ts-codemod-lib 2.2.3 → 2.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -12
- package/dist/cmd/append-as-const.mjs +1 -1
- package/dist/cmd/append-as-const.mjs.map +1 -1
- package/dist/cmd/convert-interface-to-type.mjs +1 -1
- package/dist/cmd/convert-interface-to-type.mjs.map +1 -1
- package/dist/cmd/convert-to-readonly.mjs +1 -1
- package/dist/cmd/convert-to-readonly.mjs.map +1 -1
- package/dist/cmd/replace-any-with-unknown.mjs +1 -1
- package/dist/cmd/replace-any-with-unknown.mjs.map +1 -1
- package/dist/cmd/replace-record-with-unknown-record.mjs +1 -1
- package/dist/cmd/replace-record-with-unknown-record.mjs.map +1 -1
- package/dist/cmd/run-transformer-cli.mjs +1 -1
- package/dist/cmd/run-transformer-cli.mjs.map +1 -1
- package/dist/functions/ast-transformers/append-as-const.mjs +1 -1
- package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-interface-to-type.mjs +4 -4
- package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.d.mts.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.mjs +12 -13
- package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts +3 -3
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts.map +1 -1
- package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map +1 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts.map +1 -1
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +13 -13
- package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
- package/dist/functions/ast-transformers/transform-source-code.mjs +2 -2
- package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
- package/dist/functions/functions/is-as-const-node.mjs +1 -1
- package/dist/functions/functions/is-as-const-node.mjs.map +1 -1
- package/dist/functions/functions/is-readonly-node.d.mts +5 -5
- package/dist/functions/functions/is-readonly-node.d.mts.map +1 -1
- package/dist/functions/functions/is-readonly-node.mjs +1 -1
- package/dist/functions/functions/is-readonly-node.mjs.map +1 -1
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.d.mts.map +1 -1
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs +1 -4
- package/dist/functions/functions/should-avoid-parentheses-for-readonly.mjs.map +1 -1
- package/package.json +37 -40
- package/src/cmd/append-as-const.mts +1 -1
- package/src/cmd/convert-interface-to-type.mts +1 -1
- package/src/cmd/convert-to-readonly.mts +1 -1
- package/src/cmd/replace-any-with-unknown.mts +1 -1
- package/src/cmd/replace-record-with-unknown-record.mts +1 -1
- package/src/cmd/run-transformer-cli.mts +1 -1
- package/src/functions/ast-transformers/append-as-const.mts +1 -1
- package/src/functions/ast-transformers/convert-interface-to-type.mts +4 -4
- package/src/functions/ast-transformers/convert-to-readonly.mts +31 -33
- package/src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts +3 -3
- package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +18 -29
- package/src/functions/ast-transformers/transform-source-code.mts +2 -2
- package/src/functions/functions/is-as-const-node.mts +1 -1
- package/src/functions/functions/is-readonly-node.mts +6 -6
- package/src/functions/functions/should-avoid-parentheses-for-readonly.mts +1 -5
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.
|
|
13
|
+
version: "2.2.5",
|
|
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.
|
|
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.5',\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.
|
|
13
|
+
version: "2.2.5",
|
|
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.
|
|
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.5',\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.
|
|
13
|
+
version: "2.2.5",
|
|
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.
|
|
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.5',\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.
|
|
13
|
+
version: "2.2.5",
|
|
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.
|
|
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.5',\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.
|
|
13
|
+
version: "2.2.5",
|
|
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.
|
|
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.5',\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.
|
|
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.
|
|
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":"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"}
|
|
@@ -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.
|
|
26
|
+
if (Arr.isEmpty(extendsExpressions)) {
|
|
27
27
|
return buildTypeLiteral(members);
|
|
28
28
|
}
|
|
29
|
-
if (Arr.
|
|
29
|
+
if (Arr.isEmpty(members)) {
|
|
30
30
|
const extendedTypes = extendsExpressions.map(
|
|
31
31
|
(ext) => ext.getText()
|
|
32
32
|
);
|
|
33
|
-
return Arr.
|
|
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.
|
|
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.
|
|
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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-to-readonly.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/convert-to-readonly.mts"],"names":[],"mappings":"AAUA,OAAO,
|
|
1
|
+
{"version":3,"file":"convert-to-readonly.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/convert-to-readonly.mts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,eAAe,CAAC;AAsBvB,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,eAAO,MAAM,4BAA4B,aAC7B,0BAA0B,KACnC,kBAuCF,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,YAAY,CAAC;IACpD;;OAEG;IACH,YAAY,CAAC,EAAE;QACb;;;;WAIG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;KA2BnB,CAAC;IAEF;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC,CAAC"}
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
619
|
-
const typeLiteralsWrappedWithReadonly = nonEmptyTypeLiterals === void 0 || Arr.
|
|
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.
|
|
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)) {
|
|
@@ -727,11 +727,10 @@ const transformMembers = (members, readonlyModifier, readonlyContext, options) =
|
|
|
727
727
|
continue;
|
|
728
728
|
}
|
|
729
729
|
transformNode(mb, readonlyContext, options);
|
|
730
|
-
continue;
|
|
731
730
|
}
|
|
732
731
|
};
|
|
733
732
|
const transformPropertySignature = (node, readonlyModifier, readonlyContext, options) => {
|
|
734
|
-
if (
|
|
733
|
+
if (readonlyModifier === "remove" || readonlyContext.type === "DeepReadonly") {
|
|
735
734
|
node.setIsReadonly(false);
|
|
736
735
|
} else {
|
|
737
736
|
node.setIsReadonly(true);
|
|
@@ -748,7 +747,7 @@ const transformIndexSignatureDeclaration = (node, readonlyModifier, readonlyCont
|
|
|
748
747
|
options.debugPrint("skipped index signature by disable-next-line comment");
|
|
749
748
|
return;
|
|
750
749
|
}
|
|
751
|
-
if (
|
|
750
|
+
if (readonlyModifier === "remove" || readonlyContext.type === "DeepReadonly") {
|
|
752
751
|
node.toggleModifier("readonly", false);
|
|
753
752
|
} else {
|
|
754
753
|
node.toggleModifier("readonly", true);
|