ts-codemod-lib 3.3.0 → 3.3.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 (86) hide show
  1. package/README.md +22 -0
  2. package/dist/entry-point.mjs +2 -24
  3. package/dist/entry-point.mjs.map +1 -1
  4. package/dist/functions/ast-transformers/append-as-const.mjs +330 -292
  5. package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
  6. package/dist/functions/ast-transformers/convert-interface-to-type.mjs +85 -70
  7. package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -1
  8. package/dist/functions/ast-transformers/convert-to-readonly.d.mts.map +1 -1
  9. package/dist/functions/ast-transformers/convert-to-readonly.mjs +971 -838
  10. package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
  11. package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.d.mts +32 -9
  12. package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.d.mts.map +1 -1
  13. package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.mjs +299 -134
  14. package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.mjs.map +1 -1
  15. package/dist/functions/ast-transformers/index.mjs +10 -12
  16. package/dist/functions/ast-transformers/index.mjs.map +1 -1
  17. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs +14 -7
  18. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs.map +1 -1
  19. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs +12 -15
  20. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs.map +1 -1
  21. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.d.mts.map +1 -1
  22. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs +70 -59
  23. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs.map +1 -1
  24. package/dist/functions/ast-transformers/readonly-transformer-helpers/index.mjs +5 -5
  25. package/dist/functions/ast-transformers/readonly-transformer-helpers/index.mjs.map +1 -1
  26. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs +15 -20
  27. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map +1 -1
  28. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs +30 -34
  29. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs.map +1 -1
  30. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +197 -156
  31. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
  32. package/dist/functions/ast-transformers/transform-source-code.mjs +74 -75
  33. package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
  34. package/dist/functions/ast-transformers/types.mjs +2 -2
  35. package/dist/functions/ast-transformers/types.mjs.map +1 -1
  36. package/dist/functions/constants/ignore-comment-text.mjs +11 -13
  37. package/dist/functions/constants/ignore-comment-text.mjs.map +1 -1
  38. package/dist/functions/constants/index.mjs +2 -2
  39. package/dist/functions/constants/index.mjs.map +1 -1
  40. package/dist/functions/functions/has-call-or-construct-signature.d.mts +18 -0
  41. package/dist/functions/functions/has-call-or-construct-signature.d.mts.map +1 -0
  42. package/dist/functions/functions/has-call-or-construct-signature.mjs +87 -0
  43. package/dist/functions/functions/has-call-or-construct-signature.mjs.map +1 -0
  44. package/dist/functions/functions/has-disable-next-line-comment.mjs +67 -38
  45. package/dist/functions/functions/has-disable-next-line-comment.mjs.map +1 -1
  46. package/dist/functions/functions/index.d.mts +1 -0
  47. package/dist/functions/functions/index.d.mts.map +1 -1
  48. package/dist/functions/functions/index.mjs +12 -11
  49. package/dist/functions/functions/index.mjs.map +1 -1
  50. package/dist/functions/functions/is-as-const-node.mjs +25 -20
  51. package/dist/functions/functions/is-as-const-node.mjs.map +1 -1
  52. package/dist/functions/functions/is-atomic-type-node.mjs +245 -25
  53. package/dist/functions/functions/is-atomic-type-node.mjs.map +1 -1
  54. package/dist/functions/functions/is-conditional-type-distribution-guard.mjs +34 -13
  55. package/dist/functions/functions/is-conditional-type-distribution-guard.mjs.map +1 -1
  56. package/dist/functions/functions/is-readonly-node.mjs +120 -14
  57. package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
  58. package/dist/functions/functions/is-spread-parameter-node.mjs +5 -6
  59. package/dist/functions/functions/is-spread-parameter-node.mjs.map +1 -1
  60. package/dist/functions/functions/remove-parentheses.mjs +4 -4
  61. package/dist/functions/functions/remove-parentheses.mjs.map +1 -1
  62. package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs +23 -9
  63. package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs.map +1 -1
  64. package/dist/functions/functions/unwrap-readonly.mjs +3 -4
  65. package/dist/functions/functions/unwrap-readonly.mjs.map +1 -1
  66. package/dist/functions/functions/wrap-with-parentheses.d.mts +14 -5
  67. package/dist/functions/functions/wrap-with-parentheses.d.mts.map +1 -1
  68. package/dist/functions/functions/wrap-with-parentheses.mjs +67 -30
  69. package/dist/functions/functions/wrap-with-parentheses.mjs.map +1 -1
  70. package/dist/functions/index.mjs +5 -24
  71. package/dist/functions/index.mjs.map +1 -1
  72. package/dist/functions/utils/index.mjs +2 -2
  73. package/dist/functions/utils/index.mjs.map +1 -1
  74. package/dist/functions/utils/replace-with-debug.mjs +4 -6
  75. package/dist/functions/utils/replace-with-debug.mjs.map +1 -1
  76. package/dist/index.mjs +2 -24
  77. package/dist/index.mjs.map +1 -1
  78. package/package.json +18 -18
  79. package/src/functions/ast-transformers/convert-to-readonly.mts +19 -13
  80. package/src/functions/ast-transformers/convert-to-readonly.test.mts +129 -1
  81. package/src/functions/ast-transformers/enable-no-unchecked-indexed-access.mts +32 -9
  82. package/src/functions/ast-transformers/enable-no-unchecked-indexed-access.test.mts +76 -22
  83. package/src/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mts +8 -1
  84. package/src/functions/functions/has-call-or-construct-signature.mts +120 -0
  85. package/src/functions/functions/index.mts +1 -0
  86. package/src/functions/functions/wrap-with-parentheses.mts +32 -17
@@ -1,179 +1,220 @@
1
+
1
2
  import { Arr } from 'ts-data-forge';
2
3
  import * as tsm from 'ts-morph';
3
- import { hasDisableNextLineComment } from '../functions/has-disable-next-line-comment.mjs';
4
- import '../functions/is-atomic-type-node.mjs';
5
-
6
- const TRANSFORMER_NAME = "replace-record-with-unknown-record";
7
- const UNKNOWN_RECORD_MODULE = "ts-type-forge";
8
- const UNKNOWN_RECORD_NAME = "UnknownRecord";
9
- const replaceRecordWithUnknownRecordTransformer = () => ({
10
- name: TRANSFORMER_NAME,
11
- transform: (sourceAst) => {
12
- const containerModifications = Arr.toUnshifted(
13
- sourceAst.getModules().map(processDeclarations),
14
- processDeclarations(sourceAst)
15
- );
16
- if (containerModifications.includes(true)) {
17
- ensureUnknownRecordImport(sourceAst);
18
- }
19
- }
4
+ import { hasDisableNextLineComment } from '../functions/index.mjs';
5
+ const TRANSFORMER_NAME = 'replace-record-with-unknown-record';
6
+ const UNKNOWN_RECORD_MODULE = 'ts-type-forge';
7
+ const UNKNOWN_RECORD_NAME = 'UnknownRecord';
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+ export const replaceRecordWithUnknownRecordTransformer = () => ({
17
+ name: TRANSFORMER_NAME,
18
+ transform: (sourceAst) => {
19
+ const containerModifications = Arr.toUnshifted(sourceAst.getModules().map(processDeclarations), processDeclarations(sourceAst));
20
+ if (containerModifications.includes(true)) {
21
+ ensureUnknownRecordImport(sourceAst);
22
+ }
23
+ },
20
24
  });
21
25
  const processDeclarations = (container) => {
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(processInterfaceDeclaration);
31
- return [...typeAliasModifications, ...interfaceModifications].includes(true);
26
+ const typeAliasModifications = container.getTypeAliases().map((typeAlias) => {
27
+ if (hasDisableNextLineComment(typeAlias, TRANSFORMER_NAME)) {
28
+ return false;
29
+ }
30
+ const typeNode = typeAlias.getTypeNode();
31
+ if (typeNode === undefined)
32
+ return false;
33
+ return visitTypeNode(typeNode);
34
+ });
35
+ const interfaceModifications = container
36
+ .getInterfaces()
37
+ .map(processInterfaceDeclaration);
38
+ return [...typeAliasModifications, ...interfaceModifications].includes(true);
32
39
  };
33
40
  const processInterfaceDeclaration = (interfaceDecl) => {
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.isEmpty(interfaceDecl.getProperties()) && Arr.isFixedLengthArray(1, indexSignatures) && Arr.isEmpty(interfaceDecl.getTypeParameters()) && Arr.isEmpty(interfaceDecl.getExtends()) && !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);
41
+ if (hasDisableNextLineComment(interfaceDecl, TRANSFORMER_NAME)) {
42
+ return false;
43
+ }
44
+
45
+ const indexSignatures = interfaceDecl.getIndexSignatures();
46
+ const hasStringUnknownSignature = indexSignatures.some((sig) => {
47
+ const keyType = sig.getKeyType();
48
+ const returnType = sig.getReturnType();
49
+ return keyType.getText() === 'string' && returnType.getText() === 'unknown';
50
+ });
51
+
52
+
53
+
54
+ if (hasStringUnknownSignature &&
55
+ Arr.isEmpty(interfaceDecl.getProperties()) &&
56
+ Arr.isFixedLengthArray(1, indexSignatures) &&
57
+ Arr.isEmpty(interfaceDecl.getTypeParameters()) &&
58
+ Arr.isEmpty(interfaceDecl.getExtends()) &&
59
+ !interfaceDecl.hasDeclareKeyword() &&
60
+ !interfaceDecl.hasDefaultKeyword()) {
61
+ const exportPrefix = interfaceDecl.hasExportKeyword() ? 'export ' : '';
62
+ const interfaceName = interfaceDecl.getName();
63
+ interfaceDecl.replaceWithText(`${exportPrefix}type ${interfaceName} = UnknownRecord;`);
64
+ return true;
65
+ }
66
+
67
+ return interfaceDecl
68
+ .getProperties()
69
+ .map((property) => {
70
+ const typeNode = property.getTypeNode();
71
+ if (typeNode === undefined)
72
+ return false;
73
+ return visitTypeNode(typeNode);
74
+ })
75
+ .includes(true);
56
76
  };
57
77
  const visitTypeNode = (node) => {
58
- if (tsm.Node.isTypeReference(node)) {
59
- if (node.getTypeName().getText() === "Readonly") {
60
- const typeArgs = node.getTypeArguments();
61
- if (Arr.isFixedLengthArray(1, typeArgs)) {
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.isFixedLengthArray(1, members) && Arr.isFixedLengthArray(1, indexSigs) && isStringUnknownIndexSignature(indexSigs[0])) {
69
- node.replaceWithText("UnknownRecord");
78
+ if (tsm.Node.isTypeReference(node)) {
79
+
80
+ if (node.getTypeName().getText() === 'Readonly') {
81
+ const typeArgs = node.getTypeArguments();
82
+ if (Arr.isFixedLengthArray(1, typeArgs)) {
83
+ const typeArg = typeArgs[0];
84
+ if (tsm.Node.isTypeLiteral(typeArg)) {
85
+ const members = typeArg.getMembers();
86
+ const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
87
+
88
+ if (Arr.isFixedLengthArray(1, members) &&
89
+ Arr.isFixedLengthArray(1, indexSigs) &&
90
+ isStringUnknownIndexSignature(indexSigs[0])) {
91
+ node.replaceWithText('UnknownRecord');
92
+ return true;
93
+ }
94
+
95
+ return visitTypeNode(typeArg);
96
+ }
97
+ }
98
+ }
99
+ return replaceIfRecordUnknown(node);
100
+ }
101
+
102
+ if (tsm.Node.isTypeLiteral(node)) {
103
+ const members = node.getMembers();
104
+ const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
105
+
106
+ if (Arr.isFixedLengthArray(1, members) &&
107
+ Arr.isFixedLengthArray(1, indexSigs) &&
108
+ isStringUnknownIndexSignature(indexSigs[0])) {
109
+ node.replaceWithText('UnknownRecord');
70
110
  return true;
71
- }
72
- return visitTypeNode(typeArg);
73
111
  }
74
- }
112
+ return members
113
+ .map((member) => {
114
+ if (tsm.Node.isPropertySignature(member)) {
115
+ const typeNode = member.getTypeNode();
116
+ return typeNode === undefined ? false : visitTypeNode(typeNode);
117
+ }
118
+ if (tsm.Node.isIndexSignatureDeclaration(member)) {
119
+ const typeNode = member.getReturnTypeNode();
120
+ return typeNode === undefined ? false : visitTypeNode(typeNode);
121
+ }
122
+ return false;
123
+ })
124
+ .includes(true);
125
+ }
126
+
127
+ if (tsm.Node.isUnionTypeNode(node) || tsm.Node.isIntersectionTypeNode(node)) {
128
+ return node.getTypeNodes().map(visitTypeNode).includes(true);
129
+ }
130
+ if (tsm.Node.isArrayTypeNode(node)) {
131
+ return visitTypeNode(node.getElementTypeNode());
132
+ }
133
+ if (tsm.Node.isTupleTypeNode(node)) {
134
+ return node.getElements().map(visitTypeNode).includes(true);
135
+ }
136
+ if (tsm.Node.isParenthesizedTypeNode(node)) {
137
+ return visitTypeNode(node.getTypeNode());
138
+ }
139
+
140
+ if (tsm.Node.isTypeOperatorTypeNode(node)) {
141
+ return visitTypeNode(node.getTypeNode());
142
+ }
143
+ if (tsm.Node.isRestTypeNode(node)) {
144
+ return visitTypeNode(node.getTypeNode());
75
145
  }
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.isFixedLengthArray(1, members) && Arr.isFixedLengthArray(1, indexSigs) && isStringUnknownIndexSignature(indexSigs[0])) {
84
- node.replaceWithText("UnknownRecord");
85
- return true;
146
+ if (tsm.Node.isNamedTupleMember(node)) {
147
+ return visitTypeNode(node.getTypeNode());
86
148
  }
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(visitTypeNode).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(visitTypeNode).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;
149
+ return false;
121
150
  };
122
151
  const isStringUnknownIndexSignature = (sig) => {
123
- const keyType = sig.getKeyTypeNode();
124
- const returnType = sig.getReturnTypeNode();
125
- return keyType.getText() === "string" && returnType?.getText() === "unknown";
152
+ const keyType = sig.getKeyTypeNode();
153
+ const returnType = sig.getReturnTypeNode();
154
+ return keyType.getText() === 'string' && returnType?.getText() === 'unknown';
126
155
  };
127
156
  const replaceIfRecordUnknown = (node) => {
128
- const typeName = node.getTypeName().getText();
129
- switch (typeName) {
130
- case "Record": {
131
- const typeArgs = node.getTypeArguments();
132
- if (Arr.isFixedLengthArray(2, typeArgs) && typeArgs[0].getText() === "string" && typeArgs[1].getText() === "unknown") {
133
- node.replaceWithText("UnknownRecord");
134
- return true;
135
- }
136
- return typeArgs.map(visitTypeNode).includes(true);
137
- }
138
- case "Readonly": {
139
- const typeArgs = node.getTypeArguments();
140
- if (Arr.isFixedLengthArray(1, typeArgs)) {
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.isFixedLengthArray(2, innerTypeArgs) && innerTypeArgs[0].getText() === "string" && innerTypeArgs[1].getText() === "unknown") {
147
- node.replaceWithText("UnknownRecord");
148
- return true;
157
+ const typeName = node.getTypeName().getText();
158
+ switch (typeName) {
159
+ case 'Record': {
160
+
161
+ const typeArgs = node.getTypeArguments();
162
+ if (Arr.isFixedLengthArray(2, typeArgs) &&
163
+ typeArgs[0].getText() === 'string' &&
164
+ typeArgs[1].getText() === 'unknown') {
165
+ node.replaceWithText('UnknownRecord');
166
+ return true;
149
167
  }
150
- }
168
+
169
+ return typeArgs.map(visitTypeNode).includes(true);
170
+ }
171
+ case 'Readonly': {
172
+
173
+ const typeArgs = node.getTypeArguments();
174
+ if (Arr.isFixedLengthArray(1, typeArgs)) {
175
+ const innerType = typeArgs[0];
176
+ if (tsm.Node.isTypeReference(innerType)) {
177
+ const innerTypeName = innerType.getTypeName().getText();
178
+ if (innerTypeName === 'Record') {
179
+ const innerTypeArgs = innerType.getTypeArguments();
180
+ if (Arr.isFixedLengthArray(2, innerTypeArgs) &&
181
+ innerTypeArgs[0].getText() === 'string' &&
182
+ innerTypeArgs[1].getText() === 'unknown') {
183
+ node.replaceWithText('UnknownRecord');
184
+ return true;
185
+ }
186
+ }
187
+ }
188
+
189
+ return visitTypeNode(innerType);
190
+ }
191
+ return false;
192
+ }
193
+ default: {
194
+
195
+ return node.getTypeArguments().map(visitTypeNode).includes(true);
151
196
  }
152
- return visitTypeNode(innerType);
153
- }
154
- return false;
155
- }
156
- default: {
157
- return node.getTypeArguments().map(visitTypeNode).includes(true);
158
197
  }
159
- }
160
198
  };
161
199
  const ensureUnknownRecordImport = (sourceFile) => {
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 }]
200
+ const existingImport = sourceFile
201
+ .getImportDeclarations()
202
+ .find((decl) => decl.getModuleSpecifierValue() === UNKNOWN_RECORD_MODULE);
203
+ if (existingImport === undefined) {
204
+ sourceFile.insertImportDeclaration(0, {
205
+ moduleSpecifier: UNKNOWN_RECORD_MODULE,
206
+ namedImports: [{ name: UNKNOWN_RECORD_NAME, isTypeOnly: true }],
207
+ });
208
+ return;
209
+ }
210
+ const alreadyImported = existingImport
211
+ .getNamedImports()
212
+ .some((ni) => ni.getName() === UNKNOWN_RECORD_NAME);
213
+ if (alreadyImported)
214
+ return;
215
+ existingImport.addNamedImport({
216
+ name: UNKNOWN_RECORD_NAME,
217
+ isTypeOnly: true,
167
218
  });
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
- });
176
219
  };
177
-
178
- export { replaceRecordWithUnknownRecordTransformer };
179
- //# sourceMappingURL=replace-record-with-unknown-record.mjs.map
220
+ //# sourceMappingURL=replace-record-with-unknown-record.mjs.map
@@ -1 +1 @@
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.getModules().map(processDeclarations),\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(processInterfaceDeclaration);\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.isEmpty(interfaceDecl.getProperties()) &&\n Arr.isFixedLengthArray(1, indexSignatures) &&\n Arr.isEmpty(interfaceDecl.getTypeParameters()) &&\n Arr.isEmpty(interfaceDecl.getExtends()) &&\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.isFixedLengthArray(1, typeArgs)) {\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.isFixedLengthArray(1, members) &&\n Arr.isFixedLengthArray(1, indexSigs) &&\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.isFixedLengthArray(1, members) &&\n Arr.isFixedLengthArray(1, indexSigs) &&\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.getTypeNodes().map(visitTypeNode).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.getElements().map(visitTypeNode).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.isFixedLengthArray(2, typeArgs) &&\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(visitTypeNode).includes(true);\n }\n case 'Readonly': {\n // Check if it's Readonly<Record<string, unknown>>\n const typeArgs = node.getTypeArguments();\n\n if (Arr.isFixedLengthArray(1, typeArgs)) {\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.isFixedLengthArray(2, innerTypeArgs) &&\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.getTypeArguments().map(visitTypeNode).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
+ {"version":3,"file":"replace-record-with-unknown-record.mjs","sourceRoot":"","sources":["../../../src/functions/ast-transformers/replace-record-with-unknown-record.mts"],"names":[],"mappings":"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"}
@@ -1,84 +1,83 @@
1
1
  import { Arr } from 'ts-data-forge';
2
2
  import * as tsm from 'ts-morph';
3
-
4
3
  const extractFileIgnoreTransformers = (code) => {
5
- const patterns = [
6
- {
7
- prefix: "transformer-ignore",
8
- regex: /\/\*\s*transformer-ignore\s*(.*?)\s*\*\//u
9
- },
10
- {
11
- prefix: "ts-codemod-ignore",
12
- regex: /\/\*\s*ts-codemod-ignore\s*(.*?)\s*\*\//u
13
- },
14
- {
15
- prefix: "codemod-ignore",
16
- regex: /\/\*\s*codemod-ignore\s*(.*?)\s*\*\//u
17
- },
18
- {
19
- prefix: "transform-ignore",
20
- regex: /\/\*\s*transform-ignore\s*(.*?)\s*\*\//u
21
- }
22
- ];
23
- for (const { regex } of patterns) {
24
- const match = regex.exec(code);
25
- if (match !== null) {
26
- const targetTransformers = match[1]?.trim() ?? "";
27
- if (targetTransformers === "") {
28
- return [];
29
- }
30
- return targetTransformers.split(",").map((name) => name.trim());
4
+
5
+ const patterns = [
6
+ {
7
+ prefix: 'transformer-ignore',
8
+ regex: /\/\*\s*transformer-ignore\s*(.*?)\s*\*\//u,
9
+ },
10
+ {
11
+ prefix: 'ts-codemod-ignore',
12
+ regex: /\/\*\s*ts-codemod-ignore\s*(.*?)\s*\*\//u,
13
+ },
14
+ {
15
+ prefix: 'codemod-ignore',
16
+ regex: /\/\*\s*codemod-ignore\s*(.*?)\s*\*\//u,
17
+ },
18
+ {
19
+ prefix: 'transform-ignore',
20
+ regex: /\/\*\s*transform-ignore\s*(.*?)\s*\*\//u,
21
+ },
22
+ ];
23
+ for (const { regex } of patterns) {
24
+ const match = regex.exec(code);
25
+ if (match !== null) {
26
+ const targetTransformers = match[1]?.trim() ?? '';
27
+
28
+ if (targetTransformers === '') {
29
+ return [];
30
+ }
31
+
32
+ return targetTransformers.split(',').map((name) => name.trim());
33
+ }
31
34
  }
32
- }
33
- return [];
35
+ return [];
34
36
  };
35
37
  const shouldSkipFile = (code, transformerName) => {
36
- const ignoredTransformers = extractFileIgnoreTransformers(code);
37
- const patterns = [
38
- /\/\*\s*transformer-ignore\s*.*?\s*\*\//u,
39
- /\/\*\s*ts-codemod-ignore\s*.*?\s*\*\//u,
40
- /\/\*\s*codemod-ignore\s*.*?\s*\*\//u,
41
- /\/\*\s*transform-ignore\s*.*?\s*\*\//u
42
- ];
43
- const hasFileIgnoreComment = patterns.some((regex) => regex.test(code));
44
- if (!hasFileIgnoreComment && Arr.isEmpty(ignoredTransformers)) {
45
- return false;
46
- }
47
- if (Arr.isEmpty(ignoredTransformers)) {
48
- return true;
49
- }
50
- if (transformerName === void 0) {
51
- return false;
52
- }
53
- return ignoredTransformers.includes(transformerName);
54
- };
55
- const transformSourceCode = (code, isTsx, transformers, debug = false) => {
56
- const project = new tsm.Project({
57
- useInMemoryFileSystem: true,
58
- compilerOptions: {
59
- jsx: isTsx ? tsm.ts.JsxEmit.React : void 0,
60
- target: tsm.ts.ScriptTarget.ESNext,
61
- module: tsm.ts.ModuleKind.ESNext
38
+ const ignoredTransformers = extractFileIgnoreTransformers(code);
39
+
40
+ const patterns = [
41
+ /\/\*\s*transformer-ignore\s*.*?\s*\*\//u,
42
+ /\/\*\s*ts-codemod-ignore\s*.*?\s*\*\//u,
43
+ /\/\*\s*codemod-ignore\s*.*?\s*\*\//u,
44
+ /\/\*\s*transform-ignore\s*.*?\s*\*\//u,
45
+ ];
46
+ const hasFileIgnoreComment = patterns.some((regex) => regex.test(code));
47
+ if (!hasFileIgnoreComment && Arr.isEmpty(ignoredTransformers)) {
48
+ return false;
62
49
  }
63
- });
64
- const sourceAst = project.createSourceFile(
65
- `source.${isTsx ? "tsx" : "ts"}`,
66
- code
67
- );
68
- for (const transformer of transformers) {
69
- const transformerName = transformer.name;
70
- if (shouldSkipFile(code, transformerName)) {
71
- if (debug) {
72
- console.debug(
73
- `skipped by ignore-file comment for transformer: ${transformerName}`
74
- );
75
- }
76
- continue;
50
+
51
+ if (Arr.isEmpty(ignoredTransformers)) {
52
+ return true;
53
+ }
54
+
55
+ if (transformerName === undefined) {
56
+ return false;
77
57
  }
78
- transformer.transform(sourceAst);
79
- }
80
- return sourceAst.getFullText();
81
- };
82
58
 
83
- export { transformSourceCode };
84
- //# sourceMappingURL=transform-source-code.mjs.map
59
+ return ignoredTransformers.includes(transformerName);
60
+ };
61
+ export const transformSourceCode = (code, isTsx, transformers, debug = false) => {
62
+ const project = new tsm.Project({
63
+ useInMemoryFileSystem: true,
64
+ compilerOptions: {
65
+ jsx: isTsx ? tsm.ts.JsxEmit.React : undefined,
66
+ target: tsm.ts.ScriptTarget.ESNext,
67
+ module: tsm.ts.ModuleKind.ESNext,
68
+ },
69
+ });
70
+ const sourceAst = project.createSourceFile(`source.${isTsx ? 'tsx' : 'ts'}`, code);
71
+ for (const transformer of transformers) {
72
+ const transformerName = transformer.name;
73
+ if (shouldSkipFile(code, transformerName)) {
74
+ if (debug) {
75
+ console.debug(`skipped by ignore-file comment for transformer: ${transformerName}`);
76
+ }
77
+ continue;
78
+ }
79
+ transformer.transform(sourceAst);
80
+ }
81
+ return sourceAst.getFullText();
82
+ };
83
+ //# sourceMappingURL=transform-source-code.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform-source-code.mjs","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"sourcesContent":["import { Arr } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst extractFileIgnoreTransformers = (code: string): readonly string[] => {\n // Try to find any of the supported file-level ignore comment prefixes\n const patterns = [\n {\n prefix: 'transformer-ignore',\n regex: /\\/\\*\\s*transformer-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'ts-codemod-ignore',\n regex: /\\/\\*\\s*ts-codemod-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'codemod-ignore',\n regex: /\\/\\*\\s*codemod-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'transform-ignore',\n regex: /\\/\\*\\s*transform-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n ] as const;\n\n for (const { regex } of patterns) {\n const match = regex.exec(code);\n\n if (match !== null) {\n const targetTransformers = match[1]?.trim() ?? '';\n\n // Empty means ignore all transformers\n if (targetTransformers === '') {\n return [];\n }\n\n // Parse comma-separated transformer names\n return targetTransformers.split(',').map((name) => name.trim());\n }\n }\n\n return [];\n};\n\nconst shouldSkipFile = (\n code: string,\n transformerName: string | undefined,\n): boolean => {\n const ignoredTransformers = extractFileIgnoreTransformers(code);\n\n // If no file-level ignore comment found, don't skip\n const patterns = [\n /\\/\\*\\s*transformer-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*ts-codemod-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*codemod-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*transform-ignore\\s*.*?\\s*\\*\\//u,\n ] as const;\n\n const hasFileIgnoreComment = patterns.some((regex) => regex.test(code));\n\n if (!hasFileIgnoreComment && Arr.isEmpty(ignoredTransformers)) {\n return false;\n }\n\n // Empty array means ignore all transformers (file-level ignore without specific transformers)\n if (Arr.isEmpty(ignoredTransformers)) {\n return true;\n }\n\n // If transformer name is not specified, don't skip\n if (transformerName === undefined) {\n return false;\n }\n\n // Check if the transformer is in the ignore list\n return ignoredTransformers.includes(transformerName);\n};\n\nexport const transformSourceCode = (\n code: string,\n isTsx: boolean,\n transformers: readonly TsMorphTransformer[],\n debug: boolean = false,\n): string => {\n const project = new tsm.Project({\n useInMemoryFileSystem: true,\n compilerOptions: {\n jsx: isTsx ? tsm.ts.JsxEmit.React : undefined,\n target: tsm.ts.ScriptTarget.ESNext,\n module: tsm.ts.ModuleKind.ESNext,\n },\n });\n\n const sourceAst = project.createSourceFile(\n `source.${isTsx ? 'tsx' : 'ts'}`,\n code,\n );\n\n for (const transformer of transformers) {\n const transformerName = transformer.name;\n\n if (shouldSkipFile(code, transformerName)) {\n if (debug) {\n console.debug(\n `skipped by ignore-file comment for transformer: ${transformerName}`,\n );\n }\n\n continue;\n }\n\n transformer.transform(sourceAst);\n }\n\n return sourceAst.getFullText();\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,6BAAA,GAAgC,CAAC,IAAA,KAAoC;AAEzE,EAAA,MAAM,QAAA,GAAW;AAAA,IACf;AAAA,MACE,MAAA,EAAQ,oBAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,mBAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,gBAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,kBAAA;AAAA,MACR,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,QAAA,EAAU;AAChC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAE7B,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAG/C,MAAA,IAAI,uBAAuB,EAAA,EAAI;AAC7B,QAAA,OAAO,EAAC;AAAA,MACV;AAGA,MAAA,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,IAChE;AAAA,EACF;AAEA,EAAA,OAAO,EAAC;AACV,CAAA;AAEA,MAAM,cAAA,GAAiB,CACrB,IAAA,EACA,eAAA,KACY;AACZ,EAAA,MAAM,mBAAA,GAAsB,8BAA8B,IAAI,CAAA;AAG9D,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,yCAAA;AAAA,IACA,wCAAA;AAAA,IACA,qCAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,oBAAA,GAAuB,SAAS,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAEtE,EAAA,IAAI,CAAC,oBAAA,IAAwB,GAAA,CAAI,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,mBAAA,CAAoB,SAAS,eAAe,CAAA;AACrD,CAAA;AAEO,MAAM,sBAAsB,CACjC,IAAA,EACA,KAAA,EACA,YAAA,EACA,QAAiB,KAAA,KACN;AACX,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAA,CAAQ;AAAA,IAC9B,qBAAA,EAAuB,IAAA;AAAA,IACvB,eAAA,EAAiB;AAAA,MACf,GAAA,EAAK,KAAA,GAAQ,GAAA,CAAI,EAAA,CAAG,QAAQ,KAAA,GAAQ,MAAA;AAAA,MACpC,MAAA,EAAQ,GAAA,CAAI,EAAA,CAAG,YAAA,CAAa,MAAA;AAAA,MAC5B,MAAA,EAAQ,GAAA,CAAI,EAAA,CAAG,UAAA,CAAW;AAAA;AAC5B,GACD,CAAA;AAED,EAAA,MAAM,YAAY,OAAA,CAAQ,gBAAA;AAAA,IACxB,CAAA,OAAA,EAAU,KAAA,GAAQ,KAAA,GAAQ,IAAI,CAAA,CAAA;AAAA,IAC9B;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,kBAAkB,WAAA,CAAY,IAAA;AAEpC,IAAA,IAAI,cAAA,CAAe,IAAA,EAAM,eAAe,CAAA,EAAG;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,mDAAmD,eAAe,CAAA;AAAA,SACpE;AAAA,MACF;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,UAAU,SAAS,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,UAAU,WAAA,EAAY;AAC/B;;;;"}
1
+ {"version":3,"file":"transform-source-code.mjs","sourceRoot":"","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
-
2
- //# sourceMappingURL=types.mjs.map
1
+ export {};
2
+ //# sourceMappingURL=types.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../../src/functions/ast-transformers/types.mts"],"names":[],"mappings":""}