ts-codemod-lib 3.2.0 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/entry-point.mjs +2 -23
- package/dist/entry-point.mjs.map +1 -1
- package/dist/functions/ast-transformers/append-as-const.mjs +330 -292
- package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-interface-to-type.mjs +85 -70
- package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.mjs +969 -840
- package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
- package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.d.mts +65 -0
- package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.d.mts.map +1 -0
- package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.mjs +297 -0
- package/dist/functions/ast-transformers/enable-no-unchecked-indexed-access.mjs.map +1 -0
- package/dist/functions/ast-transformers/index.d.mts +1 -0
- package/dist/functions/ast-transformers/index.d.mts.map +1 -1
- package/dist/functions/ast-transformers/index.mjs +10 -11
- package/dist/functions/ast-transformers/index.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs +14 -7
- package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs +12 -15
- package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs +63 -58
- package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/index.mjs +5 -5
- package/dist/functions/ast-transformers/readonly-transformer-helpers/index.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs +15 -20
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map +1 -1
- package/dist/functions/ast-transformers/replace-any-with-unknown.mjs +30 -34
- package/dist/functions/ast-transformers/replace-any-with-unknown.mjs.map +1 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +197 -156
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
- package/dist/functions/ast-transformers/transform-source-code.mjs +74 -75
- package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
- package/dist/functions/ast-transformers/types.mjs +2 -2
- package/dist/functions/ast-transformers/types.mjs.map +1 -1
- package/dist/functions/constants/ignore-comment-text.mjs +11 -13
- package/dist/functions/constants/ignore-comment-text.mjs.map +1 -1
- package/dist/functions/constants/index.mjs +2 -2
- package/dist/functions/constants/index.mjs.map +1 -1
- package/dist/functions/functions/has-disable-next-line-comment.mjs +67 -38
- package/dist/functions/functions/has-disable-next-line-comment.mjs.map +1 -1
- package/dist/functions/functions/index.mjs +11 -11
- package/dist/functions/functions/index.mjs.map +1 -1
- package/dist/functions/functions/is-as-const-node.mjs +25 -20
- package/dist/functions/functions/is-as-const-node.mjs.map +1 -1
- package/dist/functions/functions/is-atomic-type-node.mjs +245 -25
- package/dist/functions/functions/is-atomic-type-node.mjs.map +1 -1
- package/dist/functions/functions/is-conditional-type-distribution-guard.mjs +34 -13
- package/dist/functions/functions/is-conditional-type-distribution-guard.mjs.map +1 -1
- package/dist/functions/functions/is-readonly-node.mjs +120 -14
- package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
- package/dist/functions/functions/is-spread-parameter-node.mjs +5 -6
- package/dist/functions/functions/is-spread-parameter-node.mjs.map +1 -1
- package/dist/functions/functions/remove-parentheses.mjs +4 -4
- package/dist/functions/functions/remove-parentheses.mjs.map +1 -1
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs +23 -9
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs.map +1 -1
- package/dist/functions/functions/unwrap-readonly.mjs +3 -4
- 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 +54 -29
- package/dist/functions/functions/wrap-with-parentheses.mjs.map +1 -1
- package/dist/functions/index.mjs +5 -23
- package/dist/functions/index.mjs.map +1 -1
- package/dist/functions/utils/index.mjs +2 -2
- package/dist/functions/utils/index.mjs.map +1 -1
- package/dist/functions/utils/replace-with-debug.mjs +4 -6
- package/dist/functions/utils/replace-with-debug.mjs.map +1 -1
- package/dist/index.mjs +2 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -12
- package/src/functions/ast-transformers/convert-to-readonly.test.mts +10 -1
- package/src/functions/ast-transformers/enable-no-unchecked-indexed-access.mts +438 -0
- package/src/functions/ast-transformers/enable-no-unchecked-indexed-access.test.mts +619 -0
- package/src/functions/ast-transformers/index.mts +1 -0
- package/src/functions/functions/wrap-with-parentheses.mts +5 -2
|
@@ -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/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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"],"
|
|
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","
|
|
1
|
+
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../../src/functions/ast-transformers/types.mts"],"names":[],"mappings":""}
|