1 | /**
|
2 | * @fileoverview Rule to disallow whitespace before properties
|
3 | * @author Kai Cataldo
|
4 | */
|
5 | ;
|
6 |
|
7 | //------------------------------------------------------------------------------
|
8 | // Requirements
|
9 | //------------------------------------------------------------------------------
|
10 |
|
11 | const astUtils = require("../ast-utils");
|
12 |
|
13 | //------------------------------------------------------------------------------
|
14 | // Rule Definition
|
15 | //------------------------------------------------------------------------------
|
16 |
|
17 | module.exports = {
|
18 | meta: {
|
19 | docs: {
|
20 | description: "disallow whitespace before properties",
|
21 | category: "Stylistic Issues",
|
22 | recommended: false,
|
23 | url: "https://eslint.org/docs/rules/no-whitespace-before-property"
|
24 | },
|
25 |
|
26 | fixable: "whitespace",
|
27 | schema: []
|
28 | },
|
29 |
|
30 | create(context) {
|
31 | const sourceCode = context.getSourceCode();
|
32 |
|
33 | //--------------------------------------------------------------------------
|
34 | // Helpers
|
35 | //--------------------------------------------------------------------------
|
36 |
|
37 | /**
|
38 | * Reports whitespace before property token
|
39 | * @param {ASTNode} node - the node to report in the event of an error
|
40 | * @param {Token} leftToken - the left token
|
41 | * @param {Token} rightToken - the right token
|
42 | * @returns {void}
|
43 | * @private
|
44 | */
|
45 | function reportError(node, leftToken, rightToken) {
|
46 | const replacementText = node.computed ? "" : ".";
|
47 |
|
48 | context.report({
|
49 | node,
|
50 | message: "Unexpected whitespace before property {{propName}}.",
|
51 | data: {
|
52 | propName: sourceCode.getText(node.property)
|
53 | },
|
54 | fix(fixer) {
|
55 | if (!node.computed && astUtils.isDecimalInteger(node.object)) {
|
56 |
|
57 | /*
|
58 | * If the object is a number literal, fixing it to something like 5.toString() would cause a SyntaxError.
|
59 | * Don't fix this case.
|
60 | */
|
61 | return null;
|
62 | }
|
63 | return fixer.replaceTextRange([leftToken.range[1], rightToken.range[0]], replacementText);
|
64 | }
|
65 | });
|
66 | }
|
67 |
|
68 | //--------------------------------------------------------------------------
|
69 | // Public
|
70 | //--------------------------------------------------------------------------
|
71 |
|
72 | return {
|
73 | MemberExpression(node) {
|
74 | let rightToken;
|
75 | let leftToken;
|
76 |
|
77 | if (!astUtils.isTokenOnSameLine(node.object, node.property)) {
|
78 | return;
|
79 | }
|
80 |
|
81 | if (node.computed) {
|
82 | rightToken = sourceCode.getTokenBefore(node.property, astUtils.isOpeningBracketToken);
|
83 | leftToken = sourceCode.getTokenBefore(rightToken);
|
84 | } else {
|
85 | rightToken = sourceCode.getFirstToken(node.property);
|
86 | leftToken = sourceCode.getTokenBefore(rightToken, 1);
|
87 | }
|
88 |
|
89 | if (sourceCode.isSpaceBetweenTokens(leftToken, rightToken)) {
|
90 | reportError(node, leftToken, rightToken);
|
91 | }
|
92 | }
|
93 | };
|
94 | }
|
95 | };
|