ts-codemod-lib 2.2.3 → 2.2.4

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 (42) hide show
  1. package/README.md +0 -12
  2. package/dist/cmd/append-as-const.mjs +1 -1
  3. package/dist/cmd/append-as-const.mjs.map +1 -1
  4. package/dist/cmd/convert-interface-to-type.mjs +1 -1
  5. package/dist/cmd/convert-interface-to-type.mjs.map +1 -1
  6. package/dist/cmd/convert-to-readonly.mjs +1 -1
  7. package/dist/cmd/convert-to-readonly.mjs.map +1 -1
  8. package/dist/cmd/replace-any-with-unknown.mjs +1 -1
  9. package/dist/cmd/replace-any-with-unknown.mjs.map +1 -1
  10. package/dist/cmd/replace-record-with-unknown-record.mjs +1 -1
  11. package/dist/cmd/replace-record-with-unknown-record.mjs.map +1 -1
  12. package/dist/cmd/run-transformer-cli.mjs +1 -1
  13. package/dist/cmd/run-transformer-cli.mjs.map +1 -1
  14. package/dist/functions/ast-transformers/append-as-const.mjs +1 -1
  15. package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
  16. package/dist/functions/ast-transformers/convert-interface-to-type.mjs +4 -4
  17. package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -1
  18. package/dist/functions/ast-transformers/convert-to-readonly.mjs +10 -10
  19. package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
  20. package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts.map +1 -1
  21. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +13 -13
  22. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
  23. package/dist/functions/ast-transformers/transform-source-code.mjs +2 -2
  24. package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
  25. package/dist/functions/functions/is-as-const-node.mjs +1 -1
  26. package/dist/functions/functions/is-as-const-node.mjs.map +1 -1
  27. package/dist/functions/functions/is-readonly-node.mjs +1 -1
  28. package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
  29. package/package.json +36 -39
  30. package/src/cmd/append-as-const.mts +1 -1
  31. package/src/cmd/convert-interface-to-type.mts +1 -1
  32. package/src/cmd/convert-to-readonly.mts +1 -1
  33. package/src/cmd/replace-any-with-unknown.mts +1 -1
  34. package/src/cmd/replace-record-with-unknown-record.mts +1 -1
  35. package/src/cmd/run-transformer-cli.mts +1 -1
  36. package/src/functions/ast-transformers/append-as-const.mts +1 -1
  37. package/src/functions/ast-transformers/convert-interface-to-type.mts +4 -4
  38. package/src/functions/ast-transformers/convert-to-readonly.mts +11 -16
  39. package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +18 -29
  40. package/src/functions/ast-transformers/transform-source-code.mts +2 -2
  41. package/src/functions/functions/is-as-const-node.mts +1 -1
  42. package/src/functions/functions/is-readonly-node.mts +1 -1
package/README.md CHANGED
@@ -448,21 +448,9 @@ node codemod.mjs
448
448
 
449
449
  ```sh
450
450
  git clone https://github.com/noshiro-pf/ts-codemod-lib.git
451
- git submodule update --init --recursive
452
451
  pnpm i
453
452
  ```
454
453
 
455
- ### Syncing AGENTS.md Updates
456
-
457
- 1. Update `AGENTS.md` in the common repository (`common-agent-config`)
458
- 2. Update the submodule in each project
459
-
460
- ```bash
461
- git submodule update --remote --merge
462
- git add agents/common
463
- git commit -m "Update AGENTS.md"
464
- ```
465
-
466
454
  ### Resources
467
455
 
468
456
  - <https://ts-ast-viewer.com/#>
@@ -10,7 +10,7 @@ import { runTransformerCLI } from './run-transformer-cli.mjs';
10
10
  const transformer = appendAsConstTransformer();
11
11
  const cmdDef = cmd.command({
12
12
  name: transformer.name,
13
- version: "2.2.3",
13
+ version: "2.2.4",
14
14
  args: {
15
15
  baseDir: cmd.positional({
16
16
  type: cmd.string,
@@ -1 +1 @@
1
- {"version":3,"file":"append-as-const.mjs","sources":["../../src/cmd/append-as-const.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { appendAsConstTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = appendAsConstTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.3',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,wBAAA,EAAyB;AAE7C,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"append-as-const.mjs","sources":["../../src/cmd/append-as-const.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { appendAsConstTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = appendAsConstTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.4',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,wBAAA,EAAyB;AAE7C,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
@@ -10,7 +10,7 @@ import { runTransformerCLI } from './run-transformer-cli.mjs';
10
10
  const transformer = convertInterfaceToTypeTransformer();
11
11
  const cmdDef = cmd.command({
12
12
  name: transformer.name,
13
- version: "2.2.3",
13
+ version: "2.2.4",
14
14
  args: {
15
15
  baseDir: cmd.positional({
16
16
  type: cmd.string,
@@ -1 +1 @@
1
- {"version":3,"file":"convert-interface-to-type.mjs","sources":["../../src/cmd/convert-interface-to-type.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { convertInterfaceToTypeTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = convertInterfaceToTypeTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.3',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,iCAAA,EAAkC;AAEtD,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"convert-interface-to-type.mjs","sources":["../../src/cmd/convert-interface-to-type.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { convertInterfaceToTypeTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = convertInterfaceToTypeTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.4',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,iCAAA,EAAkC;AAEtD,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
@@ -10,7 +10,7 @@ import { runTransformerCLI } from './run-transformer-cli.mjs';
10
10
  const transformer = convertToReadonlyTransformer();
11
11
  const cmdDef = cmd.command({
12
12
  name: transformer.name,
13
- version: "2.2.3",
13
+ version: "2.2.4",
14
14
  args: {
15
15
  baseDir: cmd.positional({
16
16
  type: cmd.string,
@@ -1 +1 @@
1
- {"version":3,"file":"convert-to-readonly.mjs","sources":["../../src/cmd/convert-to-readonly.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { convertToReadonlyTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = convertToReadonlyTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.3',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,4BAAA,EAA6B;AAEjD,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"convert-to-readonly.mjs","sources":["../../src/cmd/convert-to-readonly.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { convertToReadonlyTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = convertToReadonlyTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.4',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,4BAAA,EAA6B;AAEjD,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
@@ -10,7 +10,7 @@ import { runTransformerCLI } from './run-transformer-cli.mjs';
10
10
  const transformer = replaceAnyWithUnknownTransformer();
11
11
  const cmdDef = cmd.command({
12
12
  name: transformer.name,
13
- version: "2.2.3",
13
+ version: "2.2.4",
14
14
  args: {
15
15
  baseDir: cmd.positional({
16
16
  type: cmd.string,
@@ -1 +1 @@
1
- {"version":3,"file":"replace-any-with-unknown.mjs","sources":["../../src/cmd/replace-any-with-unknown.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { replaceAnyWithUnknownTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = replaceAnyWithUnknownTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.3',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,gCAAA,EAAiC;AAErD,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"replace-any-with-unknown.mjs","sources":["../../src/cmd/replace-any-with-unknown.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { replaceAnyWithUnknownTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = replaceAnyWithUnknownTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.4',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,gCAAA,EAAiC;AAErD,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
@@ -10,7 +10,7 @@ import { runTransformerCLI } from './run-transformer-cli.mjs';
10
10
  const transformer = replaceRecordWithUnknownRecordTransformer();
11
11
  const cmdDef = cmd.command({
12
12
  name: transformer.name,
13
- version: "2.2.3",
13
+ version: "2.2.4",
14
14
  args: {
15
15
  baseDir: cmd.positional({
16
16
  type: cmd.string,
@@ -1 +1 @@
1
- {"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../src/cmd/replace-record-with-unknown-record.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { replaceRecordWithUnknownRecordTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = replaceRecordWithUnknownRecordTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.3',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,yCAAA,EAA0C;AAE9D,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../src/cmd/replace-record-with-unknown-record.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { replaceRecordWithUnknownRecordTransformer } from '../functions/index.mjs';\nimport { runTransformerCLI } from './run-transformer-cli.mjs';\n\nconst transformer = replaceRecordWithUnknownRecordTransformer();\n\nconst cmdDef = cmd.command({\n name: transformer.name,\n version: '2.2.4',\n args: {\n baseDir: cmd.positional({\n type: cmd.string,\n displayName: 'baseDir',\n description: 'The base directory in which to perform the conversion',\n }),\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the base directory (e.g., \"src/generated/**/*.mts\")',\n }),\n uncommitted: cmd.flag({\n long: 'uncommitted',\n type: cmd.optional(cmd.boolean),\n description:\n 'If true, transforms only uncommitted files (untracked, modified, and staged files)',\n }),\n diffFrom: cmd.option({\n long: 'diff-from',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, transforms only files that differ from the given base branch or commit hash',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n (async (): Promise<void> => {\n const result = await runTransformerCLI(\n {\n baseDir: args.baseDir,\n exclude: args.exclude ?? [],\n uncommitted: args.uncommitted ?? false,\n diffFrom: args.diffFrom,\n silent: args.silent ?? false,\n },\n [transformer],\n );\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n })().catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,cAAc,yCAAA,EAA0C;AAE9D,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,IAAI,UAAA,CAAW;AAAA,MACtB,MAAM,GAAA,CAAI,MAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,OAAA,EAAS,IAAI,WAAA,CAAY;AAAA,MACvB,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,WAAA,EAAa,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,QAAA,EAAU,IAAI,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,CAAC,YAA2B;AAC1B,MAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,QACnB;AAAA,UACE,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,UAC1B,WAAA,EAAa,KAAK,WAAA,IAAe,KAAA;AAAA,UACjC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAEA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
@@ -22,7 +22,7 @@ const runTransformerCLI = async (options, transformers) => {
22
22
  return Result.err(void 0);
23
23
  }
24
24
  const files = filesResult.value;
25
- if (Arr.isArrayOfLength(files, 0)) {
25
+ if (Arr.isEmpty(files)) {
26
26
  echoIfNotSilent(
27
27
  options.diffFrom !== void 0 ? `No files found in diff from "${options.diffFrom}" matching pattern: ${options.baseDir}` : options.uncommitted ? "No uncommitted files found" : `No files found matching pattern: ${options.baseDir}`
28
28
  );
@@ -1 +1 @@
1
- {"version":3,"file":"run-transformer-cli.mjs","sources":["../../src/cmd/run-transformer-cli.mts"],"sourcesContent":["/* eslint-disable no-await-in-loop */\n\nimport dedent from 'dedent';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Arr, expectType, Result, unknownToString } from 'ts-data-forge';\nimport {\n getDiffFrom,\n getModifiedFiles,\n getStagedFiles,\n getUntrackedFiles,\n glob,\n} from 'ts-repo-utils';\nimport {\n transformSourceCode,\n type TsMorphTransformer,\n} from '../functions/index.mjs';\n\ntype GetFilesOptions = Readonly<{\n baseDir: string;\n exclude: readonly string[];\n uncommitted: boolean;\n diffFrom: string | undefined;\n silent: boolean;\n}>;\n\ntype TransformerCLIOptions = GetFilesOptions;\n\nexport const runTransformerCLI = async (\n options: TransformerCLIOptions,\n transformers: readonly TsMorphTransformer[],\n): Promise<Result<undefined, undefined>> => {\n const echoIfNotSilent = options.silent ? () => {} : console.log;\n\n const errorIfNotSilent = options.silent ? () => {} : console.error;\n\n const filesResult = await getFilesForTransformation(options);\n\n if (Result.isErr(filesResult)) {\n errorIfNotSilent(\n options.diffFrom !== undefined\n ? `Error getting diff files from \"${options.diffFrom}\":`\n : options.uncommitted\n ? 'Error getting uncommitted files:'\n : 'Error finding files matching pattern:',\n filesResult.value,\n );\n\n return Result.err(undefined);\n }\n\n const files = filesResult.value;\n\n if (Arr.isArrayOfLength(files, 0)) {\n echoIfNotSilent(\n options.diffFrom !== undefined\n ? `No files found in diff from \"${options.diffFrom}\" matching pattern: ${options.baseDir}`\n : options.uncommitted\n ? 'No uncommitted files found'\n : `No files found matching pattern: ${options.baseDir}`,\n );\n\n return Result.ok(undefined);\n }\n\n const { errorFiles, transformedCount, unchangedCount } = await transformFiles(\n files,\n transformers,\n options.silent,\n );\n\n const hr = '='.repeat(50);\n\n echoIfNotSilent(dedent`\n ${hr}\n Summary:\n ✅ Transformed: ${transformedCount}\n ⏭️ Unchanged: ${unchangedCount}\n ❌ Errors: ${errorFiles.length}\n 📊 Total: ${files.length}\n `);\n\n if (Arr.isNonEmpty(errorFiles)) {\n echoIfNotSilent('\\nFiles with errors:');\n\n for (const fileName of errorFiles) {\n echoIfNotSilent(` - ${fileName}`);\n }\n }\n\n echoIfNotSilent(hr);\n\n if (Arr.isNonEmpty(errorFiles)) {\n return Result.err(undefined);\n }\n\n return Result.ok(undefined);\n};\n\nconst getFilesForTransformation = async (\n options: GetFilesOptions,\n): Promise<\n Result<\n readonly string[],\n | readonly unknown[]\n | Readonly<{\n message: string;\n }>\n >\n> => {\n const filesFromGlob = await getFilesFromGlob(\n options.baseDir,\n options.exclude,\n options.silent,\n );\n\n if (Result.isErr(filesFromGlob)) {\n return filesFromGlob;\n }\n\n let mut_files = filesFromGlob.value;\n\n if (options.uncommitted) {\n const uncommittedFiles = await getUncommittedFiles(options.silent);\n\n if (Result.isErr(uncommittedFiles)) {\n return uncommittedFiles;\n }\n\n mut_files = Arr.setIntersection(mut_files, uncommittedFiles.value);\n }\n\n if (options.diffFrom !== undefined) {\n const diffFiles = await getDiffFrom(options.diffFrom, {\n silent: options.silent,\n });\n\n if (Result.isErr(diffFiles)) {\n return diffFiles;\n }\n\n mut_files = Arr.setIntersection(mut_files, diffFiles.value);\n }\n\n return Result.ok(mut_files);\n};\n\nconst getUncommittedFiles = async (\n silent: boolean,\n): Promise<\n Result<\n readonly string[],\n | readonly unknown[]\n | Readonly<{\n message: string;\n }>\n >\n> => {\n const mut_files: string[] = [];\n\n const untrackedFilesResult = await getUntrackedFiles({ silent });\n\n if (Result.isErr(untrackedFilesResult)) {\n return untrackedFilesResult;\n }\n\n mut_files.push(...untrackedFilesResult.value);\n\n const modifiedFilesResult = await getModifiedFiles({ silent });\n\n if (Result.isErr(modifiedFilesResult)) {\n return modifiedFilesResult;\n }\n\n mut_files.push(...modifiedFilesResult.value);\n\n const stagedFilesResult = await getStagedFiles({ silent });\n\n if (Result.isErr(stagedFilesResult)) {\n return stagedFilesResult;\n }\n\n mut_files.push(...stagedFilesResult.value);\n\n return Result.ok(Arr.uniq(mut_files));\n};\n\nconst getFilesFromGlob = async (\n baseDir: string,\n exclude: readonly string[],\n silent: boolean,\n): Promise<\n Result<\n readonly string[],\n | readonly unknown[]\n | Readonly<{\n message: string;\n }>\n >\n> => {\n const globResult = await glob(baseDir, {\n // Never transform files inside dependencies. With pnpm,\n // `packages/*/node_modules/<dep>` are symlinks whose `src/` directory would\n // otherwise be matched by patterns such as\n // `packages/**/{src,scripts,samples,test}/**`, so the codemod would rewrite\n // dependency source files (and could hit pathological types there).\n ignore: Arr.toPushed(exclude, '**/node_modules/**'),\n absolute: true,\n // Do not escape the project tree by following symlinks (e.g. the pnpm\n // `node_modules` symlinks above, or workspace-package links).\n followSymbolicLinks: false,\n });\n\n if (Result.isErr(globResult)) {\n if (!silent) {\n console.error('Error finding files matching pattern:', globResult.value);\n }\n\n return Result.err([globResult.value]);\n }\n\n return Result.ok(globResult.value);\n};\n\nconst transformFiles = async (\n filePaths: readonly string[],\n transformers: readonly TsMorphTransformer[],\n silent: boolean,\n): Promise<\n Readonly<{\n transformedCount: number;\n unchangedCount: number;\n errorFiles: readonly string[];\n }>\n> => {\n let mut_transformedCount: number = 0;\n\n let mut_unchangedCount: number = 0;\n\n const mut_errorFiles: string[] = [];\n\n for (const filePath of filePaths) {\n const result = await transformOneFile(filePath, transformers, silent);\n\n if (Result.isOk(result)) {\n expectType<typeof result.value, 'unchanged' | 'transformed'>('=');\n\n if (result.value === 'transformed') {\n mut_transformedCount += 1;\n } else {\n mut_unchangedCount += 1;\n }\n } else {\n mut_errorFiles.push(path.basename(filePath));\n }\n }\n\n return {\n transformedCount: mut_transformedCount,\n unchangedCount: mut_unchangedCount,\n errorFiles: mut_errorFiles,\n };\n};\n\nconst transformOneFile = async (\n filePath: string,\n transformers: readonly TsMorphTransformer[],\n silent: boolean,\n): Promise<Result<'unchanged' | 'transformed', string>> => {\n const echoIfNotSilent = silent ? () => {} : console.log;\n\n const errorIfNotSilent = silent ? () => {} : console.error;\n\n const fileName = path.basename(filePath);\n\n const isTsx = fileName.endsWith('.tsx') || fileName.endsWith('.jsx');\n\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const originalCode = await fs.readFile(filePath, 'utf8');\n\n const transformedCode = transformSourceCode(\n originalCode,\n isTsx,\n transformers,\n );\n\n if (transformedCode === originalCode) {\n echoIfNotSilent(`⏭️ ${fileName} - no changes needed`);\n\n return Result.ok('unchanged');\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await fs.writeFile(filePath, transformedCode, 'utf8');\n\n echoIfNotSilent(`✅ ${fileName} - transformed`);\n\n return Result.ok('transformed');\n } catch (error) {\n const errStr = unknownToString(error);\n\n errorIfNotSilent(`❌ ${fileName} - error: ${errStr}`);\n\n return Result.err(errStr);\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-transformer-cli.mjs","sources":["../../src/cmd/run-transformer-cli.mts"],"sourcesContent":["/* eslint-disable no-await-in-loop */\n\nimport dedent from 'dedent';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Arr, expectType, Result, unknownToString } from 'ts-data-forge';\nimport {\n getDiffFrom,\n getModifiedFiles,\n getStagedFiles,\n getUntrackedFiles,\n glob,\n} from 'ts-repo-utils';\nimport {\n transformSourceCode,\n type TsMorphTransformer,\n} from '../functions/index.mjs';\n\ntype GetFilesOptions = Readonly<{\n baseDir: string;\n exclude: readonly string[];\n uncommitted: boolean;\n diffFrom: string | undefined;\n silent: boolean;\n}>;\n\ntype TransformerCLIOptions = GetFilesOptions;\n\nexport const runTransformerCLI = async (\n options: TransformerCLIOptions,\n transformers: readonly TsMorphTransformer[],\n): Promise<Result<undefined, undefined>> => {\n const echoIfNotSilent = options.silent ? () => {} : console.log;\n\n const errorIfNotSilent = options.silent ? () => {} : console.error;\n\n const filesResult = await getFilesForTransformation(options);\n\n if (Result.isErr(filesResult)) {\n errorIfNotSilent(\n options.diffFrom !== undefined\n ? `Error getting diff files from \"${options.diffFrom}\":`\n : options.uncommitted\n ? 'Error getting uncommitted files:'\n : 'Error finding files matching pattern:',\n filesResult.value,\n );\n\n return Result.err(undefined);\n }\n\n const files = filesResult.value;\n\n if (Arr.isEmpty(files)) {\n echoIfNotSilent(\n options.diffFrom !== undefined\n ? `No files found in diff from \"${options.diffFrom}\" matching pattern: ${options.baseDir}`\n : options.uncommitted\n ? 'No uncommitted files found'\n : `No files found matching pattern: ${options.baseDir}`,\n );\n\n return Result.ok(undefined);\n }\n\n const { errorFiles, transformedCount, unchangedCount } = await transformFiles(\n files,\n transformers,\n options.silent,\n );\n\n const hr = '='.repeat(50);\n\n echoIfNotSilent(dedent`\n ${hr}\n Summary:\n ✅ Transformed: ${transformedCount}\n ⏭️ Unchanged: ${unchangedCount}\n ❌ Errors: ${errorFiles.length}\n 📊 Total: ${files.length}\n `);\n\n if (Arr.isNonEmpty(errorFiles)) {\n echoIfNotSilent('\\nFiles with errors:');\n\n for (const fileName of errorFiles) {\n echoIfNotSilent(` - ${fileName}`);\n }\n }\n\n echoIfNotSilent(hr);\n\n if (Arr.isNonEmpty(errorFiles)) {\n return Result.err(undefined);\n }\n\n return Result.ok(undefined);\n};\n\nconst getFilesForTransformation = async (\n options: GetFilesOptions,\n): Promise<\n Result<\n readonly string[],\n | readonly unknown[]\n | Readonly<{\n message: string;\n }>\n >\n> => {\n const filesFromGlob = await getFilesFromGlob(\n options.baseDir,\n options.exclude,\n options.silent,\n );\n\n if (Result.isErr(filesFromGlob)) {\n return filesFromGlob;\n }\n\n let mut_files = filesFromGlob.value;\n\n if (options.uncommitted) {\n const uncommittedFiles = await getUncommittedFiles(options.silent);\n\n if (Result.isErr(uncommittedFiles)) {\n return uncommittedFiles;\n }\n\n mut_files = Arr.setIntersection(mut_files, uncommittedFiles.value);\n }\n\n if (options.diffFrom !== undefined) {\n const diffFiles = await getDiffFrom(options.diffFrom, {\n silent: options.silent,\n });\n\n if (Result.isErr(diffFiles)) {\n return diffFiles;\n }\n\n mut_files = Arr.setIntersection(mut_files, diffFiles.value);\n }\n\n return Result.ok(mut_files);\n};\n\nconst getUncommittedFiles = async (\n silent: boolean,\n): Promise<\n Result<\n readonly string[],\n | readonly unknown[]\n | Readonly<{\n message: string;\n }>\n >\n> => {\n const mut_files: string[] = [];\n\n const untrackedFilesResult = await getUntrackedFiles({ silent });\n\n if (Result.isErr(untrackedFilesResult)) {\n return untrackedFilesResult;\n }\n\n mut_files.push(...untrackedFilesResult.value);\n\n const modifiedFilesResult = await getModifiedFiles({ silent });\n\n if (Result.isErr(modifiedFilesResult)) {\n return modifiedFilesResult;\n }\n\n mut_files.push(...modifiedFilesResult.value);\n\n const stagedFilesResult = await getStagedFiles({ silent });\n\n if (Result.isErr(stagedFilesResult)) {\n return stagedFilesResult;\n }\n\n mut_files.push(...stagedFilesResult.value);\n\n return Result.ok(Arr.uniq(mut_files));\n};\n\nconst getFilesFromGlob = async (\n baseDir: string,\n exclude: readonly string[],\n silent: boolean,\n): Promise<\n Result<\n readonly string[],\n | readonly unknown[]\n | Readonly<{\n message: string;\n }>\n >\n> => {\n const globResult = await glob(baseDir, {\n // Never transform files inside dependencies. With pnpm,\n // `packages/*/node_modules/<dep>` are symlinks whose `src/` directory would\n // otherwise be matched by patterns such as\n // `packages/**/{src,scripts,samples,test}/**`, so the codemod would rewrite\n // dependency source files (and could hit pathological types there).\n ignore: Arr.toPushed(exclude, '**/node_modules/**'),\n absolute: true,\n // Do not escape the project tree by following symlinks (e.g. the pnpm\n // `node_modules` symlinks above, or workspace-package links).\n followSymbolicLinks: false,\n });\n\n if (Result.isErr(globResult)) {\n if (!silent) {\n console.error('Error finding files matching pattern:', globResult.value);\n }\n\n return Result.err([globResult.value]);\n }\n\n return Result.ok(globResult.value);\n};\n\nconst transformFiles = async (\n filePaths: readonly string[],\n transformers: readonly TsMorphTransformer[],\n silent: boolean,\n): Promise<\n Readonly<{\n transformedCount: number;\n unchangedCount: number;\n errorFiles: readonly string[];\n }>\n> => {\n let mut_transformedCount: number = 0;\n\n let mut_unchangedCount: number = 0;\n\n const mut_errorFiles: string[] = [];\n\n for (const filePath of filePaths) {\n const result = await transformOneFile(filePath, transformers, silent);\n\n if (Result.isOk(result)) {\n expectType<typeof result.value, 'unchanged' | 'transformed'>('=');\n\n if (result.value === 'transformed') {\n mut_transformedCount += 1;\n } else {\n mut_unchangedCount += 1;\n }\n } else {\n mut_errorFiles.push(path.basename(filePath));\n }\n }\n\n return {\n transformedCount: mut_transformedCount,\n unchangedCount: mut_unchangedCount,\n errorFiles: mut_errorFiles,\n };\n};\n\nconst transformOneFile = async (\n filePath: string,\n transformers: readonly TsMorphTransformer[],\n silent: boolean,\n): Promise<Result<'unchanged' | 'transformed', string>> => {\n const echoIfNotSilent = silent ? () => {} : console.log;\n\n const errorIfNotSilent = silent ? () => {} : console.error;\n\n const fileName = path.basename(filePath);\n\n const isTsx = fileName.endsWith('.tsx') || fileName.endsWith('.jsx');\n\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const originalCode = await fs.readFile(filePath, 'utf8');\n\n const transformedCode = transformSourceCode(\n originalCode,\n isTsx,\n transformers,\n );\n\n if (transformedCode === originalCode) {\n echoIfNotSilent(`⏭️ ${fileName} - no changes needed`);\n\n return Result.ok('unchanged');\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await fs.writeFile(filePath, transformedCode, 'utf8');\n\n echoIfNotSilent(`✅ ${fileName} - transformed`);\n\n return Result.ok('transformed');\n } catch (error) {\n const errStr = unknownToString(error);\n\n errorIfNotSilent(`❌ ${fileName} - error: ${errStr}`);\n\n return Result.err(errStr);\n }\n};\n"],"names":[],"mappings":"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"}
@@ -62,7 +62,7 @@ const transformNode = (node, context, options) => {
62
62
  return;
63
63
  }
64
64
  const declarationKindKeywords = node.getVariableStatement()?.getDeclarationKindKeywords().map((k) => k.getText());
65
- if (declarationKindKeywords !== void 0 && Arr.isArrayOfLength(declarationKindKeywords, 1)) {
65
+ if (declarationKindKeywords !== void 0 && Arr.isFixedLengthArray(1, declarationKindKeywords)) {
66
66
  transformNode(
67
67
  initializer,
68
68
  {
@@ -1 +1 @@
1
- {"version":3,"file":"append-as-const.mjs","sources":["../../../src/functions/ast-transformers/append-as-const.mts"],"sourcesContent":["import { Arr, ISet } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type DeepReadonly } from 'ts-type-forge';\nimport {\n hasDisableNextLineComment,\n isAsConstNode,\n} from '../functions/index.mjs';\nimport { replaceNodeWithDebugPrint } from '../utils/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'append-as-const';\n\nexport const appendAsConstTransformer = (\n options?: AppendAsConstTransformerOptions,\n): TsMorphTransformer => {\n const ignorePrefixes = ISet.create(\n options?.ignorePrefixes ?? ['mut_', '#mut_', '_mut_', 'draft'],\n );\n\n const optionsInternal: AppendAsConstTransformerOptionsInternal = {\n applyLevel: options?.applyLevel ?? 'avoidInFunctionArgs',\n ignoredPrefixes: ignorePrefixes,\n\n debugPrint: options?.debug === true ? console.debug : () => {},\n replaceNode:\n options?.debug === true\n ? replaceNodeWithDebugPrint\n : (node, newNodeText) => node.replaceWithText(newNodeText),\n } as const;\n\n return {\n name: TRANSFORMER_NAME,\n transform: (sourceAst) => {\n for (const node of sourceAst.getDescendantsOfKind(\n tsm.SyntaxKind.VariableDeclaration,\n )) {\n transformNode(\n node,\n {\n isUnderConstContext: false,\n isDirectUnderConstInitializer: false,\n },\n optionsInternal,\n );\n }\n },\n };\n};\n\nexport type AppendAsConstTransformerOptions = DeepReadonly<{\n /**\n * @default \"avoidInFunctionArgs\"\n */\n applyLevel?: 'all' | 'avoidInFunctionArgs';\n\n /**\n * A mute keywords to ignore the readonly conversion.\n *\n * (e.g. `\"mut_\"`)\n *\n * @default ['mut_', '#mut_', '_mut_', 'draft']\n */\n ignorePrefixes?: string[];\n\n // TODO\n // ignoreConstTypeParameter?: boolean;\n\n debug?: boolean;\n}>;\n\ntype AppendAsConstTransformerOptionsInternal = DeepReadonly<{\n applyLevel: 'all' | 'avoidInFunctionArgs';\n ignoredPrefixes: ISet<string>;\n\n debugPrint: (...args: readonly unknown[]) => void;\n replaceNode: (node: tsm.Node, newNodeText: string) => void;\n}>;\n\ntype AsConstContext = Readonly<{\n /**\n * Whether the current node is under an `as const` context.\n *\n * (e.g. `[1, 2, {x: 3}] as const` --> `isUnderConstContext` is true for `[1, 2, {x: 3}]` and its children `{x: 3}`)\n */\n isUnderConstContext: boolean;\n\n /**\n * Whether the current node is directly under a `const` variable initializer.\n *\n * (e.g. `const foo = [1, 2, 3];` --> `isDirectUnderConstInitializer` is true for `[1, 2, 3]`)\n */\n isDirectUnderConstInitializer: boolean;\n}>;\n\nconst transformNode = (\n node: tsm.Node,\n context: AsConstContext,\n options: AppendAsConstTransformerOptionsInternal,\n): void => {\n if (node.wasForgotten()) {\n return;\n }\n\n options.debugPrint(node.getKindName(), node.getText(), { context });\n\n if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {\n options.debugPrint('skipped by disable-next-line comment');\n\n return;\n }\n\n if (\n options.applyLevel === 'avoidInFunctionArgs' &&\n tsm.Node.isCallExpression(node)\n ) {\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.VariableDeclaration)) {\n const nodeName = node.getName();\n\n // check for ignorePrefix\n if (options.ignoredPrefixes.some((p) => nodeName.startsWith(p))) {\n // Skip conversion for variable declarations with ignored prefixes\n // Example: const mut_foo: string[] = []; -> remains as is, without appending `as const`\n options.debugPrint('skipped variable declaration by ignorePrefixes');\n\n return;\n }\n\n const variableStatement = node.getVariableStatement();\n\n if (\n variableStatement !== undefined &&\n hasDisableNextLineComment(variableStatement, TRANSFORMER_NAME)\n ) {\n return;\n }\n\n const initializer = node.getInitializer();\n\n if (initializer === undefined) {\n return;\n }\n\n const declarationKindKeywords = node\n .getVariableStatement()\n ?.getDeclarationKindKeywords()\n .map((k) => k.getText());\n\n if (\n declarationKindKeywords !== undefined &&\n Arr.isArrayOfLength(declarationKindKeywords, 1)\n ) {\n transformNode(\n initializer,\n {\n isDirectUnderConstInitializer: declarationKindKeywords[0] === 'const',\n isUnderConstContext: false,\n },\n options,\n );\n\n return;\n }\n\n // const [a, b] = ...;\n // TODO: Support ignoredPrefixes in ArrayBindingPattern\n // if (ts.isArrayBindingPattern(nodeName)) {\n // // for (const [i, el] of nodeName.elements.entries())\n // }\n\n // const { x, y } = ...;\n // TODO: Support ignoredPrefixes in ObjectBindingPattern\n // if (ts.isObjectBindingPattern(nodeName)) {\n // // for (const [i, el] of nodeName.elements.entries())\n // }\n }\n\n // Skip already type asserted nodes\n if (tsm.Node.isAsExpression(node) && !isAsConstNode(node)) {\n return;\n }\n\n // pass by ([(X)] -> X)\n if (tsm.Node.isParenthesizedExpression(node)) {\n transformNode(node.getExpression(), context, options);\n\n return;\n }\n\n // pass by ([X satisfies ...] -> X)\n if (tsm.Node.isSatisfiesExpression(node)) {\n transformNode(node.getExpression(), context, options);\n\n return;\n }\n\n // pass by property initializer ([key: value] -> value)\n if (tsm.Node.isPropertyAssignment(node)) {\n const initializer = node.getInitializer();\n\n if (initializer !== undefined) {\n transformNode(initializer, context, options);\n }\n\n return;\n }\n\n // pass by arrow function body ([() => X] -> X)\n if (tsm.Node.isArrowFunction(node)) {\n const body = node.getBody();\n\n transformNode(body, context, options);\n\n return;\n }\n\n // pass by spread element ([...X] -> X)\n if (tsm.Node.isSpreadElement(node)) {\n transformNode(node.getExpression(), context, options);\n\n return;\n }\n\n if (\n node.isKind(tsm.SyntaxKind.NoSubstitutionTemplateLiteral) || // `abc`\n node.isKind(tsm.SyntaxKind.NumericLiteral) || // 123\n node.isKind(tsm.SyntaxKind.BigIntLiteral) || // 123n\n node.isKind(tsm.SyntaxKind.StringLiteral) || // 'abc'\n node.isKind(tsm.SyntaxKind.TrueKeyword) || // true\n node.isKind(tsm.SyntaxKind.FalseKeyword) // false\n ) {\n if (\n !context.isDirectUnderConstInitializer &&\n !context.isUnderConstContext\n ) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TemplateExpression)) {\n if (!context.isUnderConstContext) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n if (tsm.Node.isArrayLiteralExpression(node)) {\n for (const el of node.getElements()) {\n transformNode(\n el,\n {\n isUnderConstContext: true, // [...] as const\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n }\n\n if (!context.isUnderConstContext) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n if (tsm.Node.isObjectLiteralExpression(node)) {\n for (const el of node.getProperties()) {\n transformNode(\n el,\n {\n isUnderConstContext: true, // {...} as const\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n }\n\n if (!context.isUnderConstContext) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n // `as const` node\n if (isAsConstNode(node)) {\n if (context.isDirectUnderConstInitializer) {\n // In const variable declarations, remove `as const` first and then re-append it later if needed\n\n transformNode(\n node.getExpression(),\n {\n isUnderConstContext: false,\n isDirectUnderConstInitializer: true,\n },\n options,\n );\n\n options.replaceNode(\n node,\n // The expression may be marked \"as const\"\n node.getExpression().getText(),\n ); // remove `as const`\n\n return;\n }\n\n if (context.isUnderConstContext) {\n transformNode(\n node.getExpression(),\n {\n isUnderConstContext: true,\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n\n options.replaceNode(\n node,\n // The expression may be marked \"as const\"\n node.getExpression().getText(),\n ); // remove `as const`\n\n return;\n }\n\n transformNode(\n node.getExpression(),\n {\n isUnderConstContext: true,\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n\n return;\n }\n\n if (tsm.Node.isConditionalExpression(node)) {\n // For conditional expressions, traverse both branches in a non-const context\n transformNode(\n node.getWhenTrue(),\n {\n isDirectUnderConstInitializer: context.isDirectUnderConstInitializer,\n isUnderConstContext: false,\n },\n options,\n );\n\n transformNode(\n node.getWhenFalse(),\n {\n isDirectUnderConstInitializer: context.isDirectUnderConstInitializer,\n isUnderConstContext: false,\n },\n options,\n );\n\n // return;\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"append-as-const.mjs","sources":["../../../src/functions/ast-transformers/append-as-const.mts"],"sourcesContent":["import { Arr, ISet } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type DeepReadonly } from 'ts-type-forge';\nimport {\n hasDisableNextLineComment,\n isAsConstNode,\n} from '../functions/index.mjs';\nimport { replaceNodeWithDebugPrint } from '../utils/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'append-as-const';\n\nexport const appendAsConstTransformer = (\n options?: AppendAsConstTransformerOptions,\n): TsMorphTransformer => {\n const ignorePrefixes = ISet.create(\n options?.ignorePrefixes ?? ['mut_', '#mut_', '_mut_', 'draft'],\n );\n\n const optionsInternal: AppendAsConstTransformerOptionsInternal = {\n applyLevel: options?.applyLevel ?? 'avoidInFunctionArgs',\n ignoredPrefixes: ignorePrefixes,\n\n debugPrint: options?.debug === true ? console.debug : () => {},\n replaceNode:\n options?.debug === true\n ? replaceNodeWithDebugPrint\n : (node, newNodeText) => node.replaceWithText(newNodeText),\n } as const;\n\n return {\n name: TRANSFORMER_NAME,\n transform: (sourceAst) => {\n for (const node of sourceAst.getDescendantsOfKind(\n tsm.SyntaxKind.VariableDeclaration,\n )) {\n transformNode(\n node,\n {\n isUnderConstContext: false,\n isDirectUnderConstInitializer: false,\n },\n optionsInternal,\n );\n }\n },\n };\n};\n\nexport type AppendAsConstTransformerOptions = DeepReadonly<{\n /**\n * @default \"avoidInFunctionArgs\"\n */\n applyLevel?: 'all' | 'avoidInFunctionArgs';\n\n /**\n * A mute keywords to ignore the readonly conversion.\n *\n * (e.g. `\"mut_\"`)\n *\n * @default ['mut_', '#mut_', '_mut_', 'draft']\n */\n ignorePrefixes?: string[];\n\n // TODO\n // ignoreConstTypeParameter?: boolean;\n\n debug?: boolean;\n}>;\n\ntype AppendAsConstTransformerOptionsInternal = DeepReadonly<{\n applyLevel: 'all' | 'avoidInFunctionArgs';\n ignoredPrefixes: ISet<string>;\n\n debugPrint: (...args: readonly unknown[]) => void;\n replaceNode: (node: tsm.Node, newNodeText: string) => void;\n}>;\n\ntype AsConstContext = Readonly<{\n /**\n * Whether the current node is under an `as const` context.\n *\n * (e.g. `[1, 2, {x: 3}] as const` --> `isUnderConstContext` is true for `[1, 2, {x: 3}]` and its children `{x: 3}`)\n */\n isUnderConstContext: boolean;\n\n /**\n * Whether the current node is directly under a `const` variable initializer.\n *\n * (e.g. `const foo = [1, 2, 3];` --> `isDirectUnderConstInitializer` is true for `[1, 2, 3]`)\n */\n isDirectUnderConstInitializer: boolean;\n}>;\n\nconst transformNode = (\n node: tsm.Node,\n context: AsConstContext,\n options: AppendAsConstTransformerOptionsInternal,\n): void => {\n if (node.wasForgotten()) {\n return;\n }\n\n options.debugPrint(node.getKindName(), node.getText(), { context });\n\n if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {\n options.debugPrint('skipped by disable-next-line comment');\n\n return;\n }\n\n if (\n options.applyLevel === 'avoidInFunctionArgs' &&\n tsm.Node.isCallExpression(node)\n ) {\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.VariableDeclaration)) {\n const nodeName = node.getName();\n\n // check for ignorePrefix\n if (options.ignoredPrefixes.some((p) => nodeName.startsWith(p))) {\n // Skip conversion for variable declarations with ignored prefixes\n // Example: const mut_foo: string[] = []; -> remains as is, without appending `as const`\n options.debugPrint('skipped variable declaration by ignorePrefixes');\n\n return;\n }\n\n const variableStatement = node.getVariableStatement();\n\n if (\n variableStatement !== undefined &&\n hasDisableNextLineComment(variableStatement, TRANSFORMER_NAME)\n ) {\n return;\n }\n\n const initializer = node.getInitializer();\n\n if (initializer === undefined) {\n return;\n }\n\n const declarationKindKeywords = node\n .getVariableStatement()\n ?.getDeclarationKindKeywords()\n .map((k) => k.getText());\n\n if (\n declarationKindKeywords !== undefined &&\n Arr.isFixedLengthArray(1, declarationKindKeywords)\n ) {\n transformNode(\n initializer,\n {\n isDirectUnderConstInitializer: declarationKindKeywords[0] === 'const',\n isUnderConstContext: false,\n },\n options,\n );\n\n return;\n }\n\n // const [a, b] = ...;\n // TODO: Support ignoredPrefixes in ArrayBindingPattern\n // if (ts.isArrayBindingPattern(nodeName)) {\n // // for (const [i, el] of nodeName.elements.entries())\n // }\n\n // const { x, y } = ...;\n // TODO: Support ignoredPrefixes in ObjectBindingPattern\n // if (ts.isObjectBindingPattern(nodeName)) {\n // // for (const [i, el] of nodeName.elements.entries())\n // }\n }\n\n // Skip already type asserted nodes\n if (tsm.Node.isAsExpression(node) && !isAsConstNode(node)) {\n return;\n }\n\n // pass by ([(X)] -> X)\n if (tsm.Node.isParenthesizedExpression(node)) {\n transformNode(node.getExpression(), context, options);\n\n return;\n }\n\n // pass by ([X satisfies ...] -> X)\n if (tsm.Node.isSatisfiesExpression(node)) {\n transformNode(node.getExpression(), context, options);\n\n return;\n }\n\n // pass by property initializer ([key: value] -> value)\n if (tsm.Node.isPropertyAssignment(node)) {\n const initializer = node.getInitializer();\n\n if (initializer !== undefined) {\n transformNode(initializer, context, options);\n }\n\n return;\n }\n\n // pass by arrow function body ([() => X] -> X)\n if (tsm.Node.isArrowFunction(node)) {\n const body = node.getBody();\n\n transformNode(body, context, options);\n\n return;\n }\n\n // pass by spread element ([...X] -> X)\n if (tsm.Node.isSpreadElement(node)) {\n transformNode(node.getExpression(), context, options);\n\n return;\n }\n\n if (\n node.isKind(tsm.SyntaxKind.NoSubstitutionTemplateLiteral) || // `abc`\n node.isKind(tsm.SyntaxKind.NumericLiteral) || // 123\n node.isKind(tsm.SyntaxKind.BigIntLiteral) || // 123n\n node.isKind(tsm.SyntaxKind.StringLiteral) || // 'abc'\n node.isKind(tsm.SyntaxKind.TrueKeyword) || // true\n node.isKind(tsm.SyntaxKind.FalseKeyword) // false\n ) {\n if (\n !context.isDirectUnderConstInitializer &&\n !context.isUnderConstContext\n ) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TemplateExpression)) {\n if (!context.isUnderConstContext) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n if (tsm.Node.isArrayLiteralExpression(node)) {\n for (const el of node.getElements()) {\n transformNode(\n el,\n {\n isUnderConstContext: true, // [...] as const\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n }\n\n if (!context.isUnderConstContext) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n if (tsm.Node.isObjectLiteralExpression(node)) {\n for (const el of node.getProperties()) {\n transformNode(\n el,\n {\n isUnderConstContext: true, // {...} as const\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n }\n\n if (!context.isUnderConstContext) {\n options.replaceNode(node, `${node.getText()} as const`);\n }\n\n return;\n }\n\n // `as const` node\n if (isAsConstNode(node)) {\n if (context.isDirectUnderConstInitializer) {\n // In const variable declarations, remove `as const` first and then re-append it later if needed\n\n transformNode(\n node.getExpression(),\n {\n isUnderConstContext: false,\n isDirectUnderConstInitializer: true,\n },\n options,\n );\n\n options.replaceNode(\n node,\n // The expression may be marked \"as const\"\n node.getExpression().getText(),\n ); // remove `as const`\n\n return;\n }\n\n if (context.isUnderConstContext) {\n transformNode(\n node.getExpression(),\n {\n isUnderConstContext: true,\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n\n options.replaceNode(\n node,\n // The expression may be marked \"as const\"\n node.getExpression().getText(),\n ); // remove `as const`\n\n return;\n }\n\n transformNode(\n node.getExpression(),\n {\n isUnderConstContext: true,\n isDirectUnderConstInitializer: false,\n },\n options,\n );\n\n return;\n }\n\n if (tsm.Node.isConditionalExpression(node)) {\n // For conditional expressions, traverse both branches in a non-const context\n transformNode(\n node.getWhenTrue(),\n {\n isDirectUnderConstInitializer: context.isDirectUnderConstInitializer,\n isUnderConstContext: false,\n },\n options,\n );\n\n transformNode(\n node.getWhenFalse(),\n {\n isDirectUnderConstInitializer: context.isDirectUnderConstInitializer,\n isUnderConstContext: false,\n },\n options,\n );\n\n // return;\n }\n};\n"],"names":[],"mappings":";;;;;;;AAUA,MAAM,gBAAA,GAAmB,iBAAA;AAElB,MAAM,wBAAA,GAA2B,CACtC,OAAA,KACuB;AACvB,EAAA,MAAM,iBAAiB,IAAA,CAAK,MAAA;AAAA,IAC1B,SAAS,cAAA,IAAkB,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAO;AAAA,GAC/D;AAEA,EAAA,MAAM,eAAA,GAA2D;AAAA,IAC/D,UAAA,EAAY,SAAS,UAAA,IAAc,qBAAA;AAAA,IACnC,eAAA,EAAiB,cAAA;AAAA,IAEjB,YAAY,OAAA,EAAS,KAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IAC7D,WAAA,EACE,OAAA,EAAS,KAAA,KAAU,IAAA,GACf,yBAAA,GACA,CAAC,IAAA,EAAM,WAAA,KAAgB,IAAA,CAAK,eAAA,CAAgB,WAAW;AAAA,GAC/D;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,SAAA,EAAW,CAAC,SAAA,KAAc;AACxB,MAAA,KAAA,MAAW,QAAQ,SAAA,CAAU,oBAAA;AAAA,QAC3B,IAAI,UAAA,CAAW;AAAA,OACjB,EAAG;AACD,QAAA,aAAA;AAAA,UACE,IAAA;AAAA,UACA;AAAA,YACE,mBAAA,EAAqB,KAAA;AAAA,YACrB,6BAAA,EAA+B;AAAA,WACjC;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AA+CA,MAAM,aAAA,GAAgB,CACpB,IAAA,EACA,OAAA,EACA,OAAA,KACS;AACT,EAAA,IAAI,IAAA,CAAK,cAAa,EAAG;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,UAAA,CAAW,KAAK,WAAA,EAAY,EAAG,KAAK,OAAA,EAAQ,EAAG,EAAE,OAAA,EAAS,CAAA;AAElE,EAAA,IAAI,yBAAA,CAA0B,IAAA,EAAM,gBAAgB,CAAA,EAAG;AACrD,IAAA,OAAA,CAAQ,WAAW,sCAAsC,CAAA;AAEzD,IAAA;AAAA,EACF;AAEA,EAAA,IACE,QAAQ,UAAA,KAAe,qBAAA,IACvB,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA,EAC9B;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,mBAAmB,CAAA,EAAG;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAQ;AAG9B,IAAA,IAAI,OAAA,CAAQ,gBAAgB,IAAA,CAAK,CAAC,MAAM,QAAA,CAAS,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AAG/D,MAAA,OAAA,CAAQ,WAAW,gDAAgD,CAAA;AAEnE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAAoB,KAAK,oBAAA,EAAqB;AAEpD,IAAA,IACE,iBAAA,KAAsB,MAAA,IACtB,yBAAA,CAA0B,iBAAA,EAAmB,gBAAgB,CAAA,EAC7D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,KAAK,cAAA,EAAe;AAExC,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,uBAAA,GAA0B,IAAA,CAC7B,oBAAA,EAAqB,EACpB,0BAAA,EAA2B,CAC5B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,EAAS,CAAA;AAEzB,IAAA,IACE,4BAA4B,MAAA,IAC5B,GAAA,CAAI,kBAAA,CAAmB,CAAA,EAAG,uBAAuB,CAAA,EACjD;AACA,MAAA,aAAA;AAAA,QACE,WAAA;AAAA,QACA;AAAA,UACE,6BAAA,EAA+B,uBAAA,CAAwB,CAAC,CAAA,KAAM,OAAA;AAAA,UAC9D,mBAAA,EAAqB;AAAA,SACvB;AAAA,QACA;AAAA,OACF;AAEA,MAAA;AAAA,IACF;AAAA,EAaF;AAGA,EAAA,IAAI,GAAA,CAAI,KAAK,cAAA,CAAe,IAAI,KAAK,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AACzD,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,yBAAA,CAA0B,IAAI,CAAA,EAAG;AAC5C,IAAA,aAAA,CAAc,IAAA,CAAK,aAAA,EAAc,EAAG,OAAA,EAAS,OAAO,CAAA;AAEpD,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAA,EAAG;AACxC,IAAA,aAAA,CAAc,IAAA,CAAK,aAAA,EAAc,EAAG,OAAA,EAAS,OAAO,CAAA;AAEpD,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA,EAAG;AACvC,IAAA,MAAM,WAAA,GAAc,KAAK,cAAA,EAAe;AAExC,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,aAAA,CAAc,WAAA,EAAa,SAAS,OAAO,CAAA;AAAA,IAC7C;AAEA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAE1B,IAAA,aAAA,CAAc,IAAA,EAAM,SAAS,OAAO,CAAA;AAEpC,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA,EAAG;AAClC,IAAA,aAAA,CAAc,IAAA,CAAK,aAAA,EAAc,EAAG,OAAA,EAAS,OAAO,CAAA;AAEpD,IAAA;AAAA,EACF;AAEA,EAAA,IACE,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,6BAA6B,CAAA;AAAA,EACxD,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,cAAc,CAAA;AAAA,EACzC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA;AAAA,EACxC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA;AAAA,EACxC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA;AAAA,EACtC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,EACvC;AACA,IAAA,IACE,CAAC,OAAA,CAAQ,6BAAA,IACT,CAAC,QAAQ,mBAAA,EACT;AACA,MAAA,OAAA,CAAQ,YAAY,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA,SAAA,CAAW,CAAA;AAAA,IACxD;AAEA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,kBAAkB,CAAA,EAAG;AAClD,IAAA,IAAI,CAAC,QAAQ,mBAAA,EAAqB;AAChC,MAAA,OAAA,CAAQ,YAAY,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA,SAAA,CAAW,CAAA;AAAA,IACxD;AAEA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA,EAAG;AAC3C,IAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,WAAA,EAAY,EAAG;AACnC,MAAA,aAAA;AAAA,QACE,EAAA;AAAA,QACA;AAAA,UACE,mBAAA,EAAqB,IAAA;AAAA;AAAA,UACrB,6BAAA,EAA+B;AAAA,SACjC;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAQ,mBAAA,EAAqB;AAChC,MAAA,OAAA,CAAQ,YAAY,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA,SAAA,CAAW,CAAA;AAAA,IACxD;AAEA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,yBAAA,CAA0B,IAAI,CAAA,EAAG;AAC5C,IAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,aAAA,EAAc,EAAG;AACrC,MAAA,aAAA;AAAA,QACE,EAAA;AAAA,QACA;AAAA,UACE,mBAAA,EAAqB,IAAA;AAAA;AAAA,UACrB,6BAAA,EAA+B;AAAA,SACjC;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAQ,mBAAA,EAAqB;AAChC,MAAA,OAAA,CAAQ,YAAY,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA,SAAA,CAAW,CAAA;AAAA,IACxD;AAEA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,IAAI,QAAQ,6BAAA,EAA+B;AAGzC,MAAA,aAAA;AAAA,QACE,KAAK,aAAA,EAAc;AAAA,QACnB;AAAA,UACE,mBAAA,EAAqB,KAAA;AAAA,UACrB,6BAAA,EAA+B;AAAA,SACjC;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAA,CAAQ,WAAA;AAAA,QACN,IAAA;AAAA;AAAA,QAEA,IAAA,CAAK,aAAA,EAAc,CAAE,OAAA;AAAQ,OAC/B;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC/B,MAAA,aAAA;AAAA,QACE,KAAK,aAAA,EAAc;AAAA,QACnB;AAAA,UACE,mBAAA,EAAqB,IAAA;AAAA,UACrB,6BAAA,EAA+B;AAAA,SACjC;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAA,CAAQ,WAAA;AAAA,QACN,IAAA;AAAA;AAAA,QAEA,IAAA,CAAK,aAAA,EAAc,CAAE,OAAA;AAAQ,OAC/B;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,aAAA;AAAA,MACE,KAAK,aAAA,EAAc;AAAA,MACnB;AAAA,QACE,mBAAA,EAAqB,IAAA;AAAA,QACrB,6BAAA,EAA+B;AAAA,OACjC;AAAA,MACA;AAAA,KACF;AAEA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,IAAA,CAAK,uBAAA,CAAwB,IAAI,CAAA,EAAG;AAE1C,IAAA,aAAA;AAAA,MACE,KAAK,WAAA,EAAY;AAAA,MACjB;AAAA,QACE,+BAA+B,OAAA,CAAQ,6BAAA;AAAA,QACvC,mBAAA,EAAqB;AAAA,OACvB;AAAA,MACA;AAAA,KACF;AAEA,IAAA,aAAA;AAAA,MACE,KAAK,YAAA,EAAa;AAAA,MAClB;AAAA,QACE,+BAA+B,OAAA,CAAQ,6BAAA;AAAA,QACvC,mBAAA,EAAqB;AAAA,OACvB;AAAA,MACA;AAAA,KACF;AAAA,EAGF;AACF,CAAA;;;;"}
@@ -23,14 +23,14 @@ const convertInterfaceToTypeTransformer = () => ({
23
23
  const members = interfaceDecl.getMembers();
24
24
  const typeParamsStr = Arr.isNonEmpty(typeParameters) ? `<${typeParameters.map((tp) => tp.getText()).join(", ")}>` : "";
25
25
  const mut_typeBody = (() => {
26
- if (Arr.isArrayOfLength(extendsExpressions, 0)) {
26
+ if (Arr.isEmpty(extendsExpressions)) {
27
27
  return buildTypeLiteral(members);
28
28
  }
29
- if (Arr.isArrayOfLength(members, 0)) {
29
+ if (Arr.isEmpty(members)) {
30
30
  const extendedTypes = extendsExpressions.map(
31
31
  (ext) => ext.getText()
32
32
  );
33
- return Arr.isArrayOfLength(extendedTypes, 1) ? extendedTypes[0] : extendedTypes.join(" & ");
33
+ return Arr.isFixedLengthArray(1, extendedTypes) ? extendedTypes[0] : extendedTypes.join(" & ");
34
34
  }
35
35
  const extendedTypesWithMembers = extendsExpressions.map(
36
36
  (ext) => ext.getText()
@@ -48,7 +48,7 @@ const convertInterfaceToTypeTransformer = () => ({
48
48
  interfaceDecl.replaceWithText(typeAliasText);
49
49
  };
50
50
  const buildTypeLiteral = (members) => {
51
- if (Arr.isArrayOfLength(members, 0)) {
51
+ if (Arr.isEmpty(members)) {
52
52
  return "Record<string, never>";
53
53
  }
54
54
  const memberTexts = members.map((member) => {
@@ -1 +1 @@
1
- {"version":3,"file":"convert-interface-to-type.mjs","sources":["../../../src/functions/ast-transformers/convert-interface-to-type.mts"],"sourcesContent":["/* eslint-disable unicorn/consistent-function-scoping -- helper functions are kept inside for clarity */\n/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types -- ts-morph uses mutable types */\nimport { Arr } from 'ts-data-forge';\nimport type * as tsm from 'ts-morph';\nimport { hasDisableNextLineComment } from '../functions/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'convert-interface-to-type';\n\n/**\n * interface による型定義を type による型定義に変換する。\n * @typescript-eslint/consistent-type-definitions: [\"error\", \"type\"] と同等の動作\n */\nexport const convertInterfaceToTypeTransformer = (): TsMorphTransformer =>\n ({\n name: TRANSFORMER_NAME,\n transform: (sourceAst) => {\n const processInterfaces = (\n container: tsm.SourceFile | tsm.ModuleDeclaration,\n ): void => {\n const interfaces = container.getInterfaces();\n\n for (const interfaceDecl of interfaces) {\n if (hasDisableNextLineComment(interfaceDecl, TRANSFORMER_NAME)) {\n continue;\n }\n\n convertInterfaceToType(interfaceDecl);\n }\n };\n\n const convertInterfaceToType = (\n interfaceDecl: tsm.InterfaceDeclaration,\n ): void => {\n const interfaceName = interfaceDecl.getName();\n\n const typeParameters = interfaceDecl.getTypeParameters();\n\n const extendsExpressions = interfaceDecl.getExtends();\n\n const members = interfaceDecl.getMembers();\n\n // Build type parameters string\n const typeParamsStr = Arr.isNonEmpty(typeParameters)\n ? `<${typeParameters.map((tp) => tp.getText()).join(', ')}>`\n : '';\n\n // Build type literal from members\n const mut_typeBody: string = (() => {\n if (Arr.isArrayOfLength(extendsExpressions, 0)) {\n // No extends: simple type literal\n return buildTypeLiteral(members);\n }\n\n if (Arr.isArrayOfLength(members, 0)) {\n // Only extends, no own members: union of extended types\n const extendedTypes = extendsExpressions.map((ext) =>\n ext.getText(),\n );\n\n return Arr.isArrayOfLength(extendedTypes, 1)\n ? extendedTypes[0]\n : extendedTypes.join(' & ');\n }\n\n // Both extends and own members: intersection\n const extendedTypesWithMembers = extendsExpressions.map((ext) =>\n ext.getText(),\n );\n\n const ownType = buildTypeLiteral(members);\n\n return Arr.toPushed(extendedTypesWithMembers, ownType).join(' & ');\n })();\n\n // Get export keyword\n const isExported = interfaceDecl.isExported();\n\n const exportKeyword = isExported ? 'export ' : '';\n\n // Get leading comments (including JSDoc)\n const leadingComments = interfaceDecl.getLeadingCommentRanges();\n\n const commentTexts = leadingComments\n .map((range) => range.getText())\n .join('\\n');\n\n const jsDocText = commentTexts.length > 0 ? `${commentTexts}\\n` : '';\n\n // Replace interface with type alias\n const typeAliasText =\n `${jsDocText}${exportKeyword}type ${interfaceName}${typeParamsStr} = ${mut_typeBody};` as const;\n\n interfaceDecl.replaceWithText(typeAliasText);\n };\n\n const buildTypeLiteral = (\n members: readonly tsm.TypeElementTypes[],\n ): string => {\n if (Arr.isArrayOfLength(members, 0)) {\n return 'Record<string, never>';\n }\n\n const memberTexts = members.map((member) => {\n // Preserve comments\n const leadingComments = member\n .getLeadingCommentRanges()\n .map((range) => range.getText())\n .join('\\n');\n\n const memberText = member.getText();\n\n return leadingComments.length > 0\n ? `${leadingComments}\\n${memberText}`\n : memberText;\n });\n\n return `{\\n ${memberTexts.join('\\n ')}\\n}`;\n };\n\n // Process top-level interface declarations\n processInterfaces(sourceAst);\n\n // Process interfaces inside namespaces/modules\n const namespaces = sourceAst.getModules();\n\n for (const namespace of namespaces) {\n processInterfaces(namespace);\n }\n },\n }) as const;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert-interface-to-type.mjs","sources":["../../../src/functions/ast-transformers/convert-interface-to-type.mts"],"sourcesContent":["/* eslint-disable unicorn/consistent-function-scoping -- helper functions are kept inside for clarity */\n/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types -- ts-morph uses mutable types */\nimport { Arr } from 'ts-data-forge';\nimport type * as tsm from 'ts-morph';\nimport { hasDisableNextLineComment } from '../functions/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'convert-interface-to-type';\n\n/**\n * interface による型定義を type による型定義に変換する。\n * @typescript-eslint/consistent-type-definitions: [\"error\", \"type\"] と同等の動作\n */\nexport const convertInterfaceToTypeTransformer = (): TsMorphTransformer =>\n ({\n name: TRANSFORMER_NAME,\n transform: (sourceAst) => {\n const processInterfaces = (\n container: tsm.SourceFile | tsm.ModuleDeclaration,\n ): void => {\n const interfaces = container.getInterfaces();\n\n for (const interfaceDecl of interfaces) {\n if (hasDisableNextLineComment(interfaceDecl, TRANSFORMER_NAME)) {\n continue;\n }\n\n convertInterfaceToType(interfaceDecl);\n }\n };\n\n const convertInterfaceToType = (\n interfaceDecl: tsm.InterfaceDeclaration,\n ): void => {\n const interfaceName = interfaceDecl.getName();\n\n const typeParameters = interfaceDecl.getTypeParameters();\n\n const extendsExpressions = interfaceDecl.getExtends();\n\n const members = interfaceDecl.getMembers();\n\n // Build type parameters string\n const typeParamsStr = Arr.isNonEmpty(typeParameters)\n ? `<${typeParameters.map((tp) => tp.getText()).join(', ')}>`\n : '';\n\n // Build type literal from members\n const mut_typeBody: string = (() => {\n if (Arr.isEmpty(extendsExpressions)) {\n // No extends: simple type literal\n return buildTypeLiteral(members);\n }\n\n if (Arr.isEmpty(members)) {\n // Only extends, no own members: union of extended types\n const extendedTypes = extendsExpressions.map((ext) =>\n ext.getText(),\n );\n\n return Arr.isFixedLengthArray(1, extendedTypes)\n ? extendedTypes[0]\n : extendedTypes.join(' & ');\n }\n\n // Both extends and own members: intersection\n const extendedTypesWithMembers = extendsExpressions.map((ext) =>\n ext.getText(),\n );\n\n const ownType = buildTypeLiteral(members);\n\n return Arr.toPushed(extendedTypesWithMembers, ownType).join(' & ');\n })();\n\n // Get export keyword\n const isExported = interfaceDecl.isExported();\n\n const exportKeyword = isExported ? 'export ' : '';\n\n // Get leading comments (including JSDoc)\n const leadingComments = interfaceDecl.getLeadingCommentRanges();\n\n const commentTexts = leadingComments\n .map((range) => range.getText())\n .join('\\n');\n\n const jsDocText = commentTexts.length > 0 ? `${commentTexts}\\n` : '';\n\n // Replace interface with type alias\n const typeAliasText =\n `${jsDocText}${exportKeyword}type ${interfaceName}${typeParamsStr} = ${mut_typeBody};` as const;\n\n interfaceDecl.replaceWithText(typeAliasText);\n };\n\n const buildTypeLiteral = (\n members: readonly tsm.TypeElementTypes[],\n ): string => {\n if (Arr.isEmpty(members)) {\n return 'Record<string, never>';\n }\n\n const memberTexts = members.map((member) => {\n // Preserve comments\n const leadingComments = member\n .getLeadingCommentRanges()\n .map((range) => range.getText())\n .join('\\n');\n\n const memberText = member.getText();\n\n return leadingComments.length > 0\n ? `${leadingComments}\\n${memberText}`\n : memberText;\n });\n\n return `{\\n ${memberTexts.join('\\n ')}\\n}`;\n };\n\n // Process top-level interface declarations\n processInterfaces(sourceAst);\n\n // Process interfaces inside namespaces/modules\n const namespaces = sourceAst.getModules();\n\n for (const namespace of namespaces) {\n processInterfaces(namespace);\n }\n },\n }) as const;\n"],"names":[],"mappings":";;;;;AAOA,MAAM,gBAAA,GAAmB,2BAAA;AAMlB,MAAM,oCAAoC,OAC9C;AAAA,EACC,IAAA,EAAM,gBAAA;AAAA,EACN,SAAA,EAAW,CAAC,SAAA,KAAc;AACxB,IAAA,MAAM,iBAAA,GAAoB,CACxB,SAAA,KACS;AACT,MAAA,MAAM,UAAA,GAAa,UAAU,aAAA,EAAc;AAE3C,MAAA,KAAA,MAAW,iBAAiB,UAAA,EAAY;AACtC,QAAA,IAAI,yBAAA,CAA0B,aAAA,EAAe,gBAAgB,CAAA,EAAG;AAC9D,UAAA;AAAA,QACF;AAEA,QAAA,sBAAA,CAAuB,aAAa,CAAA;AAAA,MACtC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,sBAAA,GAAyB,CAC7B,aAAA,KACS;AACT,MAAA,MAAM,aAAA,GAAgB,cAAc,OAAA,EAAQ;AAE5C,MAAA,MAAM,cAAA,GAAiB,cAAc,iBAAA,EAAkB;AAEvD,MAAA,MAAM,kBAAA,GAAqB,cAAc,UAAA,EAAW;AAEpD,MAAA,MAAM,OAAA,GAAU,cAAc,UAAA,EAAW;AAGzC,MAAA,MAAM,gBAAgB,GAAA,CAAI,UAAA,CAAW,cAAc,CAAA,GAC/C,IAAI,cAAA,CAAe,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,OAAA,EAAS,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GACvD,EAAA;AAGJ,MAAA,MAAM,gBAAwB,MAAM;AAClC,QAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AAEnC,UAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,QACjC;AAEA,QAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AAExB,UAAA,MAAM,gBAAgB,kBAAA,CAAmB,GAAA;AAAA,YAAI,CAAC,GAAA,KAC5C,GAAA,CAAI,OAAA;AAAQ,WACd;AAEA,UAAA,OAAO,GAAA,CAAI,kBAAA,CAAmB,CAAA,EAAG,aAAa,CAAA,GAC1C,cAAc,CAAC,CAAA,GACf,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA;AAAA,QAC9B;AAGA,QAAA,MAAM,2BAA2B,kBAAA,CAAmB,GAAA;AAAA,UAAI,CAAC,GAAA,KACvD,GAAA,CAAI,OAAA;AAAQ,SACd;AAEA,QAAA,MAAM,OAAA,GAAU,iBAAiB,OAAO,CAAA;AAExC,QAAA,OAAO,IAAI,QAAA,CAAS,wBAAA,EAA0B,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,MACnE,CAAA,GAAG;AAGH,MAAA,MAAM,UAAA,GAAa,cAAc,UAAA,EAAW;AAE5C,MAAA,MAAM,aAAA,GAAgB,aAAa,SAAA,GAAY,EAAA;AAG/C,MAAA,MAAM,eAAA,GAAkB,cAAc,uBAAA,EAAwB;AAE9D,MAAA,MAAM,YAAA,GAAe,eAAA,CAClB,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,OAAA,EAAS,CAAA,CAC9B,IAAA,CAAK,IAAI,CAAA;AAEZ,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,GAAG,YAAY;AAAA,CAAA,GAAO,EAAA;AAGlE,MAAA,MAAM,aAAA,GACJ,CAAA,EAAG,SAAS,CAAA,EAAG,aAAa,QAAQ,aAAa,CAAA,EAAG,aAAa,CAAA,GAAA,EAAM,YAAY,CAAA,CAAA,CAAA;AAErF,MAAA,aAAA,CAAc,gBAAgB,aAAa,CAAA;AAAA,IAC7C,CAAA;AAEA,IAAA,MAAM,gBAAA,GAAmB,CACvB,OAAA,KACW;AACX,MAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACxB,QAAA,OAAO,uBAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAE1C,QAAA,MAAM,eAAA,GAAkB,MAAA,CACrB,uBAAA,EAAwB,CACxB,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,EAAS,CAAA,CAC9B,IAAA,CAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,UAAA,GAAa,OAAO,OAAA,EAAQ;AAElC,QAAA,OAAO,eAAA,CAAgB,MAAA,GAAS,CAAA,GAC5B,CAAA,EAAG,eAAe;AAAA,EAAK,UAAU,CAAA,CAAA,GACjC,UAAA;AAAA,MACN,CAAC,CAAA;AAED,MAAA,OAAO,CAAA;AAAA,EAAA,EAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA,CAAA;AAAA,IACzC,CAAA;AAGA,IAAA,iBAAA,CAAkB,SAAS,CAAA;AAG3B,IAAA,MAAM,UAAA,GAAa,UAAU,UAAA,EAAW;AAExC,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,IAC7B;AAAA,EACF;AACF,CAAA;;;;"}
@@ -177,7 +177,7 @@ const transformTypeReferenceNode = (node, readonlyContext, options) => {
177
177
  const typeNameStr = node.getTypeName().getText();
178
178
  const typeArguments = node.getTypeArguments();
179
179
  if (typeNameStr === "Array" || typeNameStr === "ReadonlyArray") {
180
- if (!Arr.isArrayOfLength(typeArguments, 1)) {
180
+ if (!Arr.isFixedLengthArray(1, typeArguments)) {
181
181
  throw new Error(
182
182
  `Unexpected number of type arguments "${typeArguments.length}" for ${typeNameStr}.`
183
183
  );
@@ -200,7 +200,7 @@ const transformTypeReferenceNode = (node, readonlyContext, options) => {
200
200
  return;
201
201
  }
202
202
  if (typeNameStr === "Set") {
203
- if (!Arr.isArrayOfLength(typeArguments, 1)) {
203
+ if (!Arr.isFixedLengthArray(1, typeArguments)) {
204
204
  throw new Error(
205
205
  `Unexpected number of type arguments "${typeArguments.length}" for Set.`
206
206
  );
@@ -218,7 +218,7 @@ const transformTypeReferenceNode = (node, readonlyContext, options) => {
218
218
  return;
219
219
  }
220
220
  if (typeNameStr === "Map") {
221
- if (!Arr.isArrayOfLength(typeArguments, 2)) {
221
+ if (!Arr.isFixedLengthArray(2, typeArguments)) {
222
222
  throw new Error(
223
223
  `Unexpected number of type arguments "${typeArguments.length}" for Map.`
224
224
  );
@@ -240,7 +240,7 @@ const transformTypeReferenceNode = (node, readonlyContext, options) => {
240
240
  return;
241
241
  }
242
242
  if (typeNameStr === "Readonly") {
243
- if (!Arr.isArrayOfLength(typeArguments, 1)) {
243
+ if (!Arr.isFixedLengthArray(1, typeArguments)) {
244
244
  throw new Error(
245
245
  `Unexpected number of type arguments "${typeArguments.length}" for Readonly.`
246
246
  );
@@ -290,7 +290,7 @@ const transformTypeReferenceNode = (node, readonlyContext, options) => {
290
290
  return;
291
291
  }
292
292
  if (typeNameStr === options.DeepReadonly.typeName) {
293
- if (!Arr.isArrayOfLength(typeArguments, 1)) {
293
+ if (!Arr.isFixedLengthArray(1, typeArguments)) {
294
294
  throw new Error(
295
295
  `Unexpected number of type arguments "${typeArguments.length}" for Readonly.`
296
296
  );
@@ -443,7 +443,7 @@ const transformTypeOperatorNode = (node, readonlyContext, options) => {
443
443
  }
444
444
  };
445
445
  const transformTypeLiteralNode = (node, readonlyContext, options) => {
446
- if (options.ignoreEmptyObjectTypes && Arr.isArrayOfLength(node.getMembers(), 0)) {
446
+ if (options.ignoreEmptyObjectTypes && Arr.isEmpty(node.getMembers())) {
447
447
  return;
448
448
  }
449
449
  transformMembers(
@@ -613,10 +613,10 @@ const transformUnionOrIntersectionTypeNodeImpl = (node, readonlyContext, options
613
613
  const newTypes = node.getTypeNodes();
614
614
  const { primitives, arraysAndTuples, typeLiterals, others } = groupUnionIntersectionTypes(newTypes);
615
615
  options.debugPrint({ primitives, arraysAndTuples, typeLiterals, others });
616
- const isEmptyTypeLiteral = (n) => n.isKind(tsm.SyntaxKind.TypeLiteral) && Arr.isArrayOfLength(n.getMembers(), 0);
616
+ const isEmptyTypeLiteral = (n) => n.isKind(tsm.SyntaxKind.TypeLiteral) && Arr.isEmpty(n.getMembers());
617
617
  const nonEmptyTypeLiterals = typeLiterals === void 0 ? void 0 : options.ignoreEmptyObjectTypes ? typeLiterals.nodes.filter((n) => !isEmptyTypeLiteral(n)) : typeLiterals.nodes;
618
- const emptyTypeLiterals = typeLiterals === void 0 || !options.ignoreEmptyObjectTypes ? void 0 : typeLiterals.nodes.filter((n) => isEmptyTypeLiteral(n));
619
- const typeLiteralsWrappedWithReadonly = nonEmptyTypeLiterals === void 0 || Arr.isArrayOfLength(nonEmptyTypeLiterals, 0) ? [] : [
618
+ const emptyTypeLiterals = typeLiterals === void 0 || !options.ignoreEmptyObjectTypes ? void 0 : typeLiterals.nodes.filter(isEmptyTypeLiteral);
619
+ const typeLiteralsWrappedWithReadonly = nonEmptyTypeLiterals === void 0 || Arr.isEmpty(nonEmptyTypeLiterals) ? [] : [
620
620
  unionToString({
621
621
  types: nonEmptyTypeLiterals.map(
622
622
  (n) => isReadonlyTypeReferenceNode(n) ? (
@@ -666,7 +666,7 @@ const unionToString = ({
666
666
  types,
667
667
  op,
668
668
  wrapWithReadonly
669
- }) => Arr.isArrayOfLength(types, 0) ? "never" : Arr.isArrayOfLength(types, 1) ? wrapWithReadonly === false ? wrapWithParentheses(types[0]) : `${isString(wrapWithReadonly) ? wrapWithReadonly : "Readonly"}<${types[0]}>` : wrapWithReadonly === false ? wrapWithParentheses(types.join(` ${op} `)) : `${isString(wrapWithReadonly) ? wrapWithReadonly : "Readonly"}<${types.join(` ${op} `)}>`;
669
+ }) => Arr.isEmpty(types) ? "never" : Arr.isFixedLengthArray(1, types) ? wrapWithReadonly === false ? wrapWithParentheses(types[0]) : `${isString(wrapWithReadonly) ? wrapWithReadonly : "Readonly"}<${types[0]}>` : wrapWithReadonly === false ? wrapWithParentheses(types.join(` ${op} `)) : `${isString(wrapWithReadonly) ? wrapWithReadonly : "Readonly"}<${types.join(` ${op} `)}>`;
670
670
  const transformParenthesizedTypeNode = (node, readonlyContext, options) => {
671
671
  const typeNode = node.getTypeNode();
672
672
  if (typeNode.isKind(tsm.SyntaxKind.ParenthesizedType)) {