UNPKG

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