ts-codemod-lib 2.2.4 → 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/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/functions/ast-transformers/convert-to-readonly.d.mts.map +1 -1
- package/dist/functions/ast-transformers/convert-to-readonly.mjs +2 -3
- 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/transform-source-code.mjs +1 -1
- package/dist/functions/ast-transformers/transform-source-code.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.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 +15 -15
- 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/functions/ast-transformers/convert-to-readonly.mts +20 -17
- package/src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts +3 -3
- package/src/functions/ast-transformers/transform-source-code.mts +1 -1
- package/src/functions/functions/is-readonly-node.mts +5 -5
- package/src/functions/functions/should-avoid-parentheses-for-readonly.mts +1 -5
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-to-readonly.mjs","sources":["../../../src/functions/ast-transformers/convert-to-readonly.mts"],"sourcesContent":["import {\n Arr,\n expectType,\n ISet,\n isString,\n mapNullable,\n match,\n pipe,\n} from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type DeepReadonly, type SafeUintWithSmallInt } from 'ts-type-forge';\nimport {\n hasDisableNextLineComment,\n isAtomicTypeNode,\n isConditionalTypeDistributionGuard,\n isReadonlyArrayTypeNode,\n isReadonlyTupleOrArrayTypeNode,\n isReadonlyTupleTypeNode,\n isReadonlyTypeReferenceNode,\n removeParentheses,\n shouldAvoidParenthesesForReadonly,\n unwrapReadonlyTypeArgText,\n wrapWithParentheses,\n type ReadonlyTypeReferenceNode,\n} from '../functions/index.mjs';\nimport { replaceNodeWithDebugPrint } from '../utils/index.mjs';\nimport {\n groupUnionIntersectionTypes,\n invalidDeepReadonlyTypeName,\n nextReadonlyContext,\n type ReadonlyContext,\n} from './readonly-transformer-helpers/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'convert-to-readonly';\n\nexport const convertToReadonlyTransformer = (\n options?: ReadonlyTransformerOptions,\n): TsMorphTransformer => {\n if (\n options?.DeepReadonly?.typeName !== undefined &&\n invalidDeepReadonlyTypeName.has(options.DeepReadonly.typeName)\n ) {\n throw new Error(\n `Invalid DeepReadonly typeName \"${options.DeepReadonly.typeName}\" passed to convertToReadonlyType`,\n );\n }\n\n const DeepReadonlyTypeName =\n options?.DeepReadonly?.typeName ?? 'DeepReadonly';\n\n const ignorePrefixes = ISet.create(\n options?.ignorePrefixes ?? ['mut_', '#mut_', '_mut_', 'draft'],\n );\n\n const optionsInternal: ReadonlyTransformerOptionsInternal = {\n DeepReadonly: {\n typeName: DeepReadonlyTypeName,\n applyLevel: 'keep',\n },\n ignoreEmptyObjectTypes: options?.ignoreEmptyObjectTypes ?? true,\n ignoredPrefixes: ignorePrefixes,\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.getChildren()) {\n transformNode(node, initialReadonlyContext, optionsInternal);\n }\n },\n };\n};\n\nexport type ReadonlyTransformerOptions = DeepReadonly<{\n /**\n * Options for a type utility `DeepReadonly` that recursively applies readonly.\n */\n DeepReadonly?: {\n /**\n * The name of a type utility that recursively applies `Readonly`.\n *\n * @default \"DeepReadonly\"\n */\n typeName?: string;\n\n /**\n * Whether to apply `DeepReadonly` aggressively or remove `DeepReadonly` as\n * possible.\n *\n * If `applyLevel` is `\"applyAggressively\"`, it applies `DeepReadonly` to all\n * nested type literals without external type references. For example, the\n * following conversions are applied:\n *\n * - `number[][]` to be `DeepReadonly<number[][]>`\n * - `number[]` to be `readonly number[]`\n * - `<T>(arg: T[][]) => void` to be `<T>(arg: readonly (readonly T[])[]>) =>\n * void`\n *\n * If `applyLevel` is `\"removeAsPossible\"`, the following conversions are applied:\n *\n * - `DeepReadonly<number[][]>` to be `readonly (readonly number[])[]`\n * - `DeepReadonly<{ a: number[] }>` to be `Readonly<{ a: readonly number[]\n * }>`\n * - `<T>(arg: DeepReadonly<T[][]>) => void` to be `<T>(arg:\n * DeepReadonly<T[][]>) => void`\n *\n * @default 'keep'\n */\n // TODO\n // applyLevel?: 'applyAggressively' | 'keep' | 'removeAsPossible';\n };\n\n /**\n * Ignore the readonly conversion for `{}`.\n *\n * @default true\n */\n ignoreEmptyObjectTypes?: boolean;\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 debug?: boolean;\n}>;\n\ntype ReadonlyTransformerOptionsInternal = Readonly<{\n DeepReadonly: Readonly<{\n typeName: string;\n\n // removeAsPossible: 正規化後、 DeepReadonly の子ノードが typeLiteral かまたはその union or intersection であり、 それぞれの TypeLiteral がプリミティブ値のメンバーしか持たない場合。\n applyLevel: 'applyAggressively' | 'keep' | 'removeAsPossible';\n }>;\n\n ignoreEmptyObjectTypes: boolean;\n\n ignoredPrefixes: ISet<string>;\n\n debugPrint: (...args: readonly unknown[]) => void;\n replaceNode: (node: tsm.Node, newNodeText: string) => void;\n}>;\n\nconst initialReadonlyContext: ReadonlyContext = {\n type: 'none',\n indexedAccessDepth: 0,\n} as const;\n\nconst transformNode = (\n node: tsm.Node,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (\n tsm.Node.isTypeNode(node) ||\n node.isKind(tsm.SyntaxKind.InterfaceDeclaration) ||\n node.isKind(tsm.SyntaxKind.ClassDeclaration)\n ) {\n options.debugPrint();\n\n options.debugPrint(`transformNode [${node.getKindName()}] `);\n\n options.debugPrint(node.getFullText());\n\n options.debugPrint({ readonlyContext });\n\n options.debugPrint();\n }\n\n if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {\n options.debugPrint('skipped by disable-next-line comment');\n\n return;\n }\n\n // check for ignorePrefix\n if (node.isKind(tsm.SyntaxKind.VariableDeclaration)) {\n const nodeName = node.getName();\n\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 // TODO: Support ignoredPrefixes in ArrayBindingPattern\n // if (ts.isArrayBindingPattern(nodeName)) {\n // // for (const [i, el] of nodeName.elements.entries())\n // }\n\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 readonly conversion for function declarations with ignored prefixes\n // Example: function mut_foo() {} -> parameters and return types remain as is\n if (\n (node.isKind(tsm.SyntaxKind.FunctionDeclaration) ||\n node.isKind(tsm.SyntaxKind.FunctionExpression)) &&\n options.ignoredPrefixes.some((p) => node.getName()?.startsWith(p) === true)\n ) {\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.Parameter)) {\n const nodeName = node.getName();\n\n if (options.ignoredPrefixes.some((p) => nodeName.startsWith(p))) {\n // Skip readonly conversion for variable declarations with ignored prefixes\n // Example: const mut_foo: string[] = []; -> remains as is, without readonly conversion\n return;\n }\n\n // TODO: Support ignoredPrefixes in ArrayBindingPattern\n // if (ts.isArrayBindingPattern(nodeName)) {\n // }\n\n // TODO: Support ignoredPrefixes in ObjectBindingPattern\n // if (ts.isObjectBindingPattern(nodeName)) {\n // }\n }\n\n // Skip readonly conversion for type alias declarations with ignored prefixes\n // Example: type mut_Foo = number[]; -> remains as number[] without readonly\n if (\n node.isKind(tsm.SyntaxKind.TypeAliasDeclaration) &&\n options.ignoredPrefixes.some((p) => node.getName().startsWith(p))\n ) {\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TypeReference)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to TypeReferenceNode',\n );\n }\n\n transformTypeReferenceNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.ArrayType)) {\n transformArrayTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TupleType)) {\n transformTupleTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.RestType)) {\n transformRestTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TypeOperator)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to TypeOperatorNode',\n );\n }\n\n transformTypeOperatorNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TypeLiteral)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to TypeLiteralNode',\n );\n }\n\n transformTypeLiteralNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.IndexedAccessType)) {\n transformIndexedAccessTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.MappedType)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to MappedTypeNode',\n );\n }\n\n transformMappedTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.InterfaceDeclaration)) {\n // Skip readonly conversion for interface declarations with ignored prefixes\n // Example: interface mut_Interface {...} -> properties remain without readonly\n if (options.ignoredPrefixes.some((p) => node.getName().startsWith(p))) {\n return;\n }\n\n transformInterfaceDeclarationNode(node, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.ClassDeclaration)) {\n // Skip readonly conversion for class declarations with ignored prefixes\n // Example: class mut_Class {...} -> properties remain without readonly\n if (\n options.ignoredPrefixes.some(\n (p) => node.getName()?.startsWith(p) === true,\n )\n ) {\n return;\n }\n\n transformClassDeclarationNode(node, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.IntersectionType)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to IntersectionTypeNode',\n );\n }\n\n transformIntersectionTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.UnionType)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to UnionTypeNode',\n );\n }\n\n transformUnionTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.ParenthesizedType)) {\n // NOTE: readonlyContext を不変のままバケツリレーさせるためにこのケースも必要\n transformParenthesizedTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n for (const child of node.getChildren()) {\n transformNode(child, initialReadonlyContext, options);\n }\n};\n\n//\n// Transformer implementation for each node type\n//\n\n/**\n * - `tr(ReadonlyArray<E>) |-> readonly tr(E)[]`\n * - `tr(Readonly<Readonly<E>>) |-> Readonly<tr(E)>`\n * - `tr(DeepReadonly<Readonly<E>>) |-> DeepReadonly<tr(E)>`\n * - `tr(Readonly<number>) |-> number`\n * - `tr(Readonly<E[]>) |-> readonly tr(E)[]`\n * - `tr(Readonly<[E1, E2, E3]>) |-> readonly [tr(E1), tr(E2), tr(E3)]`\n * - `tr(Readonly<readonly E[]>) |-> readonly tr(E)[]`\n * - `tr(Readonly<readonly [E1, E2, E3]>) |-> readonly [tr(E1), tr(E2), tr(E3)]`\n * - `tr(Readonly<A | readonly E[]>) |-> Readonly<tr(A)> | readonly tr(E)[]>`\n */\nconst transformTypeReferenceNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TypeReferenceNode,\n readonlyContext: Exclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n const typeNameStr = node.getTypeName().getText();\n\n const typeArguments = node.getTypeArguments();\n\n // Array<T> / ReadonlyArray<T> to readonly T[]\n if (typeNameStr === 'Array' || typeNameStr === 'ReadonlyArray') {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for ${typeNameStr}.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n {\n type: 'none',\n indexedAccessDepth: readonlyContext.indexedAccessDepth,\n },\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = node.getTypeArguments()[0]!;\n\n options.replaceNode(\n node,\n readonlyContext.type === 'DeepReadonly'\n ? wrapWithParentheses(`${wrapWithParentheses(T.getFullText())}[]`)\n : wrapWithParentheses(\n `readonly ${wrapWithParentheses(T.getFullText())}[]`,\n ),\n );\n\n return;\n }\n\n // Set<T> to ReadonlySet<T>\n if (typeNameStr === 'Set') {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Set.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n {\n type: 'none',\n indexedAccessDepth: readonlyContext.indexedAccessDepth,\n },\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = node.getTypeArguments()[0]!;\n\n options.replaceNode(node, `ReadonlySet<${T.getFullText()}>`);\n\n return;\n }\n\n // Map<T> to ReadonlyMap<T>\n if (typeNameStr === 'Map') {\n if (!Arr.isFixedLengthArray(2, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Map.`,\n );\n }\n\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'keep',\n });\n\n // Recursive processing\n for (const t of typeArguments) {\n transformNode(t, nextReadonlyContextValue, options);\n }\n\n const [K, V] = node.getTypeArguments();\n\n options.replaceNode(\n node,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n `ReadonlyMap<${K!.getFullText()}, ${V!.getFullText()}>`,\n );\n\n return;\n }\n\n // remove unnecessary `Readonly` wrapper or convert to readonly operator\n if (typeNameStr === 'Readonly') {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Readonly.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'Readonly',\n indexedAccessDepthChange: 'keep',\n }),\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = removeParentheses(node.getTypeArguments()[0]!);\n\n // DeepReadonly<Readonly<T>> -> DeepReadonly<T>\n if (readonlyContext.type === 'DeepReadonly') {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<{ ... }>[I] -> { ... }[I]\n if (readonlyContext.indexedAccessDepth > 0) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<Readonly<T>> -> Readonly<T>\n if (isReadonlyTypeReferenceNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<number> -> number\n if (isAtomicTypeNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // T = E[]\n // Readonly<E[]> -> readonly E[]\n //\n // T = [E1, E2, E3]\n // Readonly<[E1, E2, E3]> -> readonly [E1, E2, E3]\n if (\n T.isKind(tsm.SyntaxKind.ArrayType) ||\n T.isKind(tsm.SyntaxKind.TupleType)\n ) {\n const readonlyText = `readonly ${T.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n\n return;\n }\n\n // T = readonly E[] or readonly [E1, E2, E3]\n // Readonly<readonly E[]> -> readonly E[]\n // Readonly<readonly [E1, E2, E3]> -> readonly [E1, E2, E3]\n if (isReadonlyTupleOrArrayTypeNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // T = A | B | C\n // T = A & B & C\n if (\n T.isKind(tsm.SyntaxKind.UnionType) ||\n T.isKind(tsm.SyntaxKind.IntersectionType)\n ) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n return;\n }\n\n // DeepReadonly\n if (typeNameStr === options.DeepReadonly.typeName) {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Readonly.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'DeepReadonly',\n }),\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = node.getTypeArguments()[0]!;\n\n // DeepReadonly<DeepReadonly<T>> -> DeepReadonly<T>\n if (readonlyContext.type === 'DeepReadonly') {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<number> -> number\n if (isAtomicTypeNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // T = P[]\n // DeepReadonly<P[]> -> readonly P[] (for primitive type arrays, convert to readonly P[] form)\n // DeepReadonly<O[]> -> DeepReadonly<O[]> (for object type arrays, keep as is to recursively apply Readonly)\n // DeepReadonly<P[][]> -> DeepReadonly<P[][]>\n if (\n T.isKind(tsm.SyntaxKind.ArrayType) &&\n isAtomicTypeNode(T.getElementTypeNode())\n ) {\n const readonlyText = `readonly ${T.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n\n return;\n }\n\n // T = [P1, P2, P3]\n // DeepReadonly<[P1, P2, P3]> -> readonly [P1, P2, P3]\n if (\n T.isKind(tsm.SyntaxKind.TupleType) &&\n T.getElements().every(isAtomicTypeNode)\n ) {\n const readonlyText = `readonly ${T.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n\n return;\n }\n\n return;\n }\n\n {\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'keep',\n });\n\n // Recursive processing\n for (const t of node.getTypeArguments()) {\n transformNode(t, nextReadonlyContextValue, options);\n }\n }\n};\n\n/** `tr(E[]) |-> tr(E)[]` */\nconst transformArrayTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.ArrayTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getElementTypeNode(),\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n switch (readonlyContext.type) {\n case 'DeepReadonly':\n case 'readonly':\n return; // remain tr(E)[] as is\n\n // Unnecessary `Readonly` wrapper will be remove in transformTypeReferenceNode\n case 'Readonly':\n case 'none':\n // Skip the `A[] extends B[] ? ...` union-distribution-guard idiom: adding\n // `readonly` there does not improve immutability and breaks the idiom.\n if (\n readonlyContext.indexedAccessDepth === 0 &&\n !isConditionalTypeDistributionGuard(node)\n ) {\n const readonlyText = `readonly ${node.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n }\n }\n};\n\n/** `tr([E1, E2, E3])` |-> `[tr(E1), tr(E2), tr(E3)]` */\nconst transformTupleTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TupleTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n {\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n });\n\n for (const el of node.getElements()) {\n if (el.isKind(tsm.SyntaxKind.NamedTupleMember)) {\n if (options.ignoredPrefixes.every((p) => !el.getName().startsWith(p))) {\n transformNode(el.getTypeNode(), nextReadonlyContextValue, options);\n }\n } else {\n transformNode(el, nextReadonlyContextValue, options);\n }\n }\n }\n\n switch (readonlyContext.type) {\n case 'DeepReadonly':\n case 'readonly':\n return; // remain tr(E)[] as is\n\n // Unnecessary `Readonly` wrapper will be remove in transformTypeReferenceNode\n case 'Readonly':\n case 'none':\n // Skip the `[A] extends [B] ? ...` union-distribution-guard idiom: adding\n // `readonly` there does not improve immutability and breaks the idiom.\n if (\n readonlyContext.indexedAccessDepth === 0 &&\n !isConditionalTypeDistributionGuard(node)\n ) {\n const readonlyText = `readonly ${node.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n }\n }\n};\n\n/** `tr(\"...T\")` |-> `...tr(T)` */\nconst transformRestTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.RestTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getTypeNode() /* = T */,\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n const R = removeParentheses(node.getTypeNode());\n\n // `tr(\"...readonly E[]\") |-> ...tr(E)[]`\n // `tr(\"...readonly [E1, E2]\") |-> ...[tr(E1), tr(E2)]`\n if (isReadonlyArrayTypeNode(R) || isReadonlyTupleTypeNode(R)) {\n options.replaceNode(\n node,\n `...${R.getTypeNode().getFullText()}` /* = tr(E)[] or [tr(E1), tr(E2)] */,\n );\n }\n};\n\n/**\n * - `readonly T[][] |-> readonly (readonly T[])[]`\n * - `keyof { a: number[] } |-> keyof Readonly<{ a: readonly number[] }>`\n */\nconst transformTypeOperatorNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TypeOperatorTypeNode,\n readonlyContext: Exclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getTypeNode(),\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType:\n node.getOperator() === tsm.SyntaxKind.ReadonlyKeyword\n ? 'readonly'\n : 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n switch (readonlyContext.type) {\n // DeepReadonly<readonly E[]> -> DeepReadonly<E[]>\n case 'DeepReadonly':\n options.replaceNode(node, node.getTypeNode().getFullText());\n\n return;\n\n case 'Readonly':\n case 'none':\n if (readonlyContext.indexedAccessDepth > 0) {\n options.replaceNode(node, node.getTypeNode().getFullText());\n }\n }\n};\n\n// `{ readonly member: V } |-> Readonly<{ member: V }>`\nconst transformTypeLiteralNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TypeLiteralNode,\n readonlyContext: Exclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (options.ignoreEmptyObjectTypes && Arr.isEmpty(node.getMembers())) {\n return;\n }\n\n // Recursive processing\n transformMembers(\n node.getMembers(),\n 'remove',\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n switch (readonlyContext.type) {\n case 'DeepReadonly':\n case 'Readonly':\n // Don't wrap with Readonly if already readonly\n return;\n\n case 'none': {\n if (readonlyContext.indexedAccessDepth === 0) {\n // `{ readonly x: X, readonly y: Y } |-> Readonly<{ x: X, y: Y }>`\n options.replaceNode(node, `Readonly<${node.getFullText()}>`);\n }\n }\n }\n};\n\n/** `tr([A, B, C][I])` |-> `[tr(A), tr(B), tr(C)][I]` */\nconst transformIndexedAccessTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IndexedAccessTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getObjectTypeNode(),\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'incr',\n }),\n options,\n );\n\n transformNode(\n node.getIndexTypeNode() /* = I */,\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'Readonly',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n};\n\n/**\n * - `{ [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n * - `{ -readonly [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n * - `{ readonly [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n * - `{ +readonly [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n */\nconst transformMappedTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.MappedTypeNode,\n readonlyContext: Exclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n const typeNode = node.getTypeNode();\n\n if (typeNode !== undefined) {\n transformNode(\n typeNode,\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n }\n\n const questionTokenText =\n pipe(node.getQuestionToken()?.getText()).mapNullable((t) =>\n t === '?' ? '?' : t === '-' ? '-?' : t === '+' ? '+?' : undefined,\n ).value ?? '';\n\n const result: string = pipe(\n // remove readonlyToken\n `{ [${node.getTypeParameter().getFullText()}]${questionTokenText}: ${node.getTypeNode()?.getFullText()} }`,\n ).map((mpt) =>\n match(readonlyContext.type, {\n // Don't wrap with Readonly if already readonly or unnecessary\n DeepReadonly: mpt,\n Readonly: mpt,\n none: readonlyContext.indexedAccessDepth > 0 ? mpt : `Readonly<${mpt}>`,\n }),\n ).value;\n\n options.replaceNode(node, result);\n};\n\n// Making interface members readonly\nconst transformInterfaceDeclarationNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.InterfaceDeclaration,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n for (const param of node.getTypeParameters()) {\n transformNode(param, initialReadonlyContext, options);\n }\n\n for (const n of node.getHeritageClauses()) {\n transformNode(n, initialReadonlyContext, options);\n }\n\n transformMembers(node.getMembers(), 'add', initialReadonlyContext, options);\n};\n\nconst transformClassDeclarationNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.ClassDeclaration,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n for (const n of node.getTypeParameters()) {\n transformNode(n, initialReadonlyContext, options);\n }\n\n for (const n of node.getHeritageClauses()) {\n transformNode(n, initialReadonlyContext, options);\n }\n\n for (const mb of node.getMembers()) {\n if (hasDisableNextLineComment(mb)) {\n options.debugPrint('skipped member by disable-next-line comment');\n\n continue;\n }\n\n if (mb.isKind(tsm.SyntaxKind.PropertyDeclaration)) {\n if (!checkIfPropertyNameShouldBeIgnored(mb.getNameNode(), options)) {\n mb.setIsReadonly(true);\n\n const type = mb.getTypeNode();\n\n if (type !== undefined) {\n transformNode(type, initialReadonlyContext, options);\n }\n\n const initializer = mb.getInitializer();\n\n if (initializer !== undefined) {\n transformNode(initializer, initialReadonlyContext, options);\n }\n }\n\n continue;\n }\n\n // MethodDeclaration, GetAccessorDeclaration, SetAccessorDeclaration\n // Check if method name has ignored prefix (e.g., mut_)\n if (\n (mb.isKind(tsm.SyntaxKind.MethodDeclaration) ||\n mb.isKind(tsm.SyntaxKind.GetAccessor) ||\n mb.isKind(tsm.SyntaxKind.SetAccessor)) &&\n checkIfPropertyNameShouldBeIgnored(mb.getNameNode(), options)\n ) {\n options.debugPrint('skipped method by ignored prefix');\n\n continue;\n }\n\n transformNode(mb, initialReadonlyContext, options);\n }\n\n for (const mb of node.getChildrenOfKind(tsm.SyntaxKind.IndexSignature)) {\n transformIndexSignatureDeclaration(\n mb,\n 'add',\n initialReadonlyContext,\n options,\n );\n }\n\n for (const ctor of node.getConstructors()) {\n for (const param of ctor.getParameters()) {\n transformConstructorParameter(param, options);\n }\n\n const body = ctor.getBody();\n\n if (body !== undefined) {\n transformNode(body, initialReadonlyContext, options);\n }\n }\n};\n\nconst transformConstructorParameter = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n param: tsm.ParameterDeclaration,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (hasDisableNextLineComment(param)) {\n options.debugPrint(\n 'skipped class constructor parameter by disable-next-line comment',\n );\n\n return;\n }\n\n const name = param.getName();\n\n if (options.ignoredPrefixes.some((p) => name.startsWith(p))) {\n return;\n }\n\n // Check if parameter is a property declaration (public/protected/private)\n const scope = param.getScope();\n\n // public -> public readonly\n // protected -> protected readonly\n // private -> private readonly\n if (\n scope === tsm.Scope.Public ||\n scope === tsm.Scope.Protected ||\n scope === tsm.Scope.Private\n ) {\n param.setIsReadonly(true);\n }\n\n const type = param.getTypeNode();\n\n if (type !== undefined) {\n transformNode(type, initialReadonlyContext, options);\n }\n};\n\n/**\n * - `tr(A & B) -> tr(A) & tr(B)`\n * - `tr(Readonly<A> & Readonly<B>) -> Readonly<tr(A) & tr(B)>`\n */\nconst transformIntersectionTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IntersectionTypeNode,\n readonlyContext: Exclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n transformUnionOrIntersectionTypeNodeImpl(node, readonlyContext, options, '&');\n};\n\n/**\n * - `tr(A | B) |-> tr(A) | tr(B)`\n * - `tr(Readonly<A> | Readonly<B>) |-> Readonly<tr(A) | tr(B)>`\n */\nconst transformUnionTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.UnionTypeNode,\n readonlyContext: Exclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n transformUnionOrIntersectionTypeNodeImpl(node, readonlyContext, options, '|');\n};\n\nconst transformUnionOrIntersectionTypeNodeImpl = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IntersectionTypeNode | tsm.UnionTypeNode,\n readonlyContext: Exclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n operator: '&' | '|',\n): void => {\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'keep',\n });\n\n // Recursive processing\n for (const n of node.getTypeNodes() /* = [A, B] */) {\n transformNode(n, nextReadonlyContextValue, options);\n }\n\n const newTypes = node.getTypeNodes();\n\n const { primitives, arraysAndTuples, typeLiterals, others } =\n groupUnionIntersectionTypes(newTypes);\n\n options.debugPrint({ primitives, arraysAndTuples, typeLiterals, others });\n\n // Separate empty type literals from non-empty ones when ignoreEmptyObjectTypes is true\n const isEmptyTypeLiteral = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n n: tsm.TypeLiteralNode | ReadonlyTypeReferenceNode,\n ): boolean =>\n n.isKind(tsm.SyntaxKind.TypeLiteral) && Arr.isEmpty(n.getMembers());\n\n const nonEmptyTypeLiterals =\n typeLiterals === undefined\n ? undefined\n : options.ignoreEmptyObjectTypes\n ? typeLiterals.nodes.filter((n) => !isEmptyTypeLiteral(n))\n : typeLiterals.nodes;\n\n const emptyTypeLiterals =\n typeLiterals === undefined || !options.ignoreEmptyObjectTypes\n ? undefined\n : typeLiterals.nodes.filter(isEmptyTypeLiteral);\n\n const typeLiteralsWrappedWithReadonly: readonly [] | readonly [string] =\n nonEmptyTypeLiterals === undefined || Arr.isEmpty(nonEmptyTypeLiterals)\n ? ([] as const)\n : ([\n unionToString({\n types: nonEmptyTypeLiterals.map((n) =>\n isReadonlyTypeReferenceNode(n)\n ? // NOTE: Readonly<A & B> -> (A & B)\n unwrapReadonlyTypeArgText(n)\n : (n satisfies tsm.TypeLiteralNode).getFullText(),\n ),\n op: operator,\n wrapWithReadonly:\n nextReadonlyContextValue.type !== 'DeepReadonly' &&\n nextReadonlyContextValue.indexedAccessDepth === 0,\n }),\n ] as const);\n\n // Sort by first occurrence (preserving the original union order as much as possible)\n const sorted: readonly string[] = [\n mapNullable(\n primitives,\n (a) => [a.nodes.map((n) => n.getFullText()), a.firstPosition] as const,\n ),\n mapNullable(\n arraysAndTuples,\n (a) => [a.nodes.map((n) => n.getFullText()), a.firstPosition] as const,\n ),\n nonEmptyTypeLiterals !== undefined && Arr.isNonEmpty(nonEmptyTypeLiterals)\n ? mapNullable(\n typeLiterals,\n (a) => [typeLiteralsWrappedWithReadonly, a.firstPosition] as const,\n )\n : undefined,\n emptyTypeLiterals !== undefined && Arr.isNonEmpty(emptyTypeLiterals)\n ? mapNullable(\n typeLiterals,\n (a) =>\n [\n emptyTypeLiterals.map((n) => n.getFullText()),\n // Use a position after non-empty type literals if they exist\n a.firstPosition +\n (nonEmptyTypeLiterals !== undefined &&\n Arr.isNonEmpty(nonEmptyTypeLiterals)\n ? 0.5\n : 0),\n ] as const,\n )\n : undefined,\n mapNullable(\n others,\n (a) =>\n [\n a.nodes.map((n) => wrapWithParentheses(n.getFullText())),\n a.firstPosition,\n ] as const,\n ),\n ]\n .filter((x) => x !== undefined)\n .toSorted((a, b) => a[1] - b[1])\n .flatMap((a) => a[0]);\n\n // Readonly<number & { x: X } & { y: Y } & readonly E[]>\n // -> number & readonly E[] & Readonly<{ x: X } & { y: Y }>\n\n // Readonly<number | { x: X } | { y: Y } | readonly E[]>\n // -> number | readonly E[] | Readonly<{ x: X } | { y: Y }>\n // Readonly<number & { x: X } & { y: Y } & readonly E[]>\n // -> number & readonly E[] & Readonly<{ x: X } & { y: Y }>\n\n // Readonly<number | { x: X } | { y: Y } | readonly E[]>\n // -> number | readonly E[] | Readonly<{ x: X } | { y: Y }>\n //\n // NOTE: The result is wrapped in parentheses (via `unionToString`). This is\n // intentional and required for precedence safety: without it, a member such\n // as a function type (`() => T`), or a mix of `&` and `|`, or a `readonly`\n // operator would produce invalid syntax when this node is spliced back in.\n // Idempotency is guaranteed by `transformParenthesizedTypeNode`, which\n // collapses the redundant nesting (`((X))` -> `(X)`) this wrapping can create\n // — see the note there. That prevents the parentheses from growing without\n // bound when a union/intersection sits inside a `ParenthesizedType`.\n options.replaceNode(\n node,\n unionToString({ types: sorted, op: operator, wrapWithReadonly: false }),\n );\n};\n\nconst unionToString = ({\n types,\n op,\n wrapWithReadonly,\n}: Readonly<{\n types: readonly string[];\n op: '&' | '|';\n wrapWithReadonly: boolean | string;\n}>): string =>\n Arr.isEmpty(types)\n ? 'never'\n : Arr.isFixedLengthArray(1, types)\n ? wrapWithReadonly === false\n ? wrapWithParentheses(types[0])\n : (`${isString(wrapWithReadonly) ? wrapWithReadonly : 'Readonly'}<${types[0]}>` as const)\n : wrapWithReadonly === false\n ? wrapWithParentheses(types.join(` ${op} `))\n : (`${isString(wrapWithReadonly) ? wrapWithReadonly : 'Readonly'}<${types.join(` ${op} `)}>` as const);\n\n/** Convert ((T)) -> (T) recursively */\nconst transformParenthesizedTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.ParenthesizedTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n const typeNode = node.getTypeNode();\n\n if (typeNode.isKind(tsm.SyntaxKind.ParenthesizedType)) {\n // Recursive processing\n transformParenthesizedTypeNode(typeNode, readonlyContext, options);\n }\n\n transformNode(node.getTypeNode(), readonlyContext, options);\n\n const T = node.getTypeNode();\n\n if (\n // remove () if T is TypeReferenceNode\n // e.g. `(Readonly<A>) |-> Readonly<A>`\n T.isKind(tsm.SyntaxKind.TypeReference) ||\n // remove () if T is ArrayTypeNode\n // e.g. `(A[]) |-> A[]`\n T.isKind(tsm.SyntaxKind.ArrayType) ||\n // remove () if T is TupleTypeNode\n // e.g. `([A]) |-> [A]`\n T.isKind(tsm.SyntaxKind.TupleType) ||\n // remove () if T is PrimitiveTypeNode\n // e.g. `(number) |-> number`\n isAtomicTypeNode(T) ||\n // remove () if T is TypeLiteralNode\n // e.g. `({ member: V }) |-> { member: V }`\n T.isKind(tsm.SyntaxKind.TypeLiteral) ||\n // collapse redundant nested parentheses if T is itself a ParenthesizedType\n // e.g. `((X)) |-> (X)`\n //\n // This is what makes the transform terminate on nested parentheses. The\n // union/intersection handler defensively wraps its result in parentheses\n // for precedence safety, which turns `(A | B)` into `((A | B))` when the\n // union already sits inside a `ParenthesizedType`. Collapsing the redundant\n // outer layer here means each pass removes exactly the layer the wrapping\n // added, so the parentheses no longer grow without bound (which previously\n // overflowed the parser stack on inputs like `type T = (('a' | 'b'))`).\n T.isKind(tsm.SyntaxKind.ParenthesizedType)\n ) {\n options.replaceNode(node, T.getFullText());\n }\n};\n\n/**\n * `tr([\"member1: V1\", \"member2: V2\", \"member3: V3\"])`\n *\n * -> `[\"member1: tr(V1)\", \"member2: tr(V2)\", \"member3: tr(V3)\"]`\n */\nconst transformMembers = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n members: readonly tsm.TypeElementTypes[],\n readonlyModifier: 'add' | 'remove',\n readonlyContext: Extract<\n ReadonlyContext,\n Readonly<{\n type: 'DeepReadonly' | 'none';\n indexedAccessDepth: SafeUintWithSmallInt;\n }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n for (const mb of members) {\n if (hasDisableNextLineComment(mb)) {\n options.debugPrint('skipped by member disable-next-line comment');\n\n continue;\n }\n\n if (mb.isKind(tsm.SyntaxKind.PropertySignature)) {\n if (!checkIfPropertyNameShouldBeIgnored(mb.getNameNode(), options)) {\n transformPropertySignature(\n mb,\n readonlyModifier,\n readonlyContext,\n options,\n );\n }\n\n continue;\n }\n\n if (mb.isKind(tsm.SyntaxKind.IndexSignature)) {\n transformIndexSignatureDeclaration(\n mb,\n readonlyModifier,\n readonlyContext,\n options,\n );\n\n continue;\n }\n\n transformNode(mb, readonlyContext, options);\n\n continue;\n }\n};\n\nconst transformPropertySignature = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.PropertySignature,\n readonlyModifier: 'add' | 'remove',\n readonlyContext: Extract<\n ReadonlyContext,\n Readonly<{\n type: 'DeepReadonly' | 'none';\n indexedAccessDepth: SafeUintWithSmallInt;\n }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (\n readonlyContext.type === 'DeepReadonly' ||\n readonlyModifier === 'remove'\n ) {\n node.setIsReadonly(false);\n } else {\n node.setIsReadonly(true);\n }\n\n {\n const type = node.getTypeNode();\n\n if (type !== undefined) {\n transformNode(type, readonlyContext, options);\n }\n }\n};\n\nconst transformIndexSignatureDeclaration = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IndexSignatureDeclaration,\n readonlyModifier: 'add' | 'remove',\n readonlyContext: Extract<\n ReadonlyContext,\n Readonly<{\n type: 'DeepReadonly' | 'none';\n indexedAccessDepth: SafeUintWithSmallInt;\n }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {\n options.debugPrint('skipped index signature by disable-next-line comment');\n\n return;\n }\n\n if (\n readonlyContext.type === 'DeepReadonly' ||\n readonlyModifier === 'remove'\n ) {\n // node.setIsReadonly(false);\n node.toggleModifier('readonly', false);\n } else {\n node.toggleModifier('readonly', true);\n // node.setIsReadonly(true);\n }\n\n {\n const key = node.getKeyTypeNode();\n\n transformNode(key, readonlyContext, options);\n }\n\n {\n const ret = node.getReturnTypeNode();\n\n if (ret !== undefined) {\n transformNode(ret, readonlyContext, options);\n }\n }\n};\n\nconst checkIfPropertyNameShouldBeIgnored = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n nameNode: tsm.PropertyName,\n options: ReadonlyTransformerOptionsInternal,\n): boolean => {\n expectType<typeof nameNode, tsm.PropertyName>('=');\n\n expectType<\n tsm.PropertyName,\n | tsm.NumericLiteral\n | tsm.BigIntLiteral\n | tsm.NoSubstitutionTemplateLiteral\n | tsm.Identifier\n | tsm.StringLiteral\n | tsm.PrivateIdentifier\n | tsm.ComputedPropertyName // [`mut_x`]: number[]\n >('=');\n\n return (\n // mut_x: number[]\n (nameNode.isKind(tsm.SyntaxKind.Identifier) &&\n pipe(nameNode.getText()).map((nm) =>\n options.ignoredPrefixes.some((p) => nm.startsWith(p)),\n ).value) ||\n // \"mut_x\": number[]\n (nameNode.isKind(tsm.SyntaxKind.StringLiteral) &&\n pipe(nameNode.getLiteralValue()).map((nm) =>\n options.ignoredPrefixes.some((p) => nm.startsWith(p)),\n ).value) ||\n // #memberName: number[] (class only)\n (nameNode.isKind(tsm.SyntaxKind.PrivateIdentifier) &&\n pipe(nameNode.getText()).map((nm) =>\n options.ignoredPrefixes.some((p) => nm.startsWith(`#${p}`)),\n ).value) ||\n // [`mut_x`]: number[]\n (nameNode.isKind(tsm.SyntaxKind.ComputedPropertyName) &&\n pipe(nameNode.getExpression()).map((exp) => {\n if (exp.isKind(tsm.SyntaxKind.StringLiteral)) {\n const nm = exp.getLiteralValue();\n\n return options.ignoredPrefixes.some((p) => nm.startsWith(p));\n }\n\n return false;\n }).value)\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-to-readonly.mjs","sources":["../../../src/functions/ast-transformers/convert-to-readonly.mts"],"sourcesContent":["import {\n Arr,\n expectType,\n ISet,\n isString,\n mapNullable,\n match,\n pipe,\n} from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport {\n type DeepReadonly,\n type SafeUintWithSmallInt,\n type StrictExclude,\n type StrictExtract,\n} from 'ts-type-forge';\nimport {\n hasDisableNextLineComment,\n isAtomicTypeNode,\n isConditionalTypeDistributionGuard,\n isReadonlyArrayTypeNode,\n isReadonlyTupleOrArrayTypeNode,\n isReadonlyTupleTypeNode,\n isReadonlyTypeReferenceNode,\n removeParentheses,\n shouldAvoidParenthesesForReadonly,\n unwrapReadonlyTypeArgText,\n wrapWithParentheses,\n type ReadonlyTypeReferenceNode,\n} from '../functions/index.mjs';\nimport { replaceNodeWithDebugPrint } from '../utils/index.mjs';\nimport {\n groupUnionIntersectionTypes,\n invalidDeepReadonlyTypeName,\n nextReadonlyContext,\n type ReadonlyContext,\n} from './readonly-transformer-helpers/index.mjs';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst TRANSFORMER_NAME = 'convert-to-readonly';\n\nexport const convertToReadonlyTransformer = (\n options?: ReadonlyTransformerOptions,\n): TsMorphTransformer => {\n if (\n options?.DeepReadonly?.typeName !== undefined &&\n invalidDeepReadonlyTypeName.has(options.DeepReadonly.typeName)\n ) {\n throw new Error(\n `Invalid DeepReadonly typeName \"${options.DeepReadonly.typeName}\" passed to convertToReadonlyType`,\n );\n }\n\n const DeepReadonlyTypeName =\n options?.DeepReadonly?.typeName ?? 'DeepReadonly';\n\n const ignorePrefixes = ISet.create(\n options?.ignorePrefixes ?? ['mut_', '#mut_', '_mut_', 'draft'],\n );\n\n const optionsInternal: ReadonlyTransformerOptionsInternal = {\n DeepReadonly: {\n typeName: DeepReadonlyTypeName,\n applyLevel: 'keep',\n },\n ignoreEmptyObjectTypes: options?.ignoreEmptyObjectTypes ?? true,\n ignoredPrefixes: ignorePrefixes,\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.getChildren()) {\n transformNode(node, initialReadonlyContext, optionsInternal);\n }\n },\n };\n};\n\nexport type ReadonlyTransformerOptions = DeepReadonly<{\n /**\n * Options for a type utility `DeepReadonly` that recursively applies readonly.\n */\n DeepReadonly?: {\n /**\n * The name of a type utility that recursively applies `Readonly`.\n *\n * @default \"DeepReadonly\"\n */\n typeName?: string;\n\n /**\n * Whether to apply `DeepReadonly` aggressively or remove `DeepReadonly` as\n * possible.\n *\n * If `applyLevel` is `\"applyAggressively\"`, it applies `DeepReadonly` to all\n * nested type literals without external type references. For example, the\n * following conversions are applied:\n *\n * - `number[][]` to be `DeepReadonly<number[][]>`\n * - `number[]` to be `readonly number[]`\n * - `<T>(arg: T[][]) => void` to be `<T>(arg: readonly (readonly T[])[]>) =>\n * void`\n *\n * If `applyLevel` is `\"removeAsPossible\"`, the following conversions are applied:\n *\n * - `DeepReadonly<number[][]>` to be `readonly (readonly number[])[]`\n * - `DeepReadonly<{ a: number[] }>` to be `Readonly<{ a: readonly number[]\n * }>`\n * - `<T>(arg: DeepReadonly<T[][]>) => void` to be `<T>(arg:\n * DeepReadonly<T[][]>) => void`\n *\n * @default 'keep'\n */\n // TODO\n // applyLevel?: 'applyAggressively' | 'keep' | 'removeAsPossible';\n };\n\n /**\n * Ignore the readonly conversion for `{}`.\n *\n * @default true\n */\n ignoreEmptyObjectTypes?: boolean;\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 debug?: boolean;\n}>;\n\ntype ReadonlyTransformerOptionsInternal = Readonly<{\n DeepReadonly: Readonly<{\n typeName: string;\n\n // removeAsPossible: 正規化後、 DeepReadonly の子ノードが typeLiteral かまたはその union or intersection であり、 それぞれの TypeLiteral がプリミティブ値のメンバーしか持たない場合。\n applyLevel: 'applyAggressively' | 'keep' | 'removeAsPossible';\n }>;\n\n ignoreEmptyObjectTypes: boolean;\n\n ignoredPrefixes: ISet<string>;\n\n debugPrint: (...args: readonly unknown[]) => void;\n replaceNode: (node: tsm.Node, newNodeText: string) => void;\n}>;\n\nconst initialReadonlyContext: ReadonlyContext = {\n type: 'none',\n indexedAccessDepth: 0,\n} as const;\n\nconst transformNode = (\n node: tsm.Node,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (\n tsm.Node.isTypeNode(node) ||\n node.isKind(tsm.SyntaxKind.InterfaceDeclaration) ||\n node.isKind(tsm.SyntaxKind.ClassDeclaration)\n ) {\n options.debugPrint();\n\n options.debugPrint(`transformNode [${node.getKindName()}] `);\n\n options.debugPrint(node.getFullText());\n\n options.debugPrint({ readonlyContext });\n\n options.debugPrint();\n }\n\n if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {\n options.debugPrint('skipped by disable-next-line comment');\n\n return;\n }\n\n // check for ignorePrefix\n if (node.isKind(tsm.SyntaxKind.VariableDeclaration)) {\n const nodeName = node.getName();\n\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 // TODO: Support ignoredPrefixes in ArrayBindingPattern\n // if (ts.isArrayBindingPattern(nodeName)) {\n // // for (const [i, el] of nodeName.elements.entries())\n // }\n\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 readonly conversion for function declarations with ignored prefixes\n // Example: function mut_foo() {} -> parameters and return types remain as is\n if (\n (node.isKind(tsm.SyntaxKind.FunctionDeclaration) ||\n node.isKind(tsm.SyntaxKind.FunctionExpression)) &&\n options.ignoredPrefixes.some((p) => node.getName()?.startsWith(p) === true)\n ) {\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.Parameter)) {\n const nodeName = node.getName();\n\n if (options.ignoredPrefixes.some((p) => nodeName.startsWith(p))) {\n // Skip readonly conversion for variable declarations with ignored prefixes\n // Example: const mut_foo: string[] = []; -> remains as is, without readonly conversion\n return;\n }\n\n // TODO: Support ignoredPrefixes in ArrayBindingPattern\n // if (ts.isArrayBindingPattern(nodeName)) {\n // }\n\n // TODO: Support ignoredPrefixes in ObjectBindingPattern\n // if (ts.isObjectBindingPattern(nodeName)) {\n // }\n }\n\n // Skip readonly conversion for type alias declarations with ignored prefixes\n // Example: type mut_Foo = number[]; -> remains as number[] without readonly\n if (\n node.isKind(tsm.SyntaxKind.TypeAliasDeclaration) &&\n options.ignoredPrefixes.some((p) => node.getName().startsWith(p))\n ) {\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TypeReference)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to TypeReferenceNode',\n );\n }\n\n transformTypeReferenceNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.ArrayType)) {\n transformArrayTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TupleType)) {\n transformTupleTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.RestType)) {\n transformRestTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TypeOperator)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to TypeOperatorNode',\n );\n }\n\n transformTypeOperatorNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.TypeLiteral)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to TypeLiteralNode',\n );\n }\n\n transformTypeLiteralNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.IndexedAccessType)) {\n transformIndexedAccessTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.MappedType)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to MappedTypeNode',\n );\n }\n\n transformMappedTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.InterfaceDeclaration)) {\n // Skip readonly conversion for interface declarations with ignored prefixes\n // Example: interface mut_Interface {...} -> properties remain without readonly\n if (options.ignoredPrefixes.some((p) => node.getName().startsWith(p))) {\n return;\n }\n\n transformInterfaceDeclarationNode(node, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.ClassDeclaration)) {\n // Skip readonly conversion for class declarations with ignored prefixes\n // Example: class mut_Class {...} -> properties remain without readonly\n if (\n options.ignoredPrefixes.some(\n (p) => node.getName()?.startsWith(p) === true,\n )\n ) {\n return;\n }\n\n transformClassDeclarationNode(node, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.IntersectionType)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to IntersectionTypeNode',\n );\n }\n\n transformIntersectionTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.UnionType)) {\n if (readonlyContext.type === 'readonly') {\n throw new Error(\n 'Invalid readonlyContext \"readonly\" passed to UnionTypeNode',\n );\n }\n\n transformUnionTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n if (node.isKind(tsm.SyntaxKind.ParenthesizedType)) {\n // NOTE: readonlyContext を不変のままバケツリレーさせるためにこのケースも必要\n transformParenthesizedTypeNode(node, readonlyContext, options);\n\n return;\n }\n\n for (const child of node.getChildren()) {\n transformNode(child, initialReadonlyContext, options);\n }\n};\n\n//\n// Transformer implementation for each node type\n//\n\n/**\n * - `tr(ReadonlyArray<E>) |-> readonly tr(E)[]`\n * - `tr(Readonly<Readonly<E>>) |-> Readonly<tr(E)>`\n * - `tr(DeepReadonly<Readonly<E>>) |-> DeepReadonly<tr(E)>`\n * - `tr(Readonly<number>) |-> number`\n * - `tr(Readonly<E[]>) |-> readonly tr(E)[]`\n * - `tr(Readonly<[E1, E2, E3]>) |-> readonly [tr(E1), tr(E2), tr(E3)]`\n * - `tr(Readonly<readonly E[]>) |-> readonly tr(E)[]`\n * - `tr(Readonly<readonly [E1, E2, E3]>) |-> readonly [tr(E1), tr(E2), tr(E3)]`\n * - `tr(Readonly<A | readonly E[]>) |-> Readonly<tr(A)> | readonly tr(E)[]>`\n */\nconst transformTypeReferenceNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TypeReferenceNode,\n readonlyContext: StrictExclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n const typeNameStr = node.getTypeName().getText();\n\n const typeArguments = node.getTypeArguments();\n\n // Array<T> / ReadonlyArray<T> to readonly T[]\n if (typeNameStr === 'Array' || typeNameStr === 'ReadonlyArray') {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for ${typeNameStr}.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n {\n type: 'none',\n indexedAccessDepth: readonlyContext.indexedAccessDepth,\n },\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = node.getTypeArguments()[0]!;\n\n options.replaceNode(\n node,\n readonlyContext.type === 'DeepReadonly'\n ? wrapWithParentheses(`${wrapWithParentheses(T.getFullText())}[]`)\n : wrapWithParentheses(\n `readonly ${wrapWithParentheses(T.getFullText())}[]`,\n ),\n );\n\n return;\n }\n\n // Set<T> to ReadonlySet<T>\n if (typeNameStr === 'Set') {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Set.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n {\n type: 'none',\n indexedAccessDepth: readonlyContext.indexedAccessDepth,\n },\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = node.getTypeArguments()[0]!;\n\n options.replaceNode(node, `ReadonlySet<${T.getFullText()}>`);\n\n return;\n }\n\n // Map<T> to ReadonlyMap<T>\n if (typeNameStr === 'Map') {\n if (!Arr.isFixedLengthArray(2, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Map.`,\n );\n }\n\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'keep',\n });\n\n // Recursive processing\n for (const t of typeArguments) {\n transformNode(t, nextReadonlyContextValue, options);\n }\n\n const [K, V] = node.getTypeArguments();\n\n options.replaceNode(\n node,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n `ReadonlyMap<${K!.getFullText()}, ${V!.getFullText()}>`,\n );\n\n return;\n }\n\n // remove unnecessary `Readonly` wrapper or convert to readonly operator\n if (typeNameStr === 'Readonly') {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Readonly.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'Readonly',\n indexedAccessDepthChange: 'keep',\n }),\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = removeParentheses(node.getTypeArguments()[0]!);\n\n // DeepReadonly<Readonly<T>> -> DeepReadonly<T>\n if (readonlyContext.type === 'DeepReadonly') {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<{ ... }>[I] -> { ... }[I]\n if (readonlyContext.indexedAccessDepth > 0) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<Readonly<T>> -> Readonly<T>\n if (isReadonlyTypeReferenceNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<number> -> number\n if (isAtomicTypeNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // T = E[]\n // Readonly<E[]> -> readonly E[]\n //\n // T = [E1, E2, E3]\n // Readonly<[E1, E2, E3]> -> readonly [E1, E2, E3]\n if (\n T.isKind(tsm.SyntaxKind.ArrayType) ||\n T.isKind(tsm.SyntaxKind.TupleType)\n ) {\n const readonlyText = `readonly ${T.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n\n return;\n }\n\n // T = readonly E[] or readonly [E1, E2, E3]\n // Readonly<readonly E[]> -> readonly E[]\n // Readonly<readonly [E1, E2, E3]> -> readonly [E1, E2, E3]\n if (isReadonlyTupleOrArrayTypeNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // T = A | B | C\n // T = A & B & C\n if (\n T.isKind(tsm.SyntaxKind.UnionType) ||\n T.isKind(tsm.SyntaxKind.IntersectionType)\n ) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n return;\n }\n\n // DeepReadonly\n if (typeNameStr === options.DeepReadonly.typeName) {\n if (!Arr.isFixedLengthArray(1, typeArguments)) {\n throw new Error(\n `Unexpected number of type arguments \"${typeArguments.length}\" for Readonly.`,\n );\n }\n\n // Recursive processing\n transformNode(\n typeArguments[0],\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'DeepReadonly',\n }),\n options,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const T = node.getTypeArguments()[0]!;\n\n // DeepReadonly<DeepReadonly<T>> -> DeepReadonly<T>\n if (readonlyContext.type === 'DeepReadonly') {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // Readonly<number> -> number\n if (isAtomicTypeNode(T)) {\n options.replaceNode(node, T.getFullText());\n\n return;\n }\n\n // T = P[]\n // DeepReadonly<P[]> -> readonly P[] (for primitive type arrays, convert to readonly P[] form)\n // DeepReadonly<O[]> -> DeepReadonly<O[]> (for object type arrays, keep as is to recursively apply Readonly)\n // DeepReadonly<P[][]> -> DeepReadonly<P[][]>\n if (\n T.isKind(tsm.SyntaxKind.ArrayType) &&\n isAtomicTypeNode(T.getElementTypeNode())\n ) {\n const readonlyText = `readonly ${T.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n\n return;\n }\n\n // T = [P1, P2, P3]\n // DeepReadonly<[P1, P2, P3]> -> readonly [P1, P2, P3]\n if (\n T.isKind(tsm.SyntaxKind.TupleType) &&\n T.getElements().every(isAtomicTypeNode)\n ) {\n const readonlyText = `readonly ${T.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n\n return;\n }\n\n return;\n }\n\n {\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'keep',\n });\n\n // Recursive processing\n for (const t of node.getTypeArguments()) {\n transformNode(t, nextReadonlyContextValue, options);\n }\n }\n};\n\n/** `tr(E[]) |-> tr(E)[]` */\nconst transformArrayTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.ArrayTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getElementTypeNode(),\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n switch (readonlyContext.type) {\n case 'DeepReadonly':\n case 'readonly':\n return; // remain tr(E)[] as is\n\n // Unnecessary `Readonly` wrapper will be remove in transformTypeReferenceNode\n case 'Readonly':\n case 'none':\n // Skip the `A[] extends B[] ? ...` union-distribution-guard idiom: adding\n // `readonly` there does not improve immutability and breaks the idiom.\n if (\n readonlyContext.indexedAccessDepth === 0 &&\n !isConditionalTypeDistributionGuard(node)\n ) {\n const readonlyText = `readonly ${node.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n }\n }\n};\n\n/** `tr([E1, E2, E3])` |-> `[tr(E1), tr(E2), tr(E3)]` */\nconst transformTupleTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TupleTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n {\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n });\n\n for (const el of node.getElements()) {\n if (el.isKind(tsm.SyntaxKind.NamedTupleMember)) {\n if (options.ignoredPrefixes.every((p) => !el.getName().startsWith(p))) {\n transformNode(el.getTypeNode(), nextReadonlyContextValue, options);\n }\n } else {\n transformNode(el, nextReadonlyContextValue, options);\n }\n }\n }\n\n switch (readonlyContext.type) {\n case 'DeepReadonly':\n case 'readonly':\n return; // remain tr(E)[] as is\n\n // Unnecessary `Readonly` wrapper will be remove in transformTypeReferenceNode\n case 'Readonly':\n case 'none':\n // Skip the `[A] extends [B] ? ...` union-distribution-guard idiom: adding\n // `readonly` there does not improve immutability and breaks the idiom.\n if (\n readonlyContext.indexedAccessDepth === 0 &&\n !isConditionalTypeDistributionGuard(node)\n ) {\n const readonlyText = `readonly ${node.getFullText()}` as const;\n\n options.replaceNode(\n node,\n shouldAvoidParenthesesForReadonly(node)\n ? readonlyText\n : wrapWithParentheses(readonlyText),\n );\n }\n }\n};\n\n/** `tr(\"...T\")` |-> `...tr(T)` */\nconst transformRestTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.RestTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getTypeNode() /* = T */,\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n const R = removeParentheses(node.getTypeNode());\n\n // `tr(\"...readonly E[]\") |-> ...tr(E)[]`\n // `tr(\"...readonly [E1, E2]\") |-> ...[tr(E1), tr(E2)]`\n if (isReadonlyArrayTypeNode(R) || isReadonlyTupleTypeNode(R)) {\n options.replaceNode(\n node,\n `...${R.getTypeNode().getFullText()}` /* = tr(E)[] or [tr(E1), tr(E2)] */,\n );\n }\n};\n\n/**\n * - `readonly T[][] |-> readonly (readonly T[])[]`\n * - `keyof { a: number[] } |-> keyof Readonly<{ a: readonly number[] }>`\n */\nconst transformTypeOperatorNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TypeOperatorTypeNode,\n readonlyContext: StrictExclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getTypeNode(),\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType:\n node.getOperator() === tsm.SyntaxKind.ReadonlyKeyword\n ? 'readonly'\n : 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n switch (readonlyContext.type) {\n // DeepReadonly<readonly E[]> -> DeepReadonly<E[]>\n case 'DeepReadonly':\n options.replaceNode(node, node.getTypeNode().getFullText());\n\n return;\n\n case 'Readonly':\n case 'none':\n if (readonlyContext.indexedAccessDepth > 0) {\n options.replaceNode(node, node.getTypeNode().getFullText());\n }\n }\n};\n\n// `{ readonly member: V } |-> Readonly<{ member: V }>`\nconst transformTypeLiteralNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.TypeLiteralNode,\n readonlyContext: StrictExclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (options.ignoreEmptyObjectTypes && Arr.isEmpty(node.getMembers())) {\n return;\n }\n\n // Recursive processing\n transformMembers(\n node.getMembers(),\n 'remove',\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n\n switch (readonlyContext.type) {\n case 'DeepReadonly':\n case 'Readonly':\n // Don't wrap with Readonly if already readonly\n return;\n\n case 'none': {\n if (readonlyContext.indexedAccessDepth === 0) {\n // `{ readonly x: X, readonly y: Y } |-> Readonly<{ x: X, y: Y }>`\n options.replaceNode(node, `Readonly<${node.getFullText()}>`);\n }\n }\n }\n};\n\n/** `tr([A, B, C][I])` |-> `[tr(A), tr(B), tr(C)][I]` */\nconst transformIndexedAccessTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IndexedAccessTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n // Recursive processing\n transformNode(\n node.getObjectTypeNode(),\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'incr',\n }),\n options,\n );\n\n transformNode(\n node.getIndexTypeNode() /* = I */,\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'Readonly',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n};\n\n/**\n * - `{ [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n * - `{ -readonly [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n * - `{ readonly [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n * - `{ +readonly [key in Obj]: V }` -> `Readonly<{ [key in Obj]: V }>`\n */\nconst transformMappedTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.MappedTypeNode,\n readonlyContext: StrictExclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n const typeNode = node.getTypeNode();\n\n if (typeNode !== undefined) {\n transformNode(\n typeNode,\n nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'decr',\n }),\n options,\n );\n }\n\n const questionTokenText =\n pipe(node.getQuestionToken()?.getText()).mapNullable((t) =>\n t === '?' ? '?' : t === '-' ? '-?' : t === '+' ? '+?' : undefined,\n ).value ?? '';\n\n const result: string = pipe(\n // remove readonlyToken\n `{ [${node.getTypeParameter().getFullText()}]${questionTokenText}: ${node.getTypeNode()?.getFullText()} }`,\n ).map((mpt) =>\n match(readonlyContext.type, {\n // Don't wrap with Readonly if already readonly or unnecessary\n DeepReadonly: mpt,\n Readonly: mpt,\n none: readonlyContext.indexedAccessDepth > 0 ? mpt : `Readonly<${mpt}>`,\n }),\n ).value;\n\n options.replaceNode(node, result);\n};\n\n// Making interface members readonly\nconst transformInterfaceDeclarationNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.InterfaceDeclaration,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n for (const param of node.getTypeParameters()) {\n transformNode(param, initialReadonlyContext, options);\n }\n\n for (const n of node.getHeritageClauses()) {\n transformNode(n, initialReadonlyContext, options);\n }\n\n transformMembers(node.getMembers(), 'add', initialReadonlyContext, options);\n};\n\nconst transformClassDeclarationNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.ClassDeclaration,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n for (const n of node.getTypeParameters()) {\n transformNode(n, initialReadonlyContext, options);\n }\n\n for (const n of node.getHeritageClauses()) {\n transformNode(n, initialReadonlyContext, options);\n }\n\n for (const mb of node.getMembers()) {\n if (hasDisableNextLineComment(mb)) {\n options.debugPrint('skipped member by disable-next-line comment');\n\n continue;\n }\n\n if (mb.isKind(tsm.SyntaxKind.PropertyDeclaration)) {\n if (!checkIfPropertyNameShouldBeIgnored(mb.getNameNode(), options)) {\n mb.setIsReadonly(true);\n\n const type = mb.getTypeNode();\n\n if (type !== undefined) {\n transformNode(type, initialReadonlyContext, options);\n }\n\n const initializer = mb.getInitializer();\n\n if (initializer !== undefined) {\n transformNode(initializer, initialReadonlyContext, options);\n }\n }\n\n continue;\n }\n\n // MethodDeclaration, GetAccessorDeclaration, SetAccessorDeclaration\n // Check if method name has ignored prefix (e.g., mut_)\n if (\n (mb.isKind(tsm.SyntaxKind.MethodDeclaration) ||\n mb.isKind(tsm.SyntaxKind.GetAccessor) ||\n mb.isKind(tsm.SyntaxKind.SetAccessor)) &&\n checkIfPropertyNameShouldBeIgnored(mb.getNameNode(), options)\n ) {\n options.debugPrint('skipped method by ignored prefix');\n\n continue;\n }\n\n transformNode(mb, initialReadonlyContext, options);\n }\n\n for (const mb of node.getChildrenOfKind(tsm.SyntaxKind.IndexSignature)) {\n transformIndexSignatureDeclaration(\n mb,\n 'add',\n initialReadonlyContext,\n options,\n );\n }\n\n for (const ctor of node.getConstructors()) {\n for (const param of ctor.getParameters()) {\n transformConstructorParameter(param, options);\n }\n\n const body = ctor.getBody();\n\n if (body !== undefined) {\n transformNode(body, initialReadonlyContext, options);\n }\n }\n};\n\nconst transformConstructorParameter = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n param: tsm.ParameterDeclaration,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (hasDisableNextLineComment(param)) {\n options.debugPrint(\n 'skipped class constructor parameter by disable-next-line comment',\n );\n\n return;\n }\n\n const name = param.getName();\n\n if (options.ignoredPrefixes.some((p) => name.startsWith(p))) {\n return;\n }\n\n // Check if parameter is a property declaration (public/protected/private)\n const scope = param.getScope();\n\n // public -> public readonly\n // protected -> protected readonly\n // private -> private readonly\n if (\n scope === tsm.Scope.Public ||\n scope === tsm.Scope.Protected ||\n scope === tsm.Scope.Private\n ) {\n param.setIsReadonly(true);\n }\n\n const type = param.getTypeNode();\n\n if (type !== undefined) {\n transformNode(type, initialReadonlyContext, options);\n }\n};\n\n/**\n * - `tr(A & B) -> tr(A) & tr(B)`\n * - `tr(Readonly<A> & Readonly<B>) -> Readonly<tr(A) & tr(B)>`\n */\nconst transformIntersectionTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IntersectionTypeNode,\n readonlyContext: StrictExclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n transformUnionOrIntersectionTypeNodeImpl(node, readonlyContext, options, '&');\n};\n\n/**\n * - `tr(A | B) |-> tr(A) | tr(B)`\n * - `tr(Readonly<A> | Readonly<B>) |-> Readonly<tr(A) | tr(B)>`\n */\nconst transformUnionTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.UnionTypeNode,\n readonlyContext: StrictExclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n transformUnionOrIntersectionTypeNodeImpl(node, readonlyContext, options, '|');\n};\n\nconst transformUnionOrIntersectionTypeNodeImpl = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IntersectionTypeNode | tsm.UnionTypeNode,\n readonlyContext: StrictExclude<\n ReadonlyContext,\n Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n operator: '&' | '|',\n): void => {\n const nextReadonlyContextValue = nextReadonlyContext({\n currentReadonlyContext: readonlyContext,\n nextReadonlyContextType: 'none',\n indexedAccessDepthChange: 'keep',\n });\n\n // Recursive processing\n for (const n of node.getTypeNodes() /* = [A, B] */) {\n transformNode(n, nextReadonlyContextValue, options);\n }\n\n const newTypes = node.getTypeNodes();\n\n const { primitives, arraysAndTuples, typeLiterals, others } =\n groupUnionIntersectionTypes(newTypes);\n\n options.debugPrint({ primitives, arraysAndTuples, typeLiterals, others });\n\n // Separate empty type literals from non-empty ones when ignoreEmptyObjectTypes is true\n const isEmptyTypeLiteral = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n n: tsm.TypeLiteralNode | ReadonlyTypeReferenceNode,\n ): boolean =>\n n.isKind(tsm.SyntaxKind.TypeLiteral) && Arr.isEmpty(n.getMembers());\n\n const nonEmptyTypeLiterals =\n typeLiterals === undefined\n ? undefined\n : options.ignoreEmptyObjectTypes\n ? typeLiterals.nodes.filter((n) => !isEmptyTypeLiteral(n))\n : typeLiterals.nodes;\n\n const emptyTypeLiterals =\n typeLiterals === undefined || !options.ignoreEmptyObjectTypes\n ? undefined\n : typeLiterals.nodes.filter(isEmptyTypeLiteral);\n\n const typeLiteralsWrappedWithReadonly: readonly [] | readonly [string] =\n nonEmptyTypeLiterals === undefined || Arr.isEmpty(nonEmptyTypeLiterals)\n ? ([] as const)\n : ([\n unionToString({\n types: nonEmptyTypeLiterals.map((n) =>\n isReadonlyTypeReferenceNode(n)\n ? // NOTE: Readonly<A & B> -> (A & B)\n unwrapReadonlyTypeArgText(n)\n : (n satisfies tsm.TypeLiteralNode).getFullText(),\n ),\n op: operator,\n wrapWithReadonly:\n nextReadonlyContextValue.type !== 'DeepReadonly' &&\n nextReadonlyContextValue.indexedAccessDepth === 0,\n }),\n ] as const);\n\n // Sort by first occurrence (preserving the original union order as much as possible)\n const sorted: readonly string[] = [\n mapNullable(\n primitives,\n (a) => [a.nodes.map((n) => n.getFullText()), a.firstPosition] as const,\n ),\n mapNullable(\n arraysAndTuples,\n (a) => [a.nodes.map((n) => n.getFullText()), a.firstPosition] as const,\n ),\n nonEmptyTypeLiterals !== undefined && Arr.isNonEmpty(nonEmptyTypeLiterals)\n ? mapNullable(\n typeLiterals,\n (a) => [typeLiteralsWrappedWithReadonly, a.firstPosition] as const,\n )\n : undefined,\n emptyTypeLiterals !== undefined && Arr.isNonEmpty(emptyTypeLiterals)\n ? mapNullable(\n typeLiterals,\n (a) =>\n [\n emptyTypeLiterals.map((n) => n.getFullText()),\n // Use a position after non-empty type literals if they exist\n a.firstPosition +\n (nonEmptyTypeLiterals !== undefined &&\n Arr.isNonEmpty(nonEmptyTypeLiterals)\n ? 0.5\n : 0),\n ] as const,\n )\n : undefined,\n mapNullable(\n others,\n (a) =>\n [\n a.nodes.map((n) => wrapWithParentheses(n.getFullText())),\n a.firstPosition,\n ] as const,\n ),\n ]\n .filter((x) => x !== undefined)\n .toSorted((a, b) => a[1] - b[1])\n .flatMap((a) => a[0]);\n\n // Readonly<number & { x: X } & { y: Y } & readonly E[]>\n // -> number & readonly E[] & Readonly<{ x: X } & { y: Y }>\n\n // Readonly<number | { x: X } | { y: Y } | readonly E[]>\n // -> number | readonly E[] | Readonly<{ x: X } | { y: Y }>\n // Readonly<number & { x: X } & { y: Y } & readonly E[]>\n // -> number & readonly E[] & Readonly<{ x: X } & { y: Y }>\n\n // Readonly<number | { x: X } | { y: Y } | readonly E[]>\n // -> number | readonly E[] | Readonly<{ x: X } | { y: Y }>\n //\n // NOTE: The result is wrapped in parentheses (via `unionToString`). This is\n // intentional and required for precedence safety: without it, a member such\n // as a function type (`() => T`), or a mix of `&` and `|`, or a `readonly`\n // operator would produce invalid syntax when this node is spliced back in.\n // Idempotency is guaranteed by `transformParenthesizedTypeNode`, which\n // collapses the redundant nesting (`((X))` -> `(X)`) this wrapping can create\n // — see the note there. That prevents the parentheses from growing without\n // bound when a union/intersection sits inside a `ParenthesizedType`.\n options.replaceNode(\n node,\n unionToString({ types: sorted, op: operator, wrapWithReadonly: false }),\n );\n};\n\nconst unionToString = ({\n types,\n op,\n wrapWithReadonly,\n}: Readonly<{\n types: readonly string[];\n op: '&' | '|';\n wrapWithReadonly: boolean | string;\n}>): string =>\n Arr.isEmpty(types)\n ? 'never'\n : Arr.isFixedLengthArray(1, types)\n ? wrapWithReadonly === false\n ? wrapWithParentheses(types[0])\n : (`${isString(wrapWithReadonly) ? wrapWithReadonly : 'Readonly'}<${types[0]}>` as const)\n : wrapWithReadonly === false\n ? wrapWithParentheses(types.join(` ${op} `))\n : (`${isString(wrapWithReadonly) ? wrapWithReadonly : 'Readonly'}<${types.join(` ${op} `)}>` as const);\n\n/** Convert ((T)) -> (T) recursively */\nconst transformParenthesizedTypeNode = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.ParenthesizedTypeNode,\n readonlyContext: ReadonlyContext,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n const typeNode = node.getTypeNode();\n\n if (typeNode.isKind(tsm.SyntaxKind.ParenthesizedType)) {\n // Recursive processing\n transformParenthesizedTypeNode(typeNode, readonlyContext, options);\n }\n\n transformNode(node.getTypeNode(), readonlyContext, options);\n\n const T = node.getTypeNode();\n\n if (\n // remove () if T is TypeReferenceNode\n // e.g. `(Readonly<A>) |-> Readonly<A>`\n T.isKind(tsm.SyntaxKind.TypeReference) ||\n // remove () if T is ArrayTypeNode\n // e.g. `(A[]) |-> A[]`\n T.isKind(tsm.SyntaxKind.ArrayType) ||\n // remove () if T is TupleTypeNode\n // e.g. `([A]) |-> [A]`\n T.isKind(tsm.SyntaxKind.TupleType) ||\n // remove () if T is PrimitiveTypeNode\n // e.g. `(number) |-> number`\n isAtomicTypeNode(T) ||\n // remove () if T is TypeLiteralNode\n // e.g. `({ member: V }) |-> { member: V }`\n T.isKind(tsm.SyntaxKind.TypeLiteral) ||\n // collapse redundant nested parentheses if T is itself a ParenthesizedType\n // e.g. `((X)) |-> (X)`\n //\n // This is what makes the transform terminate on nested parentheses. The\n // union/intersection handler defensively wraps its result in parentheses\n // for precedence safety, which turns `(A | B)` into `((A | B))` when the\n // union already sits inside a `ParenthesizedType`. Collapsing the redundant\n // outer layer here means each pass removes exactly the layer the wrapping\n // added, so the parentheses no longer grow without bound (which previously\n // overflowed the parser stack on inputs like `type T = (('a' | 'b'))`).\n T.isKind(tsm.SyntaxKind.ParenthesizedType)\n ) {\n options.replaceNode(node, T.getFullText());\n }\n};\n\n/**\n * `tr([\"member1: V1\", \"member2: V2\", \"member3: V3\"])`\n *\n * -> `[\"member1: tr(V1)\", \"member2: tr(V2)\", \"member3: tr(V3)\"]`\n */\nconst transformMembers = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n members: readonly tsm.TypeElementTypes[],\n readonlyModifier: 'add' | 'remove',\n readonlyContext: StrictExtract<\n ReadonlyContext,\n Readonly<{\n type: 'DeepReadonly' | 'none';\n indexedAccessDepth: SafeUintWithSmallInt;\n }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n for (const mb of members) {\n if (hasDisableNextLineComment(mb)) {\n options.debugPrint('skipped by member disable-next-line comment');\n\n continue;\n }\n\n if (mb.isKind(tsm.SyntaxKind.PropertySignature)) {\n if (!checkIfPropertyNameShouldBeIgnored(mb.getNameNode(), options)) {\n transformPropertySignature(\n mb,\n readonlyModifier,\n readonlyContext,\n options,\n );\n }\n\n continue;\n }\n\n if (mb.isKind(tsm.SyntaxKind.IndexSignature)) {\n transformIndexSignatureDeclaration(\n mb,\n readonlyModifier,\n readonlyContext,\n options,\n );\n\n continue;\n }\n\n transformNode(mb, readonlyContext, options);\n }\n};\n\nconst transformPropertySignature = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.PropertySignature,\n readonlyModifier: 'add' | 'remove',\n readonlyContext: StrictExtract<\n ReadonlyContext,\n Readonly<{\n type: 'DeepReadonly' | 'none';\n indexedAccessDepth: SafeUintWithSmallInt;\n }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (\n readonlyModifier === 'remove' ||\n readonlyContext.type === 'DeepReadonly'\n ) {\n node.setIsReadonly(false);\n } else {\n node.setIsReadonly(true);\n }\n\n {\n const type = node.getTypeNode();\n\n if (type !== undefined) {\n transformNode(type, readonlyContext, options);\n }\n }\n};\n\nconst transformIndexSignatureDeclaration = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: tsm.IndexSignatureDeclaration,\n readonlyModifier: 'add' | 'remove',\n readonlyContext: StrictExtract<\n ReadonlyContext,\n Readonly<{\n type: 'DeepReadonly' | 'none';\n indexedAccessDepth: SafeUintWithSmallInt;\n }>\n >,\n options: ReadonlyTransformerOptionsInternal,\n): void => {\n if (hasDisableNextLineComment(node, TRANSFORMER_NAME)) {\n options.debugPrint('skipped index signature by disable-next-line comment');\n\n return;\n }\n\n if (\n readonlyModifier === 'remove' ||\n readonlyContext.type === 'DeepReadonly'\n ) {\n // node.setIsReadonly(false);\n node.toggleModifier('readonly', false);\n } else {\n node.toggleModifier('readonly', true);\n // node.setIsReadonly(true);\n }\n\n {\n const key = node.getKeyTypeNode();\n\n transformNode(key, readonlyContext, options);\n }\n\n {\n const ret = node.getReturnTypeNode();\n\n if (ret !== undefined) {\n transformNode(ret, readonlyContext, options);\n }\n }\n};\n\nconst checkIfPropertyNameShouldBeIgnored = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n nameNode: tsm.PropertyName,\n options: ReadonlyTransformerOptionsInternal,\n): boolean => {\n expectType<typeof nameNode, tsm.PropertyName>('=');\n\n expectType<\n tsm.PropertyName,\n | tsm.NumericLiteral\n | tsm.BigIntLiteral\n | tsm.NoSubstitutionTemplateLiteral\n | tsm.Identifier\n | tsm.StringLiteral\n | tsm.PrivateIdentifier\n | tsm.ComputedPropertyName // [`mut_x`]: number[]\n >('=');\n\n return (\n // mut_x: number[]\n (nameNode.isKind(tsm.SyntaxKind.Identifier) &&\n pipe(nameNode.getText()).map((nm) =>\n options.ignoredPrefixes.some((p) => nm.startsWith(p)),\n ).value) ||\n // \"mut_x\": number[]\n (nameNode.isKind(tsm.SyntaxKind.StringLiteral) &&\n pipe(nameNode.getLiteralValue()).map((nm) =>\n options.ignoredPrefixes.some((p) => nm.startsWith(p)),\n ).value) ||\n // #memberName: number[] (class only)\n (nameNode.isKind(tsm.SyntaxKind.PrivateIdentifier) &&\n pipe(nameNode.getText()).map((nm) =>\n options.ignoredPrefixes.some((p) => nm.startsWith(`#${p}`)),\n ).value) ||\n // [`mut_x`]: number[]\n (nameNode.isKind(tsm.SyntaxKind.ComputedPropertyName) &&\n pipe(nameNode.getExpression()).map((exp) => {\n if (exp.isKind(tsm.SyntaxKind.StringLiteral)) {\n const nm = exp.getLiteralValue();\n\n return options.ignoredPrefixes.some((p) => nm.startsWith(p));\n }\n\n return false;\n }).value)\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type SafeUintWithSmallInt } from 'ts-type-forge';
|
|
1
|
+
import { type SafeUintWithSmallInt, type StrictExtract } from 'ts-type-forge';
|
|
2
2
|
/**
|
|
3
3
|
* Controls whether to make a layer mutable during recursive transformation
|
|
4
4
|
* calls, to standardize by omitting readonly from inner `number[]` in types
|
|
@@ -27,12 +27,12 @@ export declare const nextReadonlyContext: <const Curr extends ReadonlyContext, c
|
|
|
27
27
|
nextReadonlyContextType: Next;
|
|
28
28
|
indexedAccessDepthChange: 'decr' | 'incr' | 'keep' | 'infinity';
|
|
29
29
|
} | {
|
|
30
|
-
nextReadonlyContextType:
|
|
30
|
+
nextReadonlyContextType: StrictExtract<ReadonlyContext['type'], 'DeepReadonly'>;
|
|
31
31
|
indexedAccessDepthChange?: 'infinity';
|
|
32
32
|
}) & {
|
|
33
33
|
currentReadonlyContext: Curr;
|
|
34
34
|
}>) => Readonly<{
|
|
35
|
-
type:
|
|
35
|
+
type: Next | StrictExtract<ReadonlyContext['type'], 'DeepReadonly'>;
|
|
36
36
|
indexedAccessDepth: SafeUintWithSmallInt;
|
|
37
37
|
}>;
|
|
38
38
|
//# sourceMappingURL=readonly-context.d.mts.map
|
package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readonly-context.d.mts","sourceRoot":"","sources":["../../../../src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"readonly-context.d.mts","sourceRoot":"","sources":["../../../../src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CACpC,CACI;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CACnB,GAAG;IAAE,kBAAkB,EAAE,oBAAoB,CAAA;CAAE,CACjD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,KAAK,CAAC,IAAI,SAAS,eAAe,EAClC,KAAK,CAAC,IAAI,SAAS,eAAe,CAAC,MAAM,CAAC,8FAKzC,QAAQ,CACT,CACI;IACE,uBAAuB,EAAE,IAAI,CAAC;IAC9B,wBAAwB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CACjE,GACD;IACE,uBAAuB,EAAE,aAAa,CACpC,eAAe,CAAC,MAAM,CAAC,EACvB,cAAc,CACf,CAAC;IACF,wBAAwB,CAAC,EAAE,UAAU,CAAC;CACvC,CACJ,GAAG;IACF,sBAAsB,EAAE,IAAI,CAAC;CAC9B,CACF,KAAG,QAAQ,CAAC;IACX,IAAI,EAAE,IAAI,GAAG,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;IACpE,kBAAkB,EAAE,oBAAoB,CAAC;CAC1C,CAcgB,CAAC"}
|
package/dist/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readonly-context.mjs","sources":["../../../../src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts"],"sourcesContent":["import { SafeUint, match } from 'ts-data-forge';\nimport { type SafeUintWithSmallInt } from 'ts-type-forge';\n\n/**\n * Controls whether to make a layer mutable during recursive transformation\n * calls, to standardize by omitting readonly from inner `number[]` in types\n * like `DeepReadonly<[string, number[]]>`.\n *\n * - `\"DeepReadonly\"`: Indicates that `node` is inside a type utility like\n * `DeepReadonly` that recursively applies readonly.\n * - `\"Readonly\"`: Indicates that `node` is directly under a `Readonly` type.\n * - `\"readonly\"`: Indicates that `node` is directly under a `readonly` operator.\n * - `\"IndexedAccessObjectType\"`: Indicates that `node` is directly under an\n * IndexedAccessTypeNode.\n * - `\"none\"`: All other cases\n */\nexport type ReadonlyContext = Readonly<\n (\n | { type: 'DeepReadonly' }\n | { type: 'Readonly' }\n | { type: 'readonly' }\n | { type: 'none' }\n ) & { indexedAccessDepth: SafeUintWithSmallInt }\n>;\n\nexport const nextReadonlyContext = <\n const Curr extends ReadonlyContext,\n const Next extends ReadonlyContext['type'],\n>({\n currentReadonlyContext: curr,\n nextReadonlyContextType: next,\n indexedAccessDepthChange = 'infinity',\n}: Readonly<\n (\n | {\n nextReadonlyContextType: Next;\n indexedAccessDepthChange: 'decr' | 'incr' | 'keep' | 'infinity';\n }\n | {\n nextReadonlyContextType:
|
|
1
|
+
{"version":3,"file":"readonly-context.mjs","sources":["../../../../src/functions/ast-transformers/readonly-transformer-helpers/readonly-context.mts"],"sourcesContent":["import { SafeUint, match } from 'ts-data-forge';\nimport { type SafeUintWithSmallInt, type StrictExtract } from 'ts-type-forge';\n\n/**\n * Controls whether to make a layer mutable during recursive transformation\n * calls, to standardize by omitting readonly from inner `number[]` in types\n * like `DeepReadonly<[string, number[]]>`.\n *\n * - `\"DeepReadonly\"`: Indicates that `node` is inside a type utility like\n * `DeepReadonly` that recursively applies readonly.\n * - `\"Readonly\"`: Indicates that `node` is directly under a `Readonly` type.\n * - `\"readonly\"`: Indicates that `node` is directly under a `readonly` operator.\n * - `\"IndexedAccessObjectType\"`: Indicates that `node` is directly under an\n * IndexedAccessTypeNode.\n * - `\"none\"`: All other cases\n */\nexport type ReadonlyContext = Readonly<\n (\n | { type: 'DeepReadonly' }\n | { type: 'Readonly' }\n | { type: 'readonly' }\n | { type: 'none' }\n ) & { indexedAccessDepth: SafeUintWithSmallInt }\n>;\n\nexport const nextReadonlyContext = <\n const Curr extends ReadonlyContext,\n const Next extends ReadonlyContext['type'],\n>({\n currentReadonlyContext: curr,\n nextReadonlyContextType: next,\n indexedAccessDepthChange = 'infinity',\n}: Readonly<\n (\n | {\n nextReadonlyContextType: Next;\n indexedAccessDepthChange: 'decr' | 'incr' | 'keep' | 'infinity';\n }\n | {\n nextReadonlyContextType: StrictExtract<\n ReadonlyContext['type'],\n 'DeepReadonly'\n >;\n indexedAccessDepthChange?: 'infinity';\n }\n ) & {\n currentReadonlyContext: Curr;\n }\n>): Readonly<{\n type: Next | StrictExtract<ReadonlyContext['type'], 'DeepReadonly'>;\n indexedAccessDepth: SafeUintWithSmallInt;\n}> =>\n curr.type === 'DeepReadonly'\n ? ({\n type: 'DeepReadonly',\n indexedAccessDepth: SafeUint.MAX_VALUE,\n } as const)\n : ({\n type: next,\n indexedAccessDepth: match(indexedAccessDepthChange, {\n decr: SafeUint.sub(curr.indexedAccessDepth, 1),\n keep: curr.indexedAccessDepth,\n incr: SafeUint.add(curr.indexedAccessDepth, 1),\n infinity: SafeUint.MAX_VALUE,\n }),\n } as const);\n"],"names":[],"mappings":";;AAyBO,MAAM,sBAAsB,CAGjC;AAAA,EACA,sBAAA,EAAwB,IAAA;AAAA,EACxB,uBAAA,EAAyB,IAAA;AAAA,EACzB,wBAAA,GAA2B;AAC7B,CAAA,KAoBE,IAAA,CAAK,SAAS,cAAA,GACT;AAAA,EACC,IAAA,EAAM,cAAA;AAAA,EACN,oBAAoB,QAAA,CAAS;AAC/B,CAAA,GACC;AAAA,EACC,IAAA,EAAM,IAAA;AAAA,EACN,kBAAA,EAAoB,MAAM,wBAAA,EAA0B;AAAA,IAClD,IAAA,EAAM,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAAA,IAC7C,MAAM,IAAA,CAAK,kBAAA;AAAA,IACX,IAAA,EAAM,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAAA,IAC7C,UAAU,QAAA,CAAS;AAAA,GACpB;AACH;;;;"}
|
|
@@ -41,7 +41,7 @@ const shouldSkipFile = (code, transformerName) => {
|
|
|
41
41
|
/\/\*\s*transform-ignore\s*.*?\s*\*\//u
|
|
42
42
|
];
|
|
43
43
|
const hasFileIgnoreComment = patterns.some((regex) => regex.test(code));
|
|
44
|
-
if (Arr.isEmpty(ignoredTransformers)
|
|
44
|
+
if (!hasFileIgnoreComment && Arr.isEmpty(ignoredTransformers)) {
|
|
45
45
|
return false;
|
|
46
46
|
}
|
|
47
47
|
if (Arr.isEmpty(ignoredTransformers)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-source-code.mjs","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"sourcesContent":["import { Arr } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst extractFileIgnoreTransformers = (code: string): readonly string[] => {\n // Try to find any of the supported file-level ignore comment prefixes\n const patterns = [\n {\n prefix: 'transformer-ignore',\n regex: /\\/\\*\\s*transformer-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'ts-codemod-ignore',\n regex: /\\/\\*\\s*ts-codemod-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'codemod-ignore',\n regex: /\\/\\*\\s*codemod-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'transform-ignore',\n regex: /\\/\\*\\s*transform-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n ] as const;\n\n for (const { regex } of patterns) {\n const match = regex.exec(code);\n\n if (match !== null) {\n const targetTransformers = match[1]?.trim() ?? '';\n\n // Empty means ignore all transformers\n if (targetTransformers === '') {\n return [];\n }\n\n // Parse comma-separated transformer names\n return targetTransformers.split(',').map((name) => name.trim());\n }\n }\n\n return [];\n};\n\nconst shouldSkipFile = (\n code: string,\n transformerName: string | undefined,\n): boolean => {\n const ignoredTransformers = extractFileIgnoreTransformers(code);\n\n // If no file-level ignore comment found, don't skip\n const patterns = [\n /\\/\\*\\s*transformer-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*ts-codemod-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*codemod-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*transform-ignore\\s*.*?\\s*\\*\\//u,\n ] as const;\n\n const hasFileIgnoreComment = patterns.some((regex) => regex.test(code));\n\n if (Arr.isEmpty(ignoredTransformers)
|
|
1
|
+
{"version":3,"file":"transform-source-code.mjs","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"sourcesContent":["import { Arr } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type TsMorphTransformer } from './types.mjs';\n\nconst extractFileIgnoreTransformers = (code: string): readonly string[] => {\n // Try to find any of the supported file-level ignore comment prefixes\n const patterns = [\n {\n prefix: 'transformer-ignore',\n regex: /\\/\\*\\s*transformer-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'ts-codemod-ignore',\n regex: /\\/\\*\\s*ts-codemod-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'codemod-ignore',\n regex: /\\/\\*\\s*codemod-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n {\n prefix: 'transform-ignore',\n regex: /\\/\\*\\s*transform-ignore\\s*(.*?)\\s*\\*\\//u,\n },\n ] as const;\n\n for (const { regex } of patterns) {\n const match = regex.exec(code);\n\n if (match !== null) {\n const targetTransformers = match[1]?.trim() ?? '';\n\n // Empty means ignore all transformers\n if (targetTransformers === '') {\n return [];\n }\n\n // Parse comma-separated transformer names\n return targetTransformers.split(',').map((name) => name.trim());\n }\n }\n\n return [];\n};\n\nconst shouldSkipFile = (\n code: string,\n transformerName: string | undefined,\n): boolean => {\n const ignoredTransformers = extractFileIgnoreTransformers(code);\n\n // If no file-level ignore comment found, don't skip\n const patterns = [\n /\\/\\*\\s*transformer-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*ts-codemod-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*codemod-ignore\\s*.*?\\s*\\*\\//u,\n /\\/\\*\\s*transform-ignore\\s*.*?\\s*\\*\\//u,\n ] as const;\n\n const hasFileIgnoreComment = patterns.some((regex) => regex.test(code));\n\n if (!hasFileIgnoreComment && Arr.isEmpty(ignoredTransformers)) {\n return false;\n }\n\n // Empty array means ignore all transformers (file-level ignore without specific transformers)\n if (Arr.isEmpty(ignoredTransformers)) {\n return true;\n }\n\n // If transformer name is not specified, don't skip\n if (transformerName === undefined) {\n return false;\n }\n\n // Check if the transformer is in the ignore list\n return ignoredTransformers.includes(transformerName);\n};\n\nexport const transformSourceCode = (\n code: string,\n isTsx: boolean,\n transformers: readonly TsMorphTransformer[],\n debug: boolean = false,\n): string => {\n const project = new tsm.Project({\n useInMemoryFileSystem: true,\n compilerOptions: {\n jsx: isTsx ? tsm.ts.JsxEmit.React : undefined,\n target: tsm.ts.ScriptTarget.ESNext,\n module: tsm.ts.ModuleKind.ESNext,\n },\n });\n\n const sourceAst = project.createSourceFile(\n `source.${isTsx ? 'tsx' : 'ts'}`,\n code,\n );\n\n for (const transformer of transformers) {\n const transformerName = transformer.name;\n\n if (shouldSkipFile(code, transformerName)) {\n if (debug) {\n console.debug(\n `skipped by ignore-file comment for transformer: ${transformerName}`,\n );\n }\n\n continue;\n }\n\n transformer.transform(sourceAst);\n }\n\n return sourceAst.getFullText();\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import * as tsm from 'ts-morph';
|
|
2
|
-
import { type DeepReadonly } from 'ts-type-forge';
|
|
2
|
+
import { type DeepReadonly, type StrictOmit } from 'ts-type-forge';
|
|
3
3
|
export declare const isShallowReadonlyTypeNode: (node: tsm.Node) => boolean;
|
|
4
4
|
export declare const isReadonlyTupleOrArrayTypeNode: (node: DeepReadonly<tsm.Node>) => node is ReadonlyArrayTypeNode | ReadonlyTupleTypeNode;
|
|
5
|
-
export type ReadonlyArrayTypeNode = tsm.TypeNode &
|
|
5
|
+
export type ReadonlyArrayTypeNode = tsm.TypeNode & StrictOmit<tsm.TypeOperatorTypeNode, 'getOperator' | 'getTypeNode'> & Readonly<{
|
|
6
6
|
getOperator: () => tsm.SyntaxKind.ReadonlyKeyword;
|
|
7
7
|
getTypeNode: () => tsm.ArrayTypeNode;
|
|
8
8
|
}>;
|
|
9
9
|
export declare const isReadonlyArrayTypeNode: (node: DeepReadonly<tsm.Node>) => node is ReadonlyArrayTypeNode;
|
|
10
|
-
export type ReadonlyTupleTypeNode = tsm.TypeNode &
|
|
10
|
+
export type ReadonlyTupleTypeNode = tsm.TypeNode & StrictOmit<tsm.TypeOperatorTypeNode, 'getOperator' | 'getTypeNode'> & Readonly<{
|
|
11
11
|
getOperator: () => tsm.SyntaxKind.ReadonlyKeyword;
|
|
12
12
|
getTypeNode: () => tsm.TupleTypeNode;
|
|
13
13
|
}>;
|
|
14
14
|
export declare const isReadonlyTupleTypeNode: (node: DeepReadonly<tsm.Node>) => node is ReadonlyTupleTypeNode;
|
|
15
|
-
export type ReadonlyTypeReferenceNode = tsm.TypeNode &
|
|
16
|
-
getTypeName: () =>
|
|
15
|
+
export type ReadonlyTypeReferenceNode = tsm.TypeNode & StrictOmit<tsm.TypeReferenceNode, 'getTypeName' | 'getTypeArguments'> & Readonly<{
|
|
16
|
+
getTypeName: () => StrictOmit<tsm.Identifier, 'getText'> & Readonly<{
|
|
17
17
|
getText: () => 'Readonly';
|
|
18
18
|
}>;
|
|
19
19
|
getTypeArguments: () => readonly [tsm.TypeNode];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-readonly-node.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/is-readonly-node.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"is-readonly-node.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/is-readonly-node.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAGnE,eAAO,MAAM,yBAAyB,SAAU,GAAG,CAAC,IAAI,KAAG,OAGnC,CAAC;AAEzB,eAAO,MAAM,8BAA8B,SACnC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,qBAAqB,GAAG,qBAIqB,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAC,QAAQ,GAC9C,UAAU,CAAC,GAAG,CAAC,oBAAoB,EAAE,aAAa,GAAG,aAAa,CAAC,GACnE,QAAQ,CAAC;IACP,WAAW,EAAE,MAAM,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;IAClD,WAAW,EAAE,MAAM,GAAG,CAAC,aAAa,CAAC;CACtC,CAAC,CAAC;AAEL,eAAO,MAAM,uBAAuB,SAC5B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,qBAG0C,CAAC;AA8DtD,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAC,QAAQ,GAC9C,UAAU,CAAC,GAAG,CAAC,oBAAoB,EAAE,aAAa,GAAG,aAAa,CAAC,GACnE,QAAQ,CAAC;IACP,WAAW,EAAE,MAAM,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;IAClD,WAAW,EAAE,MAAM,GAAG,CAAC,aAAa,CAAC;CACtC,CAAC,CAAC;AAEL,eAAO,MAAM,uBAAuB,SAC5B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,qBAG0C,CAAC;AAkDtD,MAAM,MAAM,yBAAyB,GAAG,GAAG,CAAC,QAAQ,GAClD,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,GAAG,kBAAkB,CAAC,GACrE,QAAQ,CAAC;IACP,WAAW,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,GACtD,QAAQ,CAAC;QACP,OAAO,EAAE,MAAM,UAAU,CAAC;KAC3B,CAAC,CAAC;IACL,gBAAgB,EAAE,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;CACjD,CAAC,CAAC;AAEL,eAAO,MAAM,2BAA2B,SAChC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAC3B,IAAI,IAAI,yBAcV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-readonly-node.mjs","sources":["../../../src/functions/functions/is-readonly-node.mts"],"sourcesContent":["import { Arr, expectType } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type DeepReadonly } from 'ts-type-forge';\nimport { isAtomicTypeNode } from './is-atomic-type-node.mjs';\n\nexport const isShallowReadonlyTypeNode = (node: tsm.Node): boolean =>\n isReadonlyTupleOrArrayTypeNode(node) ||\n isReadonlyTypeReferenceNode(node) ||\n isAtomicTypeNode(node);\n\nexport const isReadonlyTupleOrArrayTypeNode = (\n node: DeepReadonly<tsm.Node>,\n): node is ReadonlyArrayTypeNode | ReadonlyTupleTypeNode =>\n node.isKind(tsm.SyntaxKind.TypeOperator) &&\n node.getOperator() === tsm.SyntaxKind.ReadonlyKeyword &&\n (node.getTypeNode().isKind(tsm.SyntaxKind.ArrayType) || // Use optional chaining and isKind\n node.getTypeNode().isKind(tsm.SyntaxKind.TupleType));\n\nexport type ReadonlyArrayTypeNode = tsm.TypeNode &\n
|
|
1
|
+
{"version":3,"file":"is-readonly-node.mjs","sources":["../../../src/functions/functions/is-readonly-node.mts"],"sourcesContent":["import { Arr, expectType } from 'ts-data-forge';\nimport * as tsm from 'ts-morph';\nimport { type DeepReadonly, type StrictOmit } from 'ts-type-forge';\nimport { isAtomicTypeNode } from './is-atomic-type-node.mjs';\n\nexport const isShallowReadonlyTypeNode = (node: tsm.Node): boolean =>\n isReadonlyTupleOrArrayTypeNode(node) ||\n isReadonlyTypeReferenceNode(node) ||\n isAtomicTypeNode(node);\n\nexport const isReadonlyTupleOrArrayTypeNode = (\n node: DeepReadonly<tsm.Node>,\n): node is ReadonlyArrayTypeNode | ReadonlyTupleTypeNode =>\n node.isKind(tsm.SyntaxKind.TypeOperator) &&\n node.getOperator() === tsm.SyntaxKind.ReadonlyKeyword &&\n (node.getTypeNode().isKind(tsm.SyntaxKind.ArrayType) || // Use optional chaining and isKind\n node.getTypeNode().isKind(tsm.SyntaxKind.TupleType));\n\nexport type ReadonlyArrayTypeNode = tsm.TypeNode &\n StrictOmit<tsm.TypeOperatorTypeNode, 'getOperator' | 'getTypeNode'> &\n Readonly<{\n getOperator: () => tsm.SyntaxKind.ReadonlyKeyword;\n getTypeNode: () => tsm.ArrayTypeNode;\n }>;\n\nexport const isReadonlyArrayTypeNode = (\n node: DeepReadonly<tsm.Node>,\n): node is ReadonlyArrayTypeNode =>\n node.isKind(tsm.SyntaxKind.TypeOperator) &&\n node.getOperator() === tsm.SyntaxKind.ReadonlyKeyword &&\n node.getTypeNode().isKind(tsm.SyntaxKind.ArrayType);\n\n// Helper to get a specific type node from source code\nconst getTypeNodeFromSource = (\n sourceCode: string,\n typeName: string,\n): tsm.Node => {\n const project = new tsm.Project({ useInMemoryFileSystem: true });\n\n const sourceFile = project.createSourceFile('test.ts', sourceCode);\n\n const typeAlias = sourceFile.getTypeAliasOrThrow(typeName);\n\n return typeAlias.getTypeNodeOrThrow();\n};\n\nif (import.meta.vitest !== undefined) {\n describe('isReadonlyArrayTypeNode', () => {\n test('should return true for readonly array type', () => {\n const node = getTypeNodeFromSource(\n 'type Test = readonly number[];',\n 'Test',\n );\n\n if (isReadonlyArrayTypeNode(node)) {\n const _operator = node.getOperator();\n\n expectType<typeof _operator, tsm.SyntaxKind.ReadonlyKeyword>('=');\n\n const _typeNode = node.getTypeNode();\n\n expectType<typeof _typeNode, tsm.ArrayTypeNode>('=');\n }\n\n assert.isTrue(node.isKind(tsm.SyntaxKind.TypeOperator));\n\n if (!isReadonlyArrayTypeNode(node)) {\n throw new Error('node should be ReadonlyArrayTypeNode');\n }\n\n expect(node.getOperator()).toBe(tsm.SyntaxKind.ReadonlyKeyword);\n\n assert.isTrue(node.getTypeNode().isKind(tsm.SyntaxKind.ArrayType));\n });\n\n test('should return false for non-readonly array', () => {\n const node = getTypeNodeFromSource('type Test = string[];', 'Test');\n\n assert.isFalse(isReadonlyArrayTypeNode(node));\n });\n\n test('should return false for readonly tuple', () => {\n const node = getTypeNodeFromSource(\n 'type Test = readonly [string];',\n 'Test',\n );\n\n assert.isFalse(isReadonlyArrayTypeNode(node));\n });\n });\n}\n\nexport type ReadonlyTupleTypeNode = tsm.TypeNode &\n StrictOmit<tsm.TypeOperatorTypeNode, 'getOperator' | 'getTypeNode'> &\n Readonly<{\n getOperator: () => tsm.SyntaxKind.ReadonlyKeyword;\n getTypeNode: () => tsm.TupleTypeNode;\n }>;\n\nexport const isReadonlyTupleTypeNode = (\n node: DeepReadonly<tsm.Node>,\n): node is ReadonlyTupleTypeNode =>\n node.isKind(tsm.SyntaxKind.TypeOperator) &&\n node.getOperator() === tsm.SyntaxKind.ReadonlyKeyword &&\n node.getTypeNode().isKind(tsm.SyntaxKind.TupleType);\n\nif (import.meta.vitest !== undefined) {\n describe('isReadonlyTupleTypeNode', () => {\n test('should return true for readonly tuple type', () => {\n const node = getTypeNodeFromSource(\n 'type Test = readonly [number, string];',\n 'Test',\n );\n\n assert.isTrue(isReadonlyTupleTypeNode(node));\n\n if (isReadonlyTupleTypeNode(node)) {\n const _operator = node.getOperator();\n\n expectType<typeof _operator, tsm.SyntaxKind.ReadonlyKeyword>('=');\n\n const _typeNode = node.getTypeNode();\n\n expectType<typeof _typeNode, tsm.TupleTypeNode>('=');\n }\n\n assert.isTrue(node.isKind(tsm.SyntaxKind.TypeOperator));\n\n if (!isReadonlyTupleTypeNode(node)) {\n throw new Error('node should be ReadonlyTupleTypeNode');\n }\n\n expect(node.getOperator()).toBe(tsm.SyntaxKind.ReadonlyKeyword);\n\n assert.isTrue(node.getTypeNode().isKind(tsm.SyntaxKind.TupleType));\n });\n\n test('should return false for non-readonly tuple', () => {\n const node = getTypeNodeFromSource('type Test = [boolean];', 'Test');\n\n assert.isFalse(isReadonlyTupleTypeNode(node));\n });\n\n test('should return false for readonly array', () => {\n const node = getTypeNodeFromSource(\n 'type Test = readonly number[];',\n 'Test',\n );\n\n assert.isFalse(isReadonlyTupleTypeNode(node));\n });\n });\n}\n\nexport type ReadonlyTypeReferenceNode = tsm.TypeNode &\n StrictOmit<tsm.TypeReferenceNode, 'getTypeName' | 'getTypeArguments'> &\n Readonly<{\n getTypeName: () => StrictOmit<tsm.Identifier, 'getText'> &\n Readonly<{\n getText: () => 'Readonly';\n }>;\n getTypeArguments: () => readonly [tsm.TypeNode];\n }>;\n\nexport const isReadonlyTypeReferenceNode = (\n node: DeepReadonly<tsm.Node>,\n): node is ReadonlyTypeReferenceNode => {\n if (!node.isKind(tsm.SyntaxKind.TypeReference)) {\n return false;\n }\n\n const typeName = node.getTypeName();\n\n const typeArguments = node.getTypeArguments();\n\n return (\n typeName.isKind(tsm.SyntaxKind.Identifier) &&\n typeName.getText() === 'Readonly' &&\n Arr.isFixedLengthArray(1, typeArguments)\n );\n};\n\nif (import.meta.vitest !== undefined) {\n describe('isReadonlyTypeReferenceNode', () => {\n test('should return true for Readonly<T>', () => {\n const node = getTypeNodeFromSource(\n 'type Test = Readonly<{ x: number }>;',\n 'Test',\n );\n\n assert.isTrue(isReadonlyTypeReferenceNode(node));\n\n if (isReadonlyTypeReferenceNode(node)) {\n const _typeNameText = node.getTypeName().getText();\n\n expectType<typeof _typeNameText, 'Readonly'>('=');\n\n const _typeArguments = node.getTypeArguments();\n\n expectType<\n typeof _typeArguments,\n readonly [tsm.TypeNode<tsm.ts.TypeNode>]\n >('=');\n }\n\n assert.isTrue(node.isKind(tsm.SyntaxKind.TypeReference));\n\n if (!isReadonlyTypeReferenceNode(node)) {\n throw new Error('node should be ReadonlyNode');\n }\n\n expect(node.getTypeName().getText()).toBe('Readonly');\n\n expect(node.getTypeArguments()).toHaveLength(1);\n });\n\n test('should return false for other type references', () => {\n const node = getTypeNodeFromSource(\n 'type Test = Partial<{ y: string }>;',\n 'Test',\n );\n\n assert.isFalse(isReadonlyTypeReferenceNode(node));\n });\n\n test('should return false for Readonly without type arguments', () => {\n // Note: This is syntactically incorrect TS, but testing the guard\n const node = getTypeNodeFromSource('type Test = Readonly;', 'Test');\n\n assert.isFalse(isReadonlyTypeReferenceNode(node));\n });\n\n test('should return false for Readonly with multiple type arguments', () => {\n // Note: This is syntactically incorrect TS, but testing the guard\n const project = new tsm.Project({ useInMemoryFileSystem: true });\n\n // Need to create manually as TS parser might reject Readonly<A, B>\n const sourceFile = project.createSourceFile(\n 'test.ts',\n 'type Test = Readonly<string, number>;',\n );\n\n const node = sourceFile.getTypeAliasOrThrow('Test').getTypeNodeOrThrow();\n\n assert.isFalse(isReadonlyTypeReferenceNode(node));\n });\n });\n}\n"],"names":[],"mappings":";;;;MAKa,yBAAA,GAA4B,CAAC,IAAA,KACxC,8BAAA,CAA+B,IAAI,KACnC,2BAAA,CAA4B,IAAI,CAAA,IAChC,gBAAA,CAAiB,IAAI;MAEV,8BAAA,GAAiC,CAC5C,IAAA,KAEA,IAAA,CAAK,OAAO,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,IACvC,IAAA,CAAK,aAAY,KAAM,GAAA,CAAI,WAAW,eAAA,KACrC,IAAA,CAAK,aAAY,CAAE,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA;AACjD,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA,CAAO,GAAA,CAAI,WAAW,SAAS,CAAA;MASzC,uBAAA,GAA0B,CACrC,IAAA,KAEA,IAAA,CAAK,OAAO,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,IACvC,IAAA,CAAK,aAAY,KAAM,GAAA,CAAI,WAAW,eAAA,IACtC,IAAA,CAAK,aAAY,CAAE,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,SAAS;MAqEvC,uBAAA,GAA0B,CACrC,IAAA,KAEA,IAAA,CAAK,OAAO,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,IACvC,IAAA,CAAK,aAAY,KAAM,GAAA,CAAI,WAAW,eAAA,IACtC,IAAA,CAAK,aAAY,CAAE,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,SAAS;AA4D7C,MAAM,2BAAA,GAA8B,CACzC,IAAA,KACsC;AACtC,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,EAAG;AAC9C,IAAA,OAAO,KAAA;AAAA,EAAA;AAGT,EAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAElC,EAAA,MAAM,aAAA,GAAgB,KAAK,gBAAA,EAAiB;AAE5C,EAAA,OACE,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,IACzC,QAAA,CAAS,OAAA,EAAQ,KAAM,UAAA,IACvB,GAAA,CAAI,kBAAA,CAAmB,GAAG,aAAa,CAAA;AAE3C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"should-avoid-parentheses-for-readonly.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/should-avoid-parentheses-for-readonly.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iCAAiC,SAAU,GAAG,CAAC,IAAI,KAAG,
|
|
1
|
+
{"version":3,"file":"should-avoid-parentheses-for-readonly.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/should-avoid-parentheses-for-readonly.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iCAAiC,SAAU,GAAG,CAAC,IAAI,KAAG,OAYlE,CAAC"}
|
|
@@ -5,10 +5,7 @@ const shouldAvoidParenthesesForReadonly = (node) => {
|
|
|
5
5
|
if (parent === void 0) {
|
|
6
6
|
return false;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
return false;
|
|
8
|
+
return parent.isKind(tsm.SyntaxKind.TypePredicate);
|
|
12
9
|
};
|
|
13
10
|
|
|
14
11
|
export { shouldAvoidParenthesesForReadonly };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"should-avoid-parentheses-for-readonly.mjs","sources":["../../../src/functions/functions/should-avoid-parentheses-for-readonly.mts"],"sourcesContent":["import * as tsm from 'ts-morph';\n\n/**\n * Determines if parentheses should be avoided when adding 'readonly' prefix to a type.\n *\n * Parentheses should be AVOIDED in these specific contexts:\n * - Type predicates: `x is [T, U]` -> `x is readonly [T, U]` (not `x is (readonly [T, U])`)\n * because parentheses around the type in a type predicate cause syntax errors\n *\n * For all other contexts, we keep parentheses for safety to avoid precedence issues,\n * relying on prettier to remove unnecessary ones.\n *\n * @param node - The type node to check\n * @returns true if parentheses should be avoided, false otherwise (keep parentheses)\n */\nexport const shouldAvoidParenthesesForReadonly = (node: tsm.Node): boolean => {\n const parent = node.getParent();\n\n if (parent === undefined) {\n return false;\n }\n\n // Check if parent is TypePredicate: x is T\n // In this case, we MUST avoid parentheses: x is readonly T (not x is (readonly T))\n // because `x is (readonly T)` is a syntax error\n
|
|
1
|
+
{"version":3,"file":"should-avoid-parentheses-for-readonly.mjs","sources":["../../../src/functions/functions/should-avoid-parentheses-for-readonly.mts"],"sourcesContent":["import * as tsm from 'ts-morph';\n\n/**\n * Determines if parentheses should be avoided when adding 'readonly' prefix to a type.\n *\n * Parentheses should be AVOIDED in these specific contexts:\n * - Type predicates: `x is [T, U]` -> `x is readonly [T, U]` (not `x is (readonly [T, U])`)\n * because parentheses around the type in a type predicate cause syntax errors\n *\n * For all other contexts, we keep parentheses for safety to avoid precedence issues,\n * relying on prettier to remove unnecessary ones.\n *\n * @param node - The type node to check\n * @returns true if parentheses should be avoided, false otherwise (keep parentheses)\n */\nexport const shouldAvoidParenthesesForReadonly = (node: tsm.Node): boolean => {\n const parent = node.getParent();\n\n if (parent === undefined) {\n return false;\n }\n\n // Check if parent is TypePredicate: x is T\n // In this case, we MUST avoid parentheses: x is readonly T (not x is (readonly T))\n // because `x is (readonly T)` is a syntax error\n // For all other cases, keep parentheses for safety\n return parent.isKind(tsm.SyntaxKind.TypePredicate);\n};\n"],"names":[],"mappings":";;AAeO,MAAM,iCAAA,GAAoC,CAAC,IAAA,KAA4B;AAC5E,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAE9B,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAMA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA;AACnD;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-codemod-lib",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -105,9 +105,9 @@
|
|
|
105
105
|
"z:vitest:node": "pnpm run z:vitest --project='Node.js'"
|
|
106
106
|
},
|
|
107
107
|
"dependencies": {
|
|
108
|
-
"ts-data-forge": "^14.
|
|
108
|
+
"ts-data-forge": "^14.1.0",
|
|
109
109
|
"ts-morph": "^28.0.0",
|
|
110
|
-
"ts-type-forge": "^9.1.
|
|
110
|
+
"ts-type-forge": "^9.1.3"
|
|
111
111
|
},
|
|
112
112
|
"devDependencies": {
|
|
113
113
|
"@rollup/plugin-replace": "6.0.3",
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
"@semantic-release/github": "12.0.9",
|
|
120
120
|
"@semantic-release/npm": "13.1.5",
|
|
121
121
|
"@semantic-release/release-notes-generator": "14.1.1",
|
|
122
|
-
"@types/node": "26.
|
|
122
|
+
"@types/node": "26.2.0",
|
|
123
123
|
"@vitest/browser-playwright": "4.1.10",
|
|
124
124
|
"@vitest/coverage-v8": "4.1.10",
|
|
125
125
|
"@vitest/ui": "4.1.10",
|
|
@@ -129,29 +129,29 @@
|
|
|
129
129
|
"dedent": "1.7.2",
|
|
130
130
|
"esbuild": "0.28.1",
|
|
131
131
|
"eslint": "10.8.0",
|
|
132
|
-
"eslint-config-typed": "5.8.
|
|
133
|
-
"eslint-plugin-ts-data-forge": "0.
|
|
134
|
-
"eslint-plugin-ts-fortress": "0.
|
|
135
|
-
"eslint-plugin-ts-type-forge": "0.
|
|
136
|
-
"github-settings-as-code": "2.0
|
|
132
|
+
"eslint-config-typed": "5.8.4",
|
|
133
|
+
"eslint-plugin-ts-data-forge": "0.4.2",
|
|
134
|
+
"eslint-plugin-ts-fortress": "1.0.0",
|
|
135
|
+
"eslint-plugin-ts-type-forge": "0.6.1",
|
|
136
|
+
"github-settings-as-code": "2.1.0",
|
|
137
137
|
"jiti": "2.7.0",
|
|
138
138
|
"markdownlint": "0.41.1",
|
|
139
139
|
"markdownlint-cli2": "0.23.2",
|
|
140
|
-
"npm-run-all2": "9.0.
|
|
141
|
-
"playwright": "1.62.
|
|
140
|
+
"npm-run-all2": "9.0.3",
|
|
141
|
+
"playwright": "1.62.1",
|
|
142
142
|
"prettier": "3.9.6",
|
|
143
143
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
144
144
|
"prettier-plugin-packagejson": "3.0.2",
|
|
145
|
-
"rollup": "4.62.
|
|
145
|
+
"rollup": "4.62.4",
|
|
146
146
|
"rollup-plugin-esbuild": "6.2.1",
|
|
147
147
|
"semantic-release": "25.0.8",
|
|
148
|
-
"ts-repo-utils": "10.1.
|
|
149
|
-
"tsx": "4.23.
|
|
148
|
+
"ts-repo-utils": "10.1.7",
|
|
149
|
+
"tsx": "4.23.4",
|
|
150
150
|
"typedoc": "0.28.20",
|
|
151
151
|
"typedoc-github-theme": "0.4.0",
|
|
152
152
|
"typescript": "6.0.3",
|
|
153
153
|
"typescript-native": "npm:typescript@7.0.2",
|
|
154
|
-
"vite": "8.
|
|
154
|
+
"vite": "8.2.0",
|
|
155
155
|
"vitest": "4.1.10"
|
|
156
156
|
},
|
|
157
157
|
"peerDependencies": {
|
|
@@ -8,7 +8,12 @@ import {
|
|
|
8
8
|
pipe,
|
|
9
9
|
} from 'ts-data-forge';
|
|
10
10
|
import * as tsm from 'ts-morph';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
type DeepReadonly,
|
|
13
|
+
type SafeUintWithSmallInt,
|
|
14
|
+
type StrictExclude,
|
|
15
|
+
type StrictExtract,
|
|
16
|
+
} from 'ts-type-forge';
|
|
12
17
|
import {
|
|
13
18
|
hasDisableNextLineComment,
|
|
14
19
|
isAtomicTypeNode,
|
|
@@ -397,7 +402,7 @@ const transformNode = (
|
|
|
397
402
|
const transformTypeReferenceNode = (
|
|
398
403
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
399
404
|
node: tsm.TypeReferenceNode,
|
|
400
|
-
readonlyContext:
|
|
405
|
+
readonlyContext: StrictExclude<
|
|
401
406
|
ReadonlyContext,
|
|
402
407
|
Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>
|
|
403
408
|
>,
|
|
@@ -813,7 +818,7 @@ const transformRestTypeNode = (
|
|
|
813
818
|
const transformTypeOperatorNode = (
|
|
814
819
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
815
820
|
node: tsm.TypeOperatorTypeNode,
|
|
816
|
-
readonlyContext:
|
|
821
|
+
readonlyContext: StrictExclude<
|
|
817
822
|
ReadonlyContext,
|
|
818
823
|
Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>
|
|
819
824
|
>,
|
|
@@ -852,7 +857,7 @@ const transformTypeOperatorNode = (
|
|
|
852
857
|
const transformTypeLiteralNode = (
|
|
853
858
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
854
859
|
node: tsm.TypeLiteralNode,
|
|
855
|
-
readonlyContext:
|
|
860
|
+
readonlyContext: StrictExclude<
|
|
856
861
|
ReadonlyContext,
|
|
857
862
|
Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>
|
|
858
863
|
>,
|
|
@@ -927,7 +932,7 @@ const transformIndexedAccessTypeNode = (
|
|
|
927
932
|
const transformMappedTypeNode = (
|
|
928
933
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
929
934
|
node: tsm.MappedTypeNode,
|
|
930
|
-
readonlyContext:
|
|
935
|
+
readonlyContext: StrictExclude<
|
|
931
936
|
ReadonlyContext,
|
|
932
937
|
Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>
|
|
933
938
|
>,
|
|
@@ -1109,7 +1114,7 @@ const transformConstructorParameter = (
|
|
|
1109
1114
|
const transformIntersectionTypeNode = (
|
|
1110
1115
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
1111
1116
|
node: tsm.IntersectionTypeNode,
|
|
1112
|
-
readonlyContext:
|
|
1117
|
+
readonlyContext: StrictExclude<
|
|
1113
1118
|
ReadonlyContext,
|
|
1114
1119
|
Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>
|
|
1115
1120
|
>,
|
|
@@ -1125,7 +1130,7 @@ const transformIntersectionTypeNode = (
|
|
|
1125
1130
|
const transformUnionTypeNode = (
|
|
1126
1131
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
1127
1132
|
node: tsm.UnionTypeNode,
|
|
1128
|
-
readonlyContext:
|
|
1133
|
+
readonlyContext: StrictExclude<
|
|
1129
1134
|
ReadonlyContext,
|
|
1130
1135
|
Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>
|
|
1131
1136
|
>,
|
|
@@ -1137,7 +1142,7 @@ const transformUnionTypeNode = (
|
|
|
1137
1142
|
const transformUnionOrIntersectionTypeNodeImpl = (
|
|
1138
1143
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
1139
1144
|
node: tsm.IntersectionTypeNode | tsm.UnionTypeNode,
|
|
1140
|
-
readonlyContext:
|
|
1145
|
+
readonlyContext: StrictExclude<
|
|
1141
1146
|
ReadonlyContext,
|
|
1142
1147
|
Readonly<{ type: 'readonly'; indexedAccessDepth: SafeUintWithSmallInt }>
|
|
1143
1148
|
>,
|
|
@@ -1346,7 +1351,7 @@ const transformMembers = (
|
|
|
1346
1351
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
1347
1352
|
members: readonly tsm.TypeElementTypes[],
|
|
1348
1353
|
readonlyModifier: 'add' | 'remove',
|
|
1349
|
-
readonlyContext:
|
|
1354
|
+
readonlyContext: StrictExtract<
|
|
1350
1355
|
ReadonlyContext,
|
|
1351
1356
|
Readonly<{
|
|
1352
1357
|
type: 'DeepReadonly' | 'none';
|
|
@@ -1387,8 +1392,6 @@ const transformMembers = (
|
|
|
1387
1392
|
}
|
|
1388
1393
|
|
|
1389
1394
|
transformNode(mb, readonlyContext, options);
|
|
1390
|
-
|
|
1391
|
-
continue;
|
|
1392
1395
|
}
|
|
1393
1396
|
};
|
|
1394
1397
|
|
|
@@ -1396,7 +1399,7 @@ const transformPropertySignature = (
|
|
|
1396
1399
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
1397
1400
|
node: tsm.PropertySignature,
|
|
1398
1401
|
readonlyModifier: 'add' | 'remove',
|
|
1399
|
-
readonlyContext:
|
|
1402
|
+
readonlyContext: StrictExtract<
|
|
1400
1403
|
ReadonlyContext,
|
|
1401
1404
|
Readonly<{
|
|
1402
1405
|
type: 'DeepReadonly' | 'none';
|
|
@@ -1406,8 +1409,8 @@ const transformPropertySignature = (
|
|
|
1406
1409
|
options: ReadonlyTransformerOptionsInternal,
|
|
1407
1410
|
): void => {
|
|
1408
1411
|
if (
|
|
1409
|
-
|
|
1410
|
-
|
|
1412
|
+
readonlyModifier === 'remove' ||
|
|
1413
|
+
readonlyContext.type === 'DeepReadonly'
|
|
1411
1414
|
) {
|
|
1412
1415
|
node.setIsReadonly(false);
|
|
1413
1416
|
} else {
|
|
@@ -1427,7 +1430,7 @@ const transformIndexSignatureDeclaration = (
|
|
|
1427
1430
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
1428
1431
|
node: tsm.IndexSignatureDeclaration,
|
|
1429
1432
|
readonlyModifier: 'add' | 'remove',
|
|
1430
|
-
readonlyContext:
|
|
1433
|
+
readonlyContext: StrictExtract<
|
|
1431
1434
|
ReadonlyContext,
|
|
1432
1435
|
Readonly<{
|
|
1433
1436
|
type: 'DeepReadonly' | 'none';
|
|
@@ -1443,8 +1446,8 @@ const transformIndexSignatureDeclaration = (
|
|
|
1443
1446
|
}
|
|
1444
1447
|
|
|
1445
1448
|
if (
|
|
1446
|
-
|
|
1447
|
-
|
|
1449
|
+
readonlyModifier === 'remove' ||
|
|
1450
|
+
readonlyContext.type === 'DeepReadonly'
|
|
1448
1451
|
) {
|
|
1449
1452
|
// node.setIsReadonly(false);
|
|
1450
1453
|
node.toggleModifier('readonly', false);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SafeUint, match } from 'ts-data-forge';
|
|
2
|
-
import { type SafeUintWithSmallInt } from 'ts-type-forge';
|
|
2
|
+
import { type SafeUintWithSmallInt, type StrictExtract } from 'ts-type-forge';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Controls whether to make a layer mutable during recursive transformation
|
|
@@ -37,7 +37,7 @@ export const nextReadonlyContext = <
|
|
|
37
37
|
indexedAccessDepthChange: 'decr' | 'incr' | 'keep' | 'infinity';
|
|
38
38
|
}
|
|
39
39
|
| {
|
|
40
|
-
nextReadonlyContextType:
|
|
40
|
+
nextReadonlyContextType: StrictExtract<
|
|
41
41
|
ReadonlyContext['type'],
|
|
42
42
|
'DeepReadonly'
|
|
43
43
|
>;
|
|
@@ -47,7 +47,7 @@ export const nextReadonlyContext = <
|
|
|
47
47
|
currentReadonlyContext: Curr;
|
|
48
48
|
}
|
|
49
49
|
>): Readonly<{
|
|
50
|
-
type:
|
|
50
|
+
type: Next | StrictExtract<ReadonlyContext['type'], 'DeepReadonly'>;
|
|
51
51
|
indexedAccessDepth: SafeUintWithSmallInt;
|
|
52
52
|
}> =>
|
|
53
53
|
curr.type === 'DeepReadonly'
|
|
@@ -58,7 +58,7 @@ const shouldSkipFile = (
|
|
|
58
58
|
|
|
59
59
|
const hasFileIgnoreComment = patterns.some((regex) => regex.test(code));
|
|
60
60
|
|
|
61
|
-
if (Arr.isEmpty(ignoredTransformers)
|
|
61
|
+
if (!hasFileIgnoreComment && Arr.isEmpty(ignoredTransformers)) {
|
|
62
62
|
return false;
|
|
63
63
|
}
|
|
64
64
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Arr, expectType } from 'ts-data-forge';
|
|
2
2
|
import * as tsm from 'ts-morph';
|
|
3
|
-
import { type DeepReadonly } from 'ts-type-forge';
|
|
3
|
+
import { type DeepReadonly, type StrictOmit } from 'ts-type-forge';
|
|
4
4
|
import { isAtomicTypeNode } from './is-atomic-type-node.mjs';
|
|
5
5
|
|
|
6
6
|
export const isShallowReadonlyTypeNode = (node: tsm.Node): boolean =>
|
|
@@ -17,7 +17,7 @@ export const isReadonlyTupleOrArrayTypeNode = (
|
|
|
17
17
|
node.getTypeNode().isKind(tsm.SyntaxKind.TupleType));
|
|
18
18
|
|
|
19
19
|
export type ReadonlyArrayTypeNode = tsm.TypeNode &
|
|
20
|
-
|
|
20
|
+
StrictOmit<tsm.TypeOperatorTypeNode, 'getOperator' | 'getTypeNode'> &
|
|
21
21
|
Readonly<{
|
|
22
22
|
getOperator: () => tsm.SyntaxKind.ReadonlyKeyword;
|
|
23
23
|
getTypeNode: () => tsm.ArrayTypeNode;
|
|
@@ -91,7 +91,7 @@ if (import.meta.vitest !== undefined) {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
export type ReadonlyTupleTypeNode = tsm.TypeNode &
|
|
94
|
-
|
|
94
|
+
StrictOmit<tsm.TypeOperatorTypeNode, 'getOperator' | 'getTypeNode'> &
|
|
95
95
|
Readonly<{
|
|
96
96
|
getOperator: () => tsm.SyntaxKind.ReadonlyKeyword;
|
|
97
97
|
getTypeNode: () => tsm.TupleTypeNode;
|
|
@@ -153,9 +153,9 @@ if (import.meta.vitest !== undefined) {
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
export type ReadonlyTypeReferenceNode = tsm.TypeNode &
|
|
156
|
-
|
|
156
|
+
StrictOmit<tsm.TypeReferenceNode, 'getTypeName' | 'getTypeArguments'> &
|
|
157
157
|
Readonly<{
|
|
158
|
-
getTypeName: () =>
|
|
158
|
+
getTypeName: () => StrictOmit<tsm.Identifier, 'getText'> &
|
|
159
159
|
Readonly<{
|
|
160
160
|
getText: () => 'Readonly';
|
|
161
161
|
}>;
|
|
@@ -23,10 +23,6 @@ export const shouldAvoidParenthesesForReadonly = (node: tsm.Node): boolean => {
|
|
|
23
23
|
// Check if parent is TypePredicate: x is T
|
|
24
24
|
// In this case, we MUST avoid parentheses: x is readonly T (not x is (readonly T))
|
|
25
25
|
// because `x is (readonly T)` is a syntax error
|
|
26
|
-
if (parent.isKind(tsm.SyntaxKind.TypePredicate)) {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
26
|
// For all other cases, keep parentheses for safety
|
|
31
|
-
return
|
|
27
|
+
return parent.isKind(tsm.SyntaxKind.TypePredicate);
|
|
32
28
|
};
|