ts-codemod-lib 4.0.0 → 4.1.0
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.
- package/README.md +2 -1
- package/dist/functions/ast-transformers/append-as-const.d.mts +9 -10
- package/dist/functions/ast-transformers/append-as-const.d.mts.map +1 -1
- package/dist/functions/ast-transformers/append-as-const.mjs +123 -114
- package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.d.mts +28 -7
- package/dist/functions/ast-transformers/convert-to-readonly.d.mts.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.mjs +452 -253
- package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
- package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.d.mts +8 -8
- package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.mjs +103 -104
- package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.mjs.map +1 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts +2 -2
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +51 -51
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
- package/dist/functions/ast-transformers/transform-source-code.d.mts.map +1 -1
- package/dist/functions/ast-transformers/transform-source-code.mjs +69 -69
- package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
- package/dist/functions/constants/mutable-prefixes.d.mts +8 -8
- package/dist/functions/functions/has-disable-next-line-comment.mjs +23 -23
- package/dist/functions/functions/has-disable-next-line-comment.mjs.map +1 -1
- package/dist/functions/functions/is-readonly-node.d.mts +2 -2
- package/dist/functions/functions/is-readonly-node.d.mts.map +1 -1
- package/dist/functions/functions/is-readonly-node.mjs +13 -13
- package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
- package/dist/functions/functions/wrap-with-parentheses.d.mts +2 -2
- package/dist/functions/functions/wrap-with-parentheses.d.mts.map +1 -1
- package/dist/functions/functions/wrap-with-parentheses.mjs +87 -32
- package/dist/functions/functions/wrap-with-parentheses.mjs.map +1 -1
- package/dist/functions/utils/replace-node-with-text.d.mts +10 -11
- package/dist/functions/utils/replace-node-with-text.d.mts.map +1 -1
- package/dist/functions/utils/replace-node-with-text.mjs +0 -1
- package/dist/functions/utils/replace-node-with-text.mjs.map +1 -1
- package/package.json +9 -9
- package/src/functions/ast-transformers/append-as-const.mts +242 -231
- package/src/functions/ast-transformers/append-as-const.test.mts +39 -6
- package/src/functions/ast-transformers/convert-to-readonly-record-import.test.mts +458 -0
- package/src/functions/ast-transformers/convert-to-readonly.mts +1003 -694
- package/src/functions/ast-transformers/convert-to-readonly.test.mts +80 -33
- package/src/functions/ast-transformers/enable-no-unchecked-indexed-access.mts +178 -179
- package/src/functions/ast-transformers/enable-no-unchecked-indexed-access.test.mts +29 -29
- package/src/functions/ast-transformers/replace-any-with-unknown.test.mts +6 -6
- package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +75 -75
- package/src/functions/ast-transformers/replace-record-with-unknown-record.test.mts +6 -6
- package/src/functions/ast-transformers/transform-source-code.mts +110 -110
- package/src/functions/ast-transformers/transformer-specific-ignore.test.mts +6 -6
- package/src/functions/constants/mutable-prefixes.mts +8 -8
- package/src/functions/functions/has-disable-next-line-comment.mts +35 -35
- package/src/functions/functions/is-readonly-node.mts +25 -25
- package/src/functions/functions/wrap-with-parentheses.mts +138 -52
- package/src/functions/functions/wrap-with-parentheses.test.mts +115 -0
- package/src/functions/utils/replace-node-with-text.mts +10 -11
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
const parenDepthDelta = (char) => {
|
|
3
|
-
switch (char) {
|
|
4
|
-
case '(':
|
|
5
|
-
return 1;
|
|
6
|
-
case ')':
|
|
7
|
-
return -1;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
case undefined:
|
|
11
|
-
default:
|
|
12
|
-
return 0;
|
|
13
|
-
}
|
|
14
|
-
};
|
|
1
|
+
import * as tsm from 'ts-morph';
|
|
15
2
|
|
|
16
3
|
|
|
17
4
|
|
|
@@ -25,22 +12,23 @@ const parenDepthDelta = (char) => {
|
|
|
25
12
|
|
|
26
13
|
|
|
27
14
|
|
|
28
|
-
const isWrappedWithParentheses = (str) => {
|
|
29
|
-
const trimmed = str.trim();
|
|
30
|
-
if (!trimmed.startsWith('(') || !trimmed.endsWith(')')) {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
15
|
|
|
34
16
|
|
|
35
|
-
let mut_depth = 0;
|
|
36
|
-
for (const mut_i of range(0, asUint32(trimmed.length))) {
|
|
37
|
-
mut_depth += parenDepthDelta(trimmed.at(mut_i));
|
|
38
17
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
export const wrapWithParentheses = (nodeStr) => {
|
|
24
|
+
const trimmed = nodeStr.trim();
|
|
25
|
+
return isWrappedWithParentheses(trimmed)
|
|
26
|
+
? trimmed
|
|
27
|
+
: `(${trimmed})`;
|
|
28
|
+
};
|
|
29
|
+
const initialScanState = {
|
|
30
|
+
parenDepth: 0,
|
|
31
|
+
openBraces: '',
|
|
44
32
|
};
|
|
45
33
|
|
|
46
34
|
|
|
@@ -48,14 +36,46 @@ const isWrappedWithParentheses = (str) => {
|
|
|
48
36
|
|
|
49
37
|
|
|
50
38
|
|
|
39
|
+
const untrustedTokens = new Set([
|
|
40
|
+
tsm.ts.SyntaxKind.SlashToken,
|
|
41
|
+
tsm.ts.SyntaxKind.SlashEqualsToken,
|
|
42
|
+
tsm.ts.SyntaxKind.Unknown,
|
|
43
|
+
]);
|
|
51
44
|
|
|
52
45
|
|
|
53
46
|
|
|
54
47
|
|
|
55
48
|
|
|
49
|
+
const scanStep = new Map([
|
|
50
|
+
[
|
|
51
|
+
tsm.ts.SyntaxKind.OpenParenToken,
|
|
52
|
+
(state) => ({ ...state, parenDepth: state.parenDepth + 1 }),
|
|
53
|
+
],
|
|
54
|
+
[
|
|
55
|
+
tsm.ts.SyntaxKind.CloseParenToken,
|
|
56
|
+
(state) => ({ ...state, parenDepth: state.parenDepth - 1 }),
|
|
57
|
+
],
|
|
58
|
+
[
|
|
59
|
+
tsm.ts.SyntaxKind.OpenBraceToken,
|
|
60
|
+
(state) => ({ ...state, openBraces: `${state.openBraces}{` }),
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
tsm.ts.SyntaxKind.TemplateHead,
|
|
64
|
+
(state) => ({ ...state, openBraces: `${state.openBraces}$` }),
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
tsm.ts.SyntaxKind.CloseBraceToken,
|
|
68
|
+
(state, scanner) =>
|
|
56
69
|
|
|
57
70
|
|
|
58
71
|
|
|
72
|
+
state.openBraces.endsWith('$') &&
|
|
73
|
+
scanner.reScanTemplateToken( false) !==
|
|
74
|
+
tsm.ts.SyntaxKind.TemplateTail
|
|
75
|
+
? state
|
|
76
|
+
: { ...state, openBraces: state.openBraces.slice(0, -1) },
|
|
77
|
+
],
|
|
78
|
+
]);
|
|
59
79
|
|
|
60
80
|
|
|
61
81
|
|
|
@@ -63,10 +83,45 @@ const isWrappedWithParentheses = (str) => {
|
|
|
63
83
|
|
|
64
84
|
|
|
65
85
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
const isWrappedWithParentheses = (str) => {
|
|
100
|
+
const trimmed = str.trim();
|
|
101
|
+
if (!trimmed.startsWith('(') || !trimmed.endsWith(')')) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const scanner = tsm.ts.createScanner(tsm.ts.ScriptTarget.Latest,
|
|
105
|
+
true, tsm.ts.LanguageVariant.Standard, trimmed);
|
|
106
|
+
let mut_state = initialScanState;
|
|
107
|
+
for (let mut_token = scanner.scan(); mut_token !== tsm.ts.SyntaxKind.EndOfFileToken; mut_token = scanner.scan()) {
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
if (untrustedTokens.has(mut_token)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
mut_state = scanStep.get(mut_token)?.(mut_state, scanner) ?? mut_state;
|
|
114
|
+
|
|
115
|
+
if (scanner.isUnterminated()) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
if (mut_state.parenDepth === 0 && scanner.getTokenEnd() < trimmed.length) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return mut_state.parenDepth === 0;
|
|
71
126
|
};
|
|
72
127
|
//# sourceMappingURL=wrap-with-parentheses.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-with-parentheses.mjs","sourceRoot":"","sources":["../../../src/functions/functions/wrap-with-parentheses.mts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"wrap-with-parentheses.mjs","sourceRoot":"","sources":["../../../src/functions/functions/wrap-with-parentheses.mts"],"names":[],"mappings":"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"}
|
|
@@ -3,19 +3,18 @@ import type * as tsm from 'ts-morph';
|
|
|
3
3
|
* `node.replaceWithText(newNodeText)`, sparing a one-line text the indentation
|
|
4
4
|
* lookup.
|
|
5
5
|
*
|
|
6
|
-
* `replaceWithText` writes the text through a writer whose indentation it
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* the original path.
|
|
6
|
+
* `replaceWithText` writes the text through a writer whose indentation it looks
|
|
7
|
+
* up first, for the lines after the first one, and the lookup reparses the
|
|
8
|
+
* whole file in the language service: on top of the reparse every replacement
|
|
9
|
+
* makes anyway, once per replacement, so it is quadratic in the size of the
|
|
10
|
+
* file. A text with no `\n` has no line after the first, the indentation is
|
|
11
|
+
* never applied, and a plain writer from the same project writes the same text
|
|
12
|
+
* — so the lookup is skipped. A multi-line text takes the original path.
|
|
14
13
|
*
|
|
15
14
|
* The writer is passed as `replaceWithText`'s second argument, which its
|
|
16
|
-
* declaration leaves out and ts-morph passes itself when it sets an
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* declaration leaves out and ts-morph passes itself when it sets an expression.
|
|
16
|
+
* Were it ever dropped, the method would look the indentation up as before:
|
|
17
|
+
* slower, never different.
|
|
19
18
|
*/
|
|
20
19
|
export declare const replaceNodeWithText: (node: tsm.Node, newNodeText: string) => tsm.Node;
|
|
21
20
|
//# sourceMappingURL=replace-node-with-text.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-node-with-text.d.mts","sourceRoot":"","sources":["../../../src/functions/utils/replace-node-with-text.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC
|
|
1
|
+
{"version":3,"file":"replace-node-with-text.d.mts","sourceRoot":"","sources":["../../../src/functions/utils/replace-node-with-text.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,mBAAmB,SACxB,GAAG,CAAC,IAAI,eACD,MAAM,KAClB,GAAG,CAAC,IAOA,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-node-with-text.mjs","sourceRoot":"","sources":["../../../src/functions/utils/replace-node-with-text.mts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"replace-node-with-text.mjs","sourceRoot":"","sources":["../../../src/functions/utils/replace-node-with-text.mts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,IAAc,EACd,WAAmB,EACT,EAAE,CACZ,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;IACxB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;IACnC,CAAC,CAAE,IAAI,CAAC,eAA6C,CAAC,IAAI,CACtD,IAAI,EACJ,WAAW,EACX,IAAI,CAAC,UAAU,EAAE,CAAC,YAAY,EAAE,CACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-codemod-lib",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -38,30 +38,30 @@
|
|
|
38
38
|
"LICENSE"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"ts-data-forge": "^14.
|
|
41
|
+
"ts-data-forge": "^14.11.0",
|
|
42
42
|
"ts-morph": "^28.0.0",
|
|
43
43
|
"ts-type-forge": "^9.2.2"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "26.6.5",
|
|
47
47
|
"@vitest/browser-playwright": "5.0.5",
|
|
48
|
-
"@vitest/coverage-
|
|
48
|
+
"@vitest/coverage-istanbul": "5.0.5",
|
|
49
49
|
"@vitest/ui": "5.0.5",
|
|
50
50
|
"cspell": "10.4.0",
|
|
51
51
|
"dedent": "1.7.2",
|
|
52
52
|
"esbuild": "0.28.2",
|
|
53
53
|
"eslint": "10.13.0",
|
|
54
|
-
"eslint-config-typed": "
|
|
55
|
-
"eslint-plugin-ts-data-forge": "0.10.
|
|
56
|
-
"eslint-plugin-ts-fortress": "1.3.
|
|
57
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
54
|
+
"eslint-config-typed": "7.5.0",
|
|
55
|
+
"eslint-plugin-ts-data-forge": "0.10.10",
|
|
56
|
+
"eslint-plugin-ts-fortress": "1.3.14",
|
|
57
|
+
"eslint-plugin-ts-type-forge": "0.8.19",
|
|
58
58
|
"jiti": "2.7.0",
|
|
59
59
|
"npm-run-all2": "9.0.4",
|
|
60
60
|
"playwright": "1.64.1",
|
|
61
61
|
"prettier": "3.9.10",
|
|
62
62
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
63
63
|
"prettier-plugin-packagejson": "3.0.2",
|
|
64
|
-
"ts-repo-utils": "10.7.
|
|
64
|
+
"ts-repo-utils": "10.7.3",
|
|
65
65
|
"tsx": "4.23.15",
|
|
66
66
|
"typedoc": "0.28.20",
|
|
67
67
|
"typedoc-github-theme": "0.4.0",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"pnpm": ">=9.0.0"
|
|
76
76
|
},
|
|
77
77
|
"volta": {
|
|
78
|
-
"node": "26.
|
|
78
|
+
"node": "26.13.0"
|
|
79
79
|
},
|
|
80
80
|
"publishConfig": {
|
|
81
81
|
"access": "public",
|