124 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview Enforce spacing between rest and spread operators and their expressions.
 | |
|  * @author Kai Cataldo
 | |
|  * @deprecated in ESLint v8.53.0
 | |
|  */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Rule Definition
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /** @type {import('../shared/types').Rule} */
 | |
| module.exports = {
 | |
|     meta: {
 | |
|         deprecated: true,
 | |
|         replacedBy: [],
 | |
|         type: "layout",
 | |
| 
 | |
|         docs: {
 | |
|             description: "Enforce spacing between rest and spread operators and their expressions",
 | |
|             recommended: false,
 | |
|             url: "https://eslint.org/docs/latest/rules/rest-spread-spacing"
 | |
|         },
 | |
| 
 | |
|         fixable: "whitespace",
 | |
| 
 | |
|         schema: [
 | |
|             {
 | |
|                 enum: ["always", "never"]
 | |
|             }
 | |
|         ],
 | |
| 
 | |
|         messages: {
 | |
|             unexpectedWhitespace: "Unexpected whitespace after {{type}} operator.",
 | |
|             expectedWhitespace: "Expected whitespace after {{type}} operator."
 | |
|         }
 | |
|     },
 | |
| 
 | |
|     create(context) {
 | |
|         const sourceCode = context.sourceCode,
 | |
|             alwaysSpace = context.options[0] === "always";
 | |
| 
 | |
|         //--------------------------------------------------------------------------
 | |
|         // Helpers
 | |
|         //--------------------------------------------------------------------------
 | |
| 
 | |
|         /**
 | |
|          * Checks whitespace between rest/spread operators and their expressions
 | |
|          * @param {ASTNode} node The node to check
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function checkWhiteSpace(node) {
 | |
|             const operator = sourceCode.getFirstToken(node),
 | |
|                 nextToken = sourceCode.getTokenAfter(operator),
 | |
|                 hasWhitespace = sourceCode.isSpaceBetweenTokens(operator, nextToken);
 | |
|             let type;
 | |
| 
 | |
|             switch (node.type) {
 | |
|                 case "SpreadElement":
 | |
|                     type = "spread";
 | |
|                     if (node.parent.type === "ObjectExpression") {
 | |
|                         type += " property";
 | |
|                     }
 | |
|                     break;
 | |
|                 case "RestElement":
 | |
|                     type = "rest";
 | |
|                     if (node.parent.type === "ObjectPattern") {
 | |
|                         type += " property";
 | |
|                     }
 | |
|                     break;
 | |
|                 case "ExperimentalSpreadProperty":
 | |
|                     type = "spread property";
 | |
|                     break;
 | |
|                 case "ExperimentalRestProperty":
 | |
|                     type = "rest property";
 | |
|                     break;
 | |
|                 default:
 | |
|                     return;
 | |
|             }
 | |
| 
 | |
|             if (alwaysSpace && !hasWhitespace) {
 | |
|                 context.report({
 | |
|                     node,
 | |
|                     loc: operator.loc,
 | |
|                     messageId: "expectedWhitespace",
 | |
|                     data: {
 | |
|                         type
 | |
|                     },
 | |
|                     fix(fixer) {
 | |
|                         return fixer.replaceTextRange([operator.range[1], nextToken.range[0]], " ");
 | |
|                     }
 | |
|                 });
 | |
|             } else if (!alwaysSpace && hasWhitespace) {
 | |
|                 context.report({
 | |
|                     node,
 | |
|                     loc: {
 | |
|                         start: operator.loc.end,
 | |
|                         end: nextToken.loc.start
 | |
|                     },
 | |
|                     messageId: "unexpectedWhitespace",
 | |
|                     data: {
 | |
|                         type
 | |
|                     },
 | |
|                     fix(fixer) {
 | |
|                         return fixer.removeRange([operator.range[1], nextToken.range[0]]);
 | |
|                     }
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //--------------------------------------------------------------------------
 | |
|         // Public
 | |
|         //--------------------------------------------------------------------------
 | |
| 
 | |
|         return {
 | |
|             SpreadElement: checkWhiteSpace,
 | |
|             RestElement: checkWhiteSpace,
 | |
|             ExperimentalSpreadProperty: checkWhiteSpace,
 | |
|             ExperimentalRestProperty: checkWhiteSpace
 | |
|         };
 | |
|     }
 | |
| };
 |