.
This commit is contained in:
		
							
								
								
									
										186
									
								
								qwen/nodejs/node_modules/eslint/lib/rules/arrow-parens.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								qwen/nodejs/node_modules/eslint/lib/rules/arrow-parens.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,186 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @fileoverview Rule to require parens in arrow function arguments.
 | 
			
		||||
 * @author Jxck
 | 
			
		||||
 * @deprecated in ESLint v8.53.0
 | 
			
		||||
 */
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
const astUtils = require("./utils/ast-utils");
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Helpers
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Determines if the given arrow function has block body.
 | 
			
		||||
 * @param {ASTNode} node `ArrowFunctionExpression` node.
 | 
			
		||||
 * @returns {boolean} `true` if the function has block body.
 | 
			
		||||
 */
 | 
			
		||||
function hasBlockBody(node) {
 | 
			
		||||
    return node.body.type === "BlockStatement";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Rule Definition
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/** @type {import('../shared/types').Rule} */
 | 
			
		||||
module.exports = {
 | 
			
		||||
    meta: {
 | 
			
		||||
        deprecated: true,
 | 
			
		||||
        replacedBy: [],
 | 
			
		||||
        type: "layout",
 | 
			
		||||
 | 
			
		||||
        docs: {
 | 
			
		||||
            description: "Require parentheses around arrow function arguments",
 | 
			
		||||
            recommended: false,
 | 
			
		||||
            url: "https://eslint.org/docs/latest/rules/arrow-parens"
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        fixable: "code",
 | 
			
		||||
 | 
			
		||||
        schema: [
 | 
			
		||||
            {
 | 
			
		||||
                enum: ["always", "as-needed"]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                type: "object",
 | 
			
		||||
                properties: {
 | 
			
		||||
                    requireForBlockBody: {
 | 
			
		||||
                        type: "boolean",
 | 
			
		||||
                        default: false
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                additionalProperties: false
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
 | 
			
		||||
        messages: {
 | 
			
		||||
            unexpectedParens: "Unexpected parentheses around single function argument.",
 | 
			
		||||
            expectedParens: "Expected parentheses around arrow function argument.",
 | 
			
		||||
 | 
			
		||||
            unexpectedParensInline: "Unexpected parentheses around single function argument having a body with no curly braces.",
 | 
			
		||||
            expectedParensBlock: "Expected parentheses around arrow function argument having a body with curly braces."
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    create(context) {
 | 
			
		||||
        const asNeeded = context.options[0] === "as-needed";
 | 
			
		||||
        const requireForBlockBody = asNeeded && context.options[1] && context.options[1].requireForBlockBody === true;
 | 
			
		||||
 | 
			
		||||
        const sourceCode = context.sourceCode;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Finds opening paren of parameters for the given arrow function, if it exists.
 | 
			
		||||
         * It is assumed that the given arrow function has exactly one parameter.
 | 
			
		||||
         * @param {ASTNode} node `ArrowFunctionExpression` node.
 | 
			
		||||
         * @returns {Token|null} the opening paren, or `null` if the given arrow function doesn't have parens of parameters.
 | 
			
		||||
         */
 | 
			
		||||
        function findOpeningParenOfParams(node) {
 | 
			
		||||
            const tokenBeforeParams = sourceCode.getTokenBefore(node.params[0]);
 | 
			
		||||
 | 
			
		||||
            if (
 | 
			
		||||
                tokenBeforeParams &&
 | 
			
		||||
                astUtils.isOpeningParenToken(tokenBeforeParams) &&
 | 
			
		||||
                node.range[0] <= tokenBeforeParams.range[0]
 | 
			
		||||
            ) {
 | 
			
		||||
                return tokenBeforeParams;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Finds closing paren of parameters for the given arrow function.
 | 
			
		||||
         * It is assumed that the given arrow function has parens of parameters and that it has exactly one parameter.
 | 
			
		||||
         * @param {ASTNode} node `ArrowFunctionExpression` node.
 | 
			
		||||
         * @returns {Token} the closing paren of parameters.
 | 
			
		||||
         */
 | 
			
		||||
        function getClosingParenOfParams(node) {
 | 
			
		||||
            return sourceCode.getTokenAfter(node.params[0], astUtils.isClosingParenToken);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Determines whether the given arrow function has comments inside parens of parameters.
 | 
			
		||||
         * It is assumed that the given arrow function has parens of parameters.
 | 
			
		||||
         * @param {ASTNode} node `ArrowFunctionExpression` node.
 | 
			
		||||
         * @param {Token} openingParen Opening paren of parameters.
 | 
			
		||||
         * @returns {boolean} `true` if the function has at least one comment inside of parens of parameters.
 | 
			
		||||
         */
 | 
			
		||||
        function hasCommentsInParensOfParams(node, openingParen) {
 | 
			
		||||
            return sourceCode.commentsExistBetween(openingParen, getClosingParenOfParams(node));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Determines whether the given arrow function has unexpected tokens before opening paren of parameters,
 | 
			
		||||
         * in which case it will be assumed that the existing parens of parameters are necessary.
 | 
			
		||||
         * Only tokens within the range of the arrow function (tokens that are part of the arrow function) are taken into account.
 | 
			
		||||
         * Example: <T>(a) => b
 | 
			
		||||
         * @param {ASTNode} node `ArrowFunctionExpression` node.
 | 
			
		||||
         * @param {Token} openingParen Opening paren of parameters.
 | 
			
		||||
         * @returns {boolean} `true` if the function has at least one unexpected token.
 | 
			
		||||
         */
 | 
			
		||||
        function hasUnexpectedTokensBeforeOpeningParen(node, openingParen) {
 | 
			
		||||
            const expectedCount = node.async ? 1 : 0;
 | 
			
		||||
 | 
			
		||||
            return sourceCode.getFirstToken(node, { skip: expectedCount }) !== openingParen;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            "ArrowFunctionExpression[params.length=1]"(node) {
 | 
			
		||||
                const shouldHaveParens = !asNeeded || requireForBlockBody && hasBlockBody(node);
 | 
			
		||||
                const openingParen = findOpeningParenOfParams(node);
 | 
			
		||||
                const hasParens = openingParen !== null;
 | 
			
		||||
                const [param] = node.params;
 | 
			
		||||
 | 
			
		||||
                if (shouldHaveParens && !hasParens) {
 | 
			
		||||
                    context.report({
 | 
			
		||||
                        node,
 | 
			
		||||
                        messageId: requireForBlockBody ? "expectedParensBlock" : "expectedParens",
 | 
			
		||||
                        loc: param.loc,
 | 
			
		||||
                        *fix(fixer) {
 | 
			
		||||
                            yield fixer.insertTextBefore(param, "(");
 | 
			
		||||
                            yield fixer.insertTextAfter(param, ")");
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (
 | 
			
		||||
                    !shouldHaveParens &&
 | 
			
		||||
                    hasParens &&
 | 
			
		||||
                    param.type === "Identifier" &&
 | 
			
		||||
                    !param.typeAnnotation &&
 | 
			
		||||
                    !node.returnType &&
 | 
			
		||||
                    !hasCommentsInParensOfParams(node, openingParen) &&
 | 
			
		||||
                    !hasUnexpectedTokensBeforeOpeningParen(node, openingParen)
 | 
			
		||||
                ) {
 | 
			
		||||
                    context.report({
 | 
			
		||||
                        node,
 | 
			
		||||
                        messageId: requireForBlockBody ? "unexpectedParensInline" : "unexpectedParens",
 | 
			
		||||
                        loc: param.loc,
 | 
			
		||||
                        *fix(fixer) {
 | 
			
		||||
                            const tokenBeforeOpeningParen = sourceCode.getTokenBefore(openingParen);
 | 
			
		||||
                            const closingParen = getClosingParenOfParams(node);
 | 
			
		||||
 | 
			
		||||
                            if (
 | 
			
		||||
                                tokenBeforeOpeningParen &&
 | 
			
		||||
                                tokenBeforeOpeningParen.range[1] === openingParen.range[0] &&
 | 
			
		||||
                                !astUtils.canTokensBeAdjacent(tokenBeforeOpeningParen, sourceCode.getFirstToken(param))
 | 
			
		||||
                            ) {
 | 
			
		||||
                                yield fixer.insertTextBefore(openingParen, " ");
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            // remove parens, whitespace inside parens, and possible trailing comma
 | 
			
		||||
                            yield fixer.removeRange([openingParen.range[0], param.range[0]]);
 | 
			
		||||
                            yield fixer.removeRange([param.range[1], closingParen.range[1]]);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user