UNPKG

4.02 kBJavaScriptView Raw
1/**
2 * @fileoverview Rule to require parens in arrow function arguments.
3 * @author Jxck
4 * @copyright 2015 Jxck. All rights reserved.
5 */
6"use strict";
7
8//------------------------------------------------------------------------------
9// Rule Definition
10//------------------------------------------------------------------------------
11
12module.exports = function(context) {
13 // merge rules with default
14 var rule = { before: true, after: true };
15 var option = context.options[0] || {};
16 rule.before = option.before !== false;
17 rule.after = option.after !== false;
18
19 /**
20 * Get tokens of arrow(`=>`) and before/after arrow.
21 * @param {ASTNode} node The arrow function node.
22 * @returns {Object} Tokens of arrow and before/after arrow.
23 */
24 function getTokens(node) {
25 var t = context.getFirstToken(node);
26 var before;
27 while (t.type !== "Punctuator" || t.value !== "=>") {
28 before = t;
29 t = context.getTokenAfter(t);
30 }
31 var after = context.getTokenAfter(t);
32 return { before: before, arrow: t, after: after };
33 }
34
35 /**
36 * Count spaces before/after arrow(`=>`) token.
37 * @param {Object} tokens Tokens before/after arrow.
38 * @returns {Object} count of space before/after arrow.
39 */
40 function countSpaces(tokens) {
41 var before = tokens.arrow.range[0] - tokens.before.range[1];
42 var after = tokens.after.range[0] - tokens.arrow.range[1];
43 return { before: before, after: after };
44 }
45
46 /**
47 * Determines whether space(s) before after arrow(`=>`) is satisfy rule.
48 * if before/after value is `true`, there should be space(s).
49 * if before/after value is `false`, there should be no space.
50 * @param {ASTNode} node The arrow function node.
51 * @returns {void}
52 */
53 function spaces(node) {
54 var tokens = getTokens(node);
55 var countSpace = countSpaces(tokens);
56
57 if (rule.before) {
58 // should be space(s) before arrow
59 if (countSpace.before === 0) {
60 context.report({
61 node: tokens.before,
62 message: "Missing space before =>",
63 fix: function(fixer) {
64 return fixer.insertTextBefore(tokens.arrow, " ");
65 }
66 });
67 }
68 } else {
69 // should be no space before arrow
70 if (countSpace.before > 0) {
71 context.report({
72 node: tokens.before,
73 message: "Unexpected space before =>",
74 fix: function(fixer) {
75 return fixer.removeRange([tokens.before.range[1], tokens.arrow.range[0]]);
76 }
77 });
78 }
79 }
80
81 if (rule.after) {
82 // should be space(s) after arrow
83 if (countSpace.after === 0) {
84 context.report({
85 node: tokens.after,
86 message: "Missing space after =>",
87 fix: function(fixer) {
88 return fixer.insertTextAfter(tokens.arrow, " ");
89 }
90 });
91 }
92 } else {
93 // should be no space after arrow
94 if (countSpace.after > 0) {
95 context.report({
96 node: tokens.after,
97 message: "Unexpected space after =>",
98 fix: function(fixer) {
99 return fixer.removeRange([tokens.arrow.range[1], tokens.after.range[0]]);
100 }
101 });
102 }
103 }
104 }
105
106 return {
107 "ArrowFunctionExpression": spaces
108 };
109};
110
111module.exports.schema = [
112 {
113 "type": "object",
114 "properties": {
115 "before": {
116 "type": "boolean"
117 },
118 "after": {
119 "type": "boolean"
120 }
121 },
122 "additionalProperties": false
123 }
124];