UNPKG

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