ts-codemod-lib 2.2.1 → 2.2.3
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/dist/cmd/append-as-const.mjs +51 -48
- package/dist/cmd/append-as-const.mjs.map +1 -1
- package/dist/cmd/convert-interface-to-type.mjs +51 -48
- package/dist/cmd/convert-interface-to-type.mjs.map +1 -1
- package/dist/cmd/convert-to-readonly.mjs +51 -48
- package/dist/cmd/convert-to-readonly.mjs.map +1 -1
- package/dist/cmd/replace-any-with-unknown.mjs +51 -48
- package/dist/cmd/replace-any-with-unknown.mjs.map +1 -1
- package/dist/cmd/replace-record-with-unknown-record.mjs +51 -48
- package/dist/cmd/replace-record-with-unknown-record.mjs.map +1 -1
- package/dist/cmd/run-transformer-cli.d.mts.map +1 -1
- package/dist/cmd/run-transformer-cli.mjs +138 -127
- package/dist/cmd/run-transformer-cli.mjs.map +1 -1
- package/dist/functions/ast-transformers/append-as-const.d.mts.map +1 -1
- package/dist/functions/ast-transformers/append-as-const.mjs +205 -191
- package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-interface-to-type.mjs +62 -82
- package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.d.mts.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.mjs +742 -834
- 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 +2 -14
- package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.d.mts +2 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.d.mts.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs +8 -8
- package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.d.mts.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs +51 -62
- package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts +12 -12
- 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 +16 -14
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map +1 -1
- package/dist/functions/ast-transformers/replace-any-with-unknown.mjs +25 -27
- package/dist/functions/ast-transformers/replace-any-with-unknown.mjs.map +1 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +149 -208
- 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 +70 -72
- package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
- package/dist/functions/constants/ignore-comment-text.d.mts +2 -2
- package/dist/functions/constants/ignore-comment-text.d.mts.map +1 -1
- package/dist/functions/constants/ignore-comment-text.mjs +8 -8
- package/dist/functions/constants/ignore-comment-text.mjs.map +1 -1
- package/dist/functions/functions/has-disable-next-line-comment.d.mts.map +1 -1
- package/dist/functions/functions/has-disable-next-line-comment.mjs +33 -65
- package/dist/functions/functions/has-disable-next-line-comment.mjs.map +1 -1
- package/dist/functions/functions/is-as-const-node.d.mts +1 -1
- package/dist/functions/functions/is-as-const-node.d.mts.map +1 -1
- package/dist/functions/functions/is-as-const-node.mjs +15 -23
- package/dist/functions/functions/is-as-const-node.mjs.map +1 -1
- package/dist/functions/functions/is-atomic-type-node.d.mts.map +1 -1
- package/dist/functions/functions/is-atomic-type-node.mjs +22 -36
- package/dist/functions/functions/is-atomic-type-node.mjs.map +1 -1
- package/dist/functions/functions/is-conditional-type-distribution-guard.d.mts.map +1 -1
- package/dist/functions/functions/is-conditional-type-distribution-guard.mjs +9 -33
- package/dist/functions/functions/is-conditional-type-distribution-guard.mjs.map +1 -1
- package/dist/functions/functions/is-readonly-node.d.mts.map +1 -1
- package/dist/functions/functions/is-readonly-node.mjs +11 -21
- package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
- package/dist/functions/functions/is-spread-parameter-node.d.mts.map +1 -1
- package/dist/functions/functions/is-spread-parameter-node.mjs +2 -4
- package/dist/functions/functions/is-spread-parameter-node.mjs.map +1 -1
- package/dist/functions/functions/remove-parentheses.d.mts.map +1 -1
- package/dist/functions/functions/remove-parentheses.mjs +1 -4
- package/dist/functions/functions/remove-parentheses.mjs.map +1 -1
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.d.mts.map +1 -1
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs +7 -24
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs.map +1 -1
- package/dist/functions/functions/unwrap-readonly.d.mts.map +1 -1
- package/dist/functions/functions/unwrap-readonly.mjs +1 -3
- package/dist/functions/functions/unwrap-readonly.mjs.map +1 -1
- package/dist/functions/functions/wrap-with-parentheses.d.mts.map +1 -1
- package/dist/functions/functions/wrap-with-parentheses.mjs +26 -51
- package/dist/functions/functions/wrap-with-parentheses.mjs.map +1 -1
- package/dist/functions/utils/replace-with-debug.d.mts.map +1 -1
- package/dist/functions/utils/replace-with-debug.mjs +2 -2
- package/dist/functions/utils/replace-with-debug.mjs.map +1 -1
- package/package.json +40 -29
- package/src/cmd/append-as-const.mts +3 -3
- package/src/cmd/convert-interface-to-type.mts +3 -3
- package/src/cmd/convert-to-readonly.mts +3 -3
- package/src/cmd/replace-any-with-unknown.mts +3 -3
- package/src/cmd/replace-record-with-unknown-record.mts +3 -3
- package/src/cmd/run-transformer-cli.mts +21 -17
- package/src/functions/ast-transformers/convert-interface-to-type.mts +1 -1
- package/src/functions/ast-transformers/convert-to-readonly.mts +64 -35
- package/src/functions/ast-transformers/convert-to-readonly.test.mts +67 -1
- package/src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts +6 -6
- package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +4 -4
- package/src/functions/functions/has-disable-next-line-comment.mts +5 -5
- package/src/functions/functions/wrap-with-parentheses.mts +17 -23
|
@@ -4,37 +4,35 @@ import 'ts-data-forge';
|
|
|
4
4
|
import '../functions/is-atomic-type-node.mjs';
|
|
5
5
|
import { isSpreadParameterNode, isSpreadNamedTupleMemberNode } from '../functions/is-spread-parameter-node.mjs';
|
|
6
6
|
|
|
7
|
-
const TRANSFORMER_NAME =
|
|
7
|
+
const TRANSFORMER_NAME = "replace-any-with-unknown";
|
|
8
8
|
const replaceAnyWithUnknownTransformer = () => ({
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
name: TRANSFORMER_NAME,
|
|
10
|
+
transform: (sourceAst) => {
|
|
11
|
+
for (const node of sourceAst.getChildren()) {
|
|
12
|
+
transformNode(node);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
15
|
});
|
|
16
16
|
const transformNode = (node) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
anyKeywordNode.replaceWithText('readonly unknown[]');
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
anyKeywordNode.replaceWithText('unknown');
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
for (const child of node.getChildren()) {
|
|
36
|
-
transformNode(child);
|
|
17
|
+
if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {
|
|
18
|
+
console.debug("skipped by disable-next-line comment");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (node.isKind(tsm.SyntaxKind.AnyKeyword)) {
|
|
22
|
+
const anyKeywordNode = node;
|
|
23
|
+
const parent = anyKeywordNode.getParent();
|
|
24
|
+
if (parent !== void 0 && // `(...args: any) => any` -> `(...args: unknown[]) => any`
|
|
25
|
+
(isSpreadParameterNode(parent) || // `[name: E0, ...args: any)]` -> `[name: E0, ...args: unknown[]]`
|
|
26
|
+
isSpreadNamedTupleMemberNode(parent))) {
|
|
27
|
+
anyKeywordNode.replaceWithText("readonly unknown[]");
|
|
28
|
+
return;
|
|
37
29
|
}
|
|
30
|
+
anyKeywordNode.replaceWithText("unknown");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
for (const child of node.getChildren()) {
|
|
34
|
+
transformNode(child);
|
|
35
|
+
}
|
|
38
36
|
};
|
|
39
37
|
|
|
40
38
|
export { replaceAnyWithUnknownTransformer };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-any-with-unknown.mjs","sources":["../../../src/functions/ast-transformers/replace-any-with-unknown.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"replace-any-with-unknown.mjs","sources":["../../../src/functions/ast-transformers/replace-any-with-unknown.mts"],"sourcesContent":["import * as tsm from 'ts-morph';\nimport {\n hasDisableNextLineComment,\n isSpreadNamedTupleMemberNode,\n isSpreadParameterNode,\n} from '../functions/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'replace-any-with-unknown';\n\nexport const replaceAnyWithUnknownTransformer = (): TsMorphTransformer =>\n ({\n name: TRANSFORMER_NAME,\n transform: (sourceAst) => {\n for (const node of sourceAst.getChildren()) {\n transformNode(node);\n }\n },\n }) as const;\n\nconst transformNode = (node: tsm.Node): void => {\n if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {\n console.debug('skipped by disable-next-line comment');\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.AnyKeyword)) {\n const anyKeywordNode = node;\n\n const parent = anyKeywordNode.getParent();\n\n if (\n parent !== undefined &&\n // `(...args: any) => any` -> `(...args: unknown[]) => any`\n (isSpreadParameterNode(parent) ||\n // `[name: E0, ...args: any)]` -> `[name: E0, ...args: unknown[]]`\n isSpreadNamedTupleMemberNode(parent))\n ) {\n anyKeywordNode.replaceWithText('readonly unknown[]');\n\n return;\n }\n\n anyKeywordNode.replaceWithText('unknown');\n\n return;\n }\n\n for (const child of node.getChildren()) {\n transformNode(child);\n }\n};\n"],"names":[],"mappings":";;;;;;AAQA,MAAM,gBAAA,GAAmB,0BAAA;AAElB,MAAM,mCAAmC,OAC7C;AAAA,EACC,IAAA,EAAM,gBAAA;AAAA,EACN,SAAA,EAAW,CAAC,SAAA,KAAc;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,WAAA,EAAY,EAAG;AAC1C,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAA;AAEF,MAAM,aAAA,GAAgB,CAAC,IAAA,KAAyB;AAC9C,EAAA,IAAI,yBAAA,CAA0B,IAAA,EAAM,gBAAgB,CAAA,EAAG;AACrD,IAAA,OAAA,CAAQ,MAAM,sCAAsC,CAAA;AAEpD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1C,IAAA,MAAM,cAAA,GAAiB,IAAA;AAEvB,IAAA,MAAM,MAAA,GAAS,eAAe,SAAA,EAAU;AAExC,IAAA,IACE,MAAA,KAAW,MAAA;AAAA,KAEV,sBAAsB,MAAM,CAAA;AAAA,IAE3B,4BAAA,CAA6B,MAAM,CAAA,CAAA,EACrC;AACA,MAAA,cAAA,CAAe,gBAAgB,oBAAoB,CAAA;AAEnD,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,gBAAgB,SAAS,CAAA;AAExC,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,WAAA,EAAY,EAAG;AACtC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB;AACF,CAAA;;;;"}
|
|
@@ -3,235 +3,176 @@ import * as tsm from 'ts-morph';
|
|
|
3
3
|
import { hasDisableNextLineComment } from '../functions/has-disable-next-line-comment.mjs';
|
|
4
4
|
import '../functions/is-atomic-type-node.mjs';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const UNKNOWN_RECORD_NAME = 'UnknownRecord';
|
|
10
|
-
/**
|
|
11
|
-
* Replaces `Readonly<Record<string, unknown>>`, `Record<string, unknown>`,
|
|
12
|
-
* and index signatures `[k: string]: unknown` with `UnknownRecord`.
|
|
13
|
-
*
|
|
14
|
-
* When a replacement occurs, also inserts
|
|
15
|
-
* `import { type UnknownRecord } from 'ts-type-forge';` at the top of the
|
|
16
|
-
* source file (or merges into an existing import from `'ts-type-forge'`).
|
|
17
|
-
*/
|
|
6
|
+
const TRANSFORMER_NAME = "replace-record-with-unknown-record";
|
|
7
|
+
const UNKNOWN_RECORD_MODULE = "ts-type-forge";
|
|
8
|
+
const UNKNOWN_RECORD_NAME = "UnknownRecord";
|
|
18
9
|
const replaceRecordWithUnknownRecordTransformer = () => ({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
},
|
|
10
|
+
name: TRANSFORMER_NAME,
|
|
11
|
+
transform: (sourceAst) => {
|
|
12
|
+
const containerModifications = Arr.toUnshifted(
|
|
13
|
+
sourceAst.getModules().map((namespace) => processDeclarations(namespace)),
|
|
14
|
+
processDeclarations(sourceAst)
|
|
15
|
+
);
|
|
16
|
+
if (containerModifications.includes(true)) {
|
|
17
|
+
ensureUnknownRecordImport(sourceAst);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
31
20
|
});
|
|
32
21
|
const processDeclarations = (container) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
.getInterfaces()
|
|
44
|
-
.map((interfaceDecl) => processInterfaceDeclaration(interfaceDecl));
|
|
45
|
-
return [...typeAliasModifications, ...interfaceModifications].includes(true);
|
|
22
|
+
const typeAliasModifications = container.getTypeAliases().map((typeAlias) => {
|
|
23
|
+
if (hasDisableNextLineComment(typeAlias, TRANSFORMER_NAME)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const typeNode = typeAlias.getTypeNode();
|
|
27
|
+
if (typeNode === void 0) return false;
|
|
28
|
+
return visitTypeNode(typeNode);
|
|
29
|
+
});
|
|
30
|
+
const interfaceModifications = container.getInterfaces().map((interfaceDecl) => processInterfaceDeclaration(interfaceDecl));
|
|
31
|
+
return [...typeAliasModifications, ...interfaceModifications].includes(true);
|
|
46
32
|
};
|
|
47
33
|
const processInterfaceDeclaration = (interfaceDecl) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
interfaceDecl.replaceWithText(`${exportPrefix}type ${interfaceName} = UnknownRecord;`);
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
// Otherwise, check properties for Record types
|
|
74
|
-
return interfaceDecl
|
|
75
|
-
.getProperties()
|
|
76
|
-
.map((property) => {
|
|
77
|
-
const typeNode = property.getTypeNode();
|
|
78
|
-
if (typeNode === undefined)
|
|
79
|
-
return false;
|
|
80
|
-
return visitTypeNode(typeNode);
|
|
81
|
-
})
|
|
82
|
-
.includes(true);
|
|
34
|
+
if (hasDisableNextLineComment(interfaceDecl, TRANSFORMER_NAME)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const indexSignatures = interfaceDecl.getIndexSignatures();
|
|
38
|
+
const hasStringUnknownSignature = indexSignatures.some((sig) => {
|
|
39
|
+
const keyType = sig.getKeyType();
|
|
40
|
+
const returnType = sig.getReturnType();
|
|
41
|
+
return keyType.getText() === "string" && returnType.getText() === "unknown";
|
|
42
|
+
});
|
|
43
|
+
if (hasStringUnknownSignature && Arr.isArrayOfLength(interfaceDecl.getProperties(), 0) && Arr.isArrayOfLength(indexSignatures, 1) && Arr.isArrayOfLength(interfaceDecl.getTypeParameters(), 0) && Arr.isArrayOfLength(interfaceDecl.getExtends(), 0) && !interfaceDecl.hasDeclareKeyword() && !interfaceDecl.hasDefaultKeyword()) {
|
|
44
|
+
const exportPrefix = interfaceDecl.hasExportKeyword() ? "export " : "";
|
|
45
|
+
const interfaceName = interfaceDecl.getName();
|
|
46
|
+
interfaceDecl.replaceWithText(
|
|
47
|
+
`${exportPrefix}type ${interfaceName} = UnknownRecord;`
|
|
48
|
+
);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return interfaceDecl.getProperties().map((property) => {
|
|
52
|
+
const typeNode = property.getTypeNode();
|
|
53
|
+
if (typeNode === void 0) return false;
|
|
54
|
+
return visitTypeNode(typeNode);
|
|
55
|
+
}).includes(true);
|
|
83
56
|
};
|
|
84
57
|
const visitTypeNode = (node) => {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
isStringUnknownIndexSignature(indexSigs[0])) {
|
|
98
|
-
node.replaceWithText('UnknownRecord');
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
// Otherwise, recurse into the type literal to visit its properties
|
|
102
|
-
return visitTypeNode(typeArg);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return replaceIfRecordUnknown(node);
|
|
107
|
-
}
|
|
108
|
-
// Check for type literal { [k: string]: unknown }
|
|
109
|
-
if (tsm.Node.isTypeLiteral(node)) {
|
|
110
|
-
const members = node.getMembers();
|
|
111
|
-
const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
|
|
112
|
-
// Check if it has only one index signature [k: string]: unknown
|
|
113
|
-
if (Arr.isArrayOfLength(members, 1) &&
|
|
114
|
-
Arr.isArrayOfLength(indexSigs, 1) &&
|
|
115
|
-
isStringUnknownIndexSignature(indexSigs[0])) {
|
|
116
|
-
node.replaceWithText('UnknownRecord');
|
|
58
|
+
if (tsm.Node.isTypeReference(node)) {
|
|
59
|
+
if (node.getTypeName().getText() === "Readonly") {
|
|
60
|
+
const typeArgs = node.getTypeArguments();
|
|
61
|
+
if (Arr.isArrayOfLength(typeArgs, 1)) {
|
|
62
|
+
const typeArg = typeArgs[0];
|
|
63
|
+
if (tsm.Node.isTypeLiteral(typeArg)) {
|
|
64
|
+
const members = typeArg.getMembers();
|
|
65
|
+
const indexSigs = members.filter(
|
|
66
|
+
(m) => tsm.Node.isIndexSignatureDeclaration(m)
|
|
67
|
+
);
|
|
68
|
+
if (Arr.isArrayOfLength(members, 1) && Arr.isArrayOfLength(indexSigs, 1) && isStringUnknownIndexSignature(indexSigs[0])) {
|
|
69
|
+
node.replaceWithText("UnknownRecord");
|
|
117
70
|
return true;
|
|
71
|
+
}
|
|
72
|
+
return visitTypeNode(typeArg);
|
|
118
73
|
}
|
|
119
|
-
|
|
120
|
-
.map((member) => {
|
|
121
|
-
if (tsm.Node.isPropertySignature(member)) {
|
|
122
|
-
const typeNode = member.getTypeNode();
|
|
123
|
-
return typeNode === undefined ? false : visitTypeNode(typeNode);
|
|
124
|
-
}
|
|
125
|
-
if (tsm.Node.isIndexSignatureDeclaration(member)) {
|
|
126
|
-
const typeNode = member.getReturnTypeNode();
|
|
127
|
-
return typeNode === undefined ? false : visitTypeNode(typeNode);
|
|
128
|
-
}
|
|
129
|
-
return false;
|
|
130
|
-
})
|
|
131
|
-
.includes(true);
|
|
74
|
+
}
|
|
132
75
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
76
|
+
return replaceIfRecordUnknown(node);
|
|
77
|
+
}
|
|
78
|
+
if (tsm.Node.isTypeLiteral(node)) {
|
|
79
|
+
const members = node.getMembers();
|
|
80
|
+
const indexSigs = members.filter(
|
|
81
|
+
(m) => tsm.Node.isIndexSignatureDeclaration(m)
|
|
82
|
+
);
|
|
83
|
+
if (Arr.isArrayOfLength(members, 1) && Arr.isArrayOfLength(indexSigs, 1) && isStringUnknownIndexSignature(indexSigs[0])) {
|
|
84
|
+
node.replaceWithText("UnknownRecord");
|
|
85
|
+
return true;
|
|
139
86
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return
|
|
87
|
+
return members.map((member) => {
|
|
88
|
+
if (tsm.Node.isPropertySignature(member)) {
|
|
89
|
+
const typeNode = member.getTypeNode();
|
|
90
|
+
return typeNode === void 0 ? false : visitTypeNode(typeNode);
|
|
91
|
+
}
|
|
92
|
+
if (tsm.Node.isIndexSignatureDeclaration(member)) {
|
|
93
|
+
const typeNode = member.getReturnTypeNode();
|
|
94
|
+
return typeNode === void 0 ? false : visitTypeNode(typeNode);
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}).includes(true);
|
|
98
|
+
}
|
|
99
|
+
if (tsm.Node.isUnionTypeNode(node) || tsm.Node.isIntersectionTypeNode(node)) {
|
|
100
|
+
return node.getTypeNodes().map((typeNode) => visitTypeNode(typeNode)).includes(true);
|
|
101
|
+
}
|
|
102
|
+
if (tsm.Node.isArrayTypeNode(node)) {
|
|
103
|
+
return visitTypeNode(node.getElementTypeNode());
|
|
104
|
+
}
|
|
105
|
+
if (tsm.Node.isTupleTypeNode(node)) {
|
|
106
|
+
return node.getElements().map((element) => visitTypeNode(element)).includes(true);
|
|
107
|
+
}
|
|
108
|
+
if (tsm.Node.isParenthesizedTypeNode(node)) {
|
|
109
|
+
return visitTypeNode(node.getTypeNode());
|
|
110
|
+
}
|
|
111
|
+
if (tsm.Node.isTypeOperatorTypeNode(node)) {
|
|
112
|
+
return visitTypeNode(node.getTypeNode());
|
|
113
|
+
}
|
|
114
|
+
if (tsm.Node.isRestTypeNode(node)) {
|
|
115
|
+
return visitTypeNode(node.getTypeNode());
|
|
116
|
+
}
|
|
117
|
+
if (tsm.Node.isNamedTupleMember(node)) {
|
|
118
|
+
return visitTypeNode(node.getTypeNode());
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
163
121
|
};
|
|
164
122
|
const isStringUnknownIndexSignature = (sig) => {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
123
|
+
const keyType = sig.getKeyTypeNode();
|
|
124
|
+
const returnType = sig.getReturnTypeNode();
|
|
125
|
+
return keyType.getText() === "string" && returnType?.getText() === "unknown";
|
|
168
126
|
};
|
|
169
127
|
const replaceIfRecordUnknown = (node) => {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (innerTypeName === 'Record') {
|
|
192
|
-
const innerTypeArgs = innerType.getTypeArguments();
|
|
193
|
-
if (Arr.isArrayOfLength(innerTypeArgs, 2) &&
|
|
194
|
-
innerTypeArgs[0].getText() === 'string' &&
|
|
195
|
-
innerTypeArgs[1].getText() === 'unknown') {
|
|
196
|
-
node.replaceWithText('UnknownRecord');
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
// Otherwise, recurse into the type argument
|
|
202
|
-
return visitTypeNode(innerType);
|
|
128
|
+
const typeName = node.getTypeName().getText();
|
|
129
|
+
switch (typeName) {
|
|
130
|
+
case "Record": {
|
|
131
|
+
const typeArgs = node.getTypeArguments();
|
|
132
|
+
if (Arr.isArrayOfLength(typeArgs, 2) && typeArgs[0].getText() === "string" && typeArgs[1].getText() === "unknown") {
|
|
133
|
+
node.replaceWithText("UnknownRecord");
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
return typeArgs.map((typeArg) => visitTypeNode(typeArg)).includes(true);
|
|
137
|
+
}
|
|
138
|
+
case "Readonly": {
|
|
139
|
+
const typeArgs = node.getTypeArguments();
|
|
140
|
+
if (Arr.isArrayOfLength(typeArgs, 1)) {
|
|
141
|
+
const innerType = typeArgs[0];
|
|
142
|
+
if (tsm.Node.isTypeReference(innerType)) {
|
|
143
|
+
const innerTypeName = innerType.getTypeName().getText();
|
|
144
|
+
if (innerTypeName === "Record") {
|
|
145
|
+
const innerTypeArgs = innerType.getTypeArguments();
|
|
146
|
+
if (Arr.isArrayOfLength(innerTypeArgs, 2) && innerTypeArgs[0].getText() === "string" && innerTypeArgs[1].getText() === "unknown") {
|
|
147
|
+
node.replaceWithText("UnknownRecord");
|
|
148
|
+
return true;
|
|
203
149
|
}
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
default: {
|
|
207
|
-
// Recurse into type arguments for any other generic type
|
|
208
|
-
return node
|
|
209
|
-
.getTypeArguments()
|
|
210
|
-
.map((typeArg) => visitTypeNode(typeArg))
|
|
211
|
-
.includes(true);
|
|
150
|
+
}
|
|
212
151
|
}
|
|
152
|
+
return visitTypeNode(innerType);
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
default: {
|
|
157
|
+
return node.getTypeArguments().map((typeArg) => visitTypeNode(typeArg)).includes(true);
|
|
213
158
|
}
|
|
159
|
+
}
|
|
214
160
|
};
|
|
215
161
|
const ensureUnknownRecordImport = (sourceFile) => {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
moduleSpecifier: UNKNOWN_RECORD_MODULE,
|
|
222
|
-
namedImports: [{ name: UNKNOWN_RECORD_NAME, isTypeOnly: true }],
|
|
223
|
-
});
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
const alreadyImported = existingImport
|
|
227
|
-
.getNamedImports()
|
|
228
|
-
.some((ni) => ni.getName() === UNKNOWN_RECORD_NAME);
|
|
229
|
-
if (alreadyImported)
|
|
230
|
-
return;
|
|
231
|
-
existingImport.addNamedImport({
|
|
232
|
-
name: UNKNOWN_RECORD_NAME,
|
|
233
|
-
isTypeOnly: true,
|
|
162
|
+
const existingImport = sourceFile.getImportDeclarations().find((decl) => decl.getModuleSpecifierValue() === UNKNOWN_RECORD_MODULE);
|
|
163
|
+
if (existingImport === void 0) {
|
|
164
|
+
sourceFile.insertImportDeclaration(0, {
|
|
165
|
+
moduleSpecifier: UNKNOWN_RECORD_MODULE,
|
|
166
|
+
namedImports: [{ name: UNKNOWN_RECORD_NAME, isTypeOnly: true }]
|
|
234
167
|
});
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const alreadyImported = existingImport.getNamedImports().some((ni) => ni.getName() === UNKNOWN_RECORD_NAME);
|
|
171
|
+
if (alreadyImported) return;
|
|
172
|
+
existingImport.addNamedImport({
|
|
173
|
+
name: UNKNOWN_RECORD_NAME,
|
|
174
|
+
isTypeOnly: true
|
|
175
|
+
});
|
|
235
176
|
};
|
|
236
177
|
|
|
237
178
|
export { replaceRecordWithUnknownRecordTransformer };
|
|
@@ -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":"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"}
|
|
1
|
+
{"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../../src/functions/ast-transformers/replace-record-with-unknown-record.mts"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types -- ts-morph uses mutable types */\nimport { Arr } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { hasDisableNextLineComment } from '../functions/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'replace-record-with-unknown-record';\n\nconst UNKNOWN_RECORD_MODULE = 'ts-type-forge';\n\nconst UNKNOWN_RECORD_NAME = 'UnknownRecord';\n\n/**\n * Replaces `Readonly<Record<string, unknown>>`, `Record<string, unknown>`,\n * and index signatures `[k: string]: unknown` with `UnknownRecord`.\n *\n * When a replacement occurs, also inserts\n * `import { type UnknownRecord } from 'ts-type-forge';` at the top of the\n * source file (or merges into an existing import from `'ts-type-forge'`).\n */\nexport const replaceRecordWithUnknownRecordTransformer =\n (): TsMorphTransformer =>\n ({\n name: TRANSFORMER_NAME,\n transform: (sourceAst) => {\n const containerModifications = Arr.toUnshifted(\n sourceAst\n .getModules()\n .map((namespace) => processDeclarations(namespace)),\n processDeclarations(sourceAst),\n );\n\n if (containerModifications.includes(true)) {\n ensureUnknownRecordImport(sourceAst);\n }\n },\n }) as const;\n\nconst processDeclarations = (\n container: tsm.SourceFile | tsm.ModuleDeclaration,\n): boolean => {\n const typeAliasModifications = container.getTypeAliases().map((typeAlias) => {\n if (hasDisableNextLineComment(typeAlias, TRANSFORMER_NAME)) {\n return false;\n }\n\n const typeNode = typeAlias.getTypeNode();\n\n if (typeNode === undefined) return false;\n\n return visitTypeNode(typeNode);\n });\n\n const interfaceModifications = container\n .getInterfaces()\n .map((interfaceDecl) => processInterfaceDeclaration(interfaceDecl));\n\n return [...typeAliasModifications, ...interfaceModifications].includes(true);\n};\n\nconst processInterfaceDeclaration = (\n interfaceDecl: tsm.InterfaceDeclaration,\n): boolean => {\n if (hasDisableNextLineComment(interfaceDecl, TRANSFORMER_NAME)) {\n return false;\n }\n\n // Check if interface has index signature [k: string]: unknown\n const indexSignatures = interfaceDecl.getIndexSignatures();\n\n const hasStringUnknownSignature = indexSignatures.some((sig) => {\n const keyType = sig.getKeyType();\n\n const returnType = sig.getReturnType();\n\n return keyType.getText() === 'string' && returnType.getText() === 'unknown';\n });\n\n // If it has the signature and no other members, replace entire interface with type alias.\n // Skip when the interface carries semantics that a plain type alias would lose\n // (type parameters, extends clauses, declare modifier, default export).\n if (\n hasStringUnknownSignature &&\n Arr.isArrayOfLength(interfaceDecl.getProperties(), 0) &&\n Arr.isArrayOfLength(indexSignatures, 1) &&\n Arr.isArrayOfLength(interfaceDecl.getTypeParameters(), 0) &&\n Arr.isArrayOfLength(interfaceDecl.getExtends(), 0) &&\n !interfaceDecl.hasDeclareKeyword() &&\n !interfaceDecl.hasDefaultKeyword()\n ) {\n const exportPrefix = interfaceDecl.hasExportKeyword() ? 'export ' : '';\n\n const interfaceName = interfaceDecl.getName();\n\n interfaceDecl.replaceWithText(\n `${exportPrefix}type ${interfaceName} = UnknownRecord;`,\n );\n\n return true;\n }\n\n // Otherwise, check properties for Record types\n return interfaceDecl\n .getProperties()\n .map((property) => {\n const typeNode = property.getTypeNode();\n\n if (typeNode === undefined) return false;\n\n return visitTypeNode(typeNode);\n })\n .includes(true);\n};\n\nconst visitTypeNode = (node: tsm.TypeNode): boolean => {\n if (tsm.Node.isTypeReference(node)) {\n // Check if it's Readonly<{ [k: string]: unknown }>\n if (node.getTypeName().getText() === 'Readonly') {\n const typeArgs = node.getTypeArguments();\n\n if (Arr.isArrayOfLength(typeArgs, 1)) {\n const typeArg = typeArgs[0];\n\n if (tsm.Node.isTypeLiteral(typeArg)) {\n const members = typeArg.getMembers();\n\n const indexSigs = members.filter((m) =>\n tsm.Node.isIndexSignatureDeclaration(m),\n );\n\n // Check if it has only one index signature [k: string]: unknown\n if (\n Arr.isArrayOfLength(members, 1) &&\n Arr.isArrayOfLength(indexSigs, 1) &&\n isStringUnknownIndexSignature(indexSigs[0])\n ) {\n node.replaceWithText('UnknownRecord');\n\n return true;\n }\n\n // Otherwise, recurse into the type literal to visit its properties\n return visitTypeNode(typeArg);\n }\n }\n }\n\n return replaceIfRecordUnknown(node);\n }\n\n // Check for type literal { [k: string]: unknown }\n if (tsm.Node.isTypeLiteral(node)) {\n const members = node.getMembers();\n\n const indexSigs = members.filter((m) =>\n tsm.Node.isIndexSignatureDeclaration(m),\n );\n\n // Check if it has only one index signature [k: string]: unknown\n if (\n Arr.isArrayOfLength(members, 1) &&\n Arr.isArrayOfLength(indexSigs, 1) &&\n isStringUnknownIndexSignature(indexSigs[0])\n ) {\n node.replaceWithText('UnknownRecord');\n\n return true;\n }\n\n return members\n .map((member) => {\n if (tsm.Node.isPropertySignature(member)) {\n const typeNode = member.getTypeNode();\n\n return typeNode === undefined ? false : visitTypeNode(typeNode);\n }\n\n if (tsm.Node.isIndexSignatureDeclaration(member)) {\n const typeNode = member.getReturnTypeNode();\n\n return typeNode === undefined ? false : visitTypeNode(typeNode);\n }\n\n return false;\n })\n .includes(true);\n }\n\n // Recursively visit child type nodes\n if (tsm.Node.isUnionTypeNode(node) || tsm.Node.isIntersectionTypeNode(node)) {\n return node\n .getTypeNodes()\n .map((typeNode) => visitTypeNode(typeNode))\n .includes(true);\n }\n\n if (tsm.Node.isArrayTypeNode(node)) {\n return visitTypeNode(node.getElementTypeNode());\n }\n\n if (tsm.Node.isTupleTypeNode(node)) {\n return node\n .getElements()\n .map((element) => visitTypeNode(element))\n .includes(true);\n }\n\n if (tsm.Node.isParenthesizedTypeNode(node)) {\n return visitTypeNode(node.getTypeNode());\n }\n\n // Handles `readonly T[]`, `readonly [...]`, `keyof T`\n if (tsm.Node.isTypeOperatorTypeNode(node)) {\n return visitTypeNode(node.getTypeNode());\n }\n\n if (tsm.Node.isRestTypeNode(node)) {\n return visitTypeNode(node.getTypeNode());\n }\n\n if (tsm.Node.isNamedTupleMember(node)) {\n return visitTypeNode(node.getTypeNode());\n }\n\n return false;\n};\n\nconst isStringUnknownIndexSignature = (\n sig: tsm.IndexSignatureDeclaration,\n): boolean => {\n const keyType = sig.getKeyTypeNode();\n\n const returnType = sig.getReturnTypeNode();\n\n return keyType.getText() === 'string' && returnType?.getText() === 'unknown';\n};\n\nconst replaceIfRecordUnknown = (node: tsm.TypeReferenceNode): boolean => {\n const typeName = node.getTypeName().getText();\n\n switch (typeName) {\n case 'Record': {\n // Check if it's Record<string, unknown>\n const typeArgs = node.getTypeArguments();\n\n if (\n Arr.isArrayOfLength(typeArgs, 2) &&\n typeArgs[0].getText() === 'string' &&\n typeArgs[1].getText() === 'unknown'\n ) {\n node.replaceWithText('UnknownRecord');\n\n return true;\n }\n\n // Recurse into type arguments (e.g. Record<string, Record<string, unknown>>)\n return typeArgs.map((typeArg) => visitTypeNode(typeArg)).includes(true);\n }\n case 'Readonly': {\n // Check if it's Readonly<Record<string, unknown>>\n const typeArgs = node.getTypeArguments();\n\n if (Arr.isArrayOfLength(typeArgs, 1)) {\n const innerType = typeArgs[0];\n\n if (tsm.Node.isTypeReference(innerType)) {\n const innerTypeName = innerType.getTypeName().getText();\n\n if (innerTypeName === 'Record') {\n const innerTypeArgs = innerType.getTypeArguments();\n\n if (\n Arr.isArrayOfLength(innerTypeArgs, 2) &&\n innerTypeArgs[0].getText() === 'string' &&\n innerTypeArgs[1].getText() === 'unknown'\n ) {\n node.replaceWithText('UnknownRecord');\n\n return true;\n }\n }\n }\n\n // Otherwise, recurse into the type argument\n return visitTypeNode(innerType);\n }\n\n return false;\n }\n\n default: {\n // Recurse into type arguments for any other generic type\n return node\n .getTypeArguments()\n .map((typeArg) => visitTypeNode(typeArg))\n .includes(true);\n }\n }\n};\n\nconst ensureUnknownRecordImport = (sourceFile: tsm.SourceFile): void => {\n const existingImport = sourceFile\n .getImportDeclarations()\n .find((decl) => decl.getModuleSpecifierValue() === UNKNOWN_RECORD_MODULE);\n\n if (existingImport === undefined) {\n sourceFile.insertImportDeclaration(0, {\n moduleSpecifier: UNKNOWN_RECORD_MODULE,\n namedImports: [{ name: UNKNOWN_RECORD_NAME, isTypeOnly: true }],\n });\n\n return;\n }\n\n const alreadyImported = existingImport\n .getNamedImports()\n .some((ni) => ni.getName() === UNKNOWN_RECORD_NAME);\n\n if (alreadyImported) return;\n\n existingImport.addNamedImport({\n name: UNKNOWN_RECORD_NAME,\n isTypeOnly: true,\n });\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-source-code.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA4EtD,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"transform-source-code.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA4EtD,eAAO,MAAM,mBAAmB,SACxB,MAAM,SACL,OAAO,gBACA,SAAS,kBAAkB,EAAE,UACpC,OAAO,KACb,MAgCF,CAAC"}
|