12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /**
- * @author Jamund Ferguson
- * See LICENSE file in root directory for full license.
- */
- "use strict"
- module.exports = {
- meta: {
- docs: {
- description:
- "ensure Node.js-style error-first callback pattern is followed",
- category: "Possible Errors",
- recommended: false,
- url:
- "https://github.com/mysticatea/eslint-plugin-node/blob/v11.1.0/docs/rules/no-callback-literal.md",
- },
- type: "problem",
- fixable: null,
- schema: [],
- },
- create(context) {
- const callbackNames = ["callback", "cb"]
- function isCallback(name) {
- return callbackNames.indexOf(name) > -1
- }
- return {
- CallExpression(node) {
- const errorArg = node.arguments[0]
- const calleeName = node.callee.name
- if (
- errorArg &&
- !couldBeError(errorArg) &&
- isCallback(calleeName)
- ) {
- context.report({
- node,
- message:
- "Unexpected literal in error position of callback.",
- })
- }
- },
- }
- },
- }
- /**
- * Determine if a node has a possiblity to be an Error object
- * @param {ASTNode} node ASTNode to check
- * @returns {boolean} True if there is a chance it contains an Error obj
- */
- function couldBeError(node) {
- switch (node.type) {
- case "Identifier":
- case "CallExpression":
- case "NewExpression":
- case "MemberExpression":
- case "TaggedTemplateExpression":
- case "YieldExpression":
- return true // possibly an error object.
- case "AssignmentExpression":
- return couldBeError(node.right)
- case "SequenceExpression": {
- const exprs = node.expressions
- return exprs.length !== 0 && couldBeError(exprs[exprs.length - 1])
- }
- case "LogicalExpression":
- return couldBeError(node.left) || couldBeError(node.right)
- case "ConditionalExpression":
- return couldBeError(node.consequent) || couldBeError(node.alternate)
- default:
- return node.value === null
- }
- }
|