ts-codemod-lib 1.0.1 → 1.1.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 (49) hide show
  1. package/README.md +428 -6
  2. package/dist/cmd/append-as-const.d.mts +3 -0
  3. package/dist/cmd/append-as-const.d.mts.map +1 -0
  4. package/dist/cmd/append-as-const.mjs +138 -0
  5. package/dist/cmd/append-as-const.mjs.map +1 -0
  6. package/dist/cmd/convert-interface-to-type.d.mts +3 -0
  7. package/dist/cmd/convert-interface-to-type.d.mts.map +1 -0
  8. package/dist/cmd/convert-interface-to-type.mjs +138 -0
  9. package/dist/cmd/convert-interface-to-type.mjs.map +1 -0
  10. package/dist/cmd/convert-to-readonly.mjs +3 -2
  11. package/dist/cmd/convert-to-readonly.mjs.map +1 -1
  12. package/dist/cmd/replace-any-with-unknown.d.mts +3 -0
  13. package/dist/cmd/replace-any-with-unknown.d.mts.map +1 -0
  14. package/dist/cmd/replace-any-with-unknown.mjs +138 -0
  15. package/dist/cmd/replace-any-with-unknown.mjs.map +1 -0
  16. package/dist/cmd/replace-record-with-unknown-record.d.mts +3 -0
  17. package/dist/cmd/replace-record-with-unknown-record.d.mts.map +1 -0
  18. package/dist/cmd/replace-record-with-unknown-record.mjs +138 -0
  19. package/dist/cmd/replace-record-with-unknown-record.mjs.map +1 -0
  20. package/dist/entry-point.mjs +2 -0
  21. package/dist/entry-point.mjs.map +1 -1
  22. package/dist/functions/ast-transformers/append-as-const.d.mts +13 -0
  23. package/dist/functions/ast-transformers/append-as-const.d.mts.map +1 -0
  24. package/dist/functions/ast-transformers/append-as-const.mjs +98 -0
  25. package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -0
  26. package/dist/functions/ast-transformers/index.d.mts +2 -0
  27. package/dist/functions/ast-transformers/index.d.mts.map +1 -1
  28. package/dist/functions/ast-transformers/index.mjs +2 -0
  29. package/dist/functions/ast-transformers/index.mjs.map +1 -1
  30. package/dist/functions/ast-transformers/replace-any-with-unknown.d.mts +3 -0
  31. package/dist/functions/ast-transformers/replace-any-with-unknown.d.mts.map +1 -0
  32. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs +38 -0
  33. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs.map +1 -0
  34. package/dist/functions/index.mjs +2 -0
  35. package/dist/functions/index.mjs.map +1 -1
  36. package/dist/index.mjs +2 -0
  37. package/dist/index.mjs.map +1 -1
  38. package/package.json +61 -57
  39. package/src/cmd/append-as-const.mts +197 -0
  40. package/src/cmd/convert-interface-to-type.mts +197 -0
  41. package/src/cmd/convert-to-readonly.mts +3 -1
  42. package/src/cmd/replace-any-with-unknown.mts +197 -0
  43. package/src/cmd/replace-record-with-unknown-record.mts +197 -0
  44. package/src/functions/ast-transformers/append-as-const.mts +154 -0
  45. package/src/functions/ast-transformers/append-as-const.test.mts +339 -0
  46. package/src/functions/ast-transformers/convert-to-readonly-type.test.mts +3 -3
  47. package/src/functions/ast-transformers/index.mts +2 -0
  48. package/src/functions/ast-transformers/replace-any-with-unknown.mts +49 -0
  49. package/src/functions/ast-transformers/replace-any-with-unknown.test.mts +140 -0
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ import * as cmd from 'cmd-ts';
3
+ import dedent from 'dedent';
4
+ import { castMutable, Result, unknownToString } from 'ts-data-forge';
5
+ import 'ts-repo-utils';
6
+ import 'ts-morph';
7
+ import '../functions/functions/is-primitive-type-node.mjs';
8
+ import { convertInterfaceToTypeTransformer } from '../functions/ast-transformers/convert-interface-to-type.mjs';
9
+ import '../functions/ast-transformers/readonly-transformer-helpers/constants.mjs';
10
+ import { transformSourceCode } from '../functions/ast-transformers/transform-source-code.mjs';
11
+
12
+ /* eslint-disable no-await-in-loop */
13
+ const cmdDef = cmd.command({
14
+ name: 'convert-interface-to-type-cli',
15
+ version: '1.0.0',
16
+ args: {
17
+ baseDir: cmd.positional({
18
+ type: cmd.string,
19
+ displayName: 'baseDir',
20
+ description: 'The base directory in which to perform the conversion',
21
+ }),
22
+ exclude: cmd.multioption({
23
+ long: 'exclude',
24
+ type: cmd.optional(cmd.array(cmd.string)),
25
+ description: 'Glob patterns of files to exclude from the base directory (e.g., "src/generated/**/*.mts")',
26
+ }),
27
+ silent: cmd.flag({
28
+ long: 'silent',
29
+ type: cmd.optional(cmd.boolean),
30
+ description: 'If true, suppresses output messages (default: false)',
31
+ }),
32
+ },
33
+ handler: (args) => {
34
+ convertInterfaceToTypeCLI({
35
+ baseDir: args.baseDir,
36
+ exclude: args.exclude ?? [],
37
+ silent: args.silent ?? false,
38
+ }).catch((error) => {
39
+ console.error('An error occurred:', error);
40
+ process.exit(1);
41
+ });
42
+ },
43
+ });
44
+ const convertInterfaceToTypeCLI = async (args) => {
45
+ const echoIfNotSilent = args.silent ? () => { } : echo;
46
+ const errorIfNotSilent = args.silent ? () => { } : console.error;
47
+ // Find all files matching the glob
48
+ const globResult = await glob(args.baseDir, {
49
+ ignore: castMutable(args.exclude),
50
+ });
51
+ if (Result.isErr(globResult)) {
52
+ errorIfNotSilent('Error finding files matching pattern:', globResult.value);
53
+ return Result.err(undefined);
54
+ }
55
+ const files = globResult.value;
56
+ if (files.length === 0) {
57
+ echoIfNotSilent('No files found matching pattern:', args.baseDir);
58
+ return Result.ok(undefined);
59
+ }
60
+ const { errorFiles, transformedCount, unchangedCount } = await transformFiles(files, args.silent);
61
+ const hr = '='.repeat(50);
62
+ echoIfNotSilent(dedent `
63
+ ${hr}
64
+ Summary:
65
+ ✅ Transformed: ${transformedCount}
66
+ ⏭️ Unchanged: ${unchangedCount}
67
+ ❌ Errors: ${errorFiles.length}
68
+ 📊 Total: ${files.length}
69
+ `);
70
+ if (errorFiles.length > 0) {
71
+ echoIfNotSilent('\nFiles with errors:');
72
+ for (const fileName of errorFiles) {
73
+ echoIfNotSilent(` - ${fileName}`);
74
+ }
75
+ }
76
+ echoIfNotSilent(hr);
77
+ if (errorFiles.length > 0) {
78
+ return Result.err(undefined);
79
+ }
80
+ return Result.ok(undefined);
81
+ };
82
+ const transformFiles = async (filePaths, silent) => {
83
+ let mut_transformedCount = 0;
84
+ let mut_unchangedCount = 0;
85
+ const mut_errorFiles = [];
86
+ for (const filePath of filePaths) {
87
+ const result = await transformOneFile(filePath, silent);
88
+ if (Result.isOk(result)) {
89
+ switch (result.value) {
90
+ case 'transformed':
91
+ mut_transformedCount += 1;
92
+ break;
93
+ case 'unchanged':
94
+ mut_unchangedCount += 1;
95
+ break;
96
+ }
97
+ }
98
+ else {
99
+ mut_errorFiles.push(path.basename(filePath));
100
+ }
101
+ }
102
+ return {
103
+ transformedCount: mut_transformedCount,
104
+ unchangedCount: mut_unchangedCount,
105
+ errorFiles: mut_errorFiles,
106
+ };
107
+ };
108
+ const transformOneFile = async (filePath, silent) => {
109
+ const echoIfNotSilent = silent ? () => { } : echo;
110
+ const errorIfNotSilent = silent ? () => { } : console.error;
111
+ const fileName = path.basename(filePath);
112
+ const isTsx = fileName.endsWith('.tsx') || fileName.endsWith('.jsx');
113
+ try {
114
+ const originalCode = await fs.readFile(filePath, 'utf8');
115
+ // Transform the code with all transformers
116
+ const transformedCode = transformSourceCode(originalCode, isTsx, [
117
+ convertInterfaceToTypeTransformer(),
118
+ ]);
119
+ // Check if the code was actually changed
120
+ if (transformedCode === originalCode) {
121
+ echoIfNotSilent(`⏭️ ${fileName} - no changes needed`);
122
+ return Result.ok('unchanged');
123
+ }
124
+ else {
125
+ // Write back the transformed code
126
+ await fs.writeFile(filePath, transformedCode, 'utf8');
127
+ echoIfNotSilent(`✅ ${fileName} - transformed`);
128
+ return Result.ok('transformed');
129
+ }
130
+ }
131
+ catch (error) {
132
+ const errStr = unknownToString(error);
133
+ errorIfNotSilent(`❌ ${fileName} - error: ${errStr}`);
134
+ return Result.err(errStr);
135
+ }
136
+ };
137
+ await cmd.run(cmdDef, process.argv.slice(2));
138
+ //# sourceMappingURL=convert-interface-to-type.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-interface-to-type.mjs","sources":["../../src/cmd/convert-interface-to-type.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -3,9 +3,9 @@ import * as cmd from 'cmd-ts';
3
3
  import dedent from 'dedent';
4
4
  import { castMutable, Result, unknownToString } from 'ts-data-forge';
5
5
  import 'ts-repo-utils';
6
- import { convertToReadonlyTypeTransformer } from '../functions/ast-transformers/convert-to-readonly-type.mjs';
7
6
  import 'ts-morph';
8
7
  import '../functions/functions/is-primitive-type-node.mjs';
8
+ import { convertToReadonlyTypeTransformer } from '../functions/ast-transformers/convert-to-readonly-type.mjs';
9
9
  import '../functions/ast-transformers/readonly-transformer-helpers/constants.mjs';
10
10
  import { transformSourceCode } from '../functions/ast-transformers/transform-source-code.mjs';
11
11
 
@@ -109,10 +109,11 @@ const transformOneFile = async (filePath, silent) => {
109
109
  const echoIfNotSilent = silent ? () => { } : echo;
110
110
  const errorIfNotSilent = silent ? () => { } : console.error;
111
111
  const fileName = path.basename(filePath);
112
+ const isTsx = fileName.endsWith('.tsx') || fileName.endsWith('.jsx');
112
113
  try {
113
114
  const originalCode = await fs.readFile(filePath, 'utf8');
114
115
  // Transform the code with all transformers
115
- const transformedCode = transformSourceCode(originalCode, false, [
116
+ const transformedCode = transformSourceCode(originalCode, isTsx, [
116
117
  convertToReadonlyTypeTransformer(),
117
118
  ]);
118
119
  // Check if the code was actually changed
@@ -1 +1 @@
1
- {"version":3,"file":"convert-to-readonly.mjs","sources":["../../src/cmd/convert-to-readonly.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert-to-readonly.mjs","sources":["../../src/cmd/convert-to-readonly.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import 'ts-repo-utils';
3
+ //# sourceMappingURL=replace-any-with-unknown.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-any-with-unknown.d.mts","sourceRoot":"","sources":["../../src/cmd/replace-any-with-unknown.mts"],"names":[],"mappings":";AAMA,OAAO,eAAe,CAAC"}
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ import * as cmd from 'cmd-ts';
3
+ import dedent from 'dedent';
4
+ import { castMutable, Result, unknownToString } from 'ts-data-forge';
5
+ import 'ts-repo-utils';
6
+ import 'ts-morph';
7
+ import '../functions/functions/is-primitive-type-node.mjs';
8
+ import '../functions/ast-transformers/readonly-transformer-helpers/constants.mjs';
9
+ import { replaceAnyWithUnknownTransformer } from '../functions/ast-transformers/replace-any-with-unknown.mjs';
10
+ import { transformSourceCode } from '../functions/ast-transformers/transform-source-code.mjs';
11
+
12
+ /* eslint-disable no-await-in-loop */
13
+ const cmdDef = cmd.command({
14
+ name: 'replace-any-with-unknown-cli',
15
+ version: '1.0.0',
16
+ args: {
17
+ baseDir: cmd.positional({
18
+ type: cmd.string,
19
+ displayName: 'baseDir',
20
+ description: 'The base directory in which to perform the conversion',
21
+ }),
22
+ exclude: cmd.multioption({
23
+ long: 'exclude',
24
+ type: cmd.optional(cmd.array(cmd.string)),
25
+ description: 'Glob patterns of files to exclude from the base directory (e.g., "src/generated/**/*.mts")',
26
+ }),
27
+ silent: cmd.flag({
28
+ long: 'silent',
29
+ type: cmd.optional(cmd.boolean),
30
+ description: 'If true, suppresses output messages (default: false)',
31
+ }),
32
+ },
33
+ handler: (args) => {
34
+ replaceAnyWithUnknownCLI({
35
+ baseDir: args.baseDir,
36
+ exclude: args.exclude ?? [],
37
+ silent: args.silent ?? false,
38
+ }).catch((error) => {
39
+ console.error('An error occurred:', error);
40
+ process.exit(1);
41
+ });
42
+ },
43
+ });
44
+ const replaceAnyWithUnknownCLI = async (args) => {
45
+ const echoIfNotSilent = args.silent ? () => { } : echo;
46
+ const errorIfNotSilent = args.silent ? () => { } : console.error;
47
+ // Find all files matching the glob
48
+ const globResult = await glob(args.baseDir, {
49
+ ignore: castMutable(args.exclude),
50
+ });
51
+ if (Result.isErr(globResult)) {
52
+ errorIfNotSilent('Error finding files matching pattern:', globResult.value);
53
+ return Result.err(undefined);
54
+ }
55
+ const files = globResult.value;
56
+ if (files.length === 0) {
57
+ echoIfNotSilent('No files found matching pattern:', args.baseDir);
58
+ return Result.ok(undefined);
59
+ }
60
+ const { errorFiles, transformedCount, unchangedCount } = await transformFiles(files, args.silent);
61
+ const hr = '='.repeat(50);
62
+ echoIfNotSilent(dedent `
63
+ ${hr}
64
+ Summary:
65
+ ✅ Transformed: ${transformedCount}
66
+ ⏭️ Unchanged: ${unchangedCount}
67
+ ❌ Errors: ${errorFiles.length}
68
+ 📊 Total: ${files.length}
69
+ `);
70
+ if (errorFiles.length > 0) {
71
+ echoIfNotSilent('\nFiles with errors:');
72
+ for (const fileName of errorFiles) {
73
+ echoIfNotSilent(` - ${fileName}`);
74
+ }
75
+ }
76
+ echoIfNotSilent(hr);
77
+ if (errorFiles.length > 0) {
78
+ return Result.err(undefined);
79
+ }
80
+ return Result.ok(undefined);
81
+ };
82
+ const transformFiles = async (filePaths, silent) => {
83
+ let mut_transformedCount = 0;
84
+ let mut_unchangedCount = 0;
85
+ const mut_errorFiles = [];
86
+ for (const filePath of filePaths) {
87
+ const result = await transformOneFile(filePath, silent);
88
+ if (Result.isOk(result)) {
89
+ switch (result.value) {
90
+ case 'transformed':
91
+ mut_transformedCount += 1;
92
+ break;
93
+ case 'unchanged':
94
+ mut_unchangedCount += 1;
95
+ break;
96
+ }
97
+ }
98
+ else {
99
+ mut_errorFiles.push(path.basename(filePath));
100
+ }
101
+ }
102
+ return {
103
+ transformedCount: mut_transformedCount,
104
+ unchangedCount: mut_unchangedCount,
105
+ errorFiles: mut_errorFiles,
106
+ };
107
+ };
108
+ const transformOneFile = async (filePath, silent) => {
109
+ const echoIfNotSilent = silent ? () => { } : echo;
110
+ const errorIfNotSilent = silent ? () => { } : console.error;
111
+ const fileName = path.basename(filePath);
112
+ const isTsx = fileName.endsWith('.tsx') || fileName.endsWith('.jsx');
113
+ try {
114
+ const originalCode = await fs.readFile(filePath, 'utf8');
115
+ // Transform the code with all transformers
116
+ const transformedCode = transformSourceCode(originalCode, isTsx, [
117
+ replaceAnyWithUnknownTransformer(),
118
+ ]);
119
+ // Check if the code was actually changed
120
+ if (transformedCode === originalCode) {
121
+ echoIfNotSilent(`⏭️ ${fileName} - no changes needed`);
122
+ return Result.ok('unchanged');
123
+ }
124
+ else {
125
+ // Write back the transformed code
126
+ await fs.writeFile(filePath, transformedCode, 'utf8');
127
+ echoIfNotSilent(`✅ ${fileName} - transformed`);
128
+ return Result.ok('transformed');
129
+ }
130
+ }
131
+ catch (error) {
132
+ const errStr = unknownToString(error);
133
+ errorIfNotSilent(`❌ ${fileName} - error: ${errStr}`);
134
+ return Result.err(errStr);
135
+ }
136
+ };
137
+ await cmd.run(cmdDef, process.argv.slice(2));
138
+ //# sourceMappingURL=replace-any-with-unknown.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-any-with-unknown.mjs","sources":["../../src/cmd/replace-any-with-unknown.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;AACA;AAWA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;AACzB,IAAA,IAAI,EAAE,8BAA8B;AACpC,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,IAAI,EAAE;AACJ,QAAA,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC;YACtB,IAAI,EAAE,GAAG,CAAC,MAAM;AAChB,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,WAAW,EAAE,uDAAuD;SACrE,CAAC;AACF,QAAA,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC;AACvB,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACzC,YAAA,WAAW,EACT,4FAA4F;SAC/F,CAAC;AACF,QAAA,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/B,YAAA,WAAW,EAAE,sDAAsD;SACpE,CAAC;AACH,KAAA;AACD,IAAA,OAAO,EAAE,CAAC,IAAI,KAAI;AAChB,QAAA,wBAAwB,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;AAC3B,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;AAC7B,SAAA,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,KAAI;AAC1B,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;AAE1C,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,QAAA,CAAC,CAAC;IACJ,CAAC;AACF,CAAA,CAAC;AAQF,MAAM,wBAAwB,GAAG,OAC/B,IAAU,KAC+B;AACzC,IAAA,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,GAAG,QAAO,CAAC,GAAG,IAAI;AAErD,IAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,GAAG,MAAK,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK;;IAG/D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAC1C,QAAA,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;AAClC,KAAA,CAAC;AAEF,IAAA,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AAC5B,QAAA,gBAAgB,CAAC,uCAAuC,EAAE,UAAU,CAAC,KAAK,CAAC;AAE3E,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;IAC9B;AAEA,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK;AAE9B,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,QAAA,eAAe,CAAC,kCAAkC,EAAE,IAAI,CAAC,OAAO,CAAC;AAEjE,QAAA,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC;IAC7B;AAEA,IAAA,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,MAAM,cAAc,CAC3E,KAAK,EACL,IAAI,CAAC,MAAM,CACZ;IAED,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAEzB,eAAe,CAAC,MAAM,CAAA;MAClB,EAAE;;uBAEe,gBAAgB;wBACf,cAAc;AACf,qBAAA,EAAA,UAAU,CAAC,MAAM;AAChB,sBAAA,EAAA,KAAK,CAAC,MAAM;AACjC,EAAA,CAAA,CAAC;AAEF,IAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;QACzB,eAAe,CAAC,sBAAsB,CAAC;AAEvC,QAAA,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;AACjC,YAAA,eAAe,CAAC,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAC;QACpC;IACF;IAEA,eAAe,CAAC,EAAE,CAAC;AAEnB,IAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;IAC9B;AAEA,IAAA,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC;AAC7B,CAAC;AAED,MAAM,cAAc,GAAG,OACrB,SAA4B,EAC5B,MAAe,KAOb;IACF,IAAI,oBAAoB,GAAW,CAAC;IAEpC,IAAI,kBAAkB,GAAW,CAAC;IAElC,MAAM,cAAc,GAAa,EAAE;AAEnC,IAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC;AAEvD,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACvB,YAAA,QAAQ,MAAM,CAAC,KAAK;AAClB,gBAAA,KAAK,aAAa;oBAChB,oBAAoB,IAAI,CAAC;oBAEzB;AAEF,gBAAA,KAAK,WAAW;oBACd,kBAAkB,IAAI,CAAC;oBAEvB;;QAEN;aAAO;YACL,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C;IACF;IAEA,OAAO;AACL,QAAA,gBAAgB,EAAE,oBAAoB;AACtC,QAAA,cAAc,EAAE,kBAAkB;AAClC,QAAA,UAAU,EAAE,cAAc;KAC3B;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,OACvB,QAAgB,EAChB,MAAe,KACyC;AACxD,IAAA,MAAM,eAAe,GAAG,MAAM,GAAG,MAAK,EAAE,CAAC,GAAG,IAAI;AAEhD,IAAA,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAK,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK;IAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAExC,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;AAEpE,IAAA,IAAI;QACF,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;;AAGxD,QAAA,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,EAAE,KAAK,EAAE;AAC/D,YAAA,gCAAgC,EAAE;AACnC,SAAA,CAAC;;AAGF,QAAA,IAAI,eAAe,KAAK,YAAY,EAAE;AACpC,YAAA,eAAe,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAA,oBAAA,CAAsB,CAAC;AAErD,YAAA,OAAO,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC;QAC/B;aAAO;;YAEL,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC;AAErD,YAAA,eAAe,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,cAAA,CAAgB,CAAC;AAE9C,YAAA,OAAO,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC;QACjC;IACF;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC;AAErC,QAAA,gBAAgB,CAAC,CAAA,EAAA,EAAK,QAAQ,aAAa,MAAM,CAAA,CAAE,CAAC;AAEpD,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IAC3B;AACF,CAAC;AAED,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import 'ts-repo-utils';
3
+ //# sourceMappingURL=replace-record-with-unknown-record.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-record-with-unknown-record.d.mts","sourceRoot":"","sources":["../../src/cmd/replace-record-with-unknown-record.mts"],"names":[],"mappings":";AAMA,OAAO,eAAe,CAAC"}
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ import * as cmd from 'cmd-ts';
3
+ import dedent from 'dedent';
4
+ import { castMutable, Result, unknownToString } from 'ts-data-forge';
5
+ import 'ts-repo-utils';
6
+ import 'ts-morph';
7
+ import '../functions/functions/is-primitive-type-node.mjs';
8
+ import '../functions/ast-transformers/readonly-transformer-helpers/constants.mjs';
9
+ import { replaceRecordWithUnknownRecordTransformer } from '../functions/ast-transformers/replace-record-with-unknown-record.mjs';
10
+ import { transformSourceCode } from '../functions/ast-transformers/transform-source-code.mjs';
11
+
12
+ /* eslint-disable no-await-in-loop */
13
+ const cmdDef = cmd.command({
14
+ name: 'replace-record-with-unknown-record-cli',
15
+ version: '1.0.0',
16
+ args: {
17
+ baseDir: cmd.positional({
18
+ type: cmd.string,
19
+ displayName: 'baseDir',
20
+ description: 'The base directory in which to perform the conversion',
21
+ }),
22
+ exclude: cmd.multioption({
23
+ long: 'exclude',
24
+ type: cmd.optional(cmd.array(cmd.string)),
25
+ description: 'Glob patterns of files to exclude from the base directory (e.g., "src/generated/**/*.mts")',
26
+ }),
27
+ silent: cmd.flag({
28
+ long: 'silent',
29
+ type: cmd.optional(cmd.boolean),
30
+ description: 'If true, suppresses output messages (default: false)',
31
+ }),
32
+ },
33
+ handler: (args) => {
34
+ replaceRecordWithUnknownRecordCLI({
35
+ baseDir: args.baseDir,
36
+ exclude: args.exclude ?? [],
37
+ silent: args.silent ?? false,
38
+ }).catch((error) => {
39
+ console.error('An error occurred:', error);
40
+ process.exit(1);
41
+ });
42
+ },
43
+ });
44
+ const replaceRecordWithUnknownRecordCLI = async (args) => {
45
+ const echoIfNotSilent = args.silent ? () => { } : echo;
46
+ const errorIfNotSilent = args.silent ? () => { } : console.error;
47
+ // Find all files matching the glob
48
+ const globResult = await glob(args.baseDir, {
49
+ ignore: castMutable(args.exclude),
50
+ });
51
+ if (Result.isErr(globResult)) {
52
+ errorIfNotSilent('Error finding files matching pattern:', globResult.value);
53
+ return Result.err(undefined);
54
+ }
55
+ const files = globResult.value;
56
+ if (files.length === 0) {
57
+ echoIfNotSilent('No files found matching pattern:', args.baseDir);
58
+ return Result.ok(undefined);
59
+ }
60
+ const { errorFiles, transformedCount, unchangedCount } = await transformFiles(files, args.silent);
61
+ const hr = '='.repeat(50);
62
+ echoIfNotSilent(dedent `
63
+ ${hr}
64
+ Summary:
65
+ ✅ Transformed: ${transformedCount}
66
+ ⏭️ Unchanged: ${unchangedCount}
67
+ ❌ Errors: ${errorFiles.length}
68
+ 📊 Total: ${files.length}
69
+ `);
70
+ if (errorFiles.length > 0) {
71
+ echoIfNotSilent('\nFiles with errors:');
72
+ for (const fileName of errorFiles) {
73
+ echoIfNotSilent(` - ${fileName}`);
74
+ }
75
+ }
76
+ echoIfNotSilent(hr);
77
+ if (errorFiles.length > 0) {
78
+ return Result.err(undefined);
79
+ }
80
+ return Result.ok(undefined);
81
+ };
82
+ const transformFiles = async (filePaths, silent) => {
83
+ let mut_transformedCount = 0;
84
+ let mut_unchangedCount = 0;
85
+ const mut_errorFiles = [];
86
+ for (const filePath of filePaths) {
87
+ const result = await transformOneFile(filePath, silent);
88
+ if (Result.isOk(result)) {
89
+ switch (result.value) {
90
+ case 'transformed':
91
+ mut_transformedCount += 1;
92
+ break;
93
+ case 'unchanged':
94
+ mut_unchangedCount += 1;
95
+ break;
96
+ }
97
+ }
98
+ else {
99
+ mut_errorFiles.push(path.basename(filePath));
100
+ }
101
+ }
102
+ return {
103
+ transformedCount: mut_transformedCount,
104
+ unchangedCount: mut_unchangedCount,
105
+ errorFiles: mut_errorFiles,
106
+ };
107
+ };
108
+ const transformOneFile = async (filePath, silent) => {
109
+ const echoIfNotSilent = silent ? () => { } : echo;
110
+ const errorIfNotSilent = silent ? () => { } : console.error;
111
+ const fileName = path.basename(filePath);
112
+ const isTsx = fileName.endsWith('.tsx') || fileName.endsWith('.jsx');
113
+ try {
114
+ const originalCode = await fs.readFile(filePath, 'utf8');
115
+ // Transform the code with all transformers
116
+ const transformedCode = transformSourceCode(originalCode, isTsx, [
117
+ replaceRecordWithUnknownRecordTransformer(),
118
+ ]);
119
+ // Check if the code was actually changed
120
+ if (transformedCode === originalCode) {
121
+ echoIfNotSilent(`⏭️ ${fileName} - no changes needed`);
122
+ return Result.ok('unchanged');
123
+ }
124
+ else {
125
+ // Write back the transformed code
126
+ await fs.writeFile(filePath, transformedCode, 'utf8');
127
+ echoIfNotSilent(`✅ ${fileName} - transformed`);
128
+ return Result.ok('transformed');
129
+ }
130
+ }
131
+ catch (error) {
132
+ const errStr = unknownToString(error);
133
+ errorIfNotSilent(`❌ ${fileName} - error: ${errStr}`);
134
+ return Result.err(errStr);
135
+ }
136
+ };
137
+ await cmd.run(cmdDef, process.argv.slice(2));
138
+ //# sourceMappingURL=replace-record-with-unknown-record.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../src/cmd/replace-record-with-unknown-record.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
+ export { appendAsConstTransformer } from './functions/ast-transformers/append-as-const.mjs';
1
2
  export { convertInterfaceToTypeTransformer } from './functions/ast-transformers/convert-interface-to-type.mjs';
2
3
  export { convertToReadonlyTypeTransformer } from './functions/ast-transformers/convert-to-readonly-type.mjs';
3
4
  export { compareUnionIntersectionTypes } from './functions/ast-transformers/readonly-transformer-helpers/compare-union-types.mjs';
4
5
  export { invalidDeepReadonlyTypeName } from './functions/ast-transformers/readonly-transformer-helpers/constants.mjs';
5
6
  export { groupUnionIntersectionTypes } from './functions/ast-transformers/readonly-transformer-helpers/group-union-types.mjs';
6
7
  export { nextReadonlyContext } from './functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs';
8
+ export { replaceAnyWithUnknownTransformer } from './functions/ast-transformers/replace-any-with-unknown.mjs';
7
9
  export { replaceRecordWithUnknownRecordTransformer } from './functions/ast-transformers/replace-record-with-unknown-record.mjs';
8
10
  export { transformSourceCode } from './functions/ast-transformers/transform-source-code.mjs';
9
11
  export { IGNORE_FILE_COMMENT_TEXT, IGNORE_LINE_COMMENT_TEXT } from './functions/constants/ignore-comment-text.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"entry-point.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"entry-point.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ import { type TsMorphTransformer } from './types.mjs';
2
+ export declare const appendAsConstTransformer: (options?: AppendAsConstTransformerOptions) => TsMorphTransformer;
3
+ export type AppendAsConstTransformerOptions = DeepReadonly<{
4
+ applyLevel?: 'all' | 'avoidInFunctionArgs';
5
+ /**
6
+ * A mute keywords to ignore the readonly conversion.
7
+ *
8
+ * (e.g. `"mut_"`)
9
+ */
10
+ ignorePrefixes?: string[];
11
+ ignoreConstTypeParameter?: boolean;
12
+ }>;
13
+ //# sourceMappingURL=append-as-const.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"append-as-const.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/append-as-const.mts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,eAAO,MAAM,wBAAwB,GAClC,UAAU,+BAA+B,KAAG,kBAY5C,CAAC;AAEJ,MAAM,MAAM,+BAA+B,GAAG,YAAY,CAAC;IACzD,UAAU,CAAC,EAAE,KAAK,GAAG,qBAAqB,CAAC;IAE3C;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { ISet } from 'ts-data-forge';
2
+ import * as tsm from 'ts-morph';
3
+ import { hasDisableNextLineComment } from '../functions/has-disable-next-line-comment.mjs';
4
+ import { isAsConstNode } from '../functions/is-as-const-node.mjs';
5
+ import '../functions/is-primitive-type-node.mjs';
6
+
7
+ const appendAsConstTransformer = (options) => (sourceAst) => {
8
+ const ignorePrefixes = ISet.create(options?.ignorePrefixes ?? ['mut_']);
9
+ const optionsInternal = {
10
+ applyLevel: options?.applyLevel ?? 'avoidInFunctionArgs',
11
+ ignoredPrefixes: ignorePrefixes,
12
+ };
13
+ for (const node of sourceAst.getChildren()) {
14
+ transformNode(node, optionsInternal);
15
+ }
16
+ };
17
+ const transformNode = (node, options) => {
18
+ if (hasDisableNextLineComment(node)) {
19
+ console.debug('skipped by disable-next-line comment');
20
+ return;
21
+ }
22
+ // check for ignorePrefix
23
+ if (node.isKind(tsm.SyntaxKind.VariableDeclaration)) {
24
+ const nodeName = node.getName();
25
+ if (options.ignoredPrefixes.some((p) => nodeName.startsWith(p))) {
26
+ // Skip conversion for variable declarations with ignored prefixes
27
+ // Example: const mut_foo: string[] = []; -> remains as is, without appending `as const`
28
+ console.debug('skipped variable declaration by ignorePrefixes');
29
+ return;
30
+ }
31
+ // TODO: Support ignoredPrefixes in ArrayBindingPattern
32
+ // if (ts.isArrayBindingPattern(nodeName)) {
33
+ // // for (const [i, el] of nodeName.elements.entries())
34
+ // }
35
+ // TODO: Support ignoredPrefixes in ObjectBindingPattern
36
+ // if (ts.isObjectBindingPattern(nodeName)) {
37
+ // // for (const [i, el] of nodeName.elements.entries())
38
+ // }
39
+ }
40
+ if (options.applyLevel === 'avoidInFunctionArgs' &&
41
+ tsm.Node.isCallExpression(node)) {
42
+ return;
43
+ }
44
+ // `as const` node
45
+ if (isAsConstNode(node)) {
46
+ const expression = removeParenthesis(node.getExpression());
47
+ if (!tsm.Node.isArrayLiteralExpression(expression) &&
48
+ !tsm.Node.isObjectLiteralExpression(expression)) {
49
+ // `as const` is not needed for primitive types
50
+ // Example: `0 as const` -> `0`
51
+ node.replaceWithText(expression.getText());
52
+ return;
53
+ }
54
+ // Avoid appending `as const` twice
55
+ removeAsConstRecursively(node.getExpression());
56
+ return;
57
+ }
58
+ if (tsm.Node.isArrayLiteralExpression(node)) {
59
+ for (const el of node.getElements()) {
60
+ removeAsConstRecursively(el);
61
+ }
62
+ node.replaceWithText(`${node.getText()} as const`);
63
+ return;
64
+ }
65
+ if (tsm.Node.isObjectLiteralExpression(node)) {
66
+ for (const el of node.getProperties()) {
67
+ removeAsConstRecursively(el);
68
+ }
69
+ node.replaceWithText(`${node.getText()} as const`);
70
+ return;
71
+ }
72
+ for (const child of node.getChildren()) {
73
+ transformNode(child, options);
74
+ }
75
+ };
76
+ const removeAsConstRecursively = (node) => {
77
+ if (hasDisableNextLineComment(node)) {
78
+ console.debug('skipped by disable-next-line comment');
79
+ return;
80
+ }
81
+ if (isAsConstNode(node)) {
82
+ // Extract node.expression to remove `as const` and recursively call the function
83
+ // to remove `as const` from nested nodes
84
+ // Example: `[[1,2] as const, [3,4]] as const` -> `[[1,2], [3,4]]`
85
+ removeAsConstRecursively(node.getExpression());
86
+ node.replaceWithText(node.getExpression().getText());
87
+ return;
88
+ }
89
+ for (const child of node.getChildren()) {
90
+ removeAsConstRecursively(child);
91
+ }
92
+ };
93
+ const removeParenthesis = (node) => tsm.Node.isParenthesizedExpression(node)
94
+ ? removeParenthesis(node.getExpression())
95
+ : node;
96
+
97
+ export { appendAsConstTransformer };
98
+ //# sourceMappingURL=append-as-const.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"append-as-const.mjs","sources":["../../../src/functions/ast-transformers/append-as-const.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}