UNPKG

4.84 kBJavaScriptView Raw
1/**
2 * @fileoverview Rule to define spacing before/after arrow function's arrow.
3 * @author Jxck
4 */
5"use strict";
6
7//------------------------------------------------------------------------------
8// Requirements
9//------------------------------------------------------------------------------
10
11const astUtils = require("../ast-utils");
12
13//------------------------------------------------------------------------------
14// Rule Definition
15//------------------------------------------------------------------------------
16
17module.exports = {
18 meta: {
19 docs: {
20 description: "enforce consistent spacing before and after the arrow in arrow functions",
21 category: "ECMAScript 6",
22 recommended: false
23 },
24
25 fixable: "whitespace",
26
27 schema: [
28 {
29 type: "object",
30 properties: {
31 before: {
32 type: "boolean"
33 },
34 after: {
35 type: "boolean"
36 }
37 },
38 additionalProperties: false
39 }
40 ]
41 },
42
43 create(context) {
44
45 // merge rules with default
46 const rule = { before: true, after: true },
47 option = context.options[0] || {};
48
49 rule.before = option.before !== false;
50 rule.after = option.after !== false;
51
52 const sourceCode = context.getSourceCode();
53
54 /**
55 * Get tokens of arrow(`=>`) and before/after arrow.
56 * @param {ASTNode} node The arrow function node.
57 * @returns {Object} Tokens of arrow and before/after arrow.
58 */
59 function getTokens(node) {
60 const arrow = sourceCode.getTokenBefore(node.body, astUtils.isArrowToken);
61
62 return {
63 before: sourceCode.getTokenBefore(arrow),
64 arrow,
65 after: sourceCode.getTokenAfter(arrow)
66 };
67 }
68
69 /**
70 * Count spaces before/after arrow(`=>`) token.
71 * @param {Object} tokens Tokens before/after arrow.
72 * @returns {Object} count of space before/after arrow.
73 */
74 function countSpaces(tokens) {
75 const before = tokens.arrow.range[0] - tokens.before.range[1];
76 const after = tokens.after.range[0] - tokens.arrow.range[1];
77
78 return { before, after };
79 }
80
81 /**
82 * Determines whether space(s) before after arrow(`=>`) is satisfy rule.
83 * if before/after value is `true`, there should be space(s).
84 * if before/after value is `false`, there should be no space.
85 * @param {ASTNode} node The arrow function node.
86 * @returns {void}
87 */
88 function spaces(node) {
89 const tokens = getTokens(node);
90 const countSpace = countSpaces(tokens);
91
92 if (rule.before) {
93
94 // should be space(s) before arrow
95 if (countSpace.before === 0) {
96 context.report({
97 node: tokens.before,
98 message: "Missing space before =>.",
99 fix(fixer) {
100 return fixer.insertTextBefore(tokens.arrow, " ");
101 }
102 });
103 }
104 } else {
105
106 // should be no space before arrow
107 if (countSpace.before > 0) {
108 context.report({
109 node: tokens.before,
110 message: "Unexpected space before =>.",
111 fix(fixer) {
112 return fixer.removeRange([tokens.before.range[1], tokens.arrow.range[0]]);
113 }
114 });
115 }
116 }
117
118 if (rule.after) {
119
120 // should be space(s) after arrow
121 if (countSpace.after === 0) {
122 context.report({
123 node: tokens.after,
124 message: "Missing space after =>.",
125 fix(fixer) {
126 return fixer.insertTextAfter(tokens.arrow, " ");
127 }
128 });
129 }
130 } else {
131
132 // should be no space after arrow
133 if (countSpace.after > 0) {
134 context.report({
135 node: tokens.after,
136 message: "Unexpected space after =>.",
137 fix(fixer) {
138 return fixer.removeRange([tokens.arrow.range[1], tokens.after.range[0]]);
139 }
140 });
141 }
142 }
143 }
144
145 return {
146 ArrowFunctionExpression: spaces
147 };
148 }
149};