UNPKG

3.96 kBJavaScriptView Raw
1/**
2 * @fileoverview Rule to enforce spacing around embedded expressions of template strings
3 * @author Toru Nagashima
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Requirements
10//------------------------------------------------------------------------------
11
12const astUtils = require("../ast-utils");
13
14//------------------------------------------------------------------------------
15// Helpers
16//------------------------------------------------------------------------------
17
18const OPEN_PAREN = /\$\{$/;
19const CLOSE_PAREN = /^\}/;
20
21//------------------------------------------------------------------------------
22// Rule Definition
23//------------------------------------------------------------------------------
24
25module.exports = {
26 meta: {
27 docs: {
28 description: "require or disallow spacing around embedded expressions of template strings",
29 category: "ECMAScript 6",
30 recommended: false
31 },
32
33 fixable: "whitespace",
34
35 schema: [
36 {enum: ["always", "never"]}
37 ]
38 },
39
40 create(context) {
41 const sourceCode = context.getSourceCode();
42 const always = context.options[0] === "always";
43 const prefix = always ? "Expected" : "Unexpected";
44
45 /**
46 * Checks spacing before `}` of a given token.
47 * @param {Token} token - A token to check. This is a Template token.
48 * @returns {void}
49 */
50 function checkSpacingBefore(token) {
51 const prevToken = sourceCode.getTokenBefore(token);
52
53 if (prevToken &&
54 CLOSE_PAREN.test(token.value) &&
55 astUtils.isTokenOnSameLine(prevToken, token) &&
56 sourceCode.isSpaceBetweenTokens(prevToken, token) !== always
57 ) {
58 context.report({
59 loc: token.loc.start,
60 message: "{{prefix}} space(s) before '}'.",
61 data: {
62 prefix
63 },
64 fix(fixer) {
65 if (always) {
66 return fixer.insertTextBefore(token, " ");
67 }
68 return fixer.removeRange([
69 prevToken.range[1],
70 token.range[0]
71 ]);
72 }
73 });
74 }
75 }
76
77 /**
78 * Checks spacing after `${` of a given token.
79 * @param {Token} token - A token to check. This is a Template token.
80 * @returns {void}
81 */
82 function checkSpacingAfter(token) {
83 const nextToken = sourceCode.getTokenAfter(token);
84
85 if (nextToken &&
86 OPEN_PAREN.test(token.value) &&
87 astUtils.isTokenOnSameLine(token, nextToken) &&
88 sourceCode.isSpaceBetweenTokens(token, nextToken) !== always
89 ) {
90 context.report({
91 loc: {
92 line: token.loc.end.line,
93 column: token.loc.end.column - 2
94 },
95 message: "{{prefix}} space(s) after '${'.",
96 data: {
97 prefix
98 },
99 fix(fixer) {
100 if (always) {
101 return fixer.insertTextAfter(token, " ");
102 }
103 return fixer.removeRange([
104 token.range[1],
105 nextToken.range[0]
106 ]);
107 }
108 });
109 }
110 }
111
112 return {
113 TemplateElement(node) {
114 const token = sourceCode.getFirstToken(node);
115
116 checkSpacingBefore(token);
117 checkSpacingAfter(token);
118 }
119 };
120 }
121};