165 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview Rule to define spacing before/after arrow function's arrow.
 | |
|  * @author Jxck
 | |
|  * @deprecated in ESLint v8.53.0
 | |
|  */
 | |
| "use strict";
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Requirements
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| 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 before and after the arrow in arrow functions",
 | |
|             recommended: false,
 | |
|             url: "https://eslint.org/docs/latest/rules/arrow-spacing"
 | |
|         },
 | |
| 
 | |
|         fixable: "whitespace",
 | |
| 
 | |
|         schema: [
 | |
|             {
 | |
|                 type: "object",
 | |
|                 properties: {
 | |
|                     before: {
 | |
|                         type: "boolean",
 | |
|                         default: true
 | |
|                     },
 | |
|                     after: {
 | |
|                         type: "boolean",
 | |
|                         default: true
 | |
|                     }
 | |
|                 },
 | |
|                 additionalProperties: false
 | |
|             }
 | |
|         ],
 | |
| 
 | |
|         messages: {
 | |
|             expectedBefore: "Missing space before =>.",
 | |
|             unexpectedBefore: "Unexpected space before =>.",
 | |
| 
 | |
|             expectedAfter: "Missing space after =>.",
 | |
|             unexpectedAfter: "Unexpected space after =>."
 | |
|         }
 | |
|     },
 | |
| 
 | |
|     create(context) {
 | |
| 
 | |
|         // merge rules with default
 | |
|         const rule = Object.assign({}, context.options[0]);
 | |
| 
 | |
|         rule.before = rule.before !== false;
 | |
|         rule.after = rule.after !== false;
 | |
| 
 | |
|         const sourceCode = context.sourceCode;
 | |
| 
 | |
|         /**
 | |
|          * Get tokens of arrow(`=>`) and before/after arrow.
 | |
|          * @param {ASTNode} node The arrow function node.
 | |
|          * @returns {Object} Tokens of arrow and before/after arrow.
 | |
|          */
 | |
|         function getTokens(node) {
 | |
|             const arrow = sourceCode.getTokenBefore(node.body, astUtils.isArrowToken);
 | |
| 
 | |
|             return {
 | |
|                 before: sourceCode.getTokenBefore(arrow),
 | |
|                 arrow,
 | |
|                 after: sourceCode.getTokenAfter(arrow)
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Count spaces before/after arrow(`=>`) token.
 | |
|          * @param {Object} tokens Tokens before/after arrow.
 | |
|          * @returns {Object} count of space before/after arrow.
 | |
|          */
 | |
|         function countSpaces(tokens) {
 | |
|             const before = tokens.arrow.range[0] - tokens.before.range[1];
 | |
|             const after = tokens.after.range[0] - tokens.arrow.range[1];
 | |
| 
 | |
|             return { before, after };
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Determines whether space(s) before after arrow(`=>`) is satisfy rule.
 | |
|          * if before/after value is `true`, there should be space(s).
 | |
|          * if before/after value is `false`, there should be no space.
 | |
|          * @param {ASTNode} node The arrow function node.
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function spaces(node) {
 | |
|             const tokens = getTokens(node);
 | |
|             const countSpace = countSpaces(tokens);
 | |
| 
 | |
|             if (rule.before) {
 | |
| 
 | |
|                 // should be space(s) before arrow
 | |
|                 if (countSpace.before === 0) {
 | |
|                     context.report({
 | |
|                         node: tokens.before,
 | |
|                         messageId: "expectedBefore",
 | |
|                         fix(fixer) {
 | |
|                             return fixer.insertTextBefore(tokens.arrow, " ");
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|             } else {
 | |
| 
 | |
|                 // should be no space before arrow
 | |
|                 if (countSpace.before > 0) {
 | |
|                     context.report({
 | |
|                         node: tokens.before,
 | |
|                         messageId: "unexpectedBefore",
 | |
|                         fix(fixer) {
 | |
|                             return fixer.removeRange([tokens.before.range[1], tokens.arrow.range[0]]);
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (rule.after) {
 | |
| 
 | |
|                 // should be space(s) after arrow
 | |
|                 if (countSpace.after === 0) {
 | |
|                     context.report({
 | |
|                         node: tokens.after,
 | |
|                         messageId: "expectedAfter",
 | |
|                         fix(fixer) {
 | |
|                             return fixer.insertTextAfter(tokens.arrow, " ");
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|             } else {
 | |
| 
 | |
|                 // should be no space after arrow
 | |
|                 if (countSpace.after > 0) {
 | |
|                     context.report({
 | |
|                         node: tokens.after,
 | |
|                         messageId: "unexpectedAfter",
 | |
|                         fix(fixer) {
 | |
|                             return fixer.removeRange([tokens.arrow.range[1], tokens.after.range[0]]);
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return {
 | |
|             ArrowFunctionExpression: spaces
 | |
|         };
 | |
|     }
 | |
| };
 |