UNPKG

3.38 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 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};