ts-codemod-lib 2.2.0 → 2.2.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 (107) hide show
  1. package/dist/cmd/append-as-const.mjs +51 -48
  2. package/dist/cmd/append-as-const.mjs.map +1 -1
  3. package/dist/cmd/convert-interface-to-type.mjs +51 -48
  4. package/dist/cmd/convert-interface-to-type.mjs.map +1 -1
  5. package/dist/cmd/convert-to-readonly.mjs +51 -48
  6. package/dist/cmd/convert-to-readonly.mjs.map +1 -1
  7. package/dist/cmd/replace-any-with-unknown.mjs +51 -48
  8. package/dist/cmd/replace-any-with-unknown.mjs.map +1 -1
  9. package/dist/cmd/replace-record-with-unknown-record.mjs +51 -48
  10. package/dist/cmd/replace-record-with-unknown-record.mjs.map +1 -1
  11. package/dist/cmd/run-transformer-cli.d.mts.map +1 -1
  12. package/dist/cmd/run-transformer-cli.mjs +138 -127
  13. package/dist/cmd/run-transformer-cli.mjs.map +1 -1
  14. package/dist/entry-point.mjs +1 -0
  15. package/dist/entry-point.mjs.map +1 -1
  16. package/dist/functions/ast-transformers/append-as-const.d.mts.map +1 -1
  17. package/dist/functions/ast-transformers/append-as-const.mjs +205 -191
  18. package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
  19. package/dist/functions/ast-transformers/convert-interface-to-type.mjs +62 -82
  20. package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -1
  21. package/dist/functions/ast-transformers/convert-to-readonly.d.mts.map +1 -1
  22. package/dist/functions/ast-transformers/convert-to-readonly.mjs +743 -828
  23. package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
  24. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.d.mts.map +1 -1
  25. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs +2 -14
  26. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs.map +1 -1
  27. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.d.mts +2 -1
  28. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.d.mts.map +1 -1
  29. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs +8 -8
  30. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs.map +1 -1
  31. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.d.mts.map +1 -1
  32. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs +51 -62
  33. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs.map +1 -1
  34. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts +12 -12
  35. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts.map +1 -1
  36. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs +16 -14
  37. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map +1 -1
  38. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs +25 -27
  39. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs.map +1 -1
  40. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +149 -208
  41. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
  42. package/dist/functions/ast-transformers/transform-source-code.d.mts.map +1 -1
  43. package/dist/functions/ast-transformers/transform-source-code.mjs +70 -72
  44. package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
  45. package/dist/functions/constants/ignore-comment-text.d.mts +2 -2
  46. package/dist/functions/constants/ignore-comment-text.d.mts.map +1 -1
  47. package/dist/functions/constants/ignore-comment-text.mjs +8 -8
  48. package/dist/functions/constants/ignore-comment-text.mjs.map +1 -1
  49. package/dist/functions/functions/has-disable-next-line-comment.d.mts.map +1 -1
  50. package/dist/functions/functions/has-disable-next-line-comment.mjs +33 -65
  51. package/dist/functions/functions/has-disable-next-line-comment.mjs.map +1 -1
  52. package/dist/functions/functions/index.d.mts +1 -0
  53. package/dist/functions/functions/index.d.mts.map +1 -1
  54. package/dist/functions/functions/index.mjs +1 -0
  55. package/dist/functions/functions/index.mjs.map +1 -1
  56. package/dist/functions/functions/is-as-const-node.d.mts +1 -1
  57. package/dist/functions/functions/is-as-const-node.d.mts.map +1 -1
  58. package/dist/functions/functions/is-as-const-node.mjs +15 -23
  59. package/dist/functions/functions/is-as-const-node.mjs.map +1 -1
  60. package/dist/functions/functions/is-atomic-type-node.d.mts.map +1 -1
  61. package/dist/functions/functions/is-atomic-type-node.mjs +22 -36
  62. package/dist/functions/functions/is-atomic-type-node.mjs.map +1 -1
  63. package/dist/functions/functions/is-conditional-type-distribution-guard.d.mts +23 -0
  64. package/dist/functions/functions/is-conditional-type-distribution-guard.d.mts.map +1 -0
  65. package/dist/functions/functions/is-conditional-type-distribution-guard.mjs +16 -0
  66. package/dist/functions/functions/is-conditional-type-distribution-guard.mjs.map +1 -0
  67. package/dist/functions/functions/is-readonly-node.d.mts.map +1 -1
  68. package/dist/functions/functions/is-readonly-node.mjs +11 -21
  69. package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
  70. package/dist/functions/functions/is-spread-parameter-node.d.mts.map +1 -1
  71. package/dist/functions/functions/is-spread-parameter-node.mjs +2 -4
  72. package/dist/functions/functions/is-spread-parameter-node.mjs.map +1 -1
  73. package/dist/functions/functions/remove-parentheses.d.mts.map +1 -1
  74. package/dist/functions/functions/remove-parentheses.mjs +1 -4
  75. package/dist/functions/functions/remove-parentheses.mjs.map +1 -1
  76. package/dist/functions/functions/should-avoid-parentheses-for-readonly.d.mts.map +1 -1
  77. package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs +7 -24
  78. package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs.map +1 -1
  79. package/dist/functions/functions/unwrap-readonly.d.mts.map +1 -1
  80. package/dist/functions/functions/unwrap-readonly.mjs +1 -3
  81. package/dist/functions/functions/unwrap-readonly.mjs.map +1 -1
  82. package/dist/functions/functions/wrap-with-parentheses.d.mts.map +1 -1
  83. package/dist/functions/functions/wrap-with-parentheses.mjs +26 -51
  84. package/dist/functions/functions/wrap-with-parentheses.mjs.map +1 -1
  85. package/dist/functions/index.mjs +1 -0
  86. package/dist/functions/index.mjs.map +1 -1
  87. package/dist/functions/utils/replace-with-debug.d.mts.map +1 -1
  88. package/dist/functions/utils/replace-with-debug.mjs +2 -2
  89. package/dist/functions/utils/replace-with-debug.mjs.map +1 -1
  90. package/dist/index.mjs +1 -0
  91. package/dist/index.mjs.map +1 -1
  92. package/package.json +32 -31
  93. package/src/cmd/append-as-const.mts +3 -3
  94. package/src/cmd/convert-interface-to-type.mts +3 -3
  95. package/src/cmd/convert-to-readonly.mts +3 -3
  96. package/src/cmd/replace-any-with-unknown.mts +3 -3
  97. package/src/cmd/replace-record-with-unknown-record.mts +3 -3
  98. package/src/cmd/run-transformer-cli.mts +21 -17
  99. package/src/functions/ast-transformers/convert-interface-to-type.mts +1 -1
  100. package/src/functions/ast-transformers/convert-to-readonly.mts +77 -37
  101. package/src/functions/ast-transformers/convert-to-readonly.test.mts +117 -1
  102. package/src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts +6 -6
  103. package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +4 -4
  104. package/src/functions/functions/has-disable-next-line-comment.mts +5 -5
  105. package/src/functions/functions/index.mts +1 -0
  106. package/src/functions/functions/is-conditional-type-distribution-guard.mts +45 -0
  107. 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 = 'replace-any-with-unknown';
7
+ const TRANSFORMER_NAME = "replace-any-with-unknown";
8
8
  const replaceAnyWithUnknownTransformer = () => ({
9
- name: TRANSFORMER_NAME,
10
- transform: (sourceAst) => {
11
- for (const node of sourceAst.getChildren()) {
12
- transformNode(node);
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
- 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 !== undefined &&
25
- // `(...args: any) => any` -> `(...args: unknown[]) => any`
26
- (isSpreadParameterNode(parent) ||
27
- // `[name: E0, ...args: any)]` -> `[name: E0, ...args: unknown[]]`
28
- isSpreadNamedTupleMemberNode(parent))) {
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":[null],"names":[],"mappings":";;;;;;AAQA,MAAM,gBAAgB,GAAG,0BAA0B;AAE5C,MAAM,gCAAgC,GAAG,OAC7C;AACC,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,SAAS,EAAE,CAAC,SAAS,KAAI;QACvB,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;YAC1C,aAAa,CAAC,IAAI,CAAC;QACrB;IACF,CAAC;AACF,CAAA;AAEH,MAAM,aAAa,GAAG,CAAC,IAAc,KAAU;AAC7C,IAAA,IAAI,yBAAyB,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE;AACrD,QAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC;QAErD;IACF;IAEA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;QAC1C,MAAM,cAAc,GAAG,IAAI;AAE3B,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE;QAEzC,IACE,MAAM,KAAK,SAAS;;aAEnB,qBAAqB,CAAC,MAAM,CAAC;;AAE5B,gBAAA,4BAA4B,CAAC,MAAM,CAAC,CAAC,EACvC;AACA,YAAA,cAAc,CAAC,eAAe,CAAC,oBAAoB,CAAC;YAEpD;QACF;AAEA,QAAA,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC;QAEzC;IACF;IAEA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;QACtC,aAAa,CAAC,KAAK,CAAC;IACtB;AACF,CAAC;;;;"}
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
- /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types -- ts-morph uses mutable types */
7
- const TRANSFORMER_NAME = 'replace-record-with-unknown-record';
8
- const UNKNOWN_RECORD_MODULE = 'ts-type-forge';
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
- name: TRANSFORMER_NAME,
20
- transform: (sourceAst) => {
21
- const containerModifications = [
22
- processDeclarations(sourceAst),
23
- ...sourceAst
24
- .getModules()
25
- .map((namespace) => processDeclarations(namespace)),
26
- ];
27
- if (containerModifications.includes(true)) {
28
- ensureUnknownRecordImport(sourceAst);
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
- const typeAliasModifications = container.getTypeAliases().map((typeAlias) => {
34
- if (hasDisableNextLineComment(typeAlias, TRANSFORMER_NAME)) {
35
- return false;
36
- }
37
- const typeNode = typeAlias.getTypeNode();
38
- if (typeNode === undefined)
39
- return false;
40
- return visitTypeNode(typeNode);
41
- });
42
- const interfaceModifications = container
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
- if (hasDisableNextLineComment(interfaceDecl, TRANSFORMER_NAME)) {
49
- return false;
50
- }
51
- // Check if interface has index signature [k: string]: unknown
52
- const indexSignatures = interfaceDecl.getIndexSignatures();
53
- const hasStringUnknownSignature = indexSignatures.some((sig) => {
54
- const keyType = sig.getKeyType();
55
- const returnType = sig.getReturnType();
56
- return keyType.getText() === 'string' && returnType.getText() === 'unknown';
57
- });
58
- // If it has the signature and no other members, replace entire interface with type alias.
59
- // Skip when the interface carries semantics that a plain type alias would lose
60
- // (type parameters, extends clauses, declare modifier, default export).
61
- if (hasStringUnknownSignature &&
62
- Arr.isArrayOfLength(interfaceDecl.getProperties(), 0) &&
63
- Arr.isArrayOfLength(indexSignatures, 1) &&
64
- Arr.isArrayOfLength(interfaceDecl.getTypeParameters(), 0) &&
65
- Arr.isArrayOfLength(interfaceDecl.getExtends(), 0) &&
66
- !interfaceDecl.hasDeclareKeyword() &&
67
- !interfaceDecl.hasDefaultKeyword()) {
68
- const exportPrefix = interfaceDecl.hasExportKeyword() ? 'export ' : '';
69
- const interfaceName = interfaceDecl.getName();
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
- if (tsm.Node.isTypeReference(node)) {
86
- // Check if it's Readonly<{ [k: string]: unknown }>
87
- if (node.getTypeName().getText() === 'Readonly') {
88
- const typeArgs = node.getTypeArguments();
89
- if (Arr.isArrayOfLength(typeArgs, 1)) {
90
- const typeArg = typeArgs[0];
91
- if (tsm.Node.isTypeLiteral(typeArg)) {
92
- const members = typeArg.getMembers();
93
- const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
94
- // Check if it has only one index signature [k: string]: unknown
95
- if (Arr.isArrayOfLength(members, 1) &&
96
- Arr.isArrayOfLength(indexSigs, 1) &&
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
- return members
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
- // Recursively visit child type nodes
134
- if (tsm.Node.isUnionTypeNode(node) || tsm.Node.isIntersectionTypeNode(node)) {
135
- return node
136
- .getTypeNodes()
137
- .map((typeNode) => visitTypeNode(typeNode))
138
- .includes(true);
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
- if (tsm.Node.isArrayTypeNode(node)) {
141
- return visitTypeNode(node.getElementTypeNode());
142
- }
143
- if (tsm.Node.isTupleTypeNode(node)) {
144
- return node
145
- .getElements()
146
- .map((element) => visitTypeNode(element))
147
- .includes(true);
148
- }
149
- if (tsm.Node.isParenthesizedTypeNode(node)) {
150
- return visitTypeNode(node.getTypeNode());
151
- }
152
- // Handles `readonly T[]`, `readonly [...]`, `keyof T`
153
- if (tsm.Node.isTypeOperatorTypeNode(node)) {
154
- return visitTypeNode(node.getTypeNode());
155
- }
156
- if (tsm.Node.isRestTypeNode(node)) {
157
- return visitTypeNode(node.getTypeNode());
158
- }
159
- if (tsm.Node.isNamedTupleMember(node)) {
160
- return visitTypeNode(node.getTypeNode());
161
- }
162
- return false;
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
- const keyType = sig.getKeyTypeNode();
166
- const returnType = sig.getReturnTypeNode();
167
- return keyType.getText() === 'string' && returnType?.getText() === 'unknown';
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
- const typeName = node.getTypeName().getText();
171
- switch (typeName) {
172
- case 'Record': {
173
- // Check if it's Record<string, unknown>
174
- const typeArgs = node.getTypeArguments();
175
- if (Arr.isArrayOfLength(typeArgs, 2) &&
176
- typeArgs[0].getText() === 'string' &&
177
- typeArgs[1].getText() === 'unknown') {
178
- node.replaceWithText('UnknownRecord');
179
- return true;
180
- }
181
- // Recurse into type arguments (e.g. Record<string, Record<string, unknown>>)
182
- return typeArgs.map((typeArg) => visitTypeNode(typeArg)).includes(true);
183
- }
184
- case 'Readonly': {
185
- // Check if it's Readonly<Record<string, unknown>>
186
- const typeArgs = node.getTypeArguments();
187
- if (Arr.isArrayOfLength(typeArgs, 1)) {
188
- const innerType = typeArgs[0];
189
- if (tsm.Node.isTypeReference(innerType)) {
190
- const innerTypeName = innerType.getTypeName().getText();
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
- return false;
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
- const existingImport = sourceFile
217
- .getImportDeclarations()
218
- .find((decl) => decl.getModuleSpecifierValue() === UNKNOWN_RECORD_MODULE);
219
- if (existingImport === undefined) {
220
- sourceFile.insertImportDeclaration(0, {
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,GAC9B,MAAM,MAAM,EACZ,OAAO,OAAO,EACd,cAAc,SAAS,kBAAkB,EAAE,EAC3C,QAAO,OAAe,KACrB,MAgCF,CAAC"}
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"}