ts-codemod-lib 3.0.0 → 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.
package/README.md CHANGED
@@ -3,7 +3,7 @@
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
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?token=BVx5UgsiVr)](https://codecov.io/gh/noshiro-pf/mono)
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
 
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-codemod-lib",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "private": false,
5
5
  "keywords": [
6
6
  "typescript",
@@ -39,12 +39,10 @@
39
39
  ],
40
40
  "dependencies": {
41
41
  "ts-morph": "^28.0.0",
42
- "ts-data-forge": "^14.2.1",
42
+ "ts-data-forge": "^14.3.0",
43
43
  "ts-type-forge": "^9.2.1"
44
44
  },
45
45
  "devDependencies": {
46
- "@rollup/plugin-replace": "6.0.3",
47
- "@rollup/plugin-strip": "3.0.4",
48
46
  "@types/node": "26.2.0",
49
47
  "@vitest/browser-playwright": "4.1.10",
50
48
  "@vitest/coverage-v8": "4.1.10",
@@ -52,7 +50,7 @@
52
50
  "cspell": "10.0.1",
53
51
  "dedent": "1.7.2",
54
52
  "esbuild": "0.28.1",
55
- "eslint": "10.8.0",
53
+ "eslint": "10.8.1",
56
54
  "jiti": "2.7.0",
57
55
  "npm-run-all2": "9.0.3",
58
56
  "playwright": "1.62.1",
@@ -60,18 +58,17 @@
60
58
  "prettier-plugin-organize-imports": "4.3.0",
61
59
  "prettier-plugin-packagejson": "3.0.2",
62
60
  "rollup": "4.62.4",
63
- "rollup-plugin-esbuild": "6.2.1",
64
- "tsx": "4.23.4",
61
+ "tsx": "4.23.11",
65
62
  "typedoc": "0.28.20",
66
63
  "typedoc-github-theme": "0.4.0",
67
64
  "typescript": "6.0.3",
68
65
  "typescript-native": "npm:typescript@7.0.2",
69
- "vite": "8.2.0",
66
+ "vite": "8.2.1",
70
67
  "vitest": "4.1.10",
71
- "eslint-config-typed": "5.8.5",
72
- "eslint-plugin-ts-data-forge": "0.4.4",
73
- "eslint-plugin-ts-fortress": "1.0.1",
74
- "eslint-plugin-ts-type-forge": "0.6.3",
68
+ "eslint-config-typed": "5.9.2",
69
+ "eslint-plugin-ts-data-forge": "0.4.7",
70
+ "eslint-plugin-ts-fortress": "1.0.3",
71
+ "eslint-plugin-ts-type-forge": "0.6.5",
75
72
  "ts-repo-utils": "10.2.0"
76
73
  },
77
74
  "engines": {
@@ -957,9 +957,15 @@ const transformMappedTypeNode = (
957
957
  t === '?' ? '?' : t === '-' ? '-?' : t === '+' ? '+?' : undefined,
958
958
  ).value ?? '';
959
959
 
960
+ // Key remapping (`as` clause). It is part of the key set the mapped type
961
+ // produces, so dropping it would silently change the type.
962
+ const nameTypeText = pipe(node.getNameTypeNode()?.getFullText()).mapNullable(
963
+ (t) => ` as ${t.trim()}`,
964
+ ).value;
965
+
960
966
  const result: string = pipe(
961
967
  // remove readonlyToken
962
- `{ [${node.getTypeParameter().getFullText()}]${questionTokenText}: ${node.getTypeNode()?.getFullText()} }`,
968
+ `{ [${node.getTypeParameter().getFullText()}${nameTypeText ?? ''}]${questionTokenText}: ${node.getTypeNode()?.getFullText()} }`,
963
969
  ).map((mpt) =>
964
970
  match(readonlyContext.type, {
965
971
  // Don't wrap with Readonly if already readonly or unnecessary
@@ -2203,6 +2203,50 @@ describe(convertToReadonlyTransformer, () => {
2203
2203
  ])('$name', testFn);
2204
2204
  });
2205
2205
 
2206
+ describe('Mapped type key remapping', () => {
2207
+ test.each([
2208
+ {
2209
+ name: 'Keeps the `as` clause when wrapping with Readonly',
2210
+ source: dedent`
2211
+ type DropSymbolKeys<R, V> = {
2212
+ [K in keyof R as K extends symbol ? never : K]: V;
2213
+ };
2214
+ `,
2215
+ expected: dedent`
2216
+ type DropSymbolKeys<R, V> = Readonly<{
2217
+ [K in keyof R as K extends symbol ? never : K]: V;
2218
+ }>;
2219
+ `,
2220
+ },
2221
+ {
2222
+ name: 'Keeps the `as` clause when the readonly modifier is removed',
2223
+ source: dedent`
2224
+ type Renamed<R> = {
2225
+ readonly [K in keyof R as \`get\${Capitalize<K & string>}\`]: R[K];
2226
+ };
2227
+ `,
2228
+ expected: dedent`
2229
+ type Renamed<R> = Readonly<{
2230
+ [K in keyof R as \`get\${Capitalize<K & string>}\`]: R[K];
2231
+ }>;
2232
+ `,
2233
+ },
2234
+ {
2235
+ name: 'Keeps the `as` clause alongside an optional modifier',
2236
+ source: dedent`
2237
+ type PartialRenamed<R> = {
2238
+ [K in keyof R as K extends symbol ? never : K]?: R[K];
2239
+ };
2240
+ `,
2241
+ expected: dedent`
2242
+ type PartialRenamed<R> = Readonly<{
2243
+ [K in keyof R as K extends symbol ? never : K]?: R[K];
2244
+ }>;
2245
+ `,
2246
+ },
2247
+ ])('$name', testFn);
2248
+ });
2249
+
2206
2250
  describe('Primitive and keyword types', () => {
2207
2251
  test.each([
2208
2252
  {