ts-codemod-lib 1.0.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.
Files changed (149) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +33 -0
  3. package/dist/cmd/convert-to-readonly.d.mts +3 -0
  4. package/dist/cmd/convert-to-readonly.d.mts.map +1 -0
  5. package/dist/cmd/convert-to-readonly.mjs +137 -0
  6. package/dist/cmd/convert-to-readonly.mjs.map +1 -0
  7. package/dist/entry-point.d.mts +2 -0
  8. package/dist/entry-point.d.mts.map +1 -0
  9. package/dist/entry-point.mjs +19 -0
  10. package/dist/entry-point.mjs.map +1 -0
  11. package/dist/functions/ast-transformers/convert-interface-to-type.d.mts +7 -0
  12. package/dist/functions/ast-transformers/convert-interface-to-type.d.mts.map +1 -0
  13. package/dist/functions/ast-transformers/convert-interface-to-type.mjs +83 -0
  14. package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -0
  15. package/dist/functions/ast-transformers/convert-to-readonly-type.d.mts +29 -0
  16. package/dist/functions/ast-transformers/convert-to-readonly-type.d.mts.map +1 -0
  17. package/dist/functions/ast-transformers/convert-to-readonly-type.mjs +811 -0
  18. package/dist/functions/ast-transformers/convert-to-readonly-type.mjs.map +1 -0
  19. package/dist/functions/ast-transformers/index.d.mts +7 -0
  20. package/dist/functions/ast-transformers/index.d.mts.map +1 -0
  21. package/dist/functions/ast-transformers/index.mjs +9 -0
  22. package/dist/functions/ast-transformers/index.mjs.map +1 -0
  23. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.d.mts +3 -0
  24. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.d.mts.map +1 -0
  25. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs +22 -0
  26. package/dist/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs.map +1 -0
  27. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.d.mts +2 -0
  28. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.d.mts.map +1 -0
  29. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs +15 -0
  30. package/dist/functions/ast-transformers/readonly-transformer-helpers/constants.mjs.map +1 -0
  31. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.d.mts +21 -0
  32. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.d.mts.map +1 -0
  33. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs +72 -0
  34. package/dist/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs.map +1 -0
  35. package/dist/functions/ast-transformers/readonly-transformer-helpers/index.d.mts +5 -0
  36. package/dist/functions/ast-transformers/readonly-transformer-helpers/index.d.mts.map +1 -0
  37. package/dist/functions/ast-transformers/readonly-transformer-helpers/index.mjs +5 -0
  38. package/dist/functions/ast-transformers/readonly-transformer-helpers/index.mjs.map +1 -0
  39. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts +37 -0
  40. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts.map +1 -0
  41. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs +19 -0
  42. package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map +1 -0
  43. package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts +7 -0
  44. package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts.map +1 -0
  45. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +173 -0
  46. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -0
  47. package/dist/functions/ast-transformers/transform-source-code.d.mts +3 -0
  48. package/dist/functions/ast-transformers/transform-source-code.d.mts.map +1 -0
  49. package/dist/functions/ast-transformers/transform-source-code.mjs +27 -0
  50. package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -0
  51. package/dist/functions/ast-transformers/types.d.mts +3 -0
  52. package/dist/functions/ast-transformers/types.d.mts.map +1 -0
  53. package/dist/functions/ast-transformers/types.mjs +2 -0
  54. package/dist/functions/ast-transformers/types.mjs.map +1 -0
  55. package/dist/functions/constants/ignore-comment-text.d.mts +3 -0
  56. package/dist/functions/constants/ignore-comment-text.d.mts.map +1 -0
  57. package/dist/functions/constants/ignore-comment-text.mjs +5 -0
  58. package/dist/functions/constants/ignore-comment-text.mjs.map +1 -0
  59. package/dist/functions/constants/index.d.mts +2 -0
  60. package/dist/functions/constants/index.d.mts.map +1 -0
  61. package/dist/functions/constants/index.mjs +2 -0
  62. package/dist/functions/constants/index.mjs.map +1 -0
  63. package/dist/functions/functions/has-disable-next-line-comment.d.mts +10 -0
  64. package/dist/functions/functions/has-disable-next-line-comment.d.mts.map +1 -0
  65. package/dist/functions/functions/has-disable-next-line-comment.mjs +47 -0
  66. package/dist/functions/functions/has-disable-next-line-comment.mjs.map +1 -0
  67. package/dist/functions/functions/index.d.mts +9 -0
  68. package/dist/functions/functions/index.d.mts.map +1 -0
  69. package/dist/functions/functions/index.mjs +9 -0
  70. package/dist/functions/functions/index.mjs.map +1 -0
  71. package/dist/functions/functions/is-as-const-node.d.mts +10 -0
  72. package/dist/functions/functions/is-as-const-node.d.mts.map +1 -0
  73. package/dist/functions/functions/is-as-const-node.mjs +30 -0
  74. package/dist/functions/functions/is-as-const-node.mjs.map +1 -0
  75. package/dist/functions/functions/is-primitive-type-node.d.mts +15 -0
  76. package/dist/functions/functions/is-primitive-type-node.d.mts.map +1 -0
  77. package/dist/functions/functions/is-primitive-type-node.mjs +46 -0
  78. package/dist/functions/functions/is-primitive-type-node.mjs.map +1 -0
  79. package/dist/functions/functions/is-readonly-node.d.mts +21 -0
  80. package/dist/functions/functions/is-readonly-node.d.mts.map +1 -0
  81. package/dist/functions/functions/is-readonly-node.mjs +30 -0
  82. package/dist/functions/functions/is-readonly-node.mjs.map +1 -0
  83. package/dist/functions/functions/is-spread-parameter-node.d.mts +4 -0
  84. package/dist/functions/functions/is-spread-parameter-node.d.mts.map +1 -0
  85. package/dist/functions/functions/is-spread-parameter-node.mjs +9 -0
  86. package/dist/functions/functions/is-spread-parameter-node.mjs.map +1 -0
  87. package/dist/functions/functions/remove-parentheses.d.mts +3 -0
  88. package/dist/functions/functions/remove-parentheses.d.mts.map +1 -0
  89. package/dist/functions/functions/remove-parentheses.mjs +9 -0
  90. package/dist/functions/functions/remove-parentheses.mjs.map +1 -0
  91. package/dist/functions/functions/unwrap-readonly.d.mts +3 -0
  92. package/dist/functions/functions/unwrap-readonly.d.mts.map +1 -0
  93. package/dist/functions/functions/unwrap-readonly.mjs +8 -0
  94. package/dist/functions/functions/unwrap-readonly.mjs.map +1 -0
  95. package/dist/functions/functions/wrap-with-parentheses.d.mts +2 -0
  96. package/dist/functions/functions/wrap-with-parentheses.d.mts.map +1 -0
  97. package/dist/functions/functions/wrap-with-parentheses.mjs +4 -0
  98. package/dist/functions/functions/wrap-with-parentheses.mjs.map +1 -0
  99. package/dist/functions/index.d.mts +5 -0
  100. package/dist/functions/index.d.mts.map +1 -0
  101. package/dist/functions/index.mjs +19 -0
  102. package/dist/functions/index.mjs.map +1 -0
  103. package/dist/functions/utils/index.d.mts +2 -0
  104. package/dist/functions/utils/index.d.mts.map +1 -0
  105. package/dist/functions/utils/index.mjs +2 -0
  106. package/dist/functions/utils/index.mjs.map +1 -0
  107. package/dist/functions/utils/replace-with-debug.d.mts +3 -0
  108. package/dist/functions/utils/replace-with-debug.d.mts.map +1 -0
  109. package/dist/functions/utils/replace-with-debug.mjs +7 -0
  110. package/dist/functions/utils/replace-with-debug.mjs.map +1 -0
  111. package/dist/globals.d.mts +1 -0
  112. package/dist/index.d.mts +2 -0
  113. package/dist/index.d.mts.map +1 -0
  114. package/dist/index.mjs +19 -0
  115. package/dist/index.mjs.map +1 -0
  116. package/dist/tsconfig.json +1 -0
  117. package/dist/types.d.mts +2 -0
  118. package/package.json +134 -0
  119. package/src/cmd/convert-to-readonly.mts +195 -0
  120. package/src/entry-point.mts +1 -0
  121. package/src/functions/ast-transformers/convert-interface-to-type.mts +119 -0
  122. package/src/functions/ast-transformers/convert-interface-to-type.test.mts +295 -0
  123. package/src/functions/ast-transformers/convert-to-readonly-type.mts +1391 -0
  124. package/src/functions/ast-transformers/convert-to-readonly-type.test.mts +3653 -0
  125. package/src/functions/ast-transformers/index.mts +6 -0
  126. package/src/functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mts +24 -0
  127. package/src/functions/ast-transformers/readonly-transformer-helpers/constants.mts +12 -0
  128. package/src/functions/ast-transformers/readonly-transformer-helpers/group-union-types.mts +152 -0
  129. package/src/functions/ast-transformers/readonly-transformer-helpers/index.mts +4 -0
  130. package/src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts +65 -0
  131. package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +238 -0
  132. package/src/functions/ast-transformers/transform-source-code.mts +38 -0
  133. package/src/functions/ast-transformers/types.mts +6 -0
  134. package/src/functions/constants/ignore-comment-text.mts +3 -0
  135. package/src/functions/constants/index.mts +1 -0
  136. package/src/functions/functions/has-disable-next-line-comment.mts +56 -0
  137. package/src/functions/functions/index.mts +8 -0
  138. package/src/functions/functions/is-as-const-node.mts +47 -0
  139. package/src/functions/functions/is-primitive-type-node.mts +301 -0
  140. package/src/functions/functions/is-readonly-node.mts +247 -0
  141. package/src/functions/functions/is-spread-parameter-node.mts +13 -0
  142. package/src/functions/functions/remove-parentheses.mts +7 -0
  143. package/src/functions/functions/unwrap-readonly.mts +7 -0
  144. package/src/functions/functions/wrap-with-parentheses.mts +2 -0
  145. package/src/functions/index.mts +4 -0
  146. package/src/functions/utils/index.mts +1 -0
  147. package/src/functions/utils/replace-with-debug.mts +10 -0
  148. package/src/globals.d.mts +1 -0
  149. package/src/index.mts +1 -0
@@ -0,0 +1,295 @@
1
+ import dedent from 'dedent';
2
+ import { Project } from 'ts-morph';
3
+ import { convertInterfaceToTypeTransformer } from './convert-interface-to-type.mjs';
4
+
5
+ describe(convertInterfaceToTypeTransformer, () => {
6
+ test('converts simple interface to type', () => {
7
+ const project = new Project({ useInMemoryFileSystem: true });
8
+
9
+ const sourceFile = project.createSourceFile(
10
+ 'test.ts',
11
+ dedent`
12
+ interface User {
13
+ name: string;
14
+ age: number;
15
+ }
16
+ `,
17
+ );
18
+
19
+ const transformer = convertInterfaceToTypeTransformer();
20
+
21
+ transformer(sourceFile);
22
+
23
+ expect(sourceFile.getText()).toBe(
24
+ dedent`
25
+ type User = {
26
+ name: string;
27
+ age: number;
28
+ };
29
+ `,
30
+ );
31
+ });
32
+
33
+ test('converts exported interface to exported type', () => {
34
+ const project = new Project({ useInMemoryFileSystem: true });
35
+
36
+ const sourceFile = project.createSourceFile(
37
+ 'test.ts',
38
+ dedent`
39
+ export interface User {
40
+ name: string;
41
+ age: number;
42
+ }
43
+ `,
44
+ );
45
+
46
+ const transformer = convertInterfaceToTypeTransformer();
47
+
48
+ transformer(sourceFile);
49
+
50
+ expect(sourceFile.getText()).toBe(
51
+ dedent`
52
+ export type User = {
53
+ name: string;
54
+ age: number;
55
+ };
56
+ `,
57
+ );
58
+ });
59
+
60
+ test('converts interface with type parameters', () => {
61
+ const project = new Project({ useInMemoryFileSystem: true });
62
+
63
+ const sourceFile = project.createSourceFile(
64
+ 'test.ts',
65
+ dedent`
66
+ interface Container<T> {
67
+ value: T;
68
+ }
69
+ `,
70
+ );
71
+
72
+ const transformer = convertInterfaceToTypeTransformer();
73
+
74
+ transformer(sourceFile);
75
+
76
+ expect(sourceFile.getText()).toBe(
77
+ dedent`
78
+ type Container<T> = {
79
+ value: T;
80
+ };
81
+ `,
82
+ );
83
+ });
84
+
85
+ test('converts interface with extends', () => {
86
+ const project = new Project({ useInMemoryFileSystem: true });
87
+
88
+ const sourceFile = project.createSourceFile(
89
+ 'test.ts',
90
+ dedent`
91
+ interface Base {
92
+ id: string;
93
+ }
94
+
95
+ interface User extends Base {
96
+ name: string;
97
+ }
98
+ `,
99
+ );
100
+
101
+ const transformer = convertInterfaceToTypeTransformer();
102
+
103
+ transformer(sourceFile);
104
+
105
+ expect(sourceFile.getText()).toBe(
106
+ dedent`
107
+ type Base = {
108
+ id: string;
109
+ };
110
+
111
+ type User = Base & {
112
+ name: string;
113
+ };
114
+ `,
115
+ );
116
+ });
117
+
118
+ test('converts interface extending multiple interfaces', () => {
119
+ const project = new Project({ useInMemoryFileSystem: true });
120
+
121
+ const sourceFile = project.createSourceFile(
122
+ 'test.ts',
123
+ dedent`
124
+ interface A {
125
+ a: string;
126
+ }
127
+
128
+ interface B {
129
+ b: number;
130
+ }
131
+
132
+ interface C extends A, B {
133
+ c: boolean;
134
+ }
135
+ `,
136
+ );
137
+
138
+ const transformer = convertInterfaceToTypeTransformer();
139
+
140
+ transformer(sourceFile);
141
+
142
+ expect(sourceFile.getText()).toBe(
143
+ dedent`
144
+ type A = {
145
+ a: string;
146
+ };
147
+
148
+ type B = {
149
+ b: number;
150
+ };
151
+
152
+ type C = A & B & {
153
+ c: boolean;
154
+ };
155
+ `,
156
+ );
157
+ });
158
+
159
+ test('converts interface with only extends and no own members', () => {
160
+ const project = new Project({ useInMemoryFileSystem: true });
161
+
162
+ const sourceFile = project.createSourceFile(
163
+ 'test.ts',
164
+ dedent`
165
+ interface Base {
166
+ id: string;
167
+ }
168
+
169
+ interface User extends Base {}
170
+ `,
171
+ );
172
+
173
+ const transformer = convertInterfaceToTypeTransformer();
174
+
175
+ transformer(sourceFile);
176
+
177
+ expect(sourceFile.getText()).toBe(
178
+ dedent`
179
+ type Base = {
180
+ id: string;
181
+ };
182
+
183
+ type User = Base;
184
+ `,
185
+ );
186
+ });
187
+
188
+ test('converts empty interface', () => {
189
+ const project = new Project({ useInMemoryFileSystem: true });
190
+
191
+ const sourceFile = project.createSourceFile(
192
+ 'test.ts',
193
+ dedent`
194
+ interface Empty {}
195
+ `,
196
+ );
197
+
198
+ const transformer = convertInterfaceToTypeTransformer();
199
+
200
+ transformer(sourceFile);
201
+
202
+ expect(sourceFile.getText()).toBe(
203
+ dedent`
204
+ type Empty = Record<string, never>;
205
+ `,
206
+ );
207
+ });
208
+
209
+ // TODO: Fix this test
210
+ // eslint-disable-next-line vitest/warn-todo -- intentionally skipped until fixed
211
+ test.todo('converts interface with JSDoc comment');
212
+
213
+ test('converts interface inside namespace', () => {
214
+ const project = new Project({ useInMemoryFileSystem: true });
215
+
216
+ const sourceFile = project.createSourceFile(
217
+ 'test.ts',
218
+ dedent`
219
+ namespace MyNamespace {
220
+ export interface User {
221
+ name: string;
222
+ }
223
+ }
224
+ `,
225
+ );
226
+
227
+ const transformer = convertInterfaceToTypeTransformer();
228
+
229
+ transformer(sourceFile);
230
+
231
+ expect(sourceFile.getText()).toBe(
232
+ dedent`
233
+ namespace MyNamespace {
234
+ export type User = {
235
+ name: string;
236
+ };
237
+ }
238
+ `,
239
+ );
240
+ });
241
+
242
+ test('converts interface with optional properties', () => {
243
+ const project = new Project({ useInMemoryFileSystem: true });
244
+
245
+ const sourceFile = project.createSourceFile(
246
+ 'test.ts',
247
+ dedent`
248
+ interface User {
249
+ name: string;
250
+ age?: number;
251
+ }
252
+ `,
253
+ );
254
+
255
+ const transformer = convertInterfaceToTypeTransformer();
256
+
257
+ transformer(sourceFile);
258
+
259
+ expect(sourceFile.getText()).toBe(
260
+ dedent`
261
+ type User = {
262
+ name: string;
263
+ age?: number;
264
+ };
265
+ `,
266
+ );
267
+ });
268
+
269
+ test('converts interface with readonly properties', () => {
270
+ const project = new Project({ useInMemoryFileSystem: true });
271
+
272
+ const sourceFile = project.createSourceFile(
273
+ 'test.ts',
274
+ dedent`
275
+ interface User {
276
+ readonly name: string;
277
+ age: number;
278
+ }
279
+ `,
280
+ );
281
+
282
+ const transformer = convertInterfaceToTypeTransformer();
283
+
284
+ transformer(sourceFile);
285
+
286
+ expect(sourceFile.getText()).toBe(
287
+ dedent`
288
+ type User = {
289
+ readonly name: string;
290
+ age: number;
291
+ };
292
+ `,
293
+ );
294
+ });
295
+ });