2 * @fileoverview Rule to define spacing before/after arrow function's arrow.
7 //------------------------------------------------------------------------------
9 //------------------------------------------------------------------------------
11 const astUtils = require("./utils/ast-utils");
13 //------------------------------------------------------------------------------
15 //------------------------------------------------------------------------------
22 description: "enforce consistent spacing before and after the arrow in arrow functions",
23 category: "ECMAScript 6",
25 url: "https://eslint.org/docs/rules/arrow-spacing"
28 fixable: "whitespace",
43 additionalProperties: false
48 expectedBefore: "Missing space before =>.",
49 unexpectedBefore: "Unexpected space before =>.",
51 expectedAfter: "Missing space after =>.",
52 unexpectedAfter: "Unexpected space after =>."
58 // merge rules with default
59 const rule = Object.assign({}, context.options[0]);
61 rule.before = rule.before !== false;
62 rule.after = rule.after !== false;
64 const sourceCode = context.getSourceCode();
67 * Get tokens of arrow(`=>`) and before/after arrow.
68 * @param {ASTNode} node The arrow function node.
69 * @returns {Object} Tokens of arrow and before/after arrow.
71 function getTokens(node) {
72 const arrow = sourceCode.getTokenBefore(node.body, astUtils.isArrowToken);
75 before: sourceCode.getTokenBefore(arrow),
77 after: sourceCode.getTokenAfter(arrow)
82 * Count spaces before/after arrow(`=>`) token.
83 * @param {Object} tokens Tokens before/after arrow.
84 * @returns {Object} count of space before/after arrow.
86 function countSpaces(tokens) {
87 const before = tokens.arrow.range[0] - tokens.before.range[1];
88 const after = tokens.after.range[0] - tokens.arrow.range[1];
90 return { before, after };
94 * Determines whether space(s) before after arrow(`=>`) is satisfy rule.
95 * if before/after value is `true`, there should be space(s).
96 * if before/after value is `false`, there should be no space.
97 * @param {ASTNode} node The arrow function node.
100 function spaces(node) {
101 const tokens = getTokens(node);
102 const countSpace = countSpaces(tokens);
106 // should be space(s) before arrow
107 if (countSpace.before === 0) {
110 messageId: "expectedBefore",
112 return fixer.insertTextBefore(tokens.arrow, " ");
118 // should be no space before arrow
119 if (countSpace.before > 0) {
122 messageId: "unexpectedBefore",
124 return fixer.removeRange([tokens.before.range[1], tokens.arrow.range[0]]);
132 // should be space(s) after arrow
133 if (countSpace.after === 0) {
136 messageId: "expectedAfter",
138 return fixer.insertTextAfter(tokens.arrow, " ");
144 // should be no space after arrow
145 if (countSpace.after > 0) {
148 messageId: "unexpectedAfter",
150 return fixer.removeRange([tokens.arrow.range[1], tokens.after.range[0]]);
158 ArrowFunctionExpression: spaces