@flint.fyi/ts 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/lib/createTypeScriptFileFromProgram.js +3 -1
  3. package/lib/getFirstEnumValues.d.ts +35 -0
  4. package/lib/getFirstEnumValues.js +51 -0
  5. package/lib/getFirstEnumValues.test.d.ts +1 -0
  6. package/lib/getFirstEnumValues.test.js +45 -0
  7. package/lib/plugin.d.ts +16 -5
  8. package/lib/plugin.js +9 -1
  9. package/lib/rules/consecutiveNonNullAssertions.d.ts +1 -0
  10. package/lib/rules/consecutiveNonNullAssertions.js +3 -2
  11. package/lib/rules/debuggerStatements.d.ts +6 -0
  12. package/lib/rules/debuggerStatements.js +43 -0
  13. package/lib/rules/debuggerStatements.test.d.ts +1 -0
  14. package/lib/rules/debuggerStatements.test.js +80 -0
  15. package/lib/rules/forInArrays.d.ts +1 -0
  16. package/lib/rules/forInArrays.js +1 -0
  17. package/lib/rules/namespaceDeclarations.d.ts +1 -0
  18. package/lib/rules/namespaceDeclarations.js +9 -2
  19. package/lib/rules/octalEscapes.d.ts +6 -0
  20. package/lib/rules/octalEscapes.js +71 -0
  21. package/lib/rules/octalEscapes.test.d.ts +1 -0
  22. package/lib/rules/octalEscapes.test.js +213 -0
  23. package/package.json +1 -1
  24. package/src/createTypeScriptFileFromProgram.ts +4 -1
  25. package/src/getFirstEnumValues.test.ts +51 -0
  26. package/src/getFirstEnumValues.ts +59 -0
  27. package/src/plugin.ts +9 -1
  28. package/src/rules/consecutiveNonNullAssertions.ts +3 -2
  29. package/src/rules/debuggerStatements.test.ts +81 -0
  30. package/src/rules/debuggerStatements.ts +45 -0
  31. package/src/rules/forInArrays.ts +1 -0
  32. package/src/rules/namespaceDeclarations.ts +13 -2
  33. package/src/rules/octalEscapes.test.ts +214 -0
  34. package/src/rules/octalEscapes.ts +85 -0
  35. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,214 @@
1
+ import rule from "./octalEscapes.js";
2
+ import { ruleTester } from "./ruleTester.js";
3
+
4
+ ruleTester.describe(rule, {
5
+ invalid: [
6
+ {
7
+ code: `
8
+ const a = "\\1";
9
+ `,
10
+ snapshot: `
11
+ const a = "\\1";
12
+ ~~
13
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
14
+ `,
15
+ },
16
+ {
17
+ code: `
18
+ const a = "\\2";
19
+ `,
20
+ snapshot: `
21
+ const a = "\\2";
22
+ ~~
23
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
24
+ `,
25
+ },
26
+ {
27
+ code: `
28
+ const a = "\\7";
29
+ `,
30
+ snapshot: `
31
+ const a = "\\7";
32
+ ~~
33
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
34
+ `,
35
+ },
36
+ {
37
+ code: `
38
+ const a = "\\00";
39
+ `,
40
+ snapshot: `
41
+ const a = "\\00";
42
+ ~~~
43
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
44
+ `,
45
+ },
46
+ {
47
+ code: `
48
+ const a = "\\01";
49
+ `,
50
+ snapshot: `
51
+ const a = "\\01";
52
+ ~~~
53
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
54
+ `,
55
+ },
56
+ {
57
+ code: `
58
+ const a = "\\02";
59
+ `,
60
+ snapshot: `
61
+ const a = "\\02";
62
+ ~~~
63
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
64
+ `,
65
+ },
66
+ {
67
+ code: `
68
+ const a = "\\07";
69
+ `,
70
+ snapshot: `
71
+ const a = "\\07";
72
+ ~~~
73
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
74
+ `,
75
+ },
76
+ {
77
+ code: `
78
+ const a = "\\377";
79
+ `,
80
+ snapshot: `
81
+ const a = "\\377";
82
+ ~~~~
83
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
84
+ `,
85
+ },
86
+ {
87
+ code: `
88
+ const a = "\\12";
89
+ `,
90
+ snapshot: `
91
+ const a = "\\12";
92
+ ~~~
93
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
94
+ `,
95
+ },
96
+ {
97
+ code: `
98
+ const a = "before\\1after";
99
+ `,
100
+ snapshot: `
101
+ const a = "before\\1after";
102
+ ~~
103
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
104
+ `,
105
+ },
106
+ {
107
+ code: `
108
+ const a = "before\\01after";
109
+ `,
110
+ snapshot: `
111
+ const a = "before\\01after";
112
+ ~~~
113
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
114
+ `,
115
+ },
116
+ {
117
+ code: `
118
+ const a = '\\1';
119
+ `,
120
+ snapshot: `
121
+ const a = '\\1';
122
+ ~~
123
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
124
+ `,
125
+ },
126
+ {
127
+ code: `
128
+ const a = '\\01';
129
+ `,
130
+ snapshot: `
131
+ const a = '\\01';
132
+ ~~~
133
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
134
+ `,
135
+ },
136
+ {
137
+ code: `
138
+ const a = \`\\1\`;
139
+ `,
140
+ snapshot: `
141
+ const a = \`\\1\`;
142
+ ~~
143
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
144
+ `,
145
+ },
146
+ {
147
+ code: `
148
+ const a = \`\\01\`;
149
+ `,
150
+ snapshot: `
151
+ const a = \`\\01\`;
152
+ ~~~
153
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
154
+ `,
155
+ },
156
+ {
157
+ code: `
158
+ const a = \`before\\1after\`;
159
+ `,
160
+ snapshot: `
161
+ const a = \`before\\1after\`;
162
+ ~~
163
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
164
+ `,
165
+ },
166
+ {
167
+ code: `
168
+ const x = 5;
169
+ const a = \`value: \${x} \\1\`;
170
+ `,
171
+ snapshot: `
172
+ const x = 5;
173
+ const a = \`value: \${x} \\1\`;
174
+ ~~
175
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
176
+ `,
177
+ },
178
+ {
179
+ code: `
180
+ const x = 5;
181
+ const a = \`\\01 value: \${x}\`;
182
+ `,
183
+ snapshot: `
184
+ const x = 5;
185
+ const a = \`\\01 value: \${x}\`;
186
+ ~~~
187
+ Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.
188
+ `,
189
+ },
190
+ ],
191
+ valid: [
192
+ `const a = "\\0";`,
193
+ `const a = "\\8";`,
194
+ `const a = "\\9";`,
195
+ `const a = "\\x01";`,
196
+ `const a = "\\u0001";`,
197
+ `const a = "\\n";`,
198
+ `const a = "\\t";`,
199
+ `const a = "\\\\0";`,
200
+ `const a = "\\\\1";`,
201
+ `const a = "before\\0after";`,
202
+ `const a = "before\\8after";`,
203
+ `const a = "before\\9after";`,
204
+ `const a = '\\0';`,
205
+ `const a = '\\8';`,
206
+ `const a = '\\9';`,
207
+ `const a = \`\\0\`;`,
208
+ `const a = \`\\8\`;`,
209
+ `const a = \`\\9\`;`,
210
+ `const x = 5; const a = \`value: \${x} \\0\`;`,
211
+ `const x = 5; const a = \`\\0 value: \${x}\`;`,
212
+ `const x = 5; const a = \`\\8 \${x} \\9\`;`,
213
+ ],
214
+ });
@@ -0,0 +1,85 @@
1
+ import * as ts from "typescript";
2
+
3
+ import { typescriptLanguage } from "../language.js";
4
+
5
+ /**
6
+ * Finds the position and length of an octal escape sequence in a string.
7
+ * Returns undefined if no octal escape is found.
8
+ */
9
+ function findOctalEscape(
10
+ text: string,
11
+ ): undefined | { index: number; length: number } {
12
+ // Remove quotes from the string literal
13
+ const content = text.slice(1, -1);
14
+
15
+ // Match octal escapes: \0 followed by [0-7], or \1-7 optionally followed by [0-7]
16
+ // But exclude escaped backslashes (\\)
17
+ const octalEscapePattern = /(?<!\\)\\0[0-7]|(?<!\\)\\[1-7][0-7]*/;
18
+ const match = octalEscapePattern.exec(content);
19
+
20
+ if (!match) {
21
+ return undefined;
22
+ }
23
+
24
+ // Add 1 to account for the opening quote
25
+ return {
26
+ index: match.index + 1,
27
+ length: match[0].length,
28
+ };
29
+ }
30
+
31
+ export default typescriptLanguage.createRule({
32
+ about: {
33
+ description: "Reports using octal escape sequences in string literals.",
34
+ id: "octalEscapes",
35
+ preset: "logical",
36
+ },
37
+ messages: {
38
+ noOctalEscape: {
39
+ primary:
40
+ "Prefer hexadecimal or Unicode escape sequences over legacy octal escape sequences.",
41
+ secondary: [
42
+ "Octal escape sequences (e.g., `\\01`, `\\02`, `\\377`) are a deprecated feature in JavaScript that can lead to confusion and are forbidden in strict mode and template literals.",
43
+ "They are less readable than their modern alternatives and can cause portability issues.",
44
+ ],
45
+ suggestions: [
46
+ "Use hexadecimal escape sequences (e.g., `\\x01`) or Unicode escape sequences (e.g., `\\u0001`) instead.",
47
+ ],
48
+ },
49
+ },
50
+ setup(context) {
51
+ function checkNode(node: ts.Node) {
52
+ const text = node.getText(context.sourceFile);
53
+ const octalEscape = findOctalEscape(text);
54
+
55
+ if (!octalEscape) {
56
+ return;
57
+ }
58
+
59
+ const nodeStart = node.getStart(context.sourceFile);
60
+ context.report({
61
+ message: "noOctalEscape",
62
+ range: {
63
+ begin: nodeStart + octalEscape.index,
64
+ end: nodeStart + octalEscape.index + octalEscape.length,
65
+ },
66
+ });
67
+ }
68
+
69
+ return {
70
+ visitors: {
71
+ NoSubstitutionTemplateLiteral: checkNode,
72
+ StringLiteral: checkNode,
73
+ TemplateExpression: (node) => {
74
+ // Check the head of the template
75
+ checkNode(node.head);
76
+
77
+ // Check each template span
78
+ for (const span of node.templateSpans) {
79
+ checkNode(span.literal);
80
+ }
81
+ },
82
+ },
83
+ };
84
+ },
85
+ });