ts-codemod-lib 2.1.4 → 2.1.6
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 +3 -1
- package/dist/cmd/append-as-const.mjs +1 -1
- package/dist/cmd/convert-interface-to-type.mjs +1 -1
- package/dist/cmd/convert-to-readonly.mjs +1 -1
- package/dist/cmd/replace-any-with-unknown.mjs +1 -1
- package/dist/cmd/replace-record-with-unknown-record.mjs +1 -1
- package/dist/functions/ast-transformers/append-as-const.d.mts +1 -0
- package/dist/functions/ast-transformers/append-as-const.d.mts.map +1 -1
- package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.d.mts +1 -0
- package/dist/functions/ast-transformers/convert-to-readonly.d.mts.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.d.mts.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts +1 -0
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map +1 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts +5 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts.map +1 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +134 -80
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
- package/dist/functions/functions/is-atomic-type-node.d.mts +1 -0
- package/dist/functions/functions/is-atomic-type-node.d.mts.map +1 -1
- package/dist/functions/functions/is-atomic-type-node.mjs.map +1 -1
- package/dist/functions/functions/is-readonly-node.d.mts +1 -0
- package/dist/functions/functions/is-readonly-node.d.mts.map +1 -1
- package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
- package/package.json +6 -6
- package/src/cmd/append-as-const.mts +1 -1
- package/src/cmd/convert-interface-to-type.mts +1 -1
- package/src/cmd/convert-to-readonly.mts +1 -1
- package/src/cmd/replace-any-with-unknown.mts +1 -1
- package/src/cmd/replace-record-with-unknown-record.mts +1 -1
- package/src/functions/ast-transformers/append-as-const.mts +1 -0
- package/src/functions/ast-transformers/convert-to-readonly.mts +1 -0
- package/src/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mts +1 -0
- package/src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts +1 -0
- package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +169 -94
- package/src/functions/ast-transformers/replace-record-with-unknown-record.test.mts +312 -0
- package/src/functions/functions/is-atomic-type-node.mts +1 -0
- package/src/functions/functions/is-readonly-node.mts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../../src/functions/ast-transformers/replace-record-with-unknown-record.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAAA;AAMA,MAAM,gBAAgB,GAAG,oCAAoC;AAE7D
|
|
1
|
+
{"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../../src/functions/ast-transformers/replace-record-with-unknown-record.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as tsm from 'ts-morph';
|
|
2
|
+
import { type DeepReadonly } from 'ts-type-forge';
|
|
2
3
|
export type AtomicTypeNode = tsm.Node & Readonly<tsm.LiteralTypeNode | tsm.TemplateLiteralTypeNode | (tsm.TypeNode & {
|
|
3
4
|
kind: tsm.SyntaxKind.StringKeyword | tsm.SyntaxKind.BooleanKeyword | tsm.SyntaxKind.NumberKeyword | tsm.SyntaxKind.BigIntKeyword | tsm.SyntaxKind.SymbolKeyword | tsm.SyntaxKind.UndefinedKeyword | tsm.SyntaxKind.VoidKeyword | tsm.SyntaxKind.AnyKeyword | tsm.SyntaxKind.UnknownKeyword | tsm.SyntaxKind.ObjectKeyword | tsm.SyntaxKind.NeverKeyword;
|
|
4
5
|
})>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-atomic-type-node.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/is-atomic-type-node.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"is-atomic-type-node.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/is-atomic-type-node.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAkBlD,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,GACnC,QAAQ,CACJ,GAAG,CAAC,eAAe,GACnB,GAAG,CAAC,uBAAuB,GAC3B,CAAC,GAAG,CAAC,QAAQ,GAAG;IACd,IAAI,EACA,GAAG,CAAC,UAAU,CAAC,aAAa,GAC5B,GAAG,CAAC,UAAU,CAAC,cAAc,GAC7B,GAAG,CAAC,UAAU,CAAC,aAAa,GAC5B,GAAG,CAAC,UAAU,CAAC,aAAa,GAC5B,GAAG,CAAC,UAAU,CAAC,aAAa,GAC5B,GAAG,CAAC,UAAU,CAAC,gBAAgB,GAC/B,GAAG,CAAC,UAAU,CAAC,WAAW,GAC1B,GAAG,CAAC,UAAU,CAAC,UAAU,GACzB,GAAG,CAAC,UAAU,CAAC,cAAc,GAC7B,GAAG,CAAC,UAAU,CAAC,aAAa,GAC5B,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;CACjC,CAAC,CACL,CAAC;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,cAmBV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-atomic-type-node.mjs","sources":["../../../src/functions/functions/is-atomic-type-node.mts"],"sourcesContent":[null],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"is-atomic-type-node.mjs","sources":["../../../src/functions/functions/is-atomic-type-node.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA;AACA,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAiB;IACzD,GAAG,CAAC,UAAU,CAAC,aAAa;IAC5B,GAAG,CAAC,UAAU,CAAC,cAAc;IAC7B,GAAG,CAAC,UAAU,CAAC,aAAa;IAC5B,GAAG,CAAC,UAAU,CAAC,aAAa;IAC5B,GAAG,CAAC,UAAU,CAAC,aAAa;IAC5B,GAAG,CAAC,UAAU,CAAC,gBAAgB;IAC/B,GAAG,CAAC,UAAU,CAAC,WAAW;IAC1B,GAAG,CAAC,UAAU,CAAC,UAAU;IACzB,GAAG,CAAC,UAAU,CAAC,cAAc;AAC7B,IAAA,GAAG,CAAC,UAAU,CAAC,aAAa;IAC5B,GAAG,CAAC,UAAU,CAAC,YAAY;AAC5B,CAAA,CAAC;AAuBF;;;;;;;;AAQG;AACI,MAAM,gBAAgB,GAAG,CAC9B,IAA4B,KACF;;IAE1B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;AAC3C,QAAA,OAAO,IAAI;IACb;;IAGA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE;AACnD,QAAA,OAAO,IAAI;IACb;;;;IAKA,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE;AAC9C,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,KAAK;AACd;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as tsm from 'ts-morph';
|
|
2
|
+
import { type DeepReadonly } from 'ts-type-forge';
|
|
2
3
|
export declare const isShallowReadonlyTypeNode: (node: tsm.Node) => boolean;
|
|
3
4
|
export declare const isReadonlyTupleOrArrayTypeNode: (node: DeepReadonly<tsm.Node>) => node is ReadonlyArrayTypeNode | ReadonlyTupleTypeNode;
|
|
4
5
|
export type ReadonlyArrayTypeNode = tsm.TypeNode & Omit<tsm.TypeOperatorTypeNode, 'getOperator' | 'getTypeNode'> & Readonly<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-readonly-node.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/is-readonly-node.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"is-readonly-node.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/is-readonly-node.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,eAAO,MAAM,yBAAyB,GAAI,MAAM,GAAG,CAAC,IAAI,KAAG,OAGnC,CAAC;AAEzB,eAAO,MAAM,8BAA8B,GACzC,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,qBAAqB,GAAG,qBAIqB,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAC,QAAQ,GAC9C,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,aAAa,GAAG,aAAa,CAAC,GAC7D,QAAQ,CAAC;IACP,WAAW,EAAE,MAAM,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;IAClD,WAAW,EAAE,MAAM,GAAG,CAAC,aAAa,CAAC;CACtC,CAAC,CAAC;AAEL,eAAO,MAAM,uBAAuB,GAClC,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,qBAG0C,CAAC;AA8DtD,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAC,QAAQ,GAC9C,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,aAAa,GAAG,aAAa,CAAC,GAC7D,QAAQ,CAAC;IACP,WAAW,EAAE,MAAM,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;IAClD,WAAW,EAAE,MAAM,GAAG,CAAC,aAAa,CAAC;CACtC,CAAC,CAAC;AAEL,eAAO,MAAM,uBAAuB,GAClC,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,qBAG0C,CAAC;AAkDtD,MAAM,MAAM,yBAAyB,GAAG,GAAG,CAAC,QAAQ,GAClD,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,GAAG,kBAAkB,CAAC,GAC/D,QAAQ,CAAC;IACP,WAAW,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,GAChD,QAAQ,CAAC;QACP,OAAO,EAAE,MAAM,UAAU,CAAC;KAC3B,CAAC,CAAC;IACL,gBAAgB,EAAE,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;CACjD,CAAC,CAAC;AAEL,eAAO,MAAM,2BAA2B,GACtC,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,yBAcV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-readonly-node.mjs","sources":["../../../src/functions/functions/is-readonly-node.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"is-readonly-node.mjs","sources":["../../../src/functions/functions/is-readonly-node.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAKO,MAAM,yBAAyB,GAAG,CAAC,IAAc,KACtD,8BAA8B,CAAC,IAAI,CAAC;IACpC,2BAA2B,CAAC,IAAI,CAAC;IACjC,gBAAgB,CAAC,IAAI;AAEhB,MAAM,8BAA8B,GAAG,CAC5C,IAA4B,KAE5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,eAAe;AACrD,KAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;AAClD,QAAA,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;AAShD,MAAM,uBAAuB,GAAG,CACrC,IAA4B,KAE5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,eAAe;AACrD,IAAA,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS;AAqE7C,MAAM,uBAAuB,GAAG,CACrC,IAA4B,KAE5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,eAAe;AACrD,IAAA,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS;AA4D7C,MAAM,2BAA2B,GAAG,CACzC,IAA4B,KACS;AACrC,IAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;AAC9C,QAAA,OAAO,KAAK;;AAGd,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AAEnC,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;IAE7C,QACE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AAC1C,QAAA,QAAQ,CAAC,OAAO,EAAE,KAAK,UAAU;QACjC,GAAG,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC,CAAC;AAEzC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-codemod-lib",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -99,8 +99,9 @@
|
|
|
99
99
|
"z:vitest:node": "pnpm run z:vitest --project='Node.js'"
|
|
100
100
|
},
|
|
101
101
|
"dependencies": {
|
|
102
|
-
"ts-data-forge": "6.9.
|
|
103
|
-
"ts-morph": "28.0.0"
|
|
102
|
+
"ts-data-forge": "6.9.4",
|
|
103
|
+
"ts-morph": "28.0.0",
|
|
104
|
+
"ts-type-forge": "3.0.0"
|
|
104
105
|
},
|
|
105
106
|
"devDependencies": {
|
|
106
107
|
"@rollup/plugin-replace": "6.0.3",
|
|
@@ -134,8 +135,7 @@
|
|
|
134
135
|
"prettier-plugin-packagejson": "3.0.2",
|
|
135
136
|
"rollup": "4.60.2",
|
|
136
137
|
"semantic-release": "25.0.3",
|
|
137
|
-
"ts-repo-utils": "10.0.
|
|
138
|
-
"ts-type-forge": "2.4.1",
|
|
138
|
+
"ts-repo-utils": "10.0.1",
|
|
139
139
|
"tslib": "2.8.1",
|
|
140
140
|
"tsx": "4.21.0",
|
|
141
141
|
"typedoc": "0.28.19",
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"optional": true
|
|
161
161
|
}
|
|
162
162
|
},
|
|
163
|
-
"packageManager": "pnpm@
|
|
163
|
+
"packageManager": "pnpm@11.0.9",
|
|
164
164
|
"engines": {
|
|
165
165
|
"node": ">=22.18.0",
|
|
166
166
|
"pnpm": ">=9.0.0"
|
|
@@ -6,95 +6,113 @@ import { type TsMorphTransformer } from './types.mjs';
|
|
|
6
6
|
|
|
7
7
|
const TRANSFORMER_NAME = 'replace-record-with-unknown-record';
|
|
8
8
|
|
|
9
|
+
const UNKNOWN_RECORD_MODULE = 'ts-type-forge';
|
|
10
|
+
|
|
11
|
+
const UNKNOWN_RECORD_NAME = 'UnknownRecord';
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* Replaces `Readonly<Record<string, unknown>>`, `Record<string, unknown>`,
|
|
11
|
-
* and index signatures `[k: string]: unknown` with `UnknownRecord
|
|
15
|
+
* and index signatures `[k: string]: unknown` with `UnknownRecord`.
|
|
16
|
+
*
|
|
17
|
+
* When a replacement occurs, also inserts
|
|
18
|
+
* `import { type UnknownRecord } from 'ts-type-forge';` at the top of the
|
|
19
|
+
* source file (or merges into an existing import from `'ts-type-forge'`).
|
|
12
20
|
*/
|
|
13
21
|
export const replaceRecordWithUnknownRecordTransformer =
|
|
14
22
|
(): TsMorphTransformer =>
|
|
15
23
|
({
|
|
16
24
|
name: TRANSFORMER_NAME,
|
|
17
25
|
transform: (sourceAst) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
const containerModifications = [
|
|
27
|
+
processDeclarations(sourceAst),
|
|
28
|
+
...sourceAst
|
|
29
|
+
.getModules()
|
|
30
|
+
.map((namespace) => processDeclarations(namespace)),
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
if (containerModifications.includes(true)) {
|
|
34
|
+
ensureUnknownRecordImport(sourceAst);
|
|
26
35
|
}
|
|
27
36
|
},
|
|
28
37
|
}) as const;
|
|
29
38
|
|
|
30
39
|
const processDeclarations = (
|
|
31
40
|
container: tsm.SourceFile | tsm.ModuleDeclaration,
|
|
32
|
-
):
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
for (const typeAlias of typeAliases) {
|
|
41
|
+
): boolean => {
|
|
42
|
+
const typeAliasModifications = container.getTypeAliases().map((typeAlias) => {
|
|
36
43
|
if (hasDisableNextLineComment(typeAlias, TRANSFORMER_NAME)) {
|
|
37
|
-
|
|
44
|
+
return false;
|
|
38
45
|
}
|
|
39
46
|
|
|
40
47
|
const typeNode = typeAlias.getTypeNode();
|
|
41
48
|
|
|
42
|
-
if (typeNode === undefined)
|
|
49
|
+
if (typeNode === undefined) return false;
|
|
43
50
|
|
|
44
|
-
visitTypeNode(typeNode);
|
|
45
|
-
}
|
|
51
|
+
return visitTypeNode(typeNode);
|
|
52
|
+
});
|
|
46
53
|
|
|
47
|
-
const
|
|
54
|
+
const interfaceModifications = container
|
|
55
|
+
.getInterfaces()
|
|
56
|
+
.map((interfaceDecl) => processInterfaceDeclaration(interfaceDecl));
|
|
48
57
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
58
|
+
return [...typeAliasModifications, ...interfaceModifications].includes(true);
|
|
59
|
+
};
|
|
53
60
|
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
const processInterfaceDeclaration = (
|
|
62
|
+
interfaceDecl: tsm.InterfaceDeclaration,
|
|
63
|
+
): boolean => {
|
|
64
|
+
if (hasDisableNextLineComment(interfaceDecl, TRANSFORMER_NAME)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
56
67
|
|
|
57
|
-
|
|
58
|
-
|
|
68
|
+
// Check if interface has index signature [k: string]: unknown
|
|
69
|
+
const indexSignatures = interfaceDecl.getIndexSignatures();
|
|
59
70
|
|
|
60
|
-
|
|
71
|
+
const hasStringUnknownSignature = indexSignatures.some((sig) => {
|
|
72
|
+
const keyType = sig.getKeyType();
|
|
61
73
|
|
|
62
|
-
|
|
63
|
-
keyType.getText() === 'string' && returnType.getText() === 'unknown'
|
|
64
|
-
);
|
|
65
|
-
});
|
|
74
|
+
const returnType = sig.getReturnType();
|
|
66
75
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const properties = interfaceDecl.getProperties();
|
|
76
|
+
return keyType.getText() === 'string' && returnType.getText() === 'unknown';
|
|
77
|
+
});
|
|
70
78
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
// If it has the signature and no other members, replace entire interface with type alias.
|
|
80
|
+
// Skip when the interface carries semantics that a plain type alias would lose
|
|
81
|
+
// (type parameters, extends clauses, declare modifier, default export).
|
|
82
|
+
if (
|
|
83
|
+
hasStringUnknownSignature &&
|
|
84
|
+
Arr.isArrayOfLength(interfaceDecl.getProperties(), 0) &&
|
|
85
|
+
Arr.isArrayOfLength(indexSignatures, 1) &&
|
|
86
|
+
Arr.isArrayOfLength(interfaceDecl.getTypeParameters(), 0) &&
|
|
87
|
+
Arr.isArrayOfLength(interfaceDecl.getExtends(), 0) &&
|
|
88
|
+
!interfaceDecl.hasDeclareKeyword() &&
|
|
89
|
+
!interfaceDecl.hasDefaultKeyword()
|
|
90
|
+
) {
|
|
91
|
+
const exportPrefix = interfaceDecl.hasExportKeyword() ? 'export ' : '';
|
|
77
92
|
|
|
78
|
-
|
|
79
|
-
`export type ${interfaceName} = UnknownRecord;`,
|
|
80
|
-
);
|
|
93
|
+
const interfaceName = interfaceDecl.getName();
|
|
81
94
|
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
95
|
+
interfaceDecl.replaceWithText(
|
|
96
|
+
`${exportPrefix}type ${interfaceName} = UnknownRecord;`,
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
85
101
|
|
|
86
|
-
|
|
87
|
-
|
|
102
|
+
// Otherwise, check properties for Record types
|
|
103
|
+
return interfaceDecl
|
|
104
|
+
.getProperties()
|
|
105
|
+
.map((property) => {
|
|
88
106
|
const typeNode = property.getTypeNode();
|
|
89
107
|
|
|
90
|
-
if (typeNode === undefined)
|
|
108
|
+
if (typeNode === undefined) return false;
|
|
91
109
|
|
|
92
|
-
visitTypeNode(typeNode);
|
|
93
|
-
}
|
|
94
|
-
|
|
110
|
+
return visitTypeNode(typeNode);
|
|
111
|
+
})
|
|
112
|
+
.includes(true);
|
|
95
113
|
};
|
|
96
114
|
|
|
97
|
-
const visitTypeNode = (node: tsm.TypeNode):
|
|
115
|
+
const visitTypeNode = (node: tsm.TypeNode): boolean => {
|
|
98
116
|
if (tsm.Node.isTypeReference(node)) {
|
|
99
117
|
// Check if it's Readonly<{ [k: string]: unknown }>
|
|
100
118
|
if (node.getTypeName().getText() === 'Readonly') {
|
|
@@ -118,18 +136,16 @@ const visitTypeNode = (node: tsm.TypeNode): void => {
|
|
|
118
136
|
) {
|
|
119
137
|
node.replaceWithText('UnknownRecord');
|
|
120
138
|
|
|
121
|
-
return;
|
|
139
|
+
return true;
|
|
122
140
|
}
|
|
123
141
|
|
|
124
142
|
// Otherwise, recurse into the type literal to visit its properties
|
|
125
|
-
visitTypeNode(typeArg);
|
|
126
|
-
|
|
127
|
-
return;
|
|
143
|
+
return visitTypeNode(typeArg);
|
|
128
144
|
}
|
|
129
145
|
}
|
|
130
146
|
}
|
|
131
147
|
|
|
132
|
-
replaceIfRecordUnknown(node);
|
|
148
|
+
return replaceIfRecordUnknown(node);
|
|
133
149
|
}
|
|
134
150
|
|
|
135
151
|
// Check for type literal { [k: string]: unknown }
|
|
@@ -148,44 +164,65 @@ const visitTypeNode = (node: tsm.TypeNode): void => {
|
|
|
148
164
|
) {
|
|
149
165
|
node.replaceWithText('UnknownRecord');
|
|
150
166
|
|
|
151
|
-
return;
|
|
167
|
+
return true;
|
|
152
168
|
}
|
|
153
|
-
}
|
|
154
169
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
for (const typeNode of node.getTypeNodes()) {
|
|
162
|
-
visitTypeNode(typeNode);
|
|
163
|
-
}
|
|
164
|
-
} else if (tsm.Node.isArrayTypeNode(node)) {
|
|
165
|
-
visitTypeNode(node.getElementTypeNode());
|
|
166
|
-
} else if (tsm.Node.isTupleTypeNode(node)) {
|
|
167
|
-
for (const element of node.getElements()) {
|
|
168
|
-
visitTypeNode(element);
|
|
169
|
-
}
|
|
170
|
-
} else if (tsm.Node.isParenthesizedTypeNode(node)) {
|
|
171
|
-
visitTypeNode(node.getTypeNode());
|
|
172
|
-
} else if (tsm.Node.isTypeLiteral(node)) {
|
|
173
|
-
for (const member of node.getMembers()) {
|
|
174
|
-
if (tsm.Node.isPropertySignature(member)) {
|
|
175
|
-
const typeNode = member.getTypeNode();
|
|
176
|
-
|
|
177
|
-
if (typeNode !== undefined) {
|
|
178
|
-
visitTypeNode(typeNode);
|
|
170
|
+
return members
|
|
171
|
+
.map((member) => {
|
|
172
|
+
if (tsm.Node.isPropertySignature(member)) {
|
|
173
|
+
const typeNode = member.getTypeNode();
|
|
174
|
+
|
|
175
|
+
return typeNode === undefined ? false : visitTypeNode(typeNode);
|
|
179
176
|
}
|
|
180
|
-
} else if (tsm.Node.isIndexSignatureDeclaration(member)) {
|
|
181
|
-
const typeNode = member.getReturnTypeNode();
|
|
182
177
|
|
|
183
|
-
if (
|
|
184
|
-
|
|
178
|
+
if (tsm.Node.isIndexSignatureDeclaration(member)) {
|
|
179
|
+
const typeNode = member.getReturnTypeNode();
|
|
180
|
+
|
|
181
|
+
return typeNode === undefined ? false : visitTypeNode(typeNode);
|
|
185
182
|
}
|
|
186
|
-
|
|
187
|
-
|
|
183
|
+
|
|
184
|
+
return false;
|
|
185
|
+
})
|
|
186
|
+
.includes(true);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Recursively visit child type nodes
|
|
190
|
+
if (tsm.Node.isUnionTypeNode(node) || tsm.Node.isIntersectionTypeNode(node)) {
|
|
191
|
+
return node
|
|
192
|
+
.getTypeNodes()
|
|
193
|
+
.map((typeNode) => visitTypeNode(typeNode))
|
|
194
|
+
.includes(true);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (tsm.Node.isArrayTypeNode(node)) {
|
|
198
|
+
return visitTypeNode(node.getElementTypeNode());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (tsm.Node.isTupleTypeNode(node)) {
|
|
202
|
+
return node
|
|
203
|
+
.getElements()
|
|
204
|
+
.map((element) => visitTypeNode(element))
|
|
205
|
+
.includes(true);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (tsm.Node.isParenthesizedTypeNode(node)) {
|
|
209
|
+
return visitTypeNode(node.getTypeNode());
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Handles `readonly T[]`, `readonly [...]`, `keyof T`
|
|
213
|
+
if (tsm.Node.isTypeOperatorTypeNode(node)) {
|
|
214
|
+
return visitTypeNode(node.getTypeNode());
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (tsm.Node.isRestTypeNode(node)) {
|
|
218
|
+
return visitTypeNode(node.getTypeNode());
|
|
188
219
|
}
|
|
220
|
+
|
|
221
|
+
if (tsm.Node.isNamedTupleMember(node)) {
|
|
222
|
+
return visitTypeNode(node.getTypeNode());
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return false;
|
|
189
226
|
};
|
|
190
227
|
|
|
191
228
|
const isStringUnknownIndexSignature = (
|
|
@@ -198,7 +235,7 @@ const isStringUnknownIndexSignature = (
|
|
|
198
235
|
return keyType.getText() === 'string' && returnType?.getText() === 'unknown';
|
|
199
236
|
};
|
|
200
237
|
|
|
201
|
-
const replaceIfRecordUnknown = (node: tsm.TypeReferenceNode):
|
|
238
|
+
const replaceIfRecordUnknown = (node: tsm.TypeReferenceNode): boolean => {
|
|
202
239
|
const typeName = node.getTypeName().getText();
|
|
203
240
|
|
|
204
241
|
switch (typeName) {
|
|
@@ -212,9 +249,12 @@ const replaceIfRecordUnknown = (node: tsm.TypeReferenceNode): void => {
|
|
|
212
249
|
typeArgs[1].getText() === 'unknown'
|
|
213
250
|
) {
|
|
214
251
|
node.replaceWithText('UnknownRecord');
|
|
252
|
+
|
|
253
|
+
return true;
|
|
215
254
|
}
|
|
216
255
|
|
|
217
|
-
|
|
256
|
+
// Recurse into type arguments (e.g. Record<string, Record<string, unknown>>)
|
|
257
|
+
return typeArgs.map((typeArg) => visitTypeNode(typeArg)).includes(true);
|
|
218
258
|
}
|
|
219
259
|
case 'Readonly': {
|
|
220
260
|
// Check if it's Readonly<Record<string, unknown>>
|
|
@@ -235,16 +275,51 @@ const replaceIfRecordUnknown = (node: tsm.TypeReferenceNode): void => {
|
|
|
235
275
|
innerTypeArgs[1].getText() === 'unknown'
|
|
236
276
|
) {
|
|
237
277
|
node.replaceWithText('UnknownRecord');
|
|
278
|
+
|
|
279
|
+
return true;
|
|
238
280
|
}
|
|
239
281
|
}
|
|
240
282
|
}
|
|
283
|
+
|
|
284
|
+
// Otherwise, recurse into the type argument
|
|
285
|
+
return visitTypeNode(innerType);
|
|
241
286
|
}
|
|
242
287
|
|
|
243
|
-
|
|
288
|
+
return false;
|
|
244
289
|
}
|
|
245
290
|
|
|
246
291
|
default: {
|
|
247
|
-
|
|
292
|
+
// Recurse into type arguments for any other generic type
|
|
293
|
+
return node
|
|
294
|
+
.getTypeArguments()
|
|
295
|
+
.map((typeArg) => visitTypeNode(typeArg))
|
|
296
|
+
.includes(true);
|
|
248
297
|
}
|
|
249
298
|
}
|
|
250
299
|
};
|
|
300
|
+
|
|
301
|
+
const ensureUnknownRecordImport = (sourceFile: tsm.SourceFile): void => {
|
|
302
|
+
const existingImport = sourceFile
|
|
303
|
+
.getImportDeclarations()
|
|
304
|
+
.find((decl) => decl.getModuleSpecifierValue() === UNKNOWN_RECORD_MODULE);
|
|
305
|
+
|
|
306
|
+
if (existingImport === undefined) {
|
|
307
|
+
sourceFile.insertImportDeclaration(0, {
|
|
308
|
+
moduleSpecifier: UNKNOWN_RECORD_MODULE,
|
|
309
|
+
namedImports: [{ name: UNKNOWN_RECORD_NAME, isTypeOnly: true }],
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const alreadyImported = existingImport
|
|
316
|
+
.getNamedImports()
|
|
317
|
+
.some((ni) => ni.getName() === UNKNOWN_RECORD_NAME);
|
|
318
|
+
|
|
319
|
+
if (alreadyImported) return;
|
|
320
|
+
|
|
321
|
+
existingImport.addNamedImport({
|
|
322
|
+
name: UNKNOWN_RECORD_NAME,
|
|
323
|
+
isTypeOnly: true,
|
|
324
|
+
});
|
|
325
|
+
};
|