UNPKG

4.03 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 url: "https://eslint.org/docs/rules/template-curly-spacing"
32 },
33
34 fixable: "whitespace",
35
36 schema: [
37 { enum: ["always", "never"] }
38 ]
39 },
40
41 create(context) {
42 const sourceCode = context.getSourceCode();
43 const always = context.options[0] === "always";
44 const prefix = always ? "Expected" : "Unexpected";
45
46 /**
47 * Checks spacing before `}` of a given token.
48 * @param {Token} token - A token to check. This is a Template token.
49 * @returns {void}
50 */
51 function checkSpacingBefore(token) {
52 const prevToken = sourceCode.getTokenBefore(token);
53
54 if (prevToken &&
55 CLOSE_PAREN.test(token.value) &&
56 astUtils.isTokenOnSameLine(prevToken, token) &&
57 sourceCode.isSpaceBetweenTokens(prevToken, token) !== always
58 ) {
59 context.report({
60 loc: token.loc.start,
61 message: "{{prefix}} space(s) before '}'.",
62 data: {
63 prefix
64 },
65 fix(fixer) {
66 if (always) {
67 return fixer.insertTextBefore(token, " ");
68 }
69 return fixer.removeRange([
70 prevToken.range[1],
71 token.range[0]
72 ]);
73 }
74 });
75 }
76 }
77
78 /**
79 * Checks spacing after `${` of a given token.
80 * @param {Token} token - A token to check. This is a Template token.
81 * @returns {void}
82 */
83 function checkSpacingAfter(token) {
84 const nextToken = sourceCode.getTokenAfter(token);
85
86 if (nextToken &&
87 OPEN_PAREN.test(token.value) &&
88 astUtils.isTokenOnSameLine(token, nextToken) &&
89 sourceCode.isSpaceBetweenTokens(token, nextToken) !== always
90 ) {
91 context.report({
92 loc: {
93 line: token.loc.end.line,
94 column: token.loc.end.column - 2
95 },
96 message: "{{prefix}} space(s) after '${'.",
97 data: {
98 prefix
99 },
100 fix(fixer) {
101 if (always) {
102 return fixer.insertTextAfter(token, " ");
103 }
104 return fixer.removeRange([
105 token.range[1],
106 nextToken.range[0]
107 ]);
108 }
109 });
110 }
111 }
112
113 return {
114 TemplateElement(node) {
115 const token = sourceCode.getFirstToken(node);
116
117 checkSpacingBefore(token);
118 checkSpacingAfter(token);
119 }
120 };
121 }
122};