ts-codemod-lib 2.2.5 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +15 -54
  2. package/dist/functions/ast-transformers/convert-to-readonly.mjs +4 -1
  3. package/dist/functions/ast-transformers/convert-to-readonly.mjs.map +1 -1
  4. package/package.json +66 -115
  5. package/src/functions/ast-transformers/convert-to-readonly.mts +7 -1
  6. package/src/functions/ast-transformers/convert-to-readonly.test.mts +44 -0
  7. package/dist/cmd/append-as-const.d.mts +0 -3
  8. package/dist/cmd/append-as-const.d.mts.map +0 -1
  9. package/dist/cmd/append-as-const.mjs +0 -63
  10. package/dist/cmd/append-as-const.mjs.map +0 -1
  11. package/dist/cmd/convert-interface-to-type.d.mts +0 -3
  12. package/dist/cmd/convert-interface-to-type.d.mts.map +0 -1
  13. package/dist/cmd/convert-interface-to-type.mjs +0 -63
  14. package/dist/cmd/convert-interface-to-type.mjs.map +0 -1
  15. package/dist/cmd/convert-to-readonly.d.mts +0 -3
  16. package/dist/cmd/convert-to-readonly.d.mts.map +0 -1
  17. package/dist/cmd/convert-to-readonly.mjs +0 -63
  18. package/dist/cmd/convert-to-readonly.mjs.map +0 -1
  19. package/dist/cmd/replace-any-with-unknown.d.mts +0 -3
  20. package/dist/cmd/replace-any-with-unknown.d.mts.map +0 -1
  21. package/dist/cmd/replace-any-with-unknown.mjs +0 -63
  22. package/dist/cmd/replace-any-with-unknown.mjs.map +0 -1
  23. package/dist/cmd/replace-record-with-unknown-record.d.mts +0 -3
  24. package/dist/cmd/replace-record-with-unknown-record.d.mts.map +0 -1
  25. package/dist/cmd/replace-record-with-unknown-record.mjs +0 -63
  26. package/dist/cmd/replace-record-with-unknown-record.mjs.map +0 -1
  27. package/dist/cmd/run-transformer-cli.d.mts +0 -13
  28. package/dist/cmd/run-transformer-cli.d.mts.map +0 -1
  29. package/dist/cmd/run-transformer-cli.mjs +0 -176
  30. package/dist/cmd/run-transformer-cli.mjs.map +0 -1
  31. package/src/cmd/append-as-const.mts +0 -67
  32. package/src/cmd/convert-interface-to-type.mts +0 -67
  33. package/src/cmd/convert-to-readonly.mts +0 -67
  34. package/src/cmd/replace-any-with-unknown.mts +0 -67
  35. package/src/cmd/replace-record-with-unknown-record.mts +0 -67
  36. package/src/cmd/run-transformer-cli.mts +0 -307
package/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/ts-codemod-lib.svg)](https://www.npmjs.com/package/ts-codemod-lib)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/ts-codemod-lib.svg)](https://www.npmjs.com/package/ts-codemod-lib)
5
- [![License](https://img.shields.io/npm/l/ts-codemod-lib.svg)](./LICENSE)
6
- [![codecov](https://codecov.io/gh/noshiro-pf/ts-codemod-lib/graph/badge.svg?token=BVx5UgsiVr)](https://codecov.io/gh/noshiro-pf/ts-codemod-lib)
5
+ [![License](https://img.shields.io/npm/l/ts-codemod-lib.svg)](https://github.com/noshiro-pf/mono/blob/main/libs/ts-codemod-lib/LICENSE)
6
+ [![codecov](https://codecov.io/gh/noshiro-pf/mono/graph/badge.svg?component=ts-codemod-lib)](https://codecov.io/gh/noshiro-pf/mono)
7
7
 
8
8
  A TypeScript library for code transformations using AST (Abstract Syntax Tree) transformers, powered by the [ts-morph](https://github.com/dsherret/ts-morph).
9
9
 
@@ -15,7 +15,6 @@ A TypeScript library for code transformations using AST (Abstract Syntax Tree) t
15
15
 
16
16
  - **AST-based Transformations**: Leverage TypeScript Compiler API for reliable type-aware code transformations
17
17
  - **Ready-to-use Transformers**: Append `as const`, convert to readonly types, replace `any` with `unknown`, and more
18
- - **Ready-to-use CLI Tools**: Convert interfaces to types, add readonly modifiers, and more
19
18
  - **Extensible API**: Build custom transformers using the provided utilities
20
19
  - **Type-safe**: Written in TypeScript with strict type checking
21
20
  - **Selective Transformation**: Support for ignoring specific lines or entire files via comments
@@ -33,10 +32,10 @@ pnpm add ts-codemod-lib
33
32
  yarn add ts-codemod-lib
34
33
  ```
35
34
 
36
- For CLI usage:
35
+ The command line tools live in a separate package:
37
36
 
38
37
  ```bash
39
- npm add -D ts-codemod-lib cmd-ts dedent ts-repo-utils
38
+ npm add -D ts-codemod-cli
40
39
  ```
41
40
 
42
41
  ## Available Transformers
@@ -99,7 +98,7 @@ type User2 = Readonly<{
99
98
  }>;
100
99
  ```
101
100
 
102
- For more detailed transformation examples, see the [test file](./src/functions/ast-transformers/convert-to-readonly-type.test.mts) which covers various scenarios including complex types, nested structures, and DeepReadonly transformations.
101
+ For more detailed transformation examples, see the [test file](https://github.com/noshiro-pf/mono/blob/main/libs/ts-codemod-lib/src/functions/ast-transformers/convert-to-readonly.test.mts) which covers various scenarios including complex types, nested structures, and DeepReadonly transformations.
103
102
 
104
103
  ### 3. `convertInterfaceToTypeTransformer`
105
104
 
@@ -141,7 +140,7 @@ const sortValues2 = (...args: readonly unknown[]): unknown =>
141
140
  (args as any).toSorted((a: any, b: any) => a - b);
142
141
  ```
143
142
 
144
- For more detailed transformation examples, see the [test file](./src/functions/ast-transformers/replace-any-with-unknown.test.mts) which covers various scenarios including function parameters, return types, and variable declarations.
143
+ For more detailed transformation examples, see the [test file](https://github.com/noshiro-pf/mono/blob/main/libs/ts-codemod-lib/src/functions/ast-transformers/replace-any-with-unknown.test.mts) which covers various scenarios including function parameters, return types, and variable declarations.
145
144
 
146
145
  ### 5. `replaceRecordWithUnknownRecordTransformer`
147
146
 
@@ -209,57 +208,19 @@ type Data2 = { value: any };
209
208
  const items2 = [1, 2, 3];
210
209
  ```
211
210
 
212
- ## CLI Tools
211
+ ## Command Line Tools
213
212
 
214
- This package provides command-line tools for common TypeScript transformations:
215
-
216
- ### append-as-const
217
-
218
- Appends `as const` to array literals and object literals to make them readonly constants.
219
-
220
- ```bash
221
- npx append-as-const <baseDir> [--exclude <pattern>] [--uncommitted] [--diff-from <base>] [--silent]
222
- ```
223
-
224
- ### convert-interface-to-type
225
-
226
- Converts TypeScript interface declarations to type aliases.
227
-
228
- ```bash
229
- npx convert-interface-to-type <baseDir> [--exclude <pattern>] [--uncommitted] [--diff-from <base>] [--silent]
230
- ```
231
-
232
- ### convert-to-readonly
233
-
234
- Adds `readonly` modifiers to type definitions throughout your codebase.
213
+ The transformers are also available as commands, published separately as
214
+ [`ts-codemod-cli`](https://www.npmjs.com/package/ts-codemod-cli):
235
215
 
236
216
  ```bash
237
- npx convert-to-readonly <baseDir> [--exclude <pattern>] [--uncommitted] [--diff-from <base>] [--silent]
217
+ npm add -D ts-codemod-cli
218
+ npx convert-to-readonly 'src/**/*.mts'
238
219
  ```
239
220
 
240
- ### replace-any-with-unknown
241
-
242
- Replaces `any` type annotations with `unknown` for improved type safety.
243
-
244
- ```bash
245
- npx replace-any-with-unknown <baseDir> [--exclude <pattern>] [--uncommitted] [--diff-from <base>] [--silent]
246
- ```
247
-
248
- ### replace-record-with-unknown-record
249
-
250
- Replaces `Record<string, unknown>` with `UnknownRecord` for better type safety.
251
-
252
- ```bash
253
- npx replace-record-with-unknown-record <baseDir> [--exclude <pattern>] [--uncommitted] [--diff-from <base>] [--silent]
254
- ```
255
-
256
- **Common Options:**
257
-
258
- - `baseDir`: Base directory to scan for TypeScript files
259
- - `--exclude`: Glob patterns to exclude (e.g., `"src/generated/**/*.mts"`)
260
- - `--uncommitted`: Transform only uncommitted files (untracked, modified, and staged), intersected with `baseDir`
261
- - `--diff-from <base>`: Transform only files that differ from the given base branch or commit hash (e.g., `origin/main`), intersected with `baseDir`
262
- - `--silent`: Suppress output messages
221
+ They are in their own package because they need `cmd-ts`, `dedent` and
222
+ `ts-repo-utils` — dependencies this library does not otherwise carry. See that
223
+ package's README for the full command list and options.
263
224
 
264
225
  ## Programmatic Usage
265
226
 
@@ -447,7 +408,7 @@ node codemod.mjs
447
408
  ### Local Setup
448
409
 
449
410
  ```sh
450
- git clone https://github.com/noshiro-pf/ts-codemod-lib.git
411
+ git clone https://github.com/noshiro-pf/mono.git
451
412
  pnpm i
452
413
  ```
453
414
 
@@ -503,9 +503,12 @@ const transformMappedTypeNode = (node, readonlyContext, options) => {
503
503
  const questionTokenText = pipe(node.getQuestionToken()?.getText()).mapNullable(
504
504
  (t) => t === "?" ? "?" : t === "-" ? "-?" : t === "+" ? "+?" : void 0
505
505
  ).value ?? "";
506
+ const nameTypeText = pipe(node.getNameTypeNode()?.getFullText()).mapNullable(
507
+ (t) => ` as ${t.trim()}`
508
+ ).value;
506
509
  const result = pipe(
507
510
  // remove readonlyToken
508
- `{ [${node.getTypeParameter().getFullText()}]${questionTokenText}: ${node.getTypeNode()?.getFullText()} }`
511
+ `{ [${node.getTypeParameter().getFullText()}${nameTypeText ?? ""}]${questionTokenText}: ${node.getTypeNode()?.getFullText()} }`
509
512
  ).map(
510
513
  (mpt) => match(readonlyContext.type, {
511
514
  // Don't wrap with Readonly if already readonly or unnecessary
@@ -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 {\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
+ {"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 // Key remapping (`as` clause). It is part of the key set the mapped type\n // produces, so dropping it would silently change the type.\n const nameTypeText = pipe(node.getNameTypeNode()?.getFullText()).mapNullable(\n (t) => ` as ${t.trim()}`,\n ).value;\n\n const result: string = pipe(\n // remove readonlyToken\n `{ [${node.getTypeParameter().getFullText()}${nameTypeText ?? ''}]${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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"}