Permalink
Cannot retrieve contributors at this time
89 lines (73 sloc)
2.82 KB
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codeql-action/node_modules/eslint/lib/rules/no-confusing-arrow.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @fileoverview A rule to warn against using arrow functions when they could be | |
* confused with comparisons | |
* @author Jxck <https://github.com/Jxck> | |
*/ | |
"use strict"; | |
const astUtils = require("./utils/ast-utils.js"); | |
//------------------------------------------------------------------------------ | |
// Helpers | |
//------------------------------------------------------------------------------ | |
/** | |
* Checks whether or not a node is a conditional expression. | |
* @param {ASTNode} node node to test | |
* @returns {boolean} `true` if the node is a conditional expression. | |
*/ | |
function isConditional(node) { | |
return node && node.type === "ConditionalExpression"; | |
} | |
//------------------------------------------------------------------------------ | |
// Rule Definition | |
//------------------------------------------------------------------------------ | |
/** @type {import('../shared/types').Rule} */ | |
module.exports = { | |
meta: { | |
type: "suggestion", | |
docs: { | |
description: "Disallow arrow functions where they could be confused with comparisons", | |
recommended: false, | |
url: "https://eslint.org/docs/latest/rules/no-confusing-arrow" | |
}, | |
fixable: "code", | |
schema: [{ | |
type: "object", | |
properties: { | |
allowParens: { type: "boolean", default: true }, | |
onlyOneSimpleParam: { type: "boolean", default: false } | |
}, | |
additionalProperties: false | |
}], | |
messages: { | |
confusing: "Arrow function used ambiguously with a conditional expression." | |
} | |
}, | |
create(context) { | |
const config = context.options[0] || {}; | |
const allowParens = config.allowParens || (config.allowParens === void 0); | |
const onlyOneSimpleParam = config.onlyOneSimpleParam; | |
const sourceCode = context.sourceCode; | |
/** | |
* Reports if an arrow function contains an ambiguous conditional. | |
* @param {ASTNode} node A node to check and report. | |
* @returns {void} | |
*/ | |
function checkArrowFunc(node) { | |
const body = node.body; | |
if (isConditional(body) && | |
!(allowParens && astUtils.isParenthesised(sourceCode, body)) && | |
!(onlyOneSimpleParam && !(node.params.length === 1 && node.params[0].type === "Identifier"))) { | |
context.report({ | |
node, | |
messageId: "confusing", | |
fix(fixer) { | |
// if `allowParens` is not set to true don't bother wrapping in parens | |
return allowParens && fixer.replaceText(node.body, `(${sourceCode.getText(node.body)})`); | |
} | |
}); | |
} | |
} | |
return { | |
ArrowFunctionExpression: checkArrowFunc | |
}; | |
} | |
}; |