1 | 'use strict';
|
2 | const getDocumentationUrl = require('./utils/get-documentation-url');
|
3 | const replaceTemplateElement = require('./utils/replace-template-element');
|
4 |
|
5 | const escapeWithLowercase = /(?<=(?:^|[^\\])(?:\\\\)*\\)(?<data>x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|u{[\dA-Fa-f]+})/g;
|
6 | const escapePatternWithLowercase = /(?<=(?:^|[^\\])(?:\\\\)*\\)(?<data>x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|u{[\dA-Fa-f]+}|c[a-z])/g;
|
7 | const message = 'Use uppercase characters for the value of the escape sequence.';
|
8 |
|
9 | const create = context => {
|
10 | const check = ({node, original, regex = escapeWithLowercase, fix}) => {
|
11 | const fixed = original.replace(regex, data => data.slice(0, 1) + data.slice(1).toUpperCase());
|
12 |
|
13 | if (fixed !== original) {
|
14 | context.report({
|
15 | node,
|
16 | message,
|
17 | fix: fixer => fix ? fix(fixer, fixed) : fixer.replaceText(node, fixed)
|
18 | });
|
19 | }
|
20 | };
|
21 |
|
22 | return {
|
23 | Literal(node) {
|
24 | if (typeof node.value !== 'string') {
|
25 | return;
|
26 | }
|
27 |
|
28 | check({
|
29 | node,
|
30 | original: node.raw
|
31 | });
|
32 | },
|
33 | 'Literal[regex]'(node) {
|
34 | check({
|
35 | node,
|
36 | original: node.raw,
|
37 | regex: escapePatternWithLowercase
|
38 | });
|
39 | },
|
40 | TemplateElement(node) {
|
41 | check({
|
42 | node,
|
43 | original: node.value.raw,
|
44 | fix: (fixer, fixed) => replaceTemplateElement(fixer, node, fixed)
|
45 | });
|
46 | }
|
47 | };
|
48 | };
|
49 |
|
50 | module.exports = {
|
51 | create,
|
52 | meta: {
|
53 | type: 'suggestion',
|
54 | docs: {
|
55 | url: getDocumentationUrl(__filename)
|
56 | },
|
57 | fixable: 'code'
|
58 | }
|
59 | };
|