Actualizacion maquina principal
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / eslint / lib / rules / template-curly-spacing.js
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
12 const astUtils = require("./utils/ast-utils");
13
14 //------------------------------------------------------------------------------
15 // Helpers
16 //------------------------------------------------------------------------------
17
18 const OPEN_PAREN = /\$\{$/u;
19 const CLOSE_PAREN = /^\}/u;
20
21 //------------------------------------------------------------------------------
22 // Rule Definition
23 //------------------------------------------------------------------------------
24
25 module.exports = {
26     meta: {
27         type: "layout",
28
29         docs: {
30             description: "require or disallow spacing around embedded expressions of template strings",
31             category: "ECMAScript 6",
32             recommended: false,
33             url: "https://eslint.org/docs/rules/template-curly-spacing"
34         },
35
36         fixable: "whitespace",
37
38         schema: [
39             { enum: ["always", "never"] }
40         ],
41         messages: {
42             expectedBefore: "Expected space(s) before '}'.",
43             expectedAfter: "Expected space(s) after '${'.",
44             unexpectedBefore: "Unexpected space(s) before '}'.",
45             unexpectedAfter: "Unexpected space(s) after '${'."
46         }
47     },
48
49     create(context) {
50         const sourceCode = context.getSourceCode();
51         const always = context.options[0] === "always";
52         const prefix = always ? "expected" : "unexpected";
53
54         /**
55          * Checks spacing before `}` of a given token.
56          * @param {Token} token A token to check. This is a Template token.
57          * @returns {void}
58          */
59         function checkSpacingBefore(token) {
60             const prevToken = sourceCode.getTokenBefore(token);
61
62             if (prevToken &&
63                 CLOSE_PAREN.test(token.value) &&
64                 astUtils.isTokenOnSameLine(prevToken, token) &&
65                 sourceCode.isSpaceBetweenTokens(prevToken, token) !== always
66             ) {
67                 context.report({
68                     loc: token.loc.start,
69                     messageId: `${prefix}Before`,
70                     fix(fixer) {
71                         if (always) {
72                             return fixer.insertTextBefore(token, " ");
73                         }
74                         return fixer.removeRange([
75                             prevToken.range[1],
76                             token.range[0]
77                         ]);
78                     }
79                 });
80             }
81         }
82
83         /**
84          * Checks spacing after `${` of a given token.
85          * @param {Token} token A token to check. This is a Template token.
86          * @returns {void}
87          */
88         function checkSpacingAfter(token) {
89             const nextToken = sourceCode.getTokenAfter(token);
90
91             if (nextToken &&
92                 OPEN_PAREN.test(token.value) &&
93                 astUtils.isTokenOnSameLine(token, nextToken) &&
94                 sourceCode.isSpaceBetweenTokens(token, nextToken) !== always
95             ) {
96                 context.report({
97                     loc: {
98                         line: token.loc.end.line,
99                         column: token.loc.end.column - 2
100                     },
101                     messageId: `${prefix}After`,
102                     fix(fixer) {
103                         if (always) {
104                             return fixer.insertTextAfter(token, " ");
105                         }
106                         return fixer.removeRange([
107                             token.range[1],
108                             nextToken.range[0]
109                         ]);
110                     }
111                 });
112             }
113         }
114
115         return {
116             TemplateElement(node) {
117                 const token = sourceCode.getFirstToken(node);
118
119                 checkSpacingBefore(token);
120                 checkSpacingAfter(token);
121             }
122         };
123     }
124 };