245 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview Disallows or enforces spaces inside of array brackets.
 | |
|  * @author Jamund Ferguson
 | |
|  * @deprecated in ESLint v8.53.0
 | |
|  */
 | |
| "use strict";
 | |
| 
 | |
| const astUtils = require("./utils/ast-utils");
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Rule Definition
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /** @type {import('../shared/types').Rule} */
 | |
| module.exports = {
 | |
|     meta: {
 | |
|         deprecated: true,
 | |
|         replacedBy: [],
 | |
|         type: "layout",
 | |
| 
 | |
|         docs: {
 | |
|             description: "Enforce consistent spacing inside array brackets",
 | |
|             recommended: false,
 | |
|             url: "https://eslint.org/docs/latest/rules/array-bracket-spacing"
 | |
|         },
 | |
| 
 | |
|         fixable: "whitespace",
 | |
| 
 | |
|         schema: [
 | |
|             {
 | |
|                 enum: ["always", "never"]
 | |
|             },
 | |
|             {
 | |
|                 type: "object",
 | |
|                 properties: {
 | |
|                     singleValue: {
 | |
|                         type: "boolean"
 | |
|                     },
 | |
|                     objectsInArrays: {
 | |
|                         type: "boolean"
 | |
|                     },
 | |
|                     arraysInArrays: {
 | |
|                         type: "boolean"
 | |
|                     }
 | |
|                 },
 | |
|                 additionalProperties: false
 | |
|             }
 | |
|         ],
 | |
| 
 | |
|         messages: {
 | |
|             unexpectedSpaceAfter: "There should be no space after '{{tokenValue}}'.",
 | |
|             unexpectedSpaceBefore: "There should be no space before '{{tokenValue}}'.",
 | |
|             missingSpaceAfter: "A space is required after '{{tokenValue}}'.",
 | |
|             missingSpaceBefore: "A space is required before '{{tokenValue}}'."
 | |
|         }
 | |
|     },
 | |
|     create(context) {
 | |
|         const spaced = context.options[0] === "always",
 | |
|             sourceCode = context.sourceCode;
 | |
| 
 | |
|         /**
 | |
|          * Determines whether an option is set, relative to the spacing option.
 | |
|          * If spaced is "always", then check whether option is set to false.
 | |
|          * If spaced is "never", then check whether option is set to true.
 | |
|          * @param {Object} option The option to exclude.
 | |
|          * @returns {boolean} Whether or not the property is excluded.
 | |
|          */
 | |
|         function isOptionSet(option) {
 | |
|             return context.options[1] ? context.options[1][option] === !spaced : false;
 | |
|         }
 | |
| 
 | |
|         const options = {
 | |
|             spaced,
 | |
|             singleElementException: isOptionSet("singleValue"),
 | |
|             objectsInArraysException: isOptionSet("objectsInArrays"),
 | |
|             arraysInArraysException: isOptionSet("arraysInArrays")
 | |
|         };
 | |
| 
 | |
|         //--------------------------------------------------------------------------
 | |
|         // Helpers
 | |
|         //--------------------------------------------------------------------------
 | |
| 
 | |
|         /**
 | |
|          * Reports that there shouldn't be a space after the first token
 | |
|          * @param {ASTNode} node The node to report in the event of an error.
 | |
|          * @param {Token} token The token to use for the report.
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function reportNoBeginningSpace(node, token) {
 | |
|             const nextToken = sourceCode.getTokenAfter(token);
 | |
| 
 | |
|             context.report({
 | |
|                 node,
 | |
|                 loc: { start: token.loc.end, end: nextToken.loc.start },
 | |
|                 messageId: "unexpectedSpaceAfter",
 | |
|                 data: {
 | |
|                     tokenValue: token.value
 | |
|                 },
 | |
|                 fix(fixer) {
 | |
|                     return fixer.removeRange([token.range[1], nextToken.range[0]]);
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Reports that there shouldn't be a space before the last token
 | |
|          * @param {ASTNode} node The node to report in the event of an error.
 | |
|          * @param {Token} token The token to use for the report.
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function reportNoEndingSpace(node, token) {
 | |
|             const previousToken = sourceCode.getTokenBefore(token);
 | |
| 
 | |
|             context.report({
 | |
|                 node,
 | |
|                 loc: { start: previousToken.loc.end, end: token.loc.start },
 | |
|                 messageId: "unexpectedSpaceBefore",
 | |
|                 data: {
 | |
|                     tokenValue: token.value
 | |
|                 },
 | |
|                 fix(fixer) {
 | |
|                     return fixer.removeRange([previousToken.range[1], token.range[0]]);
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Reports that there should be a space after the first token
 | |
|          * @param {ASTNode} node The node to report in the event of an error.
 | |
|          * @param {Token} token The token to use for the report.
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function reportRequiredBeginningSpace(node, token) {
 | |
|             context.report({
 | |
|                 node,
 | |
|                 loc: token.loc,
 | |
|                 messageId: "missingSpaceAfter",
 | |
|                 data: {
 | |
|                     tokenValue: token.value
 | |
|                 },
 | |
|                 fix(fixer) {
 | |
|                     return fixer.insertTextAfter(token, " ");
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Reports that there should be a space before the last token
 | |
|          * @param {ASTNode} node The node to report in the event of an error.
 | |
|          * @param {Token} token The token to use for the report.
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function reportRequiredEndingSpace(node, token) {
 | |
|             context.report({
 | |
|                 node,
 | |
|                 loc: token.loc,
 | |
|                 messageId: "missingSpaceBefore",
 | |
|                 data: {
 | |
|                     tokenValue: token.value
 | |
|                 },
 | |
|                 fix(fixer) {
 | |
|                     return fixer.insertTextBefore(token, " ");
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Determines if a node is an object type
 | |
|          * @param {ASTNode} node The node to check.
 | |
|          * @returns {boolean} Whether or not the node is an object type.
 | |
|          */
 | |
|         function isObjectType(node) {
 | |
|             return node && (node.type === "ObjectExpression" || node.type === "ObjectPattern");
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Determines if a node is an array type
 | |
|          * @param {ASTNode} node The node to check.
 | |
|          * @returns {boolean} Whether or not the node is an array type.
 | |
|          */
 | |
|         function isArrayType(node) {
 | |
|             return node && (node.type === "ArrayExpression" || node.type === "ArrayPattern");
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Validates the spacing around array brackets
 | |
|          * @param {ASTNode} node The node we're checking for spacing
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function validateArraySpacing(node) {
 | |
|             if (options.spaced && node.elements.length === 0) {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             const first = sourceCode.getFirstToken(node),
 | |
|                 second = sourceCode.getFirstToken(node, 1),
 | |
|                 last = node.typeAnnotation
 | |
|                     ? sourceCode.getTokenBefore(node.typeAnnotation)
 | |
|                     : sourceCode.getLastToken(node),
 | |
|                 penultimate = sourceCode.getTokenBefore(last),
 | |
|                 firstElement = node.elements[0],
 | |
|                 lastElement = node.elements[node.elements.length - 1];
 | |
| 
 | |
|             const openingBracketMustBeSpaced =
 | |
|                 options.objectsInArraysException && isObjectType(firstElement) ||
 | |
|                 options.arraysInArraysException && isArrayType(firstElement) ||
 | |
|                 options.singleElementException && node.elements.length === 1
 | |
|                     ? !options.spaced : options.spaced;
 | |
| 
 | |
|             const closingBracketMustBeSpaced =
 | |
|                 options.objectsInArraysException && isObjectType(lastElement) ||
 | |
|                 options.arraysInArraysException && isArrayType(lastElement) ||
 | |
|                 options.singleElementException && node.elements.length === 1
 | |
|                     ? !options.spaced : options.spaced;
 | |
| 
 | |
|             if (astUtils.isTokenOnSameLine(first, second)) {
 | |
|                 if (openingBracketMustBeSpaced && !sourceCode.isSpaceBetweenTokens(first, second)) {
 | |
|                     reportRequiredBeginningSpace(node, first);
 | |
|                 }
 | |
|                 if (!openingBracketMustBeSpaced && sourceCode.isSpaceBetweenTokens(first, second)) {
 | |
|                     reportNoBeginningSpace(node, first);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (first !== penultimate && astUtils.isTokenOnSameLine(penultimate, last)) {
 | |
|                 if (closingBracketMustBeSpaced && !sourceCode.isSpaceBetweenTokens(penultimate, last)) {
 | |
|                     reportRequiredEndingSpace(node, last);
 | |
|                 }
 | |
|                 if (!closingBracketMustBeSpaced && sourceCode.isSpaceBetweenTokens(penultimate, last)) {
 | |
|                     reportNoEndingSpace(node, last);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //--------------------------------------------------------------------------
 | |
|         // Public
 | |
|         //--------------------------------------------------------------------------
 | |
| 
 | |
|         return {
 | |
|             ArrayPattern: validateArraySpacing,
 | |
|             ArrayExpression: validateArraySpacing
 | |
|         };
 | |
|     }
 | |
| };
 |