@contractkit/plugin-typescript 0.33.2 → 0.33.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/codegen-contract.ts","../src/ts-render.ts","../src/decimal-runtime.ts","../src/codegen-revive.ts","../src/codegen-operation.ts","../src/codegen-sdk.ts","../src/codegen-plain-types.ts","../src/codegen-mcp.ts","../src/path-utils.ts"],"sourcesContent":["import { resolve, join, relative, dirname, basename } from 'node:path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync, rmdirSync } from 'node:fs';\nimport { generateContract, rootNeedsScalar } from './codegen-contract.js';\nimport { generateOp } from './codegen-operation.js';\nimport type {\n ContractKitPlugin,\n PluginContext,\n ContractRootNode,\n OpRootNode,\n ModelNode,\n IncrementalManifest,\n IncrementalUnit,\n IncrementalOutputFile,\n} from '@contractkit/core';\nimport {\n runIncrementalCodegen,\n parseIncrementalManifest,\n emptyIncrementalManifest,\n serializeIncrementalManifest,\n hashFingerprint,\n collectTransitiveModelRefs,\n collectTypeRefs,\n computeModelsWithCaseTransform,\n computeModelsWithDecimal,\n} from '@contractkit/core';\nimport {\n generateSdk,\n generateSdkOptions,\n generateSdkAggregator,\n generateAreaClient,\n deriveClientClassName,\n deriveClientPropertyName,\n deriveAreaClientClassName,\n deriveAreaPropertyName,\n deriveSubareaClientClassName,\n deriveSubareaPropertyName,\n getAreaSubarea,\n hasPublicOperations,\n generateSdkPackageJson,\n generateSdkTsconfig,\n type SdkClientInfo,\n type SdkAreaInfo,\n type SdkScaffoldDeps,\n} from './codegen-sdk.js';\nimport { generatePlainTypes } from './codegen-plain-types.js';\nimport { generateMcpFile, generateMcpAggregator, generateMcpRouter, hasMcpOperations, deriveMcpRegisterFnName } from './codegen-mcp.js';\nimport {\n TEMPLATE_VAR_RE,\n resolveTemplate,\n commonDir,\n computeOpOutPath,\n computeContractOutPath,\n computeSdkOutPath,\n computeSdkAreaClientOutPath,\n computeSdkTypeOutPath,\n generateBarrelFiles,\n computePubliclyReachableTypes,\n} from './path-utils.js';\n\n// ─── Sub-config interfaces ─────────────────────────────────────────────────\n\n/** Koa server output: routers, and the type or Zod schema files they import. */\nexport interface ServerConfig {\n /** Directory (relative to rootDir) where server files are written. Default: rootDir. */\n baseDir?: string;\n /** When true, `output.types` emits Zod schema files (via `generateContract`). When false/omitted, emits plain TypeScript. */\n zod?: boolean;\n output?: {\n /** Path template for Koa router files. Supports {filename}, {dir}, {area}. */\n routes?: string;\n /** Path template for type/schema files. Supports {filename}, {dir}, {area}. */\n types?: string;\n };\n /** Import path template for service implementations. */\n servicePathTemplate?: string;\n /** Whether to emit handlers for `internal` operations. Default true. */\n includeInternal?: boolean;\n /**\n * When true, each handler re-parses the service result through its declared response schema\n * before writing `ctx.body`, and writes the parsed value. Requires `zod: true` — without it\n * `output.types` emits plain interfaces, which are types with no runtime schema value.\n *\n * A body that transitively references a model with `format(input=...)`/`format(output=...)`, and\n * a status whose several mimes carry different body types, are left unvalidated. Default false.\n */\n validateResponses?: boolean;\n}\n\n/** TypeScript SDK client output: the client class, per-area operation clients, and their types. */\nexport interface SdkConfig {\n baseDir?: string;\n name?: string;\n zod?: boolean;\n output?: {\n sdk?: string;\n types?: string;\n clients?: string;\n };\n includeInternal?: boolean;\n /**\n * Emit a starter `package.json` and `tsconfig.json` at the SDK `baseDir` so the\n * generated output is a buildable, publishable package on its own. Opt-in and\n * write-once: the files are created only when absent and are never overwritten or\n * cleaned up on later builds, so any edits you make to them are preserved.\n * Dependency ranges are derived from the contracts (always `zod` when `zod: true`;\n * `luxon` when any covered model uses a date/time/datetime/duration/interval scalar;\n * `decimal.js` when any uses a decimal).\n */\n scaffold?: boolean;\n}\n\n/** Standalone Zod schema output, independent of the server and SDK sub-generators. */\nexport interface ZodConfig {\n baseDir?: string;\n output?: string;\n}\n\n/** Standalone plain TypeScript type output, independent of the server and SDK sub-generators. */\nexport interface TypesConfig {\n baseDir?: string;\n output?: string;\n /**\n * Runtime the emitted types describe. Affects scalars whose TypeScript type is runtime-specific:\n * `binary` renders as `Buffer` for `'server'` and `Blob` for `'client'`. Default `'client'`.\n * The `server` and `sdk` sub-generators set this themselves.\n */\n target?: 'client' | 'server';\n}\n\n/** MCP tool output: per-op-file handlers, the aggregator, and the optional POST route. */\nexport interface McpConfig {\n /** Directory (relative to rootDir) where MCP files are written. Default: rootDir. */\n baseDir?: string;\n output?: {\n /** Path template for per-op-file tool handlers. Supports {filename}, {dir}, {area}. Default `{filename}.mcp.ts`. */\n tools?: string;\n /** Path (or template) for the aggregator that assembles the McpToolHandlerMap. Default `mcp.tools.ts`. */\n index?: string;\n /** Path (or template) for the optional POST /mcp route file. Default `mcp.router.ts`. */\n router?: string;\n /**\n * Path template for the model **Zod schema** files the tools import (for arg validation and\n * `z.toJSONSchema`). When omitted, falls back to the `server` sub-config's `output.types`\n * (if `server.zod`) or the `zod` sub-config's output. Tools require Zod schemas, not plain types.\n */\n types?: string;\n };\n /** Emit the `mcp.router.ts` route boilerplate. Default true. */\n emitRouter?: boolean;\n /** Mount path used in the emitted router. Default `/mcp`. */\n path?: string;\n /** Import path template for service implementations (same semantics as ServerConfig). */\n servicePathTemplate?: string;\n /** Whether to expose operations marked `internal` as MCP tools. Default false. */\n includeInternal?: boolean;\n}\n\n/** Top-level plugin config. Each sub-config that is present enables its sub-generator. */\nexport interface TypescriptPluginConfig {\n server?: ServerConfig;\n sdk?: SdkConfig;\n zod?: ZodConfig;\n types?: TypesConfig;\n mcp?: McpConfig;\n}\n\n// ─── Caching constants ─────────────────────────────────────────────────────\n\n/** Bumped when the codegen output shape changes in a way that should bust every per-file fingerprint. */\nexport const TYPESCRIPT_CODEGEN_VERSION = '1';\n\n/** Filename for the persisted TypeScript manifest under the CLI cache directory. */\nconst CACHE_MANIFEST_FILENAME = 'typescript-manifest.json';\n\n// ─── Plugin entry points ──────────────────────────────────────────────────\n\nconst plugin: ContractKitPlugin = {\n name: 'typescript',\n async generateTargets(inputs, ctx) {\n const config = ctx.options as TypescriptPluginConfig;\n await runTypescriptCodegen(inputs, ctx, config, ctx.rootDir);\n },\n};\n\nexport default plugin;\n\n/** Build a `@contractkit/plugin-typescript` instance with explicit configuration, for programmatic use. */\nexport function createTypescriptPlugin(config: TypescriptPluginConfig, rootDir: string): ContractKitPlugin {\n return {\n name: 'typescript',\n async generateTargets(inputs, ctx) {\n await runTypescriptCodegen(inputs, ctx, config, rootDir);\n },\n };\n}\n\n/** Reject config combinations that would generate code that cannot compile or cannot run. */\nfunction assertValidConfig(config: TypescriptPluginConfig): void {\n if (config.server?.validateResponses && !config.server.zod) {\n throw new Error(\n 'plugin-typescript: server.validateResponses requires server.zod: true — without it output.types emits plain TypeScript interfaces, which are types with no runtime schema value for the router to validate against.',\n );\n }\n}\n\n/**\n * Shared orchestration. Each sub-generator (server / sdk / zod / types) contributes a\n * set of cacheable units (per-file fingerprints) plus a set of always-regenerated global\n * files (aggregators, barrels, sdk-options). Units share a single manifest so the cache\n * survives cross-cutting reads — the manifest lives at `<rootDir>/.contractkit-typescript-manifest.json`.\n *\n * Honors `ctx.cacheEnabled` — `--force` bypasses the manifest entirely.\n */\nasync function runTypescriptCodegen(\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n ctx: PluginContext,\n config: TypescriptPluginConfig,\n rootDir: string,\n): Promise<void> {\n assertValidConfig(config);\n const manifestPath = resolve(ctx.cacheDir, CACHE_MANIFEST_FILENAME);\n const prevManifest: IncrementalManifest = ctx.cacheEnabled ? readManifest(manifestPath) : emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);\n\n const units: IncrementalUnit[] = [];\n const globalFiles: IncrementalOutputFile[] = [];\n\n if (config.server) collectServerOutput(config.server, rootDir, inputs, units);\n if (config.sdk) collectSdkOutput(config.sdk, rootDir, inputs, units, globalFiles);\n if (config.zod) collectZodOutput(config.zod, rootDir, inputs, units);\n if (config.types) collectTypesOutput(config.types, rootDir, inputs, units);\n if (config.mcp) collectMcpOutput(config.mcp, config, rootDir, inputs, units, globalFiles);\n\n const result = runIncrementalCodegen({\n codegenVersion: TYPESCRIPT_CODEGEN_VERSION,\n prevManifest,\n globalFiles,\n units,\n // Paths are absolute, so existsSync works directly.\n fileExists: existsSync,\n });\n\n deleteStalePaths(result.deletedPaths);\n\n for (const { relativePath, content, ifAbsent } of result.filesToWrite) {\n ctx.emitFile(relativePath, content, ifAbsent ? { ifAbsent: true } : undefined);\n }\n\n writeManifest(manifestPath, result.manifest);\n}\n\n// ─── Cross-file dependency analysis ────────────────────────────────────────\n\n/** Build a quick lookup from model name → its definition. */\nfunction buildModelMap(contractRoots: readonly ContractRootNode[]): Map<string, ModelNode> {\n const map = new Map<string, ModelNode>();\n for (const root of contractRoots) {\n for (const model of root.models) map.set(model.name, model);\n }\n return map;\n}\n\n/** Collect every model referenced by this contract root (own models' fields + bases). Used to slice cross-file fingerprint inputs to just what this file actually depends on. */\nfunction collectContractRootRefs(root: ContractRootNode, modelMap: Map<string, ModelNode>): Set<string> {\n const seeds: Parameters<typeof collectTypeRefs>[0][] = [];\n for (const m of root.models) {\n if (m.type) seeds.push(m.type);\n for (const f of m.fields) seeds.push(f.type);\n if (m.bases) {\n for (const b of m.bases) seeds.push({ kind: 'ref', name: b } as Parameters<typeof collectTypeRefs>[0]);\n }\n }\n return collectTransitiveModelRefs(seeds, modelMap);\n}\n\n/** Collect every model referenced by an op root's routes/operations (transitive). */\nfunction collectOpRootRefs(root: OpRootNode, modelMap: Map<string, ModelNode>): Set<string> {\n const seeds: Parameters<typeof collectTypeRefs>[0][] = [];\n for (const route of root.routes) {\n if (route.params) seeds.push(...paramSourceTypes(route.params));\n for (const op of route.operations) {\n if (op.query) seeds.push(...paramSourceTypes(op.query));\n if (op.headers) seeds.push(...paramSourceTypes(op.headers));\n if (op.request) {\n for (const body of op.request.bodies) seeds.push(body.bodyType);\n }\n for (const resp of op.responses) {\n for (const body of resp.bodies) seeds.push(body.bodyType);\n if (resp.headers) {\n for (const h of resp.headers) seeds.push(h.type);\n }\n }\n }\n }\n return collectTransitiveModelRefs(seeds, modelMap);\n}\n\nfunction paramSourceTypes(src: NonNullable<OpRootNode['routes'][number]['params']>): Parameters<typeof collectTypeRefs>[0][] {\n const out: Parameters<typeof collectTypeRefs>[0][] = [];\n if (src.kind === 'params') {\n for (const n of src.nodes) out.push(n.type);\n } else if (src.kind === 'ref') {\n out.push({ kind: 'ref', name: src.name } as Parameters<typeof collectTypeRefs>[0]);\n } else if (src.kind === 'type') {\n out.push(src.node);\n }\n return out;\n}\n\n/** Build a sorted, JSON-stable record of (modelName -> outPath) for refs this unit depends on. */\nfunction sliceOutPathMap(refs: Set<string>, modelOutPaths: Map<string, string>, modelsWithInput: Set<string>, modelsWithOutput: Set<string>): Record<string, string> {\n const slice: Record<string, string> = {};\n for (const ref of [...refs].sort()) {\n const p = modelOutPaths.get(ref);\n if (p) slice[ref] = p;\n if (modelsWithInput.has(ref)) {\n const ip = modelOutPaths.get(`${ref}Input`);\n if (ip) slice[`${ref}Input`] = ip;\n }\n if (modelsWithOutput.has(ref)) {\n const op = modelOutPaths.get(`${ref}Output`);\n if (op) slice[`${ref}Output`] = op;\n }\n }\n return slice;\n}\n\n/** Slice modelsWithInput/Output to only the names relevant to this unit. */\nfunction sliceModelSet(refs: Set<string>, ownNames: Set<string>, set: Set<string>): string[] {\n const result: string[] = [];\n for (const name of set) {\n if (refs.has(name) || ownNames.has(name)) result.push(name);\n }\n return result.sort();\n}\n\n// ─── Server sub-generator ──────────────────────────────────────────────────\n\nfunction collectServerOutput(\n config: ServerConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n): void {\n const serverBase = resolve(rootDir, config.baseDir ?? '.');\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n // Not `modelsWithOutput`: that set seeds only from `format(output=...)`, because only that case\n // needs an `Output` type alias. A `format(input=...)`-only model is just as untouchable for\n // response validation — its schema's input casing is not what the service hands back.\n const modelsWithTransform = computeModelsWithCaseTransform(inputs.contractRoots.flatMap(r => r.models));\n const modelMap = buildModelMap(inputs.contractRoots);\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const subConfigKey = stableSubConfig(config);\n\n // Pre-pass: register all model → outPath. Cross-file refs need to resolve correctly,\n // which means we need the COMPLETE map (not a slice) — even though each unit's fingerprint\n // only includes its own slice.\n const serverModelOutPaths = new Map<string, string>();\n const typeEntries: { ast: ContractRootNode; typeOutPath: string }[] = [];\n if (config.output?.types) {\n for (const ast of inputs.contractRoots) {\n const typeOutPath = computeContractOutPath(ast.file, serverBase, config.output.types, '.ts', commonRoot, ast.meta);\n typeEntries.push({ ast, typeOutPath });\n for (const model of ast.models) {\n serverModelOutPaths.set(model.name, typeOutPath);\n if (modelsWithInput.has(model.name)) serverModelOutPaths.set(`${model.name}Input`, typeOutPath);\n if (modelsWithOutput.has(model.name)) serverModelOutPaths.set(`${model.name}Output`, typeOutPath);\n }\n }\n }\n\n // ── Per-contract-root types unit ──\n for (const { ast, typeOutPath } of typeEntries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'server-types',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: typeOutPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, serverModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n sub: subConfigKey,\n });\n units.push({\n key: `server-types::${typeOutPath}`,\n fingerprint,\n render: () => {\n const renderCtx = {\n modelOutPaths: serverModelOutPaths,\n currentOutPath: typeOutPath,\n modelsWithInput,\n modelsWithOutput,\n // These types are consumed by Koa handlers, so `binary` is a Buffer, not a Blob.\n target: 'server' as const,\n };\n const content = config.zod ? generateContract(ast, renderCtx) : generatePlainTypes(ast, renderCtx);\n return [{ relativePath: typeOutPath, content }];\n },\n });\n }\n\n // ── Per-op-root router unit ──\n for (const ast of inputs.opRoots) {\n const outPath = computeOpOutPath(ast.file, serverBase, config.output?.routes, '.router.ts', commonRoot, ast.meta);\n const refs = collectOpRootRefs(ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'server-router',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n // The router imports types from each contract root's type file; the slice covers exactly that.\n outPathSlice: sliceOutPathMap(refs, serverModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n servicePathTemplate: config.servicePathTemplate ?? null,\n includeInternal: config.includeInternal ?? true,\n // Not covered by `sub`: adding `format(input=snake)` to a *different* .ck file changes\n // this router's output with no change to `root` or the config.\n modelsWithTransform: sliceModelSet(refs, new Set(), modelsWithTransform),\n validateResponses: config.validateResponses ?? false,\n sub: subConfigKey,\n });\n units.push({\n key: `server-router::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateOp(ast, {\n servicePathTemplate: config.servicePathTemplate,\n outPath,\n modelOutPaths: serverModelOutPaths,\n modelsWithInput,\n modelsWithOutput,\n modelsWithTransform,\n includeInternal: config.includeInternal,\n validateResponses: config.validateResponses,\n }),\n },\n ],\n });\n }\n}\n\n// ─── SDK sub-generator ─────────────────────────────────────────────────────\n\nfunction collectSdkOutput(\n config: SdkConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n globalFiles: IncrementalOutputFile[],\n): void {\n const sdkBase = config.baseDir ? resolve(rootDir, config.baseDir) : rootDir;\n const sdkName = config.name;\n const sdkOutput = config.output?.sdk;\n const sdkEntryPath = sdkOutput\n ? join(sdkBase, TEMPLATE_VAR_RE.test(sdkOutput) ? resolveTemplate(sdkOutput, { name: sdkName ?? 'sdk' }) : sdkOutput)\n : join(sdkBase, 'sdk.ts');\n const sdkOptionsPath = join(dirname(sdkEntryPath), 'sdk-options.ts');\n const subConfigKey = stableSubConfig(config);\n\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n // Computed across every contract root, not per file: one decimal below a model taints it, and\n // the reference that reaches it may live in another .ck file entirely.\n const modelsWithDecimal = computeModelsWithDecimal(inputs.contractRoots.flatMap(r => r.models));\n const modelMap = buildModelMap(inputs.contractRoots);\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const ckCommonRoot = commonDir(allFiles, rootDir);\n\n const sdkModelOutPaths = new Map<string, string>();\n const sdkTypePaths: string[] = [];\n const sdkClientInfos: { outPath: string; className: string; propertyName: string }[] = [];\n\n // ── Pre-pass: SDK type files ──\n const sdkContractEntries: { ast: ContractRootNode; typeOutPath: string }[] = [];\n if (config.output?.types) {\n const publicTypes = computePubliclyReachableTypes(inputs.opRoots, inputs.contractRoots, modelsWithInput, modelsWithOutput);\n for (const ast of inputs.contractRoots) {\n const typeOutPath = computeSdkTypeOutPath(ast.file, sdkBase, config.output.types, ckCommonRoot, ast.meta);\n if (!typeOutPath) continue;\n if (publicTypes !== null && !ast.models.some(m => publicTypes.has(m.name))) continue;\n sdkTypePaths.push(typeOutPath);\n sdkContractEntries.push({ ast, typeOutPath });\n for (const model of ast.models) {\n sdkModelOutPaths.set(model.name, typeOutPath);\n if (modelsWithInput.has(model.name)) sdkModelOutPaths.set(`${model.name}Input`, typeOutPath);\n if (modelsWithOutput.has(model.name)) sdkModelOutPaths.set(`${model.name}Output`, typeOutPath);\n }\n }\n }\n\n // ── SDK type units ──\n for (const { ast, typeOutPath } of sdkContractEntries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'sdk-types',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: typeOutPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n // Not covered by `root`: adding a decimal to a model in a *different* .ck file changes\n // this file's revivers with no change to `root` or the config.\n modelsWithDecimal: sliceModelSet(refs, ownNames, modelsWithDecimal),\n sdkOptionsPath,\n sub: subConfigKey,\n });\n units.push({\n key: `sdk-types::${typeOutPath}`,\n fingerprint,\n render: () => {\n let content: string;\n // `emitRevivers` is set for SDK type files only: a server handler receives decimals\n // already parsed by `_ZodDecimal`, so it has nothing to rehydrate.\n if (config.zod) {\n content = generateContract(ast, {\n modelOutPaths: sdkModelOutPaths,\n currentOutPath: typeOutPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n emitRevivers: true,\n });\n } else {\n let rel = relative(dirname(typeOutPath), sdkOptionsPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n content = generatePlainTypes(ast, {\n modelOutPaths: sdkModelOutPaths,\n currentOutPath: typeOutPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n emitRevivers: true,\n jsonValueImportPath: rel,\n });\n }\n return [{ relativePath: typeOutPath, content }];\n },\n });\n }\n\n // ── Bucket op roots by area/subarea ──\n interface AreaBucket {\n leaves: { ast: OpRootNode; outPath: string; subarea: string }[];\n inlineRoots: OpRootNode[];\n }\n const areaBuckets = new Map<string, AreaBucket>();\n const topLevelEntries: { ast: OpRootNode; outPath: string }[] = [];\n\n if (config.output?.clients) {\n for (const ast of inputs.opRoots) {\n const sdkOutPath = computeSdkOutPath(ast.file, sdkBase, config.output.clients, ckCommonRoot, ast.meta);\n if (!sdkOutPath || !hasPublicOperations(ast, config.includeInternal)) continue;\n const { area, subarea } = getAreaSubarea(ast);\n if (area && subarea) {\n const bucket = areaBuckets.get(area) ?? { leaves: [], inlineRoots: [] };\n bucket.leaves.push({ ast, outPath: sdkOutPath, subarea });\n areaBuckets.set(area, bucket);\n } else if (area) {\n const bucket = areaBuckets.get(area) ?? { leaves: [], inlineRoots: [] };\n bucket.inlineRoots.push(ast);\n areaBuckets.set(area, bucket);\n } else {\n topLevelEntries.push({ ast, outPath: sdkOutPath });\n }\n }\n\n // ── Per-leaf-client (area+subarea) units ──\n for (const [area, bucket] of areaBuckets.entries()) {\n for (const leaf of bucket.leaves) {\n const className = deriveSubareaClientClassName(area, leaf.subarea);\n sdkClientInfos.push({ outPath: leaf.outPath, className, propertyName: deriveSubareaPropertyName(leaf.subarea) });\n const refs = collectOpRootRefs(leaf.ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'sdk-leaf-client',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: leaf.outPath,\n root: leaf.ast,\n outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n modelsWithDecimal: sliceModelSet(refs, new Set(), modelsWithDecimal),\n sdkOptionsPath,\n className,\n includeInternal: config.includeInternal ?? false,\n sub: subConfigKey,\n });\n units.push({\n key: `sdk-leaf-client::${leaf.outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: leaf.outPath,\n content: generateSdk(leaf.ast, {\n typeImportPathTemplate: undefined,\n outPath: leaf.outPath,\n modelOutPaths: sdkModelOutPaths,\n sdkOptionsPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n modelMap,\n includeInternal: config.includeInternal,\n clientClassName: className,\n }),\n },\n ],\n });\n }\n }\n\n // ── Top-level (no area) client units ──\n for (const { ast, outPath } of topLevelEntries) {\n const className = deriveClientClassName(ast.file);\n sdkClientInfos.push({ outPath, className, propertyName: deriveClientPropertyName(ast.file) });\n const refs = collectOpRootRefs(ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'sdk-top-client',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n modelsWithDecimal: sliceModelSet(refs, new Set(), modelsWithDecimal),\n sdkOptionsPath,\n includeInternal: config.includeInternal ?? false,\n sub: subConfigKey,\n });\n units.push({\n key: `sdk-top-client::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateSdk(ast, {\n typeImportPathTemplate: undefined,\n outPath,\n modelOutPaths: sdkModelOutPaths,\n sdkOptionsPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n modelMap,\n includeInternal: config.includeInternal,\n }),\n },\n ],\n });\n }\n }\n\n // ── Global files: sdk-options, aggregator, barrels, root index ──\n // sdk-options.ts is a constant; the aggregator is small (just imports + a wrapper class)\n // and depends on the cross-cutting client list, so it's cheap to regenerate every run.\n // Per-area `<area>.client.ts` files are cached as their own units below.\n globalFiles.push({ relativePath: sdkOptionsPath, content: generateSdkOptions() });\n\n const hasAnything = sdkClientInfos.length > 0 || areaBuckets.size > 0;\n const areaClientOutPaths = new Map<string, string>(); // area → absolute outPath of <area>.client.ts\n if (hasAnything) {\n const sdkEntryDir = dirname(sdkEntryPath);\n const sdkOptionsRel = relative(sdkEntryDir, sdkOptionsPath).replace(/\\.ts$/, '.js');\n const sdkOptionsImportPath = sdkOptionsRel.startsWith('.') ? sdkOptionsRel : './' + sdkOptionsRel;\n const sdkClassName = sdkName\n ? sdkName\n .split(/[-._\\s]+/)\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('') + 'Sdk'\n : 'Sdk';\n\n const toClientImport = (sourceDir: string, info: { outPath: string; className: string; propertyName: string }): SdkClientInfo => {\n let rel = relative(sourceDir, info.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n return { className: info.className, propertyName: info.propertyName, importPath: rel };\n };\n\n const topLevelClients: SdkClientInfo[] = topLevelEntries.map(e =>\n toClientImport(sdkEntryDir, {\n outPath: e.outPath,\n className: deriveClientClassName(e.ast.file),\n propertyName: deriveClientPropertyName(e.ast.file),\n }),\n );\n\n // ── Per-area `<area>.client.ts` units ──\n const areaInfos: SdkAreaInfo[] = [];\n const sortedAreas = [...areaBuckets.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [area, bucket] of sortedAreas) {\n const areaClientOutPath = computeSdkAreaClientOutPath(area, sdkBase, config.output!.clients);\n areaClientOutPaths.set(area, areaClientOutPath);\n const areaClassName = deriveAreaClientClassName(area);\n const areaPropertyName = deriveAreaPropertyName(area);\n sdkClientInfos.push({ outPath: areaClientOutPath, className: areaClassName, propertyName: areaPropertyName });\n\n const subareaClients = bucket.leaves\n .sort((a, b) => a.subarea.localeCompare(b.subarea))\n .map(l => ({\n propertyName: deriveSubareaPropertyName(l.subarea),\n client: toClientImport(dirname(areaClientOutPath), {\n outPath: l.outPath,\n className: deriveSubareaClientClassName(area, l.subarea),\n propertyName: deriveSubareaPropertyName(l.subarea),\n }),\n }));\n\n // Fingerprint covers every input the area client depends on:\n // - all inline roots (full AST)\n // - subarea client metadata (className / propertyName / import path)\n // - the modelOutPaths slice for refs across all inline roots\n // - modelsWithInput/Output slices\n const allInlineRefs = new Set<string>();\n for (const r of bucket.inlineRoots) {\n for (const ref of collectOpRootRefs(r, modelMap)) allInlineRefs.add(ref);\n }\n const fingerprint = hashFingerprint({\n kind: 'sdk-area-client',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: areaClientOutPath,\n area,\n inlineRoots: bucket.inlineRoots,\n subareaClients,\n outPathSlice: sliceOutPathMap(allInlineRefs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(allInlineRefs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(allInlineRefs, new Set(), modelsWithOutput),\n modelsWithDecimal: sliceModelSet(allInlineRefs, new Set(), modelsWithDecimal),\n sdkOptionsPath,\n includeInternal: config.includeInternal ?? false,\n sub: subConfigKey,\n });\n\n const inlineFilesForGen = bucket.inlineRoots.map(root => ({\n root,\n codegenOptions: {\n typeImportPathTemplate: undefined,\n outPath: areaClientOutPath,\n modelOutPaths: sdkModelOutPaths,\n sdkOptionsPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n modelMap,\n includeInternal: config.includeInternal,\n },\n }));\n\n units.push({\n key: `sdk-area-client::${areaClientOutPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: areaClientOutPath,\n content: generateAreaClient({\n area,\n outPath: areaClientOutPath,\n inlineFiles: inlineFilesForGen,\n subareaClients,\n sdkOptionsPath,\n }),\n },\n ],\n });\n\n areaInfos.push({\n area,\n client: toClientImport(sdkEntryDir, { outPath: areaClientOutPath, className: areaClassName, propertyName: areaPropertyName }),\n });\n }\n\n globalFiles.push({\n relativePath: sdkEntryPath,\n content: generateSdkAggregator({ topLevelClients, areas: areaInfos, sdkOptionsImportPath, sdkClassName }),\n });\n }\n\n const sdkSrcDir = dirname(sdkEntryPath);\n const sdkTypeBarrels = generateBarrelFiles(sdkTypePaths);\n for (const barrel of sdkTypeBarrels) globalFiles.push({ relativePath: barrel.outPath, content: barrel.content });\n\n const rootExports: string[] = [`export * from './${basename(sdkOptionsPath).replace(/\\.ts$/, '.js')}';`];\n if (hasAnything) rootExports.push(`export * from './${basename(sdkEntryPath).replace(/\\.ts$/, '.js')}';`);\n for (const c of sdkClientInfos) {\n let rel = relative(sdkSrcDir, c.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n rootExports.push(`export * from '${rel}';`);\n }\n for (const barrel of sdkTypeBarrels) {\n let rel = relative(sdkSrcDir, barrel.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n rootExports.push(`export * from '${rel}';`);\n }\n globalFiles.push({\n relativePath: join(sdkSrcDir, 'index.ts'),\n content: `// Auto-generated barrel file\\n${rootExports.sort().join('\\n')}\\n`,\n });\n\n // ── Scaffold files (opt-in, write-once) ──\n // Emitted at the SDK package root with `ifAbsent` so they're created once and\n // then owned by the user. Deps are derived from the contracts actually surfaced\n // into the SDK: zod when schema output is on, luxon when any covered model uses a\n // date/time/datetime/interval scalar.\n if (config.scaffold) {\n const coveredRoots = sdkContractEntries.map(e => e.ast);\n const deps: SdkScaffoldDeps = {\n zod: !!config.zod,\n // `duration` belongs here too: `generateContract` imports `Duration` from luxon for it,\n // so a contract whose only temporal scalar is a duration used to scaffold a package.json\n // with no luxon dependency and fail to compile.\n luxon: coveredRoots.some(r =>\n (['datetime', 'date', 'time', 'duration', 'interval'] as const).some(name => rootNeedsScalar(r, name)),\n ),\n decimal: coveredRoots.some(r => rootNeedsScalar(r, 'decimal')),\n };\n globalFiles.push({\n relativePath: join(sdkBase, 'package.json'),\n content: generateSdkPackageJson({ name: sdkName ?? 'sdk', deps }),\n ifAbsent: true,\n });\n globalFiles.push({\n relativePath: join(sdkBase, 'tsconfig.json'),\n content: generateSdkTsconfig(),\n ifAbsent: true,\n });\n }\n}\n\n// ─── Zod sub-generator ─────────────────────────────────────────────────────\n\nfunction collectZodOutput(\n config: ZodConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n): void {\n const zodBase = resolve(rootDir, config.baseDir ?? '.');\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n const modelMap = buildModelMap(inputs.contractRoots);\n const subConfigKey = stableSubConfig(config);\n\n const modelOutPaths = new Map<string, string>();\n const entries: { ast: ContractRootNode; outPath: string }[] = [];\n for (const ast of inputs.contractRoots) {\n const outPath = computeContractOutPath(ast.file, zodBase, config.output, '.schema.ts', commonRoot, ast.meta);\n entries.push({ ast, outPath });\n for (const model of ast.models) {\n modelOutPaths.set(model.name, outPath);\n if (modelsWithInput.has(model.name)) modelOutPaths.set(`${model.name}Input`, outPath);\n if (modelsWithOutput.has(model.name)) modelOutPaths.set(`${model.name}Output`, outPath);\n }\n }\n\n for (const { ast, outPath } of entries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'zod',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n sub: subConfigKey,\n });\n units.push({\n key: `zod::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateContract(ast, { modelOutPaths, currentOutPath: outPath, modelsWithInput, modelsWithOutput }),\n },\n ],\n });\n }\n}\n\n// ─── Plain types sub-generator ─────────────────────────────────────────────\n\nfunction collectTypesOutput(\n config: TypesConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n): void {\n const typesBase = resolve(rootDir, config.baseDir ?? '.');\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n const modelMap = buildModelMap(inputs.contractRoots);\n const subConfigKey = stableSubConfig(config);\n\n const modelOutPaths = new Map<string, string>();\n const entries: { ast: ContractRootNode; outPath: string }[] = [];\n for (const ast of inputs.contractRoots) {\n const outPath = computeContractOutPath(ast.file, typesBase, config.output, '.types.ts', commonRoot, ast.meta);\n entries.push({ ast, outPath });\n for (const model of ast.models) {\n modelOutPaths.set(model.name, outPath);\n if (modelsWithInput.has(model.name)) modelOutPaths.set(`${model.name}Input`, outPath);\n if (modelsWithOutput.has(model.name)) modelOutPaths.set(`${model.name}Output`, outPath);\n }\n }\n\n for (const { ast, outPath } of entries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'plain-types',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n sub: subConfigKey,\n });\n units.push({\n key: `plain-types::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generatePlainTypes(ast, {\n modelOutPaths,\n currentOutPath: outPath,\n modelsWithInput,\n modelsWithOutput,\n target: config.target,\n }),\n },\n ],\n });\n }\n}\n\n// ─── MCP sub-generator ─────────────────────────────────────────────────────\n\n/**\n * Resolve where the model **Zod schema** files live so the MCP tools can import them (for arg\n * validation + `z.toJSONSchema`). Precedence: explicit `mcp.output.types` → the `server` sub-config's\n * `output.types` (only when `server.zod`) → the `zod` sub-config's output. Returns an empty map when\n * none resolve (imports then fall back to a colocated `./<name>.js` guess).\n */\nfunction resolveMcpModelOutPaths(\n config: TypescriptPluginConfig,\n rootDir: string,\n contractRoots: readonly ContractRootNode[],\n commonRoot: string,\n modelsWithInput: Set<string>,\n modelsWithOutput: Set<string>,\n): Map<string, string> {\n const map = new Map<string, string>();\n let base: string;\n let template: string | undefined;\n let suffix: string;\n if (config.mcp?.output?.types) {\n base = resolve(rootDir, config.mcp.baseDir ?? '.');\n template = config.mcp.output.types;\n suffix = '.ts';\n } else if (config.server?.zod && config.server.output?.types) {\n base = resolve(rootDir, config.server.baseDir ?? '.');\n template = config.server.output.types;\n suffix = '.ts';\n } else if (config.zod) {\n base = resolve(rootDir, config.zod.baseDir ?? '.');\n template = config.zod.output;\n suffix = '.schema.ts';\n } else {\n return map;\n }\n\n for (const ast of contractRoots) {\n const outPath = computeContractOutPath(ast.file, base, template, suffix, commonRoot, ast.meta);\n for (const model of ast.models) {\n map.set(model.name, outPath);\n if (modelsWithInput.has(model.name)) map.set(`${model.name}Input`, outPath);\n if (modelsWithOutput.has(model.name)) map.set(`${model.name}Output`, outPath);\n }\n }\n return map;\n}\n\nfunction collectMcpOutput(\n config: McpConfig,\n fullConfig: TypescriptPluginConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n globalFiles: IncrementalOutputFile[],\n): void {\n const mcpBase = resolve(rootDir, config.baseDir ?? '.');\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n const modelMap = buildModelMap(inputs.contractRoots);\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const subConfigKey = stableSubConfig(config);\n const includeInternal = config.includeInternal ?? false;\n\n const modelOutPaths = resolveMcpModelOutPaths(fullConfig, rootDir, inputs.contractRoots, commonRoot, modelsWithInput, modelsWithOutput);\n\n // ── Per-op-root tool-handler units (only files with MCP-exposed ops) ──\n const entries: { outPath: string; registerFn: string }[] = [];\n for (const ast of inputs.opRoots) {\n if (!hasMcpOperations(ast, includeInternal)) continue;\n const outPath = computeOpOutPath(ast.file, mcpBase, config.output?.tools, '.mcp.ts', commonRoot, ast.meta);\n const refs = collectOpRootRefs(ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'mcp-tools',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n servicePathTemplate: config.servicePathTemplate ?? null,\n includeInternal,\n sub: subConfigKey,\n });\n units.push({\n key: `mcp-tools::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateMcpFile(ast, {\n outPath,\n modelOutPaths,\n modelsWithInput,\n modelsWithOutput,\n servicePathTemplate: config.servicePathTemplate,\n includeInternal,\n }),\n },\n ],\n });\n entries.push({ outPath, registerFn: deriveMcpRegisterFnName(ast.file) });\n }\n\n if (entries.length === 0) return;\n\n // ── Aggregator (global) ──\n const indexPath = join(mcpBase, config.output?.index ?? 'mcp.tools.ts');\n const aggregatorEntries = entries\n .map(e => {\n let rel = relative(dirname(indexPath), e.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n return { registerFn: e.registerFn, importPath: rel };\n })\n .sort((a, b) => a.registerFn.localeCompare(b.registerFn));\n globalFiles.push({ relativePath: indexPath, content: generateMcpAggregator(aggregatorEntries) });\n\n // ── Router (global, optional) ──\n if (config.emitRouter !== false) {\n const routerPath = join(mcpBase, config.output?.router ?? 'mcp.router.ts');\n globalFiles.push({ relativePath: routerPath, content: generateMcpRouter({ path: config.path }) });\n }\n}\n\n// ─── Manifest IO + cleanup ─────────────────────────────────────────────────\n\nfunction readManifest(manifestPath: string): IncrementalManifest {\n if (!existsSync(manifestPath)) return emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);\n try {\n return parseIncrementalManifest(readFileSync(manifestPath, 'utf-8'));\n } catch {\n return emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);\n }\n}\n\n/** Write the manifest to `manifestPath`. Creates parent dirs as needed. Errors are swallowed so a broken cache never blocks the build. */\nfunction writeManifest(manifestPath: string, manifest: IncrementalManifest): void {\n try {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeIncrementalManifest(manifest), 'utf-8');\n } catch {\n // best-effort\n }\n}\n\nfunction deleteStalePaths(absPaths: string[]): void {\n if (absPaths.length === 0) return;\n const removedDirs = new Set<string>();\n for (const abs of absPaths) {\n if (existsSync(abs)) {\n rmSync(abs, { force: true });\n removedDirs.add(dirname(abs));\n }\n }\n // Walk up affected dirs and remove if empty. Bounded — stops at filesystem root or first non-empty dir.\n for (const dir of removedDirs) {\n let current = dir;\n while (current.length > 1) {\n try {\n if (readdirSync(current).length === 0) {\n rmdirSync(current);\n current = dirname(current);\n } else {\n break;\n }\n } catch {\n break;\n }\n }\n }\n}\n\n/** Stringify a sub-config so it can participate in fingerprints. JSON.stringify gives stable output for typical config shapes. */\nfunction stableSubConfig(config: unknown): string {\n return JSON.stringify(config ?? null);\n}\n","import { relative, dirname } from 'node:path';\nimport type {\n ContractRootNode,\n ModelNode,\n FieldNode,\n ContractTypeNode,\n ScalarTypeNode,\n ArrayTypeNode,\n TupleTypeNode,\n RecordTypeNode,\n EnumTypeNode,\n LiteralTypeNode,\n UnionTypeNode,\n DiscriminatedUnionTypeNode,\n InlineObjectTypeNode,\n IntersectionTypeNode,\n ObjectMode,\n} from '@contractkit/core';\nimport {\n collectTypeRefs,\n computeModelsWithOutput as ckComputeModelsWithOutput,\n collectExternalOutputRefs as ckCollectExternalOutputRefs,\n} from '@contractkit/core';\nimport { escapeJsDocLines } from './ts-render.js';\nimport type { TsRenderTarget } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_PRELUDE_LINES } from './decimal-runtime.js';\nimport { renderReviveFunctions, reviveFnName, DECIMAL_COERCE_DECL } from './codegen-revive.js';\n\n/**\n * Maps a ContractKit object mode to its Zod constructor name.\n *\n * @returns `\"z.strictObject\"` | `\"z.object\"` | `\"z.looseObject\"`\n */\nexport function modeToWrapper(mode: ObjectMode): string {\n switch (mode) {\n case 'strict':\n return 'z.strictObject';\n case 'strip':\n return 'z.object';\n case 'loose':\n return 'z.looseObject';\n }\n}\n\n// ─── Cross-file import resolution ─────────────────────────────────────────\n\n/** Cross-file context passed to `generateContract` to wire up imports and Input/Output variant tracking. */\nexport interface ContractCodegenContext {\n /** Map from model name → absolute output file path */\n modelOutPaths: Map<string, string>;\n /** Absolute output file path for the current contract file */\n currentOutPath: string;\n /** Set of model names that have Input variants (models with visibility modifiers) */\n modelsWithInput?: Set<string>;\n /** Set of model names that have Output variants (models with format(output=...)) */\n modelsWithOutput?: Set<string>;\n /** If set, import JsonValue from this path instead of re-declaring it (avoids barrel re-export conflicts) */\n jsonValueImportPath?: string;\n /**\n * Runtime the emitted plain types describe. Only affects scalars whose TypeScript type differs\n * per runtime (`binary` → `Buffer` on the server, `Blob` in the client). Ignored by\n * `generateContract`, whose Zod schemas are server-shaped by construction. Default `'client'`.\n */\n target?: TsRenderTarget;\n /** Model names that carry a `decimal`, directly or transitively. */\n modelsWithDecimal?: Set<string>;\n /**\n * Emit `reviveX()` hydration functions alongside the schemas. Set only for SDK type files: a\n * server handler receives decimals already parsed by `_ZodDecimal`, so it has nothing to revive.\n */\n emitRevivers?: boolean;\n}\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/**\n * Compute which models need Input variants, including transitive dependencies.\n * A model needs an Input variant if it has visibility-modified fields, OR if\n * any of its field types (recursively) reference a model that has an Input variant.\n */\nexport function computeModelsWithInput(models: ModelNode[], externalModelsWithInput: Set<string> = new Set()): Set<string> {\n const result = new Set<string>();\n\n // Initial pass: direct visibility modifiers\n for (const model of models) {\n if (model.fields.some(f => f.visibility !== 'normal')) {\n result.add(model.name);\n }\n }\n\n // Transitive closure: add models that reference models with Input variants,\n // including through base model inheritance.\n let changed = true;\n while (changed) {\n changed = false;\n for (const model of models) {\n if (result.has(model.name)) continue;\n const refs = new Set<string>();\n for (const field of model.fields) {\n collectTypeRefs(field.type, refs);\n }\n // A model that extends a parent with Input variants also needs an Input variant,\n // so that the write schema can extend ParentInput instead of Parent.\n if (model.bases) for (const b of model.bases) refs.add(b);\n // A type alias (model.type set) that references a model with Input variants\n // also needs an Input variant.\n if (model.type) collectTypeRefs(model.type, refs);\n for (const ref of refs) {\n if (result.has(ref) || externalModelsWithInput.has(ref)) {\n result.add(model.name);\n changed = true;\n break;\n }\n }\n }\n }\n\n return result;\n}\n\nfunction generateComments(model: ModelNode, outPath?: string): string[] {\n const lines: string[] = [];\n lines.push('/**');\n if (model.deprecated) {\n lines.push(` * @deprecated`);\n }\n if (model.description) {\n for (const l of escapeJsDocLines(model.description)) lines.push(` * ${l}`);\n }\n\n const relPath = outPath ? relative(dirname(outPath), model.loc.file) : model.loc.file;\n lines.push(` * generated from [${model.name}](file://./${relPath}#L${model.loc.line})`);\n lines.push('*/');\n return lines;\n}\n\n/**\n * Generate a TypeScript module containing Zod schemas for every model in `root`.\n *\n * Emits up to three schemas per model when visibility modifiers are present:\n * `ModelBase` (all fields), `Model` (read — no writeonly), `ModelInput` (write — no readonly).\n *\n * @param root - The parsed contract root node.\n * @param context - Optional cross-file context for import resolution and Input/Output variant tracking.\n * @returns The full TypeScript source as a string.\n */\nexport function generateContract(root: ContractRootNode, context?: ContractCodegenContext): string {\n const needsDateTime = rootNeedsDateTime(root);\n const needsDuration = rootNeedsScalar(root, 'duration');\n const needsInterval = rootNeedsScalar(root, 'interval');\n const needsBinary = rootNeedsScalar(root, 'binary');\n const needsDatetime = rootNeedsScalar(root, 'datetime');\n const needsJson = rootNeedsScalar(root, 'json');\n const needsDecimal = rootNeedsScalar(root, 'decimal');\n const externalRefs = collectExternalRefs(root);\n const lines: string[] = [];\n\n // Compute which models have Input variants (local, incl. transitive deps + external)\n const externalModelsWithInput = context?.modelsWithInput ?? new Set<string>();\n const localModelsWithInput = computeModelsWithInput(root.models, externalModelsWithInput);\n const allModelsWithInput = new Set([...localModelsWithInput, ...externalModelsWithInput]);\n\n // Compute which models have Output variants (post-transform wire shape)\n const externalModelsWithOutput = context?.modelsWithOutput ?? new Set<string>();\n const localModelsWithOutput = ckComputeModelsWithOutput(root.models, externalModelsWithOutput);\n const allModelsWithOutput = new Set([...localModelsWithOutput, ...externalModelsWithOutput]);\n\n // Collect additional external Input refs needed for Input schema fields\n const externalInputRefs = allModelsWithInput.size > 0 ? collectExternalInputRefs(root, allModelsWithInput) : [];\n const externalOutputRefs = allModelsWithOutput.size > 0 ? ckCollectExternalOutputRefs(root, allModelsWithOutput) : [];\n const allExternalRefs = [...new Set([...externalRefs, ...externalInputRefs, ...externalOutputRefs])].sort();\n\n lines.push(`import { z } from 'zod';`);\n const luxonImports: string[] = [];\n if (needsDateTime) luxonImports.push('DateTime');\n if (needsDuration) luxonImports.push('Duration');\n if (needsInterval) luxonImports.push('Interval');\n if (luxonImports.length > 0) lines.push(`import { ${luxonImports.join(', ')} } from 'luxon';`);\n if (needsDecimal) lines.push(DECIMAL_IMPORT);\n for (const ref of allExternalRefs) {\n const importPath = resolveImportPath(ref, context);\n // A cross-file model that carries a decimal contributes its reviver too — the local\n // reviver calls it rather than re-deriving the other file's shape.\n const names =\n context?.emitRevivers && context.modelsWithDecimal?.has(ref) ? `${ref}, ${reviveFnName(ref)}` : ref;\n lines.push(`import { ${names} } from '${importPath}';`);\n }\n lines.push('');\n if (needsBinary) {\n lines.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`);\n }\n if (needsDatetime) {\n lines.push(\n `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`,\n );\n }\n if (needsInterval) {\n lines.push(\n `const _ZodInterval = z.preprocess((val) => typeof val === 'string' ? Interval.fromISO(val) : val, z.custom<Interval>((val) => val instanceof Interval && val.isValid, { message: 'Must be an ISO 8601 interval' })).transform(val => val.toISO()!);`,\n );\n }\n if (needsDecimal) {\n lines.push(...DECIMAL_PRELUDE_LINES);\n }\n if (needsJson) {\n lines.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`);\n lines.push(\n `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`,\n );\n }\n if (needsBinary || needsDatetime || needsInterval || needsDecimal || needsJson) lines.push('');\n\n const modelsWithWriteonly = new Set(root.models.filter(m => m.fields.some(f => f.visibility === 'writeonly')).map(m => m.name));\n const modelMap = new Map(root.models.map(m => [m.name, m]));\n\n const reviveOpts =\n context?.emitRevivers && context.modelsWithDecimal\n ? { modelsWithDecimal: context.modelsWithDecimal, modelsWithOutput: allModelsWithOutput, modelMap }\n : undefined;\n\n const bodyLines: string[] = [];\n for (const model of topoSortModels(root.models)) {\n bodyLines.push(...generateModel(model, context?.currentOutPath, allModelsWithInput, modelsWithWriteonly, modelMap, allModelsWithOutput));\n if (reviveOpts) {\n const revivers = renderReviveFunctions(model, reviveOpts);\n if (revivers.length > 0) {\n bodyLines.push('');\n bodyLines.push(...revivers);\n }\n }\n bodyLines.push('');\n }\n\n // Decided from the emitted revivers rather than from a predicate over the AST, so the\n // declaration and its uses cannot drift apart and leave an unused local behind.\n if (bodyLines.some(l => l.includes('__dec('))) {\n lines.push(...DECIMAL_COERCE_DECL);\n lines.push('');\n }\n lines.push(...bodyLines);\n\n return lines.join('\\n');\n}\n\n// ─── Model ─────────────────────────────────────────────────────────────────\n\n/**\n * If any ancestor in the base chain has a format(input=)/format(output=) transform,\n * the parent schema compiles to a `ZodPipe` (object().transform()) which has no `.extend()`.\n * To keep extension working, inline the parent's fields into the child and inherit format/mode\n * so the child re-applies the transform on the merged shape. Returns the model unchanged when\n * no ancestor has format, preserving the existing `.extend()`-based output.\n */\nfunction flattenFormatChain(model: ModelNode, modelMap: Map<string, ModelNode>): ModelNode {\n if (!model.bases || model.bases.length === 0) return model;\n // TODO(multi-base): currently only the first base is followed for format inheritance.\n // Multi-base format flattening will need a topological merge across all bases.\n const firstBase = model.bases[0]!;\n const parent = modelMap.get(firstBase);\n if (!parent) return model;\n const flatParent = flattenFormatChain(parent, modelMap);\n const parentHasFormat =\n (flatParent.inputCase !== undefined && flatParent.inputCase !== 'camel') ||\n (flatParent.outputCase !== undefined && flatParent.outputCase !== 'camel');\n if (!parentHasFormat) return model;\n\n const merged = new Map<string, FieldNode>();\n for (const f of flatParent.fields) merged.set(f.name, f);\n for (const f of model.fields) merged.set(f.name, f);\n\n return {\n ...model,\n bases: undefined,\n fields: [...merged.values()],\n inputCase: model.inputCase ?? flatParent.inputCase,\n outputCase: model.outputCase ?? flatParent.outputCase,\n mode: model.mode ?? flatParent.mode,\n };\n}\n\nfunction generateModel(\n model: ModelNode,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithWriteonly?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n modelsWithOutput?: Set<string>,\n): string[] {\n // Type alias: Name : typeExpression\n if (model.type) {\n return generateTypeAlias(model, outPath, modelsWithInput, modelsWithOutput);\n }\n\n const effective = modelMap ? flattenFormatChain(model, modelMap) : model;\n\n // A model needs Input/read split if it has visibility-modified fields OR if it\n // transitively references models that have Input variants (captured in modelsWithInput).\n const needsInputSplit = effective.fields.some(f => f.visibility !== 'normal') || (modelsWithInput?.has(effective.name) ?? false);\n\n const lines = needsInputSplit\n ? generateThreeSchemaModel(effective, outPath, modelsWithInput, modelsWithWriteonly, modelMap)\n : generateSimpleModel(effective, outPath);\n\n // Emit Output type alias when this model (transitively) has format(output=...)\n if (modelsWithOutput?.has(effective.name)) {\n lines.push(`export type ${effective.name}Output = z.output<typeof ${effective.name}>;`);\n }\n\n return lines;\n}\n\nfunction generateTypeAlias(model: ModelNode, outPath?: string, modelsWithInput?: Set<string>, modelsWithOutput?: Set<string>): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n lines.push(`export const ${model.name} = ${renderType(model.type!)};`);\n lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`);\n if (modelsWithInput?.has(model.name)) {\n lines.push(`export const ${model.name}Input = ${renderInputType(model.type!, modelsWithInput)};`);\n lines.push(`export type ${model.name}Input = z.infer<typeof ${model.name}Input>;`);\n }\n if (modelsWithOutput?.has(model.name)) {\n lines.push(`export type ${model.name}Output = z.output<typeof ${model.name}>;`);\n }\n return lines;\n}\n\nfunction generateSimpleModel(model: ModelNode, outPath?: string): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n\n const wrapper = modeToWrapper(model.mode ?? 'strict');\n\n const { inputCase, outputCase } = model;\n const hasInputTransform = !!inputCase && inputCase !== 'camel';\n const hasOutputTransform = !!outputCase && outputCase !== 'camel';\n\n if (hasInputTransform || hasOutputTransform) {\n const inputBody =\n inputCase === 'snake'\n ? renderFieldsAsSnakeCase(model.fields, model.mode)\n : inputCase === 'pascal'\n ? renderFieldsAsPascalCase(model.fields, model.mode)\n : renderFields(model.fields, model.mode);\n lines.push(`export const ${model.name} = ${wrapper}({`);\n lines.push(...inputBody.map(l => ` ${l}`));\n lines.push(`}).transform(data => ({`);\n for (const field of model.fields) {\n const inputKey = applyCase(field.name, inputCase);\n const outputKey = applyCase(field.name, outputCase);\n if (field.optional) {\n // Conditional spread keeps the field optional (`k?: T`) in the inferred\n // z.output / z.input type, instead of widening to required-nullable (`k: T | undefined`).\n // Consumer code built with `...(x ? { k: x } : {})` is only assignable to the optional form.\n // When inputCase is set, the input schema uses `.nullish()` so the guard must reject both\n // null and undefined; otherwise `.optional()` only allows undefined.\n const guard = hasInputTransform ? `data.${inputKey} != null` : `data.${inputKey} !== undefined`;\n lines.push(` ...(${guard} ? { ${quoteKey(outputKey)}: data.${inputKey} } : {}),`);\n } else {\n lines.push(` ${quoteKey(outputKey)}: data.${inputKey},`);\n }\n }\n lines.push(`}));`);\n // When only outputCase is set, the developer-facing type is the schema's\n // pre-transform shape (camelCase). With inputCase, the post-transform\n // shape is what consumers work with.\n const typeSource = hasOutputTransform && !hasInputTransform ? 'input' : 'output';\n lines.push(`export type ${model.name} = z.${typeSource}<typeof ${model.name}>;`);\n return lines;\n }\n\n const body = renderFields(model.fields, model.mode);\n const bases = model.bases ?? [];\n if (bases.length > 0) {\n const head = bases[0]!;\n const tail = bases\n .slice(1)\n .map(b => `.extend(${b}.shape)`)\n .join('');\n lines.push(`export const ${model.name} = ${head}${tail}.extend({`);\n lines.push(...body.map(l => ` ${l}`));\n lines.push(`});`);\n } else {\n lines.push(`export const ${model.name} = ${wrapper}({`);\n lines.push(...body.map(l => ` ${l}`));\n lines.push(`});`);\n }\n\n lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`);\n return lines;\n}\n\n/** Builds a Zod extension chain \"Head.extend(B.shape).extend(C.shape)...\" for a list of base names,\n * applying a per-base name resolver (e.g. choosing \"BaseInput\" for bases that have an Input variant). */\nfunction buildExtendChain(bases: string[], resolveName: (b: string) => string): { head: string; tail: string } {\n const head = resolveName(bases[0]!);\n const tail = bases\n .slice(1)\n .map(b => `.extend(${resolveName(b)}.shape)`)\n .join('');\n return { head, tail };\n}\n\nfunction collectEffectiveWritableFieldNames(modelName: string, modelMap: Map<string, ModelNode>): Set<string> {\n const model = modelMap.get(modelName);\n if (!model || model.type) return new Set();\n const result = new Set<string>();\n for (const base of model.bases ?? []) {\n for (const f of collectEffectiveWritableFieldNames(base, modelMap)) result.add(f);\n }\n for (const field of model.fields) {\n if (field.visibility === 'readonly') result.delete(field.name);\n else result.add(field.name);\n }\n return result;\n}\n\nfunction generateThreeSchemaModel(\n model: ModelNode,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithWriteonly?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n): string[] {\n const lines: string[] = [];\n const name = model.name;\n\n lines.push(...generateComments(model, outPath));\n\n const wrapper = modeToWrapper(model.mode ?? 'strict');\n\n const allFields = model.fields;\n const hasWriteonly = allFields.some(f => f.visibility === 'writeonly');\n\n const bases = model.bases ?? [];\n\n // Base schema — all fields (used internally when a submodel extends this one).\n // Only needed when this model has writeonly fields; otherwise Base === Read.\n if (hasWriteonly) {\n const baseBody = renderFields(allFields, model.mode);\n if (bases.length > 0) {\n const { head, tail } = buildExtendChain(bases, b => (modelsWithWriteonly?.has(b) ? `${b}Base` : b));\n lines.push(`const ${name}Base = ${head}${tail}.extend({`);\n } else {\n lines.push(`const ${name}Base = ${wrapper}({`);\n }\n lines.push(...baseBody.map(l => ` ${l}`));\n lines.push(`});`);\n lines.push('');\n }\n\n // Read schema — omit writeonly fields; extends parent read schema\n const readFields = allFields.filter(f => f.visibility !== 'writeonly');\n const readBody = renderFields(readFields, model.mode);\n if (bases.length > 0) {\n const { head, tail } = buildExtendChain(bases, b => b);\n lines.push(`export const ${name} = ${head}${tail}.extend({`);\n } else {\n lines.push(`export const ${name} = ${wrapper}({`);\n }\n lines.push(...readBody.map(l => ` ${l}`));\n lines.push(`});`);\n lines.push(`export type ${name} = z.infer<typeof ${name}>;`);\n lines.push('');\n\n // Write schema — omit readonly fields (use Input variants for sub-type refs);\n // extends ParentInput if parent has an Input variant, else extends parent read schema\n const writeFields = allFields.filter(f => f.visibility !== 'readonly');\n const writeBody = modelsWithInput ? renderInputFields(writeFields, modelsWithInput, model.mode) : renderFields(writeFields, model.mode);\n // Fields that become readonly in this model but were writable in a base must be omitted from\n // the base Input schema — Zod's .extend() cannot remove inherited fields.\n const fieldsToOmit = new Set<string>();\n if (bases.length > 0 && modelMap) {\n for (const field of allFields) {\n if (field.visibility === 'readonly') {\n for (const base of bases) {\n if (collectEffectiveWritableFieldNames(base, modelMap).has(field.name)) {\n fieldsToOmit.add(field.name);\n break;\n }\n }\n }\n }\n }\n const omitClause =\n fieldsToOmit.size > 0\n ? `.omit({ ${[...fieldsToOmit].map(f => `${quoteKey(f)}: true`).join(', ')} })`\n : '';\n if (bases.length > 0) {\n const { head, tail } = buildExtendChain(bases, b => (modelsWithInput?.has(b) ? `${b}Input` : b));\n lines.push(`export const ${name}Input = ${head}${tail}${omitClause}.extend({`);\n } else {\n lines.push(`export const ${name}Input = ${wrapper}({`);\n }\n lines.push(...writeBody.map(l => ` ${l}`));\n lines.push(`});`);\n lines.push(`export type ${name}Input = z.infer<typeof ${name}Input>;`);\n\n return lines;\n}\n\n// ─── Fields ────────────────────────────────────────────────────────────────\n\nfunction camelToSnake(s: string): string {\n return s.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`);\n}\n\nfunction camelToPascal(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction applyCase(name: string, caseTransform: 'camel' | 'snake' | 'pascal' | undefined): string {\n if (!caseTransform || caseTransform === 'camel') return name;\n if (caseTransform === 'snake') return camelToSnake(name);\n return camelToPascal(name);\n}\n\nfunction renderFields(fields: FieldNode[], defaultMode?: ObjectMode): string[] {\n return fields.flatMap(f => renderField(f, defaultMode));\n}\n\nfunction renderFieldsAsPascalCase(fields: FieldNode[], defaultMode?: ObjectMode): string[] {\n return fields.map(f => {\n const pascalKey = camelToPascal(f.name);\n let expr = renderType(f.type, 'pascal', defaultMode);\n if (f.default !== undefined) {\n if (f.nullable) expr += '.nullable()';\n const dv = typeof f.default === 'string' ? `\"${escapeString(f.default)}\"` : String(f.default);\n expr += `.default(${dv})`;\n } else if (f.optional) {\n expr += '.nullish()';\n } else if (f.nullable) {\n expr += '.nullable()';\n }\n if (f.description) expr += `.describe(\"${escapeString(f.description)}\")`;\n return `${quoteKey(pascalKey)}: ${expr},`;\n });\n}\n\nfunction renderFieldsAsSnakeCase(fields: FieldNode[], defaultMode?: ObjectMode): string[] {\n return fields.map(f => {\n const snakeKey = camelToSnake(f.name);\n let expr = renderType(f.type, 'snake', defaultMode);\n if (f.default !== undefined) {\n if (f.nullable) expr += '.nullable()';\n const dv = typeof f.default === 'string' ? `\"${escapeString(f.default)}\"` : String(f.default);\n expr += `.default(${dv})`;\n } else if (f.optional) {\n // .nullish() accepts null or undefined from the API; the transform coerces null → undefined\n expr += '.nullish()';\n } else if (f.nullable) {\n expr += '.nullable()';\n }\n if (f.description) expr += `.describe(\"${escapeString(f.description)}\")`;\n return `${quoteKey(snakeKey)}: ${expr},`;\n });\n}\n\nfunction renderField(field: FieldNode, defaultMode?: ObjectMode): string[] {\n const lines: string[] = [];\n if (field.deprecated) lines.push('/** @deprecated */');\n\n let expr = renderType(field.type, undefined, defaultMode);\n\n if (field.nullable) expr += '.nullable()';\n if (field.default !== undefined) {\n const dv = typeof field.default === 'string' ? `\"${escapeString(field.default)}\"` : String(field.default);\n expr += `.default(${dv})`;\n } else if (field.optional) {\n expr += '.optional()';\n }\n if (field.description) expr += `.describe(\"${escapeString(field.description)}\")`;\n\n lines.push(`${quoteKey(field.name)}: ${expr},`);\n return lines;\n}\n\n// ─── Type rendering ────────────────────────────────────────────────────────\n\n/**\n * Render a ContractKit AST type node as a Zod schema expression string.\n *\n * @param parseCaseTransform - When set, generates a `.transform()` that remaps incoming keys from\n * the given casing (`'snake'` | `'pascal'`) to camelCase for `inlineObject` types.\n * @param defaultMode - Fallback object mode (`'strict'` | `'strip'` | `'loose'`) when the node\n * doesn't specify its own mode.\n */\nexport function renderType(type: ContractTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n switch (type.kind) {\n case 'scalar':\n return renderScalar(type);\n case 'array':\n return renderArray(type, parseCaseTransform, defaultMode);\n case 'tuple':\n return renderTuple(type);\n case 'record':\n return renderRecord(type);\n case 'enum':\n return renderEnum(type);\n case 'literal':\n return renderLiteral(type);\n case 'union':\n return renderUnion(type, parseCaseTransform, defaultMode);\n case 'discriminatedUnion':\n return renderDiscriminatedUnion(type, parseCaseTransform, defaultMode);\n case 'intersection':\n return renderIntersection(type, parseCaseTransform, defaultMode);\n case 'ref':\n return type.name;\n case 'lazy':\n return `z.lazy(() => ${renderType(type.inner, parseCaseTransform, defaultMode)})`;\n case 'inlineObject':\n return renderInlineObject(type, parseCaseTransform, defaultMode);\n default:\n return 'z.unknown()';\n }\n}\n\n/**\n * Render a regex source as a JS regex literal for `.regex(...)`. If the source already has\n * anchors (`^` at the start and/or an unescaped `$` at the end) we trust the user's intent\n * and emit it as-is; otherwise we wrap with `^...$` so contracts default to full-match\n * semantics. Forward slashes are always escaped since `/` is the literal delimiter.\n */\nfunction renderRegexLiteral(source: string): string {\n const body = source.replace(/\\//g, '\\\\/');\n if (regexHasAnchor(source)) return `/${body}/`;\n return `/^${body}$/`;\n}\n\nfunction regexHasAnchor(source: string): boolean {\n if (source.startsWith('^')) return true;\n if (!source.endsWith('$')) return false;\n // The trailing `$` is an anchor only if it isn't escaped — count immediately preceding\n // backslashes; an even count (including zero) means `$` is unescaped.\n let i = source.length - 2;\n let backslashes = 0;\n while (i >= 0 && source[i] === '\\\\') {\n backslashes++;\n i--;\n }\n return backslashes % 2 === 0;\n}\n\nfunction renderScalar(s: ScalarTypeNode): string {\n switch (s.name) {\n case 'string': {\n let e = 'z.string()';\n if (s.min !== undefined && s.max !== undefined) e += `.min(${s.min}).max(${s.max})`;\n else if (s.min !== undefined) e += `.min(${s.min})`;\n else if (s.max !== undefined) e += `.max(${s.max})`;\n if (s.len !== undefined) e += `.length(${s.len})`;\n if (s.regex) e += `.regex(${renderRegexLiteral(s.regex)})`;\n return e;\n }\n case 'number': {\n let e = 'z.coerce.number()';\n if (s.min !== undefined) e += `.min(${s.min})`;\n if (s.max !== undefined) e += `.max(${s.max})`;\n return e;\n }\n case 'int': {\n let e = 'z.coerce.number().int()';\n if (s.min !== undefined) e += `.min(${s.min})`;\n if (s.max !== undefined) e += `.max(${s.max})`;\n return e;\n }\n case 'bigint': {\n let inner = 'z.bigint()';\n if (s.min !== undefined) inner += `.min(${s.min}n)`;\n if (s.max !== undefined) inner += `.max(${s.max}n)`;\n return `z.preprocess((val) => typeof val === 'string' ? BigInt(val.replace(/n$/, '')) : val, ${inner})`;\n }\n case 'decimal': {\n // Deliberately no output `.transform()`: `isRevalidatable` in codegen-operation treats\n // every scalar as idempotent under re-parse, which `server.validateResponses` relies on.\n // Preprocess passes an already-`Decimal` value straight through, so parse(parse(x)) is\n // stable. Modelling this on `_ZodInterval` — which does transform — would break that.\n const checks: string[] = [];\n if (s.scale !== undefined) checks.push(`v.decimalPlaces() <= ${s.scale}`);\n if (s.min !== undefined) checks.push(`v.gte('${escapeString(String(s.min))}')`);\n if (s.max !== undefined) checks.push(`v.lte('${escapeString(String(s.max))}')`);\n if (checks.length === 0) return '_ZodDecimal';\n const messageParts: string[] = [];\n if (s.scale !== undefined) messageParts.push(`at most ${s.scale} decimal place${s.scale === 1 ? '' : 's'}`);\n if (s.min !== undefined) messageParts.push(`at least ${s.min}`);\n if (s.max !== undefined) messageParts.push(`at most ${s.max}`);\n return `_ZodDecimal.refine((v) => ${checks.join(' && ')}, { message: 'Must be ${escapeString(messageParts.join(', '))}' })`;\n }\n case 'boolean':\n return `z.preprocess((v) => v === 'true' ? true : v === 'false' ? false : v, z.boolean())`;\n case 'date': {\n const fmt = s.format ?? 'yyyy-MM-dd';\n return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a date in format ${escapeString(fmt)}' }))`;\n }\n case 'time': {\n const fmt = s.format ?? 'HH:mm:ss';\n return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a time in format ${escapeString(fmt)}' }))`;\n }\n case 'datetime':\n return '_ZodDatetime';\n case 'interval':\n return '_ZodInterval';\n case 'duration': {\n const validParts = [`val instanceof Duration && val.isValid`];\n if (s.min !== undefined) validParts.push(`val.toMillis() >= Duration.fromISO('${s.min}').toMillis()`);\n if (s.max !== undefined) validParts.push(`val.toMillis() <= Duration.fromISO('${s.max}').toMillis()`);\n const validation = validParts.join(' && ');\n let message = 'Must be an ISO 8601 duration';\n if (s.min !== undefined && s.max !== undefined) message += ` between ${s.min} and ${s.max}`;\n else if (s.min !== undefined) message += ` of at least ${s.min}`;\n else if (s.max !== undefined) message += ` of at most ${s.max}`;\n return `z.preprocess((val) => typeof val === 'string' ? Duration.fromISO(val) : val, z.custom<Duration>((val) => ${validation}, { message: '${message}' }))`;\n }\n case 'email':\n return 'z.email()';\n case 'url':\n return 'z.url()';\n case 'uuid':\n return 'z.uuid()';\n case 'unknown':\n return 'z.unknown()';\n case 'null':\n return 'z.null()';\n case 'object':\n return 'z.record(z.string(), z.unknown())';\n case 'binary':\n return '_ZodBinary';\n case 'json':\n return '_ZodJson';\n default: {\n const _exhaustive: never = s.name;\n throw new Error(`plugin-typescript: unmapped scalar '${String(_exhaustive)}' — add a case`);\n }\n }\n}\n\nfunction renderArray(a: ArrayTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n let e = `z.array(${renderType(a.item, parseCaseTransform, defaultMode)})`;\n if (a.min !== undefined) e += `.min(${a.min})`;\n if (a.max !== undefined) e += `.max(${a.max})`;\n return e;\n}\n\nfunction renderTuple(t: TupleTypeNode): string {\n return `z.tuple([${t.items.map(i => renderType(i)).join(', ')}])`;\n}\n\nfunction renderRecord(r: RecordTypeNode): string {\n return `z.record(${renderType(r.key)}, ${renderType(r.value)})`;\n}\n\nfunction renderEnum(e: EnumTypeNode): string {\n const vals = e.values.map(v => `\"${escapeString(v)}\"`).join(', ');\n return `z.enum([${vals}])`;\n}\n\nfunction renderLiteral(l: LiteralTypeNode): string {\n if (typeof l.value === 'string') return `z.literal(\"${escapeString(l.value)}\")`;\n return `z.literal(${l.value})`;\n}\n\nfunction renderUnion(u: UnionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n return `z.union([${u.members.map(m => renderType(m, parseCaseTransform, defaultMode)).join(', ')}])`;\n}\n\nfunction renderDiscriminatedUnion(u: DiscriminatedUnionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n return `z.discriminatedUnion(\"${escapeString(u.discriminator)}\", [${u.members.map(m => renderType(m, parseCaseTransform, defaultMode)).join(', ')}])`;\n}\n\nfunction renderIntersection(i: IntersectionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n const [first, ...rest] = i.members;\n // When the pattern is ref & (ref | inlineObject)*, use .extend() chains to\n // produce a single ZodObject. .and() breaks strict objects — each strict side\n // rejects the other side's keys during intersection parsing, and ZodIntersection\n // has no .strict() method.\n if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {\n let expr = first.name;\n for (const member of rest) {\n if (member.kind === 'ref') {\n expr += `.extend(${member.name}.shape)`;\n } else {\n const m = member as InlineObjectTypeNode;\n const fieldLines =\n parseCaseTransform === 'snake'\n ? renderFieldsAsSnakeCase(m.fields, defaultMode)\n .map(l => ` ${l}`)\n .join('\\n')\n : parseCaseTransform === 'pascal'\n ? renderFieldsAsPascalCase(m.fields, defaultMode)\n .map(l => ` ${l}`)\n .join('\\n')\n : m.fields\n .flatMap(f => renderField(f, defaultMode))\n .map(l => ` ${l}`)\n .join('\\n');\n expr += `.extend({\\n${fieldLines}\\n})`;\n }\n }\n return expr;\n }\n let expr = renderType(first!, parseCaseTransform, defaultMode);\n for (const member of rest) {\n expr += `.and(${renderType(member, parseCaseTransform, defaultMode)})`;\n }\n return expr;\n}\n\nfunction renderInlineObject(o: InlineObjectTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n const wrapper = modeToWrapper(o.mode ?? defaultMode ?? 'strict');\n if (parseCaseTransform === 'snake') {\n const snakeLines = renderFieldsAsSnakeCase(o.fields, defaultMode);\n const joined = snakeLines.map(l => ` ${l}`).join('\\n');\n const transformEntries = o.fields\n .map(f => {\n const snakeKey = camelToSnake(f.name);\n // Optional fields use .nullish() on input. Conditional spread (instead of `?? undefined`)\n // keeps the key optional in the inferred output type (`k?: T`) rather than widening to\n // required-nullable (`k: T | undefined`).\n if (f.optional) {\n return ` ...(data.${snakeKey} != null ? { ${quoteKey(f.name)}: data.${snakeKey} } : {}),`;\n }\n return ` ${quoteKey(f.name)}: data.${snakeKey},`;\n })\n .join('\\n');\n return `${wrapper}({\\n${joined}\\n}).transform(data => ({\\n${transformEntries}\\n}))`;\n }\n if (parseCaseTransform === 'pascal') {\n const pascalLines = renderFieldsAsPascalCase(o.fields, defaultMode);\n const joined = pascalLines.map(l => ` ${l}`).join('\\n');\n const transformEntries = o.fields\n .map(f => {\n const pascalKey = camelToPascal(f.name);\n if (f.optional) {\n return ` ...(data.${pascalKey} != null ? { ${quoteKey(f.name)}: data.${pascalKey} } : {}),`;\n }\n return ` ${quoteKey(f.name)}: data.${pascalKey},`;\n })\n .join('\\n');\n return `${wrapper}({\\n${joined}\\n}).transform(data => ({\\n${transformEntries}\\n}))`;\n }\n const fields = o.fields\n .flatMap(f => renderField(f, defaultMode))\n .map(l => ` ${l}`)\n .join('\\n');\n return `${wrapper}({\\n${fields}\\n})`;\n}\n\n// ─── Input type rendering ─────────────────────────────────────────────────\n\n/**\n * Like renderScalar, but coerces from string input (JSON wire format).\n * Used for Input (write) schemas where data arrives as JSON strings.\n */\nfunction renderInputScalar(s: ScalarTypeNode): string {\n return renderScalar(s);\n}\n\n/**\n * Like renderType, but substitutes model refs with their Input variant\n * when the model has visibility modifiers, and coerces scalars from strings.\n * Used for Input (write) schema fields so that sub-type references also\n * point to their Input variants.\n */\nexport function renderInputType(type: ContractTypeNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {\n switch (type.kind) {\n case 'scalar':\n return renderInputScalar(type);\n case 'ref':\n return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name;\n case 'array': {\n let e = `z.array(${renderInputType(type.item, modelsWithInput, defaultMode)})`;\n if (type.min !== undefined) e += `.min(${type.min})`;\n if (type.max !== undefined) e += `.max(${type.max})`;\n return e;\n }\n case 'tuple':\n return `z.tuple([${type.items.map(i => renderInputType(i, modelsWithInput, defaultMode)).join(', ')}])`;\n case 'record':\n return `z.record(${renderInputType(type.key, modelsWithInput, defaultMode)}, ${renderInputType(type.value, modelsWithInput, defaultMode)})`;\n case 'union':\n return `z.union([${type.members.map(m => renderInputType(m, modelsWithInput, defaultMode)).join(', ')}])`;\n case 'discriminatedUnion':\n return `z.discriminatedUnion(\"${escapeString(type.discriminator)}\", [${type.members.map(m => renderInputType(m, modelsWithInput, defaultMode)).join(', ')}])`;\n case 'intersection': {\n const [first, ...rest] = type.members;\n if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {\n let expr = modelsWithInput?.has(first.name) ? `${first.name}Input` : first.name;\n for (const member of rest) {\n if (member.kind === 'ref') {\n const name = modelsWithInput?.has(member.name) ? `${member.name}Input` : member.name;\n expr += `.extend(${name}.shape)`;\n } else {\n const fieldLines = (member as InlineObjectTypeNode).fields\n .map(f => ` ${renderInputField(f, modelsWithInput ?? new Set(), defaultMode)}`)\n .join('\\n');\n expr += `.extend({\\n${fieldLines}\\n})`;\n }\n }\n return expr;\n }\n let expr = renderInputType(first!, modelsWithInput, defaultMode);\n for (const member of rest) {\n expr += `.and(${renderInputType(member, modelsWithInput, defaultMode)})`;\n }\n return expr;\n }\n case 'lazy':\n return `z.lazy(() => ${renderInputType(type.inner, modelsWithInput, defaultMode)})`;\n case 'inlineObject': {\n const fields = type.fields\n .flatMap(f => renderInputField(f, modelsWithInput ?? new Set(), defaultMode))\n .map(l => ` ${l}`)\n .join('\\n');\n return `${modeToWrapper(type.mode ?? defaultMode ?? 'strict')}({\\n${fields}\\n})`;\n }\n default:\n return renderType(type, undefined, defaultMode);\n }\n}\n\nfunction renderInputField(field: FieldNode, modelsWithInput: Set<string>, defaultMode?: ObjectMode): string[] {\n const lines: string[] = [];\n if (field.deprecated) lines.push('/** @deprecated */');\n\n let expr = renderInputType(field.type, modelsWithInput, defaultMode);\n\n if (field.nullable) expr += '.nullable()';\n if (field.default !== undefined) {\n const dv = typeof field.default === 'string' ? `\"${escapeString(field.default)}\"` : String(field.default);\n expr += `.default(${dv})`;\n } else if (field.optional) {\n expr += '.optional()';\n }\n if (field.description) expr += `.describe(\"${escapeString(field.description)}\")`;\n\n lines.push(`${quoteKey(field.name)}: ${expr},`);\n return lines;\n}\n\nfunction renderInputFields(fields: FieldNode[], modelsWithInput: Set<string>, defaultMode?: ObjectMode): string[] {\n return fields.flatMap(f => renderInputField(f, modelsWithInput, defaultMode));\n}\n\n// ─── Query type rendering ─────────────────────────────────────────────────\n\n/**\n * Like renderType, but wraps array types with z.preprocess to handle\n * query strings where a single value arrives as a string instead of a string[].\n * Also uses Input variants for model refs when modelsWithInput is provided.\n */\nexport function renderQueryType(type: ContractTypeNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {\n switch (type.kind) {\n case 'array': {\n const inner = modelsWithInput ? renderInputType(type, modelsWithInput, defaultMode) : renderType(type, undefined, defaultMode);\n return `z.preprocess((v) => typeof v === 'string' ? v.split(',') : v, ${inner})`;\n }\n case 'inlineObject': {\n const fields = type.fields.map(f => ` ${renderQueryField(f, modelsWithInput, defaultMode)}`).join('\\n');\n return `${modeToWrapper(type.mode ?? defaultMode ?? 'strict')}({\\n${fields}\\n})`;\n }\n case 'intersection': {\n const [first, ...rest] = type.members;\n if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {\n let expr = modelsWithInput?.has(first.name) ? `${first.name}Input` : first.name;\n for (const member of rest) {\n if (member.kind === 'ref') {\n const name = modelsWithInput?.has(member.name) ? `${member.name}Input` : member.name;\n expr += `.extend(${name}.shape)`;\n } else {\n const fieldLines = (member as InlineObjectTypeNode).fields\n .map(f => ` ${renderQueryField(f, modelsWithInput, defaultMode)}`)\n .join('\\n');\n expr += `.extend({\\n${fieldLines}\\n})`;\n }\n }\n return expr;\n }\n let expr = renderQueryType(first!, modelsWithInput, defaultMode);\n for (const member of rest) {\n expr += `.and(${renderQueryType(member, modelsWithInput, defaultMode)})`;\n }\n return expr;\n }\n case 'ref':\n return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name;\n default:\n return modelsWithInput ? renderInputType(type, modelsWithInput, defaultMode) : renderType(type, undefined, defaultMode);\n }\n}\n\nfunction renderQueryField(field: FieldNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {\n let expr =\n field.type.kind === 'array'\n ? renderQueryType(field.type, modelsWithInput, defaultMode)\n : modelsWithInput\n ? renderInputType(field.type, modelsWithInput, defaultMode)\n : renderType(field.type, undefined, defaultMode);\n\n if (field.nullable) expr += '.nullable()';\n if (field.default !== undefined) {\n const dv = typeof field.default === 'string' ? `\"${escapeString(field.default)}\"` : String(field.default);\n expr += `.default(${dv})`;\n } else if (field.optional) {\n expr += '.optional()';\n }\n if (field.description) expr += `.describe(\"${escapeString(field.description)}\")`;\n\n return `${quoteKey(field.name)}: ${expr},`;\n}\n\nfunction isValidIdentifier(name: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);\n}\n\nfunction quoteKey(name: string): string {\n return isValidIdentifier(name) ? name : `'${name}'`;\n}\n\n// ─── String escaping ──────────────────────────────────────────────────────\n\nfunction escapeString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r');\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction rootNeedsDateTime(root: ContractRootNode): boolean {\n return root.models.some(m => (m.type && typeNeedsDateTime(m.type)) || m.fields.some(f => typeNeedsDateTime(f.type)));\n}\n\n/** Returns true if `type` (recursively) contains a scalar with the given `name`. */\nexport function typeNeedsScalar(type: ContractTypeNode, name: string): boolean {\n switch (type.kind) {\n case 'scalar':\n return type.name === name;\n case 'array':\n return typeNeedsScalar(type.item, name);\n case 'tuple':\n return type.items.some(i => typeNeedsScalar(i, name));\n case 'record':\n return typeNeedsScalar(type.key, name) || typeNeedsScalar(type.value, name);\n case 'union':\n return type.members.some(m => typeNeedsScalar(m, name));\n case 'discriminatedUnion':\n return type.members.some(m => typeNeedsScalar(m, name));\n case 'intersection':\n return type.members.some(m => typeNeedsScalar(m, name));\n case 'lazy':\n return typeNeedsScalar(type.inner, name);\n case 'inlineObject':\n return type.fields.some(f => typeNeedsScalar(f.type, name));\n default:\n return false;\n }\n}\n\n/** Returns true if any model in `root` uses a scalar with the given `name`. */\nexport function rootNeedsScalar(root: ContractRootNode, name: string): boolean {\n return root.models.some(m => (m.type && typeNeedsScalar(m.type, name)) || m.fields.some(f => typeNeedsScalar(f.type, name)));\n}\n\n/** Returns true if `type` (recursively) contains a `date`, `time`, or `datetime` scalar. */\nexport function typeNeedsDateTime(type: ContractTypeNode): boolean {\n switch (type.kind) {\n case 'scalar':\n return type.name === 'date' || type.name === 'time' || type.name === 'datetime';\n case 'array':\n return typeNeedsDateTime(type.item);\n case 'union':\n return type.members.some(typeNeedsDateTime);\n case 'discriminatedUnion':\n return type.members.some(typeNeedsDateTime);\n case 'intersection':\n return type.members.some(typeNeedsDateTime);\n case 'inlineObject':\n return type.fields.some(f => typeNeedsDateTime(f.type));\n default:\n return false;\n }\n}\n\n/** Collect model names referenced in `root` that are not defined locally (need to be imported). */\nexport function collectExternalRefs(root: ContractRootNode): string[] {\n const localNames = new Set(root.models.map(m => m.name));\n const refs = new Set<string>();\n\n for (const model of root.models) {\n if (model.bases?.[0] && !localNames.has(model.bases?.[0])) refs.add(model.bases?.[0]);\n if (model.type) collectTypeRefs(model.type, refs);\n for (const field of model.fields) {\n collectTypeRefs(field.type, refs);\n }\n }\n\n for (const name of localNames) refs.delete(name);\n return [...refs].sort();\n}\n\n/** Collect external Input variant refs needed for Input schema fields. */\nexport function collectExternalInputRefs(root: ContractRootNode, modelsWithInput: Set<string>): string[] {\n const localNames = new Set(root.models.map(m => m.name));\n const refs = new Set<string>();\n\n for (const model of root.models) {\n if (!modelsWithInput.has(model.name)) continue;\n // Type alias: collect Input refs from the aliased type expression.\n if (model.type) {\n collectInputTypeRefs(model.type, refs, modelsWithInput);\n continue;\n }\n // When a model extends an external parent that has an Input variant,\n // the write schema extends ParentInput — so we need to import it.\n if (model.bases?.[0] && modelsWithInput.has(model.bases?.[0]) && !localNames.has(model.bases?.[0])) {\n refs.add(`${model.bases?.[0]}Input`);\n }\n const writeFields = model.fields.filter(f => f.visibility !== 'readonly');\n for (const field of writeFields) {\n collectInputTypeRefs(field.type, refs, modelsWithInput);\n }\n }\n\n // Remove locally defined Input variants (generated in this file)\n for (const name of localNames) {\n refs.delete(`${name}Input`);\n }\n\n return [...refs].sort();\n}\n\nfunction collectInputTypeRefs(type: ContractTypeNode, out: Set<string>, modelsWithInput: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`);\n break;\n case 'array':\n collectInputTypeRefs(type.item, out, modelsWithInput);\n break;\n case 'tuple':\n type.items.forEach(i => collectInputTypeRefs(i, out, modelsWithInput));\n break;\n case 'record':\n collectInputTypeRefs(type.key, out, modelsWithInput);\n collectInputTypeRefs(type.value, out, modelsWithInput);\n break;\n case 'union':\n type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));\n break;\n case 'discriminatedUnion':\n type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));\n break;\n case 'intersection':\n type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));\n break;\n case 'lazy':\n collectInputTypeRefs(type.inner, out, modelsWithInput);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectInputTypeRefs(f.type, out, modelsWithInput));\n break;\n }\n}\n\n/**\n * Topologically sort models so dependencies are emitted before dependents.\n * Falls back to source order for cycles (which would need z.lazy at runtime).\n */\nexport function topoSortModels(models: ModelNode[]): ModelNode[] {\n const localNames = new Set(models.map(m => m.name));\n const modelMap = new Map(models.map(m => [m.name, m]));\n\n // Build adjacency: model name → set of local model names it depends on\n const deps = new Map<string, Set<string>>();\n for (const model of models) {\n const refs = new Set<string>();\n if (model.bases?.[0] && localNames.has(model.bases?.[0])) refs.add(model.bases?.[0]);\n if (model.type) collectTypeRefs(model.type, refs);\n for (const field of model.fields) {\n collectTypeRefs(field.type, refs);\n }\n // Keep only local dependencies\n const localDeps = new Set<string>();\n for (const r of refs) {\n if (localNames.has(r) && r !== model.name) localDeps.add(r);\n }\n deps.set(model.name, localDeps);\n }\n\n // Kahn's algorithm\n const inDegree = new Map<string, number>();\n for (const name of localNames) inDegree.set(name, 0);\n for (const [, d] of deps) {\n for (const dep of d) {\n inDegree.set(dep, (inDegree.get(dep) ?? 0) + 1);\n }\n }\n\n // Note: inDegree counts how many models *depend on* this model,\n // but for Kahn's we need how many dependencies each model has.\n // Re-do: inDegree = number of unresolved deps for each model.\n const remaining = new Map<string, Set<string>>();\n for (const [name, d] of deps) {\n remaining.set(name, new Set(d));\n }\n\n const queue: string[] = [];\n for (const name of localNames) {\n if (remaining.get(name)!.size === 0) queue.push(name);\n }\n\n const sorted: ModelNode[] = [];\n while (queue.length > 0) {\n const name = queue.shift()!;\n sorted.push(modelMap.get(name)!);\n // Remove this model from all dependents' remaining sets\n for (const [other, rem] of remaining) {\n if (rem.delete(name) && rem.size === 0) {\n queue.push(other);\n }\n }\n }\n\n // Append any models not yet emitted (cycles)\n for (const model of models) {\n if (!sorted.includes(model)) sorted.push(model);\n }\n\n return sorted;\n}\n\n/**\n * Resolve the import path for an external model reference.\n * When a codegen context is available, computes the correct relative path\n * from the current file to the referenced model's output file.\n * Falls back to same-directory PascalCase → dot.case convention.\n */\nexport function resolveImportPath(refName: string, context?: ContractCodegenContext): string {\n if (context) {\n const refOutPath = context.modelOutPaths.get(refName);\n if (refOutPath) {\n const fromDir = dirname(context.currentOutPath);\n let rel = relative(fromDir, refOutPath);\n // Replace .ts extension with .js for ESM imports\n rel = rel.replace(/\\.ts$/, '.js');\n // Ensure relative path starts with ./ or ../\n if (!rel.startsWith('.')) rel = './' + rel;\n return rel;\n }\n }\n // Fallback: assume same directory, use PascalCase → dot.case convention\n const moduleName = pascalToDotCase(refName);\n return `./${moduleName}.js`;\n}\n\n/** Convert PascalCase to dot-separated lowercase: CounterpartyAccount → counterparty.account */\nexport function pascalToDotCase(name: string): string {\n return name.replace(/([a-z0-9])([A-Z])/g, '$1.$2').toLowerCase();\n}\n","import type { ContractTypeNode, FieldNode, ScalarTypeNode } from '@contractkit/core';\n\n/** Declaration emitted into generated files that reference the `json` scalar. */\nexport const JSON_VALUE_TYPE_DECL = 'export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };';\n\n/** Quote a property name unless it is already a valid bare TypeScript identifier. */\nexport function quoteKey(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`;\n}\n\n/** Escape text for safe inclusion inside a JSDoc block comment: neutralize the\n * block-comment terminator sequence and split embedded newlines into separate\n * ` * ` continuation lines. Returns the content lines (WITHOUT a leading prefix). */\nexport function escapeJsDocLines(text: string): string[] {\n return text.replace(/\\*\\//g, '*\\\\/').split('\\n');\n}\n\n/** Escape a string for inclusion inside a single-quoted TypeScript string literal. */\nexport function escapeSingleQuoted(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r');\n}\n\n/** Convert an HTTP header name (e.g. `preference-applied`, `X-Request-ID`, `ETag`) to camelCase for use as a JS property. */\nexport function headerNameToProperty(name: string): string {\n const parts = name.split(/[-_]/).filter(Boolean);\n return parts\n .map((p, i) => {\n const lower = p.toLowerCase();\n return i === 0 ? lower : lower.charAt(0).toUpperCase() + lower.slice(1);\n })\n .join('');\n}\n\n// ─── TypeScript type rendering ────────────────────────────────────────────\n\n/**\n * Which runtime the emitted types describe. A few scalars have no single correct TypeScript\n * type: `binary` is a `Blob` in a fetch-based client but a `Buffer` on a Node server. Everything\n * else renders identically for both targets. Defaults to `'client'`.\n */\nexport type TsRenderTarget = 'client' | 'server';\n\n/**\n * Render a contract type as a plain TypeScript type expression. Model refs render as their bare\n * name; use `renderInputTsType` / `renderOutputTsType` to substitute Input/Output variants.\n *\n * @param target Runtime the type describes; only `binary` differs (`Buffer` vs `Blob`).\n */\nexport function renderTsType(type: ContractTypeNode, target: TsRenderTarget = 'client'): string {\n switch (type.kind) {\n case 'scalar':\n return renderTsScalar(type.name, target);\n case 'array': {\n const inner = renderTsType(type.item, target);\n const needsParens =\n type.item.kind === 'union' ||\n type.item.kind === 'discriminatedUnion' ||\n type.item.kind === 'intersection' ||\n type.item.kind === 'enum';\n return needsParens ? `(${inner})[]` : `${inner}[]`;\n }\n case 'tuple':\n return `[${type.items.map(i => renderTsType(i, target)).join(', ')}]`;\n case 'record':\n return `Record<${renderTsType(type.key, target)}, ${renderTsType(type.value, target)}>`;\n case 'enum':\n return type.values.map(v => `'${escapeSingleQuoted(v)}'`).join(' | ');\n case 'literal':\n return typeof type.value === 'string' ? `'${escapeSingleQuoted(type.value)}'` : String(type.value);\n case 'union':\n return type.members.map(m => renderTsType(m, target)).join(' | ');\n case 'discriminatedUnion':\n return type.members.map(m => renderTsType(m, target)).join(' | ');\n case 'intersection':\n return type.members.map(m => renderTsType(m, target)).join(' & ');\n case 'ref':\n return type.name;\n case 'lazy':\n return renderTsType(type.inner, target);\n case 'inlineObject':\n return renderTsInlineObject(type.fields, target);\n default:\n return 'unknown';\n }\n}\n\nfunction renderTsScalar(name: ScalarTypeNode['name'], target: TsRenderTarget): string {\n switch (name) {\n case 'string':\n case 'email':\n case 'url':\n case 'uuid':\n return 'string';\n case 'number':\n case 'int':\n return 'number';\n case 'bigint':\n return 'bigint';\n case 'decimal':\n // The one scalar whose wire view and server view agree — see the note on this\n // function and on `serverTsScalar`. A `decimal` travels as a quoted string, and both\n // the router (via `_ZodDecimal`) and the SDK (via the generated `reviveX` functions)\n // hand the developer a real `Decimal`, so there is no `target` split to make.\n return 'Decimal';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n case 'duration':\n case 'interval':\n return 'string';\n case 'null':\n return 'null';\n case 'unknown':\n return 'unknown';\n case 'object':\n return 'Record<string, unknown>';\n case 'binary':\n // Node servers hand the handler a Buffer (matching `_ZodBinary`); fetch clients get a Blob.\n return target === 'server' ? 'Buffer' : 'Blob';\n case 'json':\n return 'JsonValue';\n default: {\n const _exhaustive: never = name;\n throw new Error(`plugin-typescript: unmapped scalar '${String(_exhaustive)}' — add a case`);\n }\n }\n}\n\nfunction renderTsInlineObject(fields: FieldNode[], target: TsRenderTarget): string {\n const entries = fields.map(f => {\n const opt = f.optional ? '?' : '';\n return `${quoteKey(f.name)}${opt}: ${renderTsType(f.type, target)}`;\n });\n return `{ ${entries.join('; ')} }`;\n}\n\n/**\n * Like renderTsType, but substitutes model refs with their Input variant\n * when the model has visibility modifiers. Used for request-side types\n * (body, params, query, headers).\n *\n * @param target Runtime the type describes; only `binary` differs (`Buffer` vs `Blob`).\n */\nexport function renderInputTsType(type: ContractTypeNode, modelsWithInput?: Set<string>, target: TsRenderTarget = 'client'): string {\n if (!modelsWithInput || modelsWithInput.size === 0) return renderTsType(type, target);\n switch (type.kind) {\n case 'ref':\n return modelsWithInput.has(type.name) ? `${type.name}Input` : type.name;\n case 'array': {\n const inner = renderInputTsType(type.item, modelsWithInput, target);\n const needsParens =\n type.item.kind === 'union' ||\n type.item.kind === 'discriminatedUnion' ||\n type.item.kind === 'intersection' ||\n type.item.kind === 'enum';\n return needsParens ? `(${inner})[]` : `${inner}[]`;\n }\n case 'intersection':\n return type.members.map(m => renderInputTsType(m, modelsWithInput, target)).join(' & ');\n case 'union':\n return type.members.map(m => renderInputTsType(m, modelsWithInput, target)).join(' | ');\n case 'discriminatedUnion':\n return type.members.map(m => renderInputTsType(m, modelsWithInput, target)).join(' | ');\n case 'inlineObject':\n return `{ ${type.fields.map(f => `${quoteKey(f.name)}${f.optional ? '?' : ''}: ${renderInputTsType(f.type, modelsWithInput, target)}`).join('; ')} }`;\n case 'lazy':\n return renderInputTsType(type.inner, modelsWithInput, target);\n default:\n return renderTsType(type, target);\n }\n}\n\n/**\n * Like renderTsType, but substitutes model refs with their Output variant\n * (post-transform wire shape) when the model has format(output=...) or\n * transitively references one. Used for response-side types in routers\n * and SDK return types.\n *\n * @param target Runtime the type describes; only `binary` differs (`Buffer` vs `Blob`).\n */\nexport function renderOutputTsType(type: ContractTypeNode, modelsWithOutput?: Set<string>, target: TsRenderTarget = 'client'): string {\n if (!modelsWithOutput || modelsWithOutput.size === 0) return renderTsType(type, target);\n switch (type.kind) {\n case 'ref':\n return modelsWithOutput.has(type.name) ? `${type.name}Output` : type.name;\n case 'array': {\n const inner = renderOutputTsType(type.item, modelsWithOutput, target);\n const needsParens =\n type.item.kind === 'union' ||\n type.item.kind === 'discriminatedUnion' ||\n type.item.kind === 'intersection' ||\n type.item.kind === 'enum';\n return needsParens ? `(${inner})[]` : `${inner}[]`;\n }\n case 'intersection':\n return type.members.map(m => renderOutputTsType(m, modelsWithOutput, target)).join(' & ');\n case 'union':\n return type.members.map(m => renderOutputTsType(m, modelsWithOutput, target)).join(' | ');\n case 'discriminatedUnion':\n return type.members.map(m => renderOutputTsType(m, modelsWithOutput, target)).join(' | ');\n case 'inlineObject':\n return `{ ${type.fields.map(f => `${quoteKey(f.name)}${f.optional ? '?' : ''}: ${renderOutputTsType(f.type, modelsWithOutput, target)}`).join('; ')} }`;\n case 'lazy':\n return renderOutputTsType(type.inner, modelsWithOutput, target);\n default:\n return renderTsType(type, target);\n }\n}\n","/**\n * The emitted decimal.js runtime shared by every generator that renders a `decimal` scalar.\n *\n * `_ZodBinary`/`_ZodDatetime`/`_ZodInterval` are duplicated as literals across codegen-contract,\n * codegen-operation and codegen-mcp, and have already drifted once (the three files emit their\n * luxon import lists in two different orders). The decimal runtime is defined once here so the\n * three call sites cannot disagree about it; each still decides *whether* to emit it with its own\n * detection strategy, which is the part that legitimately differs between them.\n */\n\n/**\n * The decimal.js import — **named, not default**.\n *\n * `decimal.d.ts` declares `Decimal` three times over: a class, a namespace, and a function, with\n * `export default Decimal` alongside. Under the `NodeNext` resolution the scaffolded SDK uses\n * (`module: NodeNext` + `\"type\": \"module\"`), the default export resolves to the *namespace*\n * meaning, so `import Decimal from 'decimal.js'` fails to compile with \"Cannot use namespace\n * 'Decimal' as a type\" and \"Property 'set' does not exist\". The named import binds the merged\n * class and is the only form that typechecks.\n */\nexport const DECIMAL_IMPORT = `import { Decimal } from 'decimal.js';`;\n\n/**\n * Global decimal.js configuration, emitted in **every** file that imports `Decimal` — plain-types\n * mode included, where there is no Zod schema but `String(value)` and `JSON.stringify` still run.\n *\n * Load-bearing, not cosmetic. decimal.js switches to exponential\n * notation outside `toExpNeg`/`toExpPos` (defaults -7/21), so without it `new Decimal('0.00000001')`\n * serializes as `\"1e-8\"` and any peer validating `^-?\\d+(\\.\\d+)?$` rejects it. It is the only lever\n * that reaches the `JSON.stringify` Koa runs over `ctx.body`, which we do not otherwise control.\n *\n */\nexport const DECIMAL_CONFIG_LINE = `Decimal.set({ toExpNeg: -9e15, toExpPos: 9e15 });`;\n\n/**\n * The Zod schema for a `decimal`.\n *\n * Deliberately has no output `.transform()`. `isRevalidatable` in codegen-operation treats every\n * scalar as idempotent under re-parse — the assumption `server.validateResponses` rests on — and\n * preprocess passes an already-`Decimal` value through untouched, so it holds.\n *\n * A raw JSON number fails validation rather than being coerced: by the time one reaches us it has\n * already been through an IEEE-754 double, which is the loss this scalar exists to prevent. Bad\n * strings are returned unchanged from preprocess rather than throwing, so they surface as an\n * ordinary Zod issue instead of a `DecimalError` escaping the parse.\n */\nexport const DECIMAL_ZOD_SCHEMA_LINE = `const _ZodDecimal = z.preprocess((val) => { if (typeof val !== 'string') return val; try { return new Decimal(val); } catch { return val; } }, z.custom<Decimal>((val) => Decimal.isDecimal(val), { message: 'Must be an exact decimal sent as a quoted string, e.g. \"1250.00\"' }));`;\n\n/** The decimal runtime for a file that also holds Zod schemas, in emission order. */\nexport const DECIMAL_PRELUDE_LINES: readonly string[] = [DECIMAL_CONFIG_LINE, DECIMAL_ZOD_SCHEMA_LINE];\n","import type { ContractTypeNode, FieldNode, ModelNode } from '@contractkit/core';\n\n/**\n * Emitters for the `reviveX` functions that rehydrate `decimal` fields in an SDK response.\n *\n * A decimal arrives as a quoted JSON string, but the generated types say `Decimal`, so something\n * has to construct one. The SDK cannot do it the way `bigint` does — `bigIntReviver` works only\n * because bigint invented a tagged `\"123n\"` wire encoding, and `\"10.50\"` is indistinguishable from\n * an ordinary string without knowing the schema. Nor can it re-parse the response through the Zod\n * schema: `XOutput` is a `z.output<>` type alias with no runtime value behind it, and models\n * default to `z.strictObject`, so any field the server added would throw in every deployed client.\n *\n * So the knowledge lives in generated code instead: one function per model that walks to the field\n * positions a decimal can occupy and converts in place. Mutating rather than rebuilding keeps the\n * cost proportional to the number of decimal fields, and preserves unknown server-added keys —\n * the forward compatibility a strict re-parse would destroy.\n *\n * Emitted from the AST, so zod mode and plain-types mode produce identical runtime behaviour.\n */\n\nexport interface ReviveCodegenOptions {\n /** Models that carry a decimal, directly or transitively. Only these get a reviver. */\n modelsWithDecimal: Set<string>;\n /** Models with an `Output` variant, which need a second reviver keyed by the output casing. */\n modelsWithOutput?: Set<string>;\n /** Every model in scope, for resolving discriminated-union members to their literal tag. */\n modelMap?: Map<string, ModelNode>;\n}\n\n/** The per-file coercion helper. Emitted once in any file that declares a reviver. */\nexport const DECIMAL_COERCE_DECL = [\n `const __dec = (v: unknown, path: string): Decimal => {`,\n ` if (typeof v !== 'string') {`,\n ` throw new TypeError(\\`ContractKit: expected a decimal string at '\\${path}', received \\${typeof v} — decimals must be sent as quoted JSON strings.\\`);`,\n ` }`,\n ` try {`,\n ` return new Decimal(v);`,\n ` } catch {`,\n ` throw new TypeError(\\`ContractKit: '\\${v}' at '\\${path}' is not a valid decimal.\\`);`,\n ` }`,\n `};`,\n];\n\n/** `reviveInvoice` / `reviveInvoiceOutput`. */\nexport function reviveFnName(model: string, variant: 'base' | 'output' = 'base'): string {\n return `revive${model}${variant === 'output' ? 'Output' : ''}`;\n}\n\nfunction applyCase(name: string, caseTransform: 'camel' | 'snake' | 'pascal' | undefined): string {\n if (!caseTransform || caseTransform === 'camel') return name;\n if (caseTransform === 'snake') return name.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`);\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n/** Whether a type reaches a decimal, following refs through `modelsWithDecimal`. */\nexport function typeReachesDecimal(type: ContractTypeNode, opts: ReviveCodegenOptions): boolean {\n switch (type.kind) {\n case 'scalar':\n return type.name === 'decimal';\n case 'ref':\n return opts.modelsWithDecimal.has(type.name);\n case 'array':\n return typeReachesDecimal(type.item, opts);\n case 'lazy':\n return typeReachesDecimal(type.inner, opts);\n case 'tuple':\n return type.items.some(t => typeReachesDecimal(t, opts));\n case 'record':\n return typeReachesDecimal(type.value, opts);\n case 'union':\n case 'discriminatedUnion':\n case 'intersection':\n return type.members.some(t => typeReachesDecimal(t, opts));\n case 'inlineObject':\n return type.fields.some(f => typeReachesDecimal(f.type, opts));\n default:\n return false;\n }\n}\n\n/** Fresh local names, so nested loops in one function body cannot collide. */\nclass Scope {\n private n = 0;\n next(prefix: string): string {\n return `__${prefix}${this.n++}`;\n }\n}\n\n/**\n * Statements that hydrate `slot` — an assignable expression — in place.\n *\n * `path` is threaded purely for the error message; it is what tells a consumer *which* field of a\n * large response was malformed.\n */\nfunction emit(slot: string, type: ContractTypeNode, path: string, opts: ReviveCodegenOptions, scope: Scope, variant: 'base' | 'output'): string[] {\n switch (type.kind) {\n case 'scalar':\n return type.name === 'decimal' ? [`${slot} = __dec(${slot}, '${path}');`] : [];\n\n case 'ref':\n return opts.modelsWithDecimal.has(type.name) ? [`${reviveRefName(type.name, opts, variant)}(${slot} as never);`] : [];\n\n case 'lazy':\n return emit(slot, type.inner, path, opts, scope, variant);\n\n case 'array': {\n if (!typeReachesDecimal(type.item, opts)) return [];\n const arr = scope.next('a');\n const i = scope.next('i');\n const inner = emit(`${arr}[${i}]`, type.item, `${path}[]`, opts, scope, variant);\n return [\n `{`,\n ` const ${arr} = ${slot} as unknown[];`,\n ` for (let ${i} = 0; ${i} < ${arr}.length; ${i}++) {`,\n ...inner.map(l => ` ${l}`),\n ` }`,\n `}`,\n ];\n }\n\n case 'tuple': {\n const items = type.items.flatMap((t, idx) =>\n typeReachesDecimal(t, opts) ? emit(`(${slot} as unknown[])[${idx}]`, t, `${path}[${idx}]`, opts, scope, variant) : [],\n );\n return items;\n }\n\n case 'record': {\n if (!typeReachesDecimal(type.value, opts)) return [];\n const rec = scope.next('r');\n const k = scope.next('k');\n const inner = emit(`${rec}[${k}]`, type.value, `${path}{}`, opts, scope, variant);\n return [\n `{`,\n ` const ${rec} = ${slot} as Record<string, unknown>;`,\n ` for (const ${k} of Object.keys(${rec})) {`,\n ...inner.map(l => ` ${l}`),\n ` }`,\n `}`,\n ];\n }\n\n case 'inlineObject': {\n const relevant = type.fields.filter(f => typeReachesDecimal(f.type, opts));\n if (relevant.length === 0) return [];\n const obj = scope.next('o');\n const body = relevant.flatMap(f => fieldStatements(obj, f, path, opts, scope, variant, undefined));\n return [`{`, ` const ${obj} = ${slot} as Record<string, unknown>;`, ...body.map(l => ` ${l}`), `}`];\n }\n\n case 'intersection':\n return type.members.flatMap(m => emit(slot, m, path, opts, scope, variant));\n\n case 'union': {\n // `validateDecimal` rejects a decimal in a union with more than one non-null member, so\n // anything reaching here is `T | null`: hydrate the single real member behind a guard.\n const real = type.members.filter(m => !(m.kind === 'scalar' && m.name === 'null'));\n const target = real.find(m => typeReachesDecimal(m, opts));\n if (!target) return [];\n const inner = emit(slot, target, path, opts, scope, variant);\n return [`if (${slot} != null) {`, ...inner.map(l => ` ${l}`), `}`];\n }\n\n case 'discriminatedUnion': {\n const branches: string[] = [];\n const disc = scope.next('d');\n for (const member of type.members) {\n if (!typeReachesDecimal(member, opts)) continue;\n const tag = discriminatorTag(member, type.discriminator, opts);\n const inner = emit(slot, member, path, opts, scope, variant);\n if (inner.length === 0) continue;\n if (tag === undefined) {\n // No resolvable literal: hydrating unconditionally could apply the wrong arm's\n // shape, so skip it rather than risk corrupting a sibling member's field.\n continue;\n }\n branches.push(` if (${disc} === ${JSON.stringify(tag)}) {`, ...inner.map(l => ` ${l}`), ` }`);\n }\n if (branches.length === 0) return [];\n return [`{`, ` const ${disc} = (${slot} as Record<string, unknown>)[${JSON.stringify(type.discriminator)}];`, ...branches, `}`];\n }\n\n default:\n return [];\n }\n}\n\n/** The literal value that selects `member` in a discriminated union, when it can be resolved. */\nfunction discriminatorTag(member: ContractTypeNode, discriminator: string, opts: ReviveCodegenOptions): string | number | boolean | undefined {\n const fields: FieldNode[] | undefined =\n member.kind === 'inlineObject' ? member.fields : member.kind === 'ref' ? opts.modelMap?.get(member.name)?.fields : undefined;\n const field = fields?.find(f => f.name === discriminator);\n if (field?.type.kind === 'literal') return field.type.value;\n // A single-valued enum is the other way a discriminator gets written.\n if (field?.type.kind === 'enum' && field.type.values.length === 1) return field.type.values[0];\n return undefined;\n}\n\n/** Statements for one field of an object held in `objVar`. */\nfunction fieldStatements(\n objVar: string,\n field: FieldNode,\n path: string,\n opts: ReviveCodegenOptions,\n scope: Scope,\n variant: 'base' | 'output',\n outputCase: 'camel' | 'snake' | 'pascal' | undefined,\n): string[] {\n const key = variant === 'output' ? applyCase(field.name, outputCase) : field.name;\n const slot = `${objVar}[${JSON.stringify(key)}]`;\n const inner = emit(slot, field.type, `${path}.${key}`, opts, scope, variant);\n if (inner.length === 0) return [];\n // A union already emits its own null guard; adding a second would just nest.\n if (field.type.kind === 'union') return inner;\n if (field.optional || field.nullable) {\n return [`if (${slot} != null) {`, ...inner.map(l => ` ${l}`), `}`];\n }\n return inner;\n}\n\n/**\n * Pick the reviver for a referenced model.\n *\n * Mirrors `renderOutputTsType`: inside an output reviver, a referenced model uses its *own* output\n * reviver only if it has one. `computeModelsWithOutput` propagates referrer→referenced, so a child\n * of a transformed parent is not itself transformed and keeps camelCase keys.\n */\nfunction reviveRefName(name: string, opts: ReviveCodegenOptions, variant: 'base' | 'output'): string {\n if (variant === 'output' && opts.modelsWithOutput?.has(name)) return reviveFnName(name, 'output');\n return reviveFnName(name, 'base');\n}\n\n/**\n * A standalone reviver for an arbitrary type node — used for a response body that is not a plain\n * model reference (an inline object, a record, a tuple), where there is no `reviveX` to call.\n *\n * Returns `null` when the type holds no decimal, so the caller emits nothing at all.\n */\nexport function renderInlineReviver(\n fnName: string,\n tsType: string,\n type: ContractTypeNode,\n opts: ReviveCodegenOptions,\n variant: 'base' | 'output' = 'output',\n): string[] | null {\n if (!typeReachesDecimal(type, opts)) return null;\n const scope = new Scope();\n const body = emit('__v[0]', type, fnName.replace(/^__revive/, ''), opts, scope, variant);\n if (body.length === 0) return null;\n return [\n `/** Rehydrates the \\`decimal\\` fields of one response body. Mutates and returns \\`raw\\`. */`,\n `function ${fnName}(raw: ${tsType}): ${tsType} {`,\n ` const __v = [raw] as unknown[];`,\n ...body.map(l => ` ${l}`),\n ` return __v[0] as ${tsType};`,\n `}`,\n ];\n}\n\n/** The `reviveX` (and `reviveXOutput`) declarations for one model, or `[]` if it holds no decimal. */\nexport function renderReviveFunctions(model: ModelNode, opts: ReviveCodegenOptions): string[] {\n if (!opts.modelsWithDecimal.has(model.name)) return [];\n const lines = renderOne(model, opts, 'base');\n if (opts.modelsWithOutput?.has(model.name)) {\n lines.push('');\n lines.push(...renderOne(model, opts, 'output'));\n }\n return lines;\n}\n\nfunction renderOne(model: ModelNode, opts: ReviveCodegenOptions, variant: 'base' | 'output'): string[] {\n const scope = new Scope();\n const typeName = `${model.name}${variant === 'output' ? 'Output' : ''}`;\n const fnName = reviveFnName(model.name, variant);\n\n // A type-alias model has no fields — hydrate the aliased type as a whole.\n if (model.type) {\n const body = emit('__v[0]', model.type, model.name, opts, scope, variant);\n if (body.length === 0) return [];\n return [\n `/** Rehydrates every \\`decimal\\` in a ${typeName} from its wire string. Mutates and returns \\`raw\\`. */`,\n `export function ${fnName}(raw: ${typeName}): ${typeName} {`,\n ` const __v = [raw] as unknown[];`,\n ...body.map(l => ` ${l}`),\n ` return __v[0] as ${typeName};`,\n `}`,\n ];\n }\n\n const obj = scope.next('o');\n const body = model.fields.flatMap(f =>\n typeReachesDecimal(f.type, opts) ? fieldStatements(obj, f, model.name, opts, scope, variant, model.outputCase) : [],\n );\n if (body.length === 0) return [];\n\n return [\n `/** Rehydrates every \\`decimal\\` in a ${typeName} from its wire string. Mutates and returns \\`raw\\`. */`,\n `export function ${fnName}(raw: ${typeName}): ${typeName} {`,\n ` const ${obj} = raw as unknown as Record<string, unknown>;`,\n ...body.map(l => ` ${l}`),\n ` return raw;`,\n `}`,\n ];\n}\n","import type {\n OpRootNode,\n OpRouteNode,\n OpOperationNode,\n OpResponseNode,\n OpResponseHeaderNode,\n ContractTypeNode,\n ScalarTypeNode,\n ParamSource,\n ObjectMode,\n} from '@contractkit/core';\nimport { resolveModifiers, resolveSecurity, SECURITY_NONE, classifyContentType, emittedResponses } from '@contractkit/core';\nimport {\n renderType,\n renderInputType,\n renderQueryType,\n pascalToDotCase,\n modeToWrapper,\n} from './codegen-contract.js';\nimport { renderOutputTsType, quoteKey, headerNameToProperty, escapeJsDocLines, escapeSingleQuoted } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_PRELUDE_LINES } from './decimal-runtime.js';\nimport { basename, dirname, relative } from 'path';\n\n// ─── Content-type helpers ──────────────────────────────────────────────────\n\n/** Map a request MIME type to the koa-bodyparser parser token used in middleware. */\nfunction bodyParserToken(contentType: string): string {\n switch (classifyContentType(contentType)) {\n case 'urlencoded':\n return 'urlencoded';\n case 'multipart':\n return 'multipart';\n case 'text':\n return 'text';\n case 'binary':\n // koa-bodyparser has no native binary token; fall back to text so the body is\n // still readable as a string. Services handling binary uploads should switch to\n // multipart/form-data.\n return 'text';\n default:\n return 'json';\n }\n}\n\n/**\n * Deep structural equality on ContractTypeNode, ignoring source locations on inline fields.\n * Used to decide whether multiple declared request MIMEs can share a single validate path.\n */\nexport function bodyTypesStructurallyEqual(a: ContractTypeNode, b: ContractTypeNode): boolean {\n if (a.kind !== b.kind) return false;\n switch (a.kind) {\n case 'scalar': {\n const bb = b as typeof a;\n return (\n a.name === bb.name &&\n a.min === bb.min &&\n a.max === bb.max &&\n a.len === bb.len &&\n a.scale === bb.scale &&\n a.regex === bb.regex &&\n a.format === bb.format\n );\n }\n case 'array': {\n const bb = b as typeof a;\n return a.min === bb.min && a.max === bb.max && bodyTypesStructurallyEqual(a.item, bb.item);\n }\n case 'tuple': {\n const bb = b as typeof a;\n return a.items.length === bb.items.length && a.items.every((x, i) => bodyTypesStructurallyEqual(x, bb.items[i]!));\n }\n case 'record': {\n const bb = b as typeof a;\n return bodyTypesStructurallyEqual(a.key, bb.key) && bodyTypesStructurallyEqual(a.value, bb.value);\n }\n case 'enum': {\n const bb = b as typeof a;\n return a.values.length === bb.values.length && a.values.every((v, i) => v === bb.values[i]);\n }\n case 'literal': {\n const bb = b as typeof a;\n return a.value === bb.value;\n }\n case 'union':\n case 'intersection': {\n const bb = b as typeof a;\n return a.members.length === bb.members.length && a.members.every((m, i) => bodyTypesStructurallyEqual(m, bb.members[i]!));\n }\n case 'discriminatedUnion': {\n const bb = b as typeof a;\n return (\n a.discriminator === bb.discriminator &&\n a.members.length === bb.members.length &&\n a.members.every((m, i) => bodyTypesStructurallyEqual(m, bb.members[i]!))\n );\n }\n case 'ref': {\n const bb = b as typeof a;\n return a.name === bb.name && !!a.lazy === !!bb.lazy;\n }\n case 'lazy': {\n const bb = b as typeof a;\n return bodyTypesStructurallyEqual(a.inner, bb.inner);\n }\n case 'inlineObject': {\n const bb = b as typeof a;\n if (a.mode !== bb.mode) return false;\n if (a.fields.length !== bb.fields.length) return false;\n return a.fields.every((f, i) => {\n const g = bb.fields[i]!;\n return (\n f.name === g.name &&\n f.optional === g.optional &&\n f.nullable === g.nullable &&\n f.visibility === g.visibility &&\n f.default === g.default &&\n !!f.deprecated === !!g.deprecated &&\n bodyTypesStructurallyEqual(f.type, g.type)\n );\n });\n }\n }\n}\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/** Options controlling how {@link generateOp} renders a Koa router module. */\nexport interface OpCodegenOptions {\n servicePathTemplate?: string;\n typeImportPathTemplate?: string;\n outPath?: string;\n /** Map from model name → absolute output file path (for cross-module type imports) */\n modelOutPaths?: Map<string, string>;\n /** Set of model names that have Input variants (models with visibility modifiers) */\n modelsWithInput?: Set<string>;\n /** Set of model names that have Output variants (models with format(output=...)) */\n modelsWithOutput?: Set<string>;\n /**\n * Whether to emit handlers for operations marked `internal`. Defaults to `true` because\n * the server still needs routes for internal endpoints; set to `false` to omit them\n * from the generated router entirely.\n */\n includeInternal?: boolean;\n /**\n * Re-parse the service result through its declared response schema before writing `ctx.body`,\n * and write the parsed value. Requires the type file to hold Zod schemas (`server.zod`) —\n * plain interfaces are types, with no runtime schema value to validate against. Default false.\n */\n validateResponses?: boolean;\n /**\n * Set of model names whose schema applies a `format(...)` key transform, directly or through a\n * referenced model. Response bodies touching one are left unvalidated: the service returns the\n * post-transform shape, which the schema itself cannot re-parse.\n */\n modelsWithTransform?: Set<string>;\n}\n\n/**\n * Generate a Koa router module for every operation in `root`, including the imports, type\n * aliases, and handler list.\n *\n * Imports are derived from the generated body — each candidate symbol is emitted only if it\n * actually appears in the output. Deciding them from predicates over the AST instead means any\n * drift between predicate and codegen leaves an unused import in every generated file, which\n * trips `noUnusedLocals` and lint downstream.\n */\nexport function generateOp(root: OpRootNode, options: OpCodegenOptions = {}): string {\n // Collect all referenced types across all routes\n const types = collectTypes(root, options.modelsWithInput, options.modelsWithOutput);\n const services = collectServices(root);\n const routerName = deriveRouterName(root.file);\n\n const lines: string[] = [];\n\n lines.push('');\n lines.push('/**');\n const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file;\n lines.push(` * generated from [${basename(root.file)}](file://./${relFile})`);\n lines.push('*/');\n lines.push(`export const ${routerName} = ServerKitRouter();`);\n lines.push('');\n\n const includeInternal = options.includeInternal ?? true;\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n lines.push(...generateHandler(route, op, root, options));\n lines.push('');\n }\n }\n\n // Helpers and imports are both decided from the code we just generated, not from predicates\n // over the AST that have to be kept in step with it by hand. A predicate that drifts leaves an\n // unused declaration in every generated file, which trips `noUnusedLocals` and lint in\n // consuming projects — `opNeedsScalar(root, 'binary')` over-approximates exactly that way,\n // since a binary *response* body is a plain `Buffer` annotation with no schema behind it.\n const handlerBody = lines.join('\\n');\n const references = (symbol: string) => new RegExp(`\\\\b${symbol}\\\\b`).test(handlerBody);\n\n const helpers: string[] = [];\n if (references('_ZodBinary')) {\n helpers.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`);\n }\n if (references('_ZodDatetime')) {\n helpers.push(\n `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`,\n );\n }\n if (references('_ZodDecimal')) {\n helpers.push(...DECIMAL_PRELUDE_LINES);\n }\n if (references('_ZodInterval')) {\n helpers.push(\n `const _ZodInterval = z.preprocess((val) => typeof val === 'string' ? Interval.fromISO(val) : val, z.custom<Interval>((val) => val instanceof Interval && val.isValid, { message: 'Must be an ISO 8601 interval' })).transform(val => val.toISO()!);`,\n );\n }\n // `_ZodJson`'s own declaration is annotated with `_JsonValue`, so the type alias comes along\n // with it; the alias is also needed on its own for a `json` body's server-side annotation.\n const needsZodJson = references('_ZodJson');\n if (needsZodJson || references('_JsonValue')) {\n helpers.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`);\n }\n if (needsZodJson) {\n helpers.push(\n `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`,\n );\n }\n\n const generated = [...(helpers.length ? ['', ...helpers] : []), ...lines].join('\\n');\n const uses = (symbol: string) => new RegExp(`\\\\b${symbol}\\\\b`).test(generated);\n\n const body: string[] = [];\n\n const koaImports = ['ServerKitRouter', 'bodyParserMiddleware', 'requirePolicy', 'requireSignature'].filter(uses);\n if (koaImports.length > 0) {\n body.push(`import { ${koaImports.join(', ')} } from '@maroonedsoftware/koa';`);\n }\n\n // Services and model names come from the AST, which over-approximates two ways: a model with an\n // Input/Output variant contributes its base name even when only the variant is ever annotated,\n // and `collectServices`/`collectTypes` walk every operation including the `internal` ones\n // `includeInternal: false` drops. Filtering through `uses` — the same gate every symbol above\n // goes through — keeps the import list to what the handlers actually reference, so generated\n // code does not trip `noUnusedLocals` in the consuming project.\n for (const svc of services.filter(uses)) {\n const modulePath = root.services?.[svc] ?? root.meta[svc] ?? deriveModulePath(svc, options.servicePathTemplate);\n body.push(`import { ${svc} } from '${modulePath}';`);\n }\n\n const usedTypes = types.filter(uses);\n if (usedTypes.length > 0) {\n body.push(...generateTypeImports(usedTypes, root.file, options));\n }\n\n // luxon is needed for date/time/datetime (DateTime), duration (Duration) and interval (Interval);\n // the rendered Zod schemas and the service-result annotations both reference these classes.\n const luxonImports = ['DateTime', 'Duration', 'Interval'].filter(uses);\n if (luxonImports.length > 0) {\n body.push(`import { ${luxonImports.join(', ')} } from 'luxon';`);\n }\n\n // Same `uses` gate: `Decimal` appears in the `_ZodDecimal` helper and in service-result\n // annotations via `serverTsScalar`, and the helper text is folded into `generated` above.\n if (uses('Decimal')) {\n body.push(DECIMAL_IMPORT);\n }\n\n if (uses('parseAndValidate')) {\n body.push(`import { parseAndValidate } from '@maroonedsoftware/zod';`);\n }\n\n if (uses('MultipartBody')) {\n body.push(`import { MultipartBody } from '@maroonedsoftware/multipart';`);\n }\n\n const allContent = [...body, ...(helpers.length ? ['', ...helpers] : []), ...lines].join('\\n');\n const needsZod = /\\bz\\./.test(allContent);\n return (needsZod ? `import { z } from 'zod';\\n` : '') + allContent;\n}\n\n// ─── Handler generation ────────────────────────────────────────────────────\n\nfunction generateHandler(route: OpRouteNode, op: OpOperationNode, root: OpRootNode, options: OpCodegenOptions): string[] {\n const lines: string[] = [];\n const file = root.file;\n const outPath = options.outPath;\n const modelsWithInput = options.modelsWithInput;\n\n lines.push('/**');\n\n // JSDoc from description\n const desc = op.description ?? route.description;\n if (desc) {\n for (const l of escapeJsDocLines(desc)) lines.push(` * ${l}`);\n }\n // Source location comment\n const relFile = outPath ? relative(dirname(outPath), file) : file;\n lines.push(` * from [${basename(file)}](file://./${relFile}#L${op.loc.line})`);\n\n // Security annotation (operation-level wins; falls back to route → file level)\n const effectiveSecurity = resolveSecurity(route, op, root);\n if (effectiveSecurity === SECURITY_NONE) {\n lines.push(` * anonymous access, no security required`);\n }\n\n // Modifier annotations\n const mods = resolveModifiers(route, op);\n if (mods.includes('internal')) lines.push(` * @internal`);\n if (mods.includes('deprecated')) lines.push(` * @deprecated`);\n\n lines.push('*/');\n\n const method = op.method;\n const path = route.path.replace(/\\{(\\w+)\\}/g, ':$1');\n const bodies = op.request?.bodies ?? [];\n const hasBody = bodies.length > 0;\n const isSingleMultipart = bodies.length === 1 && bodies[0]!.contentType === 'multipart/form-data';\n\n // Middleware list\n const middlewares: string[] = [];\n if (effectiveSecurity !== SECURITY_NONE) {\n const policy = effectiveSecurity?.policy;\n const args =\n policy === undefined\n ? ''\n : policy === false\n ? '{ policy: false }'\n : `{ policy: '${policy}' }`;\n middlewares.push(`requirePolicy(${args})`);\n }\n if (hasBody) {\n const parserTokens = Array.from(new Set(bodies.map(b => bodyParserToken(b.contentType))));\n const tokensExpr = parserTokens.map(t => `'${t}'`).join(', ');\n middlewares.push(`bodyParserMiddleware([${tokensExpr}])`);\n }\n if (op.signature) {\n const sigArgs = op.signaturePolicy\n ? `'${escapeSingleQuoted(op.signature)}', { policy: '${escapeSingleQuoted(op.signaturePolicy)}' }`\n : `'${escapeSingleQuoted(op.signature)}'`;\n middlewares.push(`requireSignature(${sigArgs})`);\n }\n const middlewareStr = middlewares.length > 0 ? `, ${middlewares.join(', ')},` : ',';\n\n lines.push(`${deriveRouterName(file)}.${method}('${path}'${middlewareStr} async ctx => {`);\n\n // Params / query / headers validation (request-side — use Input variants)\n lines.push(...generateParamValidation(route.params, 'ctx.params', 'params', route.paramsMode ?? 'strict', '', modelsWithInput));\n lines.push(...generateParamValidation(op.query, 'ctx.query', 'query', op.queryMode ?? 'strict', '', modelsWithInput));\n lines.push(...generateParamValidation(op.headers, 'ctx.headers', 'headers', op.headersMode ?? 'strip', '', modelsWithInput));\n\n // Body validation (request-side — use Input variants)\n if (hasBody && op.request) {\n if (isSingleMultipart) {\n lines.push(` const multipartBody = ctx.parsedBody as MultipartBody;`);\n lines.push('');\n } else if (bodies.length === 1) {\n lines.push(` const body = await parseAndValidate(ctx.parsedBody, ${renderInputType(bodies[0]!.bodyType, modelsWithInput)});`);\n lines.push('');\n } else if (bodies.every(b => bodyTypesStructurallyEqual(b.bodyType, bodies[0]!.bodyType))) {\n // All declared MIMEs share the same body shape — single validation suffices\n lines.push(` const body = await parseAndValidate(ctx.parsedBody, ${renderInputType(bodies[0]!.bodyType, modelsWithInput)});`);\n lines.push('');\n } else {\n // Different body types per MIME — dispatch on Content-Type\n const annotation = bodies\n .map(b =>\n b.contentType === 'multipart/form-data' ? 'MultipartBody' : `z.infer<typeof ${renderInputType(b.bodyType, modelsWithInput)}>`,\n )\n .join(' | ');\n lines.push(` let body!: ${annotation};`);\n lines.push(` switch (ctx.request.type) {`);\n for (const b of bodies) {\n lines.push(` case '${b.contentType}':`);\n if (b.contentType === 'multipart/form-data') {\n lines.push(` body = ctx.parsedBody as MultipartBody;`);\n } else {\n lines.push(` body = await parseAndValidate(ctx.parsedBody, ${renderInputType(b.bodyType, modelsWithInput)});`);\n }\n lines.push(` break;`);\n }\n lines.push(` }`);\n lines.push('');\n }\n }\n\n // Service call. `emittedResponses` decides which of the declared statuses the service is\n // responsible for producing; the rest are documentation, or the thrown-error path.\n const emitted = emittedResponses(op);\n const serviceParts = inferService(op, route, file);\n const call = `await service.${serviceParts.methodName}(${buildArgs(route, op)})`;\n\n if (emitted.length > 1) {\n lines.push(...generateMultiStatusResult(emitted, serviceParts.className, call, options));\n } else {\n lines.push(...generateSingleStatusResult(emitted[0], op, serviceParts.className, call, options));\n }\n\n lines.push(`});`);\n\n return lines;\n}\n\n/**\n * The service produces exactly one status (or none): the result is the body itself, or\n * `{ body, headers }` when the status declares headers, and `ctx.status` is a constant.\n *\n * A status declaring several mimes also gains a `contentType` the service picks, which is the\n * only thing here that can turn `ctx.type` from a literal into an expression.\n */\nfunction generateSingleStatusResult(\n resp: OpResponseNode | undefined,\n op: OpOperationNode,\n className: string,\n call: string,\n options: OpCodegenOptions,\n): string[] {\n const lines: string[] = [];\n const bodies = resp ? resp.bodies : [];\n const respHeaders = resp?.headers ?? [];\n const hasRespHeaders = respHeaders.length > 0;\n const headersAnnotation = hasRespHeaders ? renderHeadersAnnotation(respHeaders, options.modelsWithOutput) : '';\n\n let bodySchema: string | undefined;\n\n if (bodies.length === 1) {\n const { annotation, prelude } = formatTypeAnnotation(bodies[0]!.bodyType, options.modelsWithOutput);\n if (prelude) lines.push(` ${prelude}`);\n bodySchema = responseBodySchema(bodies[0]!.bodyType, options, prelude ? 'resultType' : undefined);\n lines.push(` const service = ctx.container.get(${className});`);\n if (hasRespHeaders) {\n lines.push(` const result: { body: ${annotation}; headers: ${headersAnnotation} } = ${call};`);\n } else {\n lines.push(` const result: ${annotation} = ${call};`);\n }\n } else if (bodies.length > 1) {\n const rendered = renderResponseMembers(resp!, options, { includeStatus: false, varPrefix: 'result' });\n const { members, preludes } = rendered;\n bodySchema = rendered.bodySchema;\n for (const prelude of preludes) lines.push(` ${prelude}`);\n lines.push(` const service = ctx.container.get(${className});`);\n lines.push(` const result: ${members.join(' | ')} = ${call};`);\n } else {\n lines.push(` const service = ctx.container.get(${className});`);\n if (hasRespHeaders) {\n lines.push(` const result: { headers: ${headersAnnotation} } = ${call};`);\n } else {\n lines.push(` ${call};`);\n }\n }\n\n lines.push('');\n // With nothing emitted, the status is still declared somewhere — fall back to the first\n // one written, which is what a documentation-only 3xx/4xx operation means.\n lines.push(` ctx.status = ${resp?.statusCode ?? op.responses[0]?.statusCode ?? 200};`);\n lines.push(...headerSetLines(respHeaders, ' '));\n\n if (bodies.length === 1) {\n lines.push(` ctx.type = '${bodies[0]!.contentType}';`);\n lines.push(` ctx.body = ${responseBodyExpr(hasRespHeaders ? 'result.body' : 'result', bodySchema)};`);\n } else if (bodies.length > 1) {\n lines.push(` ctx.type = result.contentType;`);\n lines.push(` ctx.body = ${responseBodyExpr('result.body', bodySchema)};`);\n }\n\n return lines;\n}\n\n/**\n * The service chooses between several statuses: the result is a union discriminated on\n * `status`, and the handler switches on it so each status writes only its own headers, mime\n * and body.\n */\nfunction generateMultiStatusResult(emitted: OpResponseNode[], className: string, call: string, options: OpCodegenOptions): string[] {\n const lines: string[] = [];\n const members: string[] = [];\n const preludes: string[] = [];\n\n const bodySchemas = new Map<number, string | undefined>();\n\n for (const resp of emitted) {\n const rendered = renderResponseMembers(resp, options, { includeStatus: true, varPrefix: `result${resp.statusCode}` });\n members.push(...rendered.members);\n preludes.push(...rendered.preludes);\n bodySchemas.set(resp.statusCode, rendered.bodySchema);\n }\n\n for (const prelude of preludes) lines.push(` ${prelude}`);\n lines.push(` const service = ctx.container.get(${className});`);\n lines.push(` const result:`);\n for (const member of members) lines.push(` | ${member}`);\n lines.push(` = ${call};`);\n lines.push('');\n lines.push(` ctx.status = result.status;`);\n lines.push(` switch (result.status) {`);\n for (const resp of emitted) {\n lines.push(` case ${resp.statusCode}:`);\n lines.push(...headerSetLines(resp.headers ?? [], ' '));\n if (resp.bodies.length > 0) {\n lines.push(` ctx.type = result.contentType;`);\n lines.push(` ctx.body = ${responseBodyExpr('result.body', bodySchemas.get(resp.statusCode))};`);\n }\n lines.push(` break;`);\n }\n lines.push(` }`);\n\n return lines;\n}\n\n/**\n * Render one status as the members of the service-result union — its `contentType`, `body` and\n * `headers`, plus `status` when the operation emits more than one.\n *\n * A status declaring several mimes collapses to a single member with a union of mime literals\n * when the bodies are structurally identical (`image/png` and `image/jpeg` both `binary`).\n * When they differ, it produces one member per mime so `contentType` and `body` stay correlated.\n */\nfunction renderResponseMembers(\n resp: OpResponseNode,\n options: OpCodegenOptions,\n opts: { includeStatus: boolean; varPrefix: string },\n): { members: string[]; preludes: string[]; bodySchema?: string } {\n const bodies = resp.bodies;\n const headers = resp.headers ?? [];\n const leading = opts.includeStatus ? [`status: ${resp.statusCode}`] : [];\n const trailing = headers.length > 0 ? [`headers: ${renderHeadersAnnotation(headers, options.modelsWithOutput)}`] : [];\n const preludes: string[] = [];\n\n if (bodies.length === 0) {\n return { members: [`{ ${[...leading, ...trailing].join('; ')} }`], preludes };\n }\n\n const uniform = bodies.every(b => bodyTypesStructurallyEqual(b.bodyType, bodies[0]!.bodyType));\n if (uniform) {\n const { annotation, prelude } = formatTypeAnnotation(bodies[0]!.bodyType, options.modelsWithOutput, `${opts.varPrefix}Type`);\n if (prelude) preludes.push(prelude);\n const bodySchema = responseBodySchema(bodies[0]!.bodyType, options, prelude ? `${opts.varPrefix}Type` : undefined);\n const contentType = bodies.map(b => `'${b.contentType}'`).join(' | ');\n return {\n members: [`{ ${[...leading, `contentType: ${contentType}`, `body: ${annotation}`, ...trailing].join('; ')} }`],\n preludes,\n bodySchema,\n };\n }\n\n // One member per mime: `contentType` and `body` stay correlated, so validating would need a\n // second switch on `result.contentType` nested inside the status switch. Left unvalidated —\n // note the absent `bodySchema` in the return below.\n const members = bodies.map((b, i) => {\n const { annotation, prelude } = formatTypeAnnotation(b.bodyType, options.modelsWithOutput, `${opts.varPrefix}Type${i}`);\n if (prelude) preludes.push(prelude);\n return `{ ${[...leading, `contentType: '${b.contentType}'`, `body: ${annotation}`, ...trailing].join('; ')} }`;\n });\n return { members, preludes };\n}\n\nfunction renderHeadersAnnotation(headers: OpResponseHeaderNode[], modelsWithOutput?: Set<string>): string {\n const fields = headers.map(\n h => `${quoteKey(headerNameToProperty(h.name))}${h.optional ? '?' : ''}: ${renderOutputTsType(h.type, modelsWithOutput, 'server')}`,\n );\n return `{ ${fields.join('; ')} }`;\n}\n\n/** `ctx.set(...)` calls for a status's declared response headers, guarding the optional ones. */\nfunction headerSetLines(headers: OpResponseHeaderNode[], indent: string): string[] {\n return headers.map(h => {\n const accessor = `result.headers[${JSON.stringify(headerNameToProperty(h.name))}]`;\n return h.optional\n ? `${indent}if (${accessor} !== undefined) ctx.set('${h.name}', String(${accessor}));`\n : `${indent}ctx.set('${h.name}', String(${accessor}));`;\n });\n}\n\n// ─── Inference helpers ─────────────────────────────────────────────────────\n\n/**\n * Resolve the service class and method a handler should delegate to.\n *\n * Uses the operation's explicit `service: Class.method` declaration when present; otherwise derives\n * the class from the contract file name (`ledger.categories.ck` → `LedgerCategoriesService`) and the\n * method from the HTTP verb and whether the path carries a parameter (`get` → `list` / `getById`).\n *\n * @param file Path of the `.ck` file the operation came from.\n */\nexport function inferService(op: OpOperationNode, route: OpRouteNode, file: string): { className: string; methodName: string } {\n // If explicitly declared: service: ServiceClass.methodName\n if (op.service) {\n const [cls = '', method] = op.service.split('.');\n return { className: cls, methodName: method ?? 'handle' };\n }\n\n // Infer from file name + method + path\n const baseName = deriveBaseName(file); // e.g. \"ledger.categories\" -> \"LedgerCategories\"\n const className = `${baseName}Service`;\n const methodName = inferMethodName(op.method, route.path);\n return { className, methodName };\n}\n\nfunction inferMethodName(method: string, path: string): string {\n const hasParam = path.includes('{');\n switch (method) {\n case 'get':\n return hasParam ? 'getById' : 'list';\n case 'post':\n return 'create';\n case 'put':\n return 'replace';\n case 'patch':\n return 'update';\n case 'delete':\n return 'delete';\n default:\n return 'handle';\n }\n}\n\n/**\n * Build the comma-separated argument list passed to the service method in a generated handler.\n *\n * Order is params, body, query, headers. Inline path params are spread as individual identifiers;\n * a referenced/compound params type is passed as a single `params` object. A lone\n * `multipart/form-data` request body is passed as `multipartBody` rather than `body`.\n *\n * @returns The rendered argument list, or an empty string when the method takes no arguments.\n */\nexport function buildArgs(route: OpRouteNode, op: OpOperationNode): string {\n const args: string[] = [];\n // Path params: spread individually (inline) or pass 'params' object (type-ref/ContractTypeNode)\n if (route.params) {\n if (route.params.kind === 'params') {\n args.push(...route.params.nodes.map(p => p.name));\n } else {\n args.push('params');\n }\n }\n // Body\n if (op.request && op.request.bodies.length > 0) {\n const bodies = op.request.bodies;\n const isSingleMultipart = bodies.length === 1 && bodies[0]!.contentType === 'multipart/form-data';\n args.push(isSingleMultipart ? 'multipartBody' : 'body');\n }\n // Query\n if (op.query) args.push('query');\n // Headers\n if (op.headers) args.push('headers');\n return args.join(', ');\n}\n\n/**\n * Map a `.ck` scalar to the TypeScript type a server handler sees, i.e. `z.infer` of the schema\n * `renderType` emits for that scalar. This is deliberately NOT `renderTsScalar` from ts-render:\n * that one describes the wire/SDK view (`binary` → `Blob`, dates → `string`), while the router\n * runs on Node against the parsed Zod output (`binary` → `Buffer`, dates → luxon `DateTime`).\n */\nfunction serverTsScalar(name: ScalarTypeNode['name']): string {\n switch (name) {\n case 'string':\n case 'email':\n case 'url':\n case 'uuid':\n return 'string';\n case 'number':\n case 'int':\n return 'number';\n case 'bigint':\n return 'bigint';\n case 'decimal':\n // Unlike the date scalars, this matches `renderTsScalar`'s wire view — `_ZodDecimal`\n // has no output transform, so `z.infer` is a `Decimal` on both sides.\n return 'Decimal';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n return 'DateTime';\n case 'duration':\n return 'Duration';\n case 'interval':\n // _ZodInterval transforms to an ISO string, so the inferred output type is string.\n return 'string';\n case 'binary':\n return 'Buffer';\n case 'json':\n return '_JsonValue';\n case 'object':\n return 'Record<string, unknown>';\n case 'null':\n return 'null';\n case 'unknown':\n return 'unknown';\n default: {\n const _exhaustive: never = name;\n throw new Error(`plugin-typescript: unmapped scalar '${String(_exhaustive)}' — add a case`);\n }\n }\n}\n\n/**\n * @param varName Name for the extracted schema variable. Distinct per status and per mime when\n * an operation emits several, so two complex bodies in one handler cannot collide.\n */\nfunction formatTypeAnnotation(bodyType: ContractTypeNode, modelsWithOutput?: Set<string>, varName = 'resultType'): { annotation: string; prelude?: string } {\n if (bodyType.kind === 'array') {\n const inner = formatTypeAnnotation(bodyType.item, modelsWithOutput, varName);\n return { annotation: `${inner.annotation}[]`, prelude: inner.prelude };\n }\n if (bodyType.kind === 'ref') {\n const name = modelsWithOutput?.has(bodyType.name) ? `${bodyType.name}Output` : bodyType.name;\n return { annotation: name };\n }\n if (bodyType.kind === 'scalar') return { annotation: serverTsScalar(bodyType.name) };\n // For complex types, extract schema into a variable so the result line stays readable\n const schema = renderType(bodyType);\n return {\n annotation: `z.infer<typeof ${varName}>`,\n prelude: `const ${varName} = ${schema};`,\n };\n}\n\n/**\n * Whether a response body can be soundly re-parsed through the schema `renderType` emits for it.\n *\n * False for anything transitively touching a model with a `format(...)` key transform — the service\n * returns the post-transform value while the schema expects the pre-transform one — and for an\n * intersection outside `renderIntersection`'s `.extend()` fast path, where `.and()` of two strict\n * objects rejects every value because each side sees the other's keys as unrecognized.\n */\nfunction isRevalidatable(type: ContractTypeNode, modelsWithOutput?: Set<string>, modelsWithTransform?: Set<string>): boolean {\n const rec = (t: ContractTypeNode): boolean => isRevalidatable(t, modelsWithOutput, modelsWithTransform);\n switch (type.kind) {\n case 'ref':\n return !modelsWithOutput?.has(type.name) && !modelsWithTransform?.has(type.name);\n case 'array':\n return rec(type.item);\n case 'tuple':\n return type.items.every(rec);\n case 'record':\n return rec(type.key) && rec(type.value);\n case 'intersection': {\n // Mirrors renderIntersection: a lone member renders as itself, `ref & (ref|object)*`\n // renders as an `.extend()` chain, and anything else falls back to `.and()`.\n const [first, ...rest] = type.members;\n if (!first) return true;\n if (rest.length === 0) return rec(first);\n const usesExtendChain = first.kind === 'ref' && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject');\n return usesExtendChain && type.members.every(rec);\n }\n case 'union':\n case 'discriminatedUnion':\n return type.members.every(rec);\n case 'inlineObject':\n return type.fields.every(f => rec(f.type));\n case 'lazy':\n return rec(type.inner);\n default:\n // scalar, enum, literal — identity or idempotent under re-parse\n return true;\n }\n}\n\n/**\n * The runtime schema a handler validates a response body against, or `undefined` when the body\n * cannot be soundly re-parsed and validation must be skipped.\n *\n * @param preludeVar The schema const {@link formatTypeAnnotation} already emitted for this body\n * (complex types only — `undefined` when it returned no prelude). Reusing it keeps a large object\n * literal from appearing twice in the same handler.\n */\nfunction responseBodySchema(bodyType: ContractTypeNode, options: OpCodegenOptions, preludeVar: string | undefined): string | undefined {\n if (!options.validateResponses) return undefined;\n if (!isRevalidatable(bodyType, options.modelsWithOutput, options.modelsWithTransform)) return undefined;\n return preludeVar ?? renderType(bodyType);\n}\n\n/**\n * The `ctx.body = ...` right-hand side for a response body: the raw result expression, or a\n * `parseAndValidate` of it. The `500` is deliberate — a service returning a shape its own contract\n * rejects is a server fault, not a client one, and `@maroonedsoftware/zod` routes the field-level\n * detail to `internalDetails` (log-only) rather than the response body at 5xx.\n */\nfunction responseBodyExpr(value: string, schema: string | undefined): string {\n return schema ? `await parseAndValidate(${value}, ${schema}, 500)` : value;\n}\n\nfunction generateParamValidation(\n source: ParamSource | undefined,\n ctxExpr: string,\n varName: string,\n mode: ObjectMode,\n suffix = '',\n modelsWithInput?: Set<string>,\n): string[] {\n if (!source) return [];\n const lines: string[] = [];\n const isQuery = ctxExpr === 'ctx.query';\n if (source.kind === 'ref') {\n // Type reference — apply mode as a method call on the schema\n const typeName = modelsWithInput?.has(source.name) ? `${source.name}Input` : source.name;\n lines.push(` const ${varName} = await parseAndValidate(${ctxExpr}, ${typeName}.${mode}());`);\n lines.push('');\n } else if (source.kind === 'params') {\n // Inline param declarations — wrap with the appropriate z.*Object constructor\n if (source.nodes.length > 0) {\n // Destructure only for params (spread individually in service call);\n // query/headers are passed as whole objects.\n const lhs = varName === 'params' ? `{ ${source.nodes.map(p => p.name).join(', ')} }` : varName;\n lines.push(` const ${lhs} = await parseAndValidate(`);\n lines.push(` ${ctxExpr},`);\n lines.push(` ${modeToWrapper(mode)}({`);\n for (const param of source.nodes) {\n const key = isValidIdentifier(param.name) ? param.name : `'${param.name}'`;\n if (isQuery && param.type.kind === 'array') {\n const inner = renderType(param.type);\n lines.push(` ${key}: z.preprocess((v) => typeof v === 'string' ? v.split(',') : v, ${inner}),`);\n } else {\n lines.push(` ${key}: ${renderType(param.type)},`);\n }\n }\n lines.push(` })${suffix},`);\n lines.push(` );`);\n lines.push('');\n }\n } else {\n // ContractTypeNode — use query-aware rendering for query params (coerces single string → array),\n // otherwise use Input variant rendering; apply mode as a method call\n const schema = isQuery ? renderQueryType(source.node, modelsWithInput) : renderInputType(source.node, modelsWithInput);\n lines.push(` const ${varName} = await parseAndValidate(${ctxExpr}, (${schema}).${mode}());`);\n lines.push('');\n }\n return lines;\n}\n\n// ─── Type import resolution ────────────────────────────────────────────────\n\n/**\n * Generate per-file type import statements.\n * When modelOutPaths is available, groups types by their actual output file\n * and computes correct relative paths. Falls back to the template-based\n * single-import approach for types not found in the map.\n */\nfunction generateTypeImports(types: string[], opFile: string, options: OpCodegenOptions): string[] {\n const lines: string[] = [];\n const { modelOutPaths, outPath } = options;\n\n if (modelOutPaths && outPath) {\n // Group types by their output file\n const byFile = new Map<string, string[]>();\n const unresolved: string[] = [];\n\n for (const type of types) {\n const typeOutPath = modelOutPaths.get(type);\n if (typeOutPath) {\n const group = byFile.get(typeOutPath) ?? [];\n group.push(type);\n byFile.set(typeOutPath, group);\n } else {\n unresolved.push(type);\n }\n }\n\n // Emit one import per source file with a relative path\n const fromDir = dirname(outPath);\n for (const [typeOutPath, names] of byFile) {\n let rel = relative(fromDir, typeOutPath);\n rel = rel.replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n lines.push(`import { ${names.sort().join(', ')} } from '${rel}';`);\n }\n\n // Fallback for types not in the map\n for (const type of unresolved) {\n const moduleName = pascalToDotCase(type);\n lines.push(`import { ${type} } from './${moduleName}.js';`);\n }\n } else {\n // No resolution context — fall back to template-based single import\n const typeImport = deriveTypeImportPath(opFile, options.typeImportPathTemplate);\n lines.push(`import { ${types.join(', ')} } from '${typeImport}';`);\n }\n\n return lines;\n}\n\n// ─── Collection helpers ────────────────────────────────────────────────────\n\nfunction collectTypes(root: OpRootNode, modelsWithInput?: Set<string>, modelsWithOutput?: Set<string>): string[] {\n const types = new Set<string>();\n for (const route of root.routes) {\n collectParamSourceRefs(route.params, types);\n collectParamSourceInputRefs(route.params, types, modelsWithInput);\n for (const op of route.operations) {\n if (op.request) {\n for (const body of op.request.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectInputTypeNodeRefs(body.bodyType, types, modelsWithInput);\n }\n }\n for (const resp of op.responses) {\n for (const body of resp.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectOutputTypeNodeRefs(body.bodyType, types, modelsWithOutput);\n }\n if (resp.headers) {\n for (const h of resp.headers) {\n collectTypeNodeRefs(h.type, types);\n collectOutputTypeNodeRefs(h.type, types, modelsWithOutput);\n }\n }\n }\n collectParamSourceRefs(op.query, types);\n collectParamSourceInputRefs(op.query, types, modelsWithInput);\n collectParamSourceRefs(op.headers, types);\n collectParamSourceInputRefs(op.headers, types, modelsWithInput);\n }\n }\n return [...types].sort();\n}\n\n/** Collect Output variant refs for response-side ContractTypeNode types. */\nfunction collectOutputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithOutput?: Set<string>): void {\n if (!modelsWithOutput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithOutput.has(type.name)) out.add(`${type.name}Output`);\n break;\n case 'array':\n collectOutputTypeNodeRefs(type.item, out, modelsWithOutput);\n break;\n case 'tuple':\n type.items.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'record':\n collectOutputTypeNodeRefs(type.key, out, modelsWithOutput);\n collectOutputTypeNodeRefs(type.value, out, modelsWithOutput);\n break;\n case 'union':\n type.members.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'intersection':\n type.members.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'lazy':\n collectOutputTypeNodeRefs(type.inner, out, modelsWithOutput);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectOutputTypeNodeRefs(f.type, out, modelsWithOutput));\n break;\n }\n}\n\nfunction collectParamSourceRefs(source: ParamSource | undefined, out: Set<string>): void {\n if (!source) return;\n if (source.kind === 'ref') {\n if (/^[A-Z]/.test(source.name)) out.add(source.name);\n } else if (source.kind === 'params') {\n for (const param of source.nodes) {\n collectTypeNodeRefs(param.type, out);\n }\n } else {\n collectTypeNodeRefs(source.node, out);\n }\n}\n\n/** Collect Input variant refs for request-side ParamSource types. */\nfunction collectParamSourceInputRefs(source: ParamSource | undefined, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!source || !modelsWithInput) return;\n if (source.kind === 'ref') {\n if (modelsWithInput.has(source.name)) out.add(`${source.name}Input`);\n } else if (source.kind === 'type') {\n collectInputTypeNodeRefs(source.node, out, modelsWithInput);\n }\n}\n\n/** Collect Input variant refs for request-side ContractTypeNode types. */\nfunction collectInputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!modelsWithInput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`);\n break;\n case 'array':\n collectInputTypeNodeRefs(type.item, out, modelsWithInput);\n break;\n case 'tuple':\n type.items.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'record':\n collectInputTypeNodeRefs(type.key, out, modelsWithInput);\n collectInputTypeNodeRefs(type.value, out, modelsWithInput);\n break;\n case 'union':\n type.members.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'intersection':\n type.members.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'lazy':\n collectInputTypeNodeRefs(type.inner, out, modelsWithInput);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectInputTypeNodeRefs(f.type, out, modelsWithInput));\n break;\n }\n}\n\nfunction collectTypeNodeRefs(type: ContractTypeNode, out: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n if (/^[A-Z]/.test(type.name)) out.add(type.name);\n break;\n case 'array':\n collectTypeNodeRefs(type.item, out);\n break;\n case 'tuple':\n type.items.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'record':\n collectTypeNodeRefs(type.key, out);\n collectTypeNodeRefs(type.value, out);\n break;\n case 'union':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'intersection':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'lazy':\n collectTypeNodeRefs(type.inner, out);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectTypeNodeRefs(f.type, out));\n break;\n }\n}\n\nfunction collectServices(root: OpRootNode): string[] {\n const services = new Set<string>();\n const inferredService = `${deriveBaseName(root.file)}Service`;\n\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (op.service) {\n services.add(op.service.split('.')[0] ?? op.service);\n } else {\n services.add(inferredService);\n }\n }\n }\n return [...services].sort();\n}\n\n\n\n\n\n\nfunction isValidIdentifier(name: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);\n}\n\n// ─── Naming conventions ────────────────────────────────────────────────────\n\n/**\n * Derive the PascalCase base name used for router, service, and type names from a contract file path.\n *\n * Strips directories and the `.op`/`.ck` extension, then PascalCases each dot-separated segment\n * (`contracts/ledger.categories.ck` → `LedgerCategories`). Falls back to `Resource` for an empty path.\n */\nexport function deriveBaseName(file: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'Resource';\n // ledger.categories -> LedgerCategories\n return base\n .split('.')\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('');\n}\n\nfunction deriveRouterName(file: string): string {\n return `${deriveBaseName(file)}Router`;\n}\n\n/**\n * Resolve the import specifier for a service class.\n *\n * Drops the trailing `Service` suffix and kebab-cases the remainder, then applies `template` if given\n * (`{name}` → `Ledger`, `{kebab}` → `ledger`). Without a template, defaults to\n * `#modules/<kebab>/<kebab>.service.js`.\n *\n * @param template Optional `servicePathTemplate` from the plugin config.\n */\nexport function deriveModulePath(serviceName: string, template?: string): string {\n // LedgerService -> #modules/ledger/ledger.service.js\n const base = serviceName.replace(/Service$/, '');\n const kebab = base.replace(/([A-Z])/g, m => `-${m.toLowerCase()}`).replace(/^-/, '');\n if (template) {\n return template.replace(/\\{name\\}/g, base).replace(/\\{kebab\\}/g, kebab);\n }\n return `#modules/${kebab}/${kebab}.service.js`;\n}\n\nfunction deriveTypeImportPath(file: string, template?: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'resource';\n const module = base.split('.')[0] ?? base;\n if (template) {\n return template.replace(/\\{module\\}/g, module).replace(/\\{base\\}/g, base);\n }\n return `#modules/${module}/types/index.js`;\n}\n","import type {\n OpRootNode,\n OpRouteNode,\n OpOperationNode,\n OpRequestBodyNode,\n OpResponseNode,\n OpResponseBodyNode,\n OpResponseHeaderNode,\n ContractTypeNode,\n ModelNode,\n ParamSource,\n} from '@contractkit/core';\nimport { resolveModifiers, isJsonMime, classifyContentType, observableResponses, thrownResponses } from '@contractkit/core';\nimport { renderInputTsType, renderOutputTsType, quoteKey, headerNameToProperty, escapeJsDocLines, JSON_VALUE_TYPE_DECL } from './ts-render.js';\nimport { pascalToDotCase, typeNeedsScalar } from './codegen-contract.js';\nimport { bodyTypesStructurallyEqual } from './codegen-operation.js';\nimport { reviveFnName, renderInlineReviver, typeReachesDecimal, DECIMAL_COERCE_DECL } from './codegen-revive.js';\nimport { DECIMAL_IMPORT, DECIMAL_CONFIG_LINE } from './decimal-runtime.js';\nimport { basename, dirname, relative } from 'path';\n\n// ─── Body strategy ────────────────────────────────────────────────────────\n\ntype BodyStrategy =\n | { kind: 'none' }\n | { kind: 'single'; body: OpRequestBodyNode }\n | { kind: 'multi-equal'; bodies: OpRequestBodyNode[] }\n | { kind: 'multi-formdata-detect'; bodies: OpRequestBodyNode[] }\n | { kind: 'multi-required-arg'; bodies: OpRequestBodyNode[] };\n\n/** Serialize expression for a single MIME, given the source body var (e.g. 'body'). */\nfunction jsonOrFormSerialize(varName: string, contentType: string): string {\n if (contentType === 'application/x-www-form-urlencoded') {\n return `new URLSearchParams(${varName} as unknown as Record<string, string>).toString()`;\n }\n if (contentType === 'multipart/form-data') {\n return `(${varName} as FormData)`;\n }\n // application/json + any `+json` structured suffix — JSON.stringify with bigint support.\n return `JSON.stringify(${varName}, bigIntReplacer)`;\n}\n\n/**\n * Build a runtime expression that picks the right serialization based on a contentType variable.\n * Used by the SDK when the caller passes (or defaults to) a content-type at call time.\n */\nfunction renderSerializeExpr(varName: string, bodies: OpRequestBodyNode[], ctVar: string): string {\n // Build a chained ternary, last MIME is the fallback\n const arms = bodies.slice(0, -1);\n const last = bodies[bodies.length - 1]!;\n let expr = jsonOrFormSerialize(varName, last.contentType);\n for (let i = arms.length - 1; i >= 0; i--) {\n const arm = arms[i]!;\n expr = `${ctVar} === '${arm.contentType}' ? ${jsonOrFormSerialize(varName, arm.contentType)} : ${expr}`;\n }\n return expr;\n}\n\nfunction classifyBodyStrategy(op: OpOperationNode): BodyStrategy {\n const bodies = op.request?.bodies ?? [];\n if (bodies.length === 0) return { kind: 'none' };\n if (bodies.length === 1) return { kind: 'single', body: bodies[0]! };\n if (bodies.every(b => bodyTypesStructurallyEqual(b.bodyType, bodies[0]!.bodyType))) {\n return { kind: 'multi-equal', bodies };\n }\n if (bodies.some(b => b.contentType === 'multipart/form-data')) {\n return { kind: 'multi-formdata-detect', bodies };\n }\n return { kind: 'multi-required-arg', bodies };\n}\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/** Options shared by every SDK code-generation entry point. */\nexport interface SdkCodegenOptions {\n /** Template for type import paths when `modelOutPaths` is not provided. Supports `{module}` and `{base}`. */\n typeImportPathTemplate?: string;\n /** Absolute path of the file currently being generated. Used to compute relative imports. */\n outPath?: string;\n /** Map from model name → absolute output file path (for cross-module type imports) */\n modelOutPaths?: Map<string, string>;\n /** Absolute path to the shared sdk-options.ts file (if set, imports SdkOptions instead of defining inline) */\n sdkOptionsPath?: string;\n /** Set of model names that have Input variants (models with visibility modifiers) */\n modelsWithInput?: Set<string>;\n /** Set of model names that have Output variants (models with format(output=...)) */\n modelsWithOutput?: Set<string>;\n /** Model names carrying a `decimal`, whose response bodies need rehydrating client-side. */\n modelsWithDecimal?: Set<string>;\n /** Every model in scope, for resolving discriminated-union members inside an inline reviver. */\n modelMap?: Map<string, ModelNode>;\n /**\n * Whether to emit SDK methods for operations marked `internal`. Defaults to `false` —\n * internal ops are omitted from the SDK so consumers don't pick them up. Set to `true`\n * to include them (e.g. for an internal-use SDK).\n */\n includeInternal?: boolean;\n /**\n * Override the generated client class name. When omitted, falls back to\n * `deriveClientClassName(root.file)` (the legacy per-file name). The aggregator\n * uses this to emit `<Area><Subarea>Client` for area+subarea leaf files.\n */\n clientClassName?: string;\n}\n\n/**\n * Returns true if the root contains at least one operation eligible for SDK emission.\n * With `includeInternal: false` (default) that means at least one non-internal op; with\n * `includeInternal: true` any op qualifies.\n */\nexport function hasPublicOperations(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (includeInternal || !resolveModifiers(route, op).includes('internal')) return true;\n }\n }\n return false;\n}\n\n/**\n * Generate a complete `*.client.ts` file for one operation root: imports, the client class\n * declaration, and one method per public operation. Used for top-level (no-area) files and\n * for subarea-leaf files. Area-level files are NOT routed through this — their methods get\n * inlined into the SDK aggregator via {@link generateClientMethods} + {@link generateSdkAggregator}.\n */\nexport function generateSdk(root: OpRootNode, options: SdkCodegenOptions = {}): string {\n const lines: string[] = [];\n const includeInternal = options.includeInternal ?? false;\n\n const types = collectTypes(root, options.modelsWithInput, options.modelsWithOutput, includeInternal);\n const clientClassName = options.clientClassName ?? deriveClientClassName(root.file);\n\n // The method bodies are generated first so the imports can be read off them, the same way\n // codegen-operation decides its imports from the code it just emitted. A reviver import that\n // came from a predicate instead could drift and leave an unused local behind.\n const inlineRevivers = new Map<string, string[]>();\n const classBody: string[] = [];\n for (const route of root.routes) {\n for (const op of route.operations) {\n const mods = resolveModifiers(route, op);\n if (!includeInternal && mods.includes('internal')) continue;\n classBody.push('');\n if (mods.includes('deprecated')) classBody.push(' /** @deprecated */');\n classBody.push(...generateMethod(route, op, root.file, options, inlineRevivers));\n }\n }\n\n const inlineReviverDecls = [...inlineRevivers.values()].flat();\n const decimalPrelude = decimalPreludeFor(inlineReviverDecls);\n\n // Type-only imports, plus the model revivers the methods actually call.\n if (types.length > 0) {\n lines.push(...generateTypeImports(types, root.file, options, usedRevivers(classBody)));\n }\n lines.push(...decimalPrelude.imports);\n\n // SdkOptions import (from shared file) or inline fallback\n if (options.sdkOptionsPath && options.outPath) {\n let rel = relative(dirname(options.outPath), options.sdkOptionsPath);\n rel = rel.replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n const jsonImport = sdkNeedsJson(root, includeInternal) ? ', JsonValue' : '';\n lines.push(`import type { SdkFetch${jsonImport} } from '${rel}';`);\n const valueImports: string[] = [];\n if (sdkNeedsBigIntReplacer(root, includeInternal)) valueImports.push('bigIntReplacer');\n if (sdkNeedsBigIntReviver(root, includeInternal)) valueImports.push('parseJson');\n if (sdkNeedsQueryString(root, includeInternal)) valueImports.push('buildQueryString');\n if (sdkNeedsReadContentType(root, includeInternal)) valueImports.push('readContentType');\n if (valueImports.length > 0) {\n lines.push(`import { ${valueImports.join(', ')} } from '${rel}';`);\n }\n } else {\n lines.push('');\n lines.push('export class SdkError<TBody = unknown> extends Error {');\n lines.push(' constructor(');\n lines.push(' public readonly status: number,');\n lines.push(' public readonly statusText: string,');\n lines.push(' public readonly body: TBody,');\n lines.push(' public readonly headers: Headers,');\n lines.push(' ) {');\n lines.push(' super(`${status} ${statusText}`);');\n lines.push(\" this.name = 'SdkError';\");\n lines.push(' }');\n lines.push('}');\n lines.push('');\n lines.push('export interface SdkRequestInit extends RequestInit {');\n lines.push(' /**');\n lines.push(' * Statuses this operation declares as values rather than errors — a 304 from');\n lines.push(' * conditional-GET middleware, or an error status the service returns deliberately.');\n lines.push(' * Anything else at or above 400 still throws SdkError.');\n lines.push(' */');\n lines.push(' expectStatuses?: number[];');\n lines.push('}');\n lines.push('');\n lines.push('export type SdkFetch = (url: string, init: SdkRequestInit) => Promise<Response>;');\n lines.push('');\n lines.push('export interface SdkOptions {');\n lines.push(' baseUrl: string;');\n lines.push(' headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);');\n lines.push(' fetch?: SdkFetch;');\n lines.push(' /** Called once per request to produce a unique X-Request-ID header value */');\n lines.push(' requestIdFactory?: () => string;');\n lines.push('}');\n lines.push('');\n lines.push('export function readContentType(res: Response): string {');\n lines.push(\" return res.headers.get('content-type')?.split(';')[0]?.trim() ?? '';\");\n lines.push('}');\n lines.push('');\n lines.push('export function createSdkFetch(options: SdkOptions): SdkFetch {');\n lines.push(' const getRequestId = options.requestIdFactory ?? (() => crypto.randomUUID());');\n lines.push(' return async (url: string, init: SdkRequestInit): Promise<Response> => {');\n lines.push(\" const baseHeaders = typeof options.headers === 'function'\");\n lines.push(' ? await options.headers()');\n lines.push(' : options.headers ?? {};');\n lines.push(' const res = await fetch(`${options.baseUrl}${url}`, {');\n lines.push(' ...init,');\n lines.push(\" headers: { ...baseHeaders, 'X-Request-ID': getRequestId(), ...init.headers as Record<string, string> },\");\n lines.push(' });');\n lines.push(' if (!res.ok && !(init.expectStatuses ?? []).includes(res.status)) {');\n lines.push(' const text = await res.text();');\n lines.push(' let body: unknown;');\n lines.push(' try { body = JSON.parse(text); } catch { body = text; }');\n lines.push(' throw new SdkError(res.status, res.statusText, body, res.headers);');\n lines.push(' }');\n lines.push(' return res;');\n lines.push(' };');\n lines.push('}');\n lines.push('');\n lines.push('export function buildQueryString(query: object | undefined): string {');\n lines.push(' const searchParams = new URLSearchParams();');\n lines.push(' if (query) {');\n lines.push(' for (const [k, v] of Object.entries(query)) {');\n lines.push(' if (v === undefined || v === null) continue;');\n lines.push(' if (Array.isArray(v)) { for (const item of v) searchParams.append(k, String(item)); }');\n lines.push(' else searchParams.set(k, String(v));');\n lines.push(' }');\n lines.push(' }');\n lines.push(' const qs = searchParams.toString();');\n lines.push(\" return qs ? `?${qs}` : '';\");\n lines.push('}');\n lines.push('');\n lines.push('export async function parseJson<T>(res: Response): Promise<T> {');\n lines.push(' return JSON.parse(await res.text(), bigIntReviver) as T;');\n lines.push('}');\n }\n\n if (sdkNeedsJson(root, includeInternal) && !(options.sdkOptionsPath && options.outPath)) {\n lines.push(JSON_VALUE_TYPE_DECL);\n }\n\n lines.push('');\n\n const errorAliases = generateErrorBodyAliases(root, options);\n if (errorAliases.length > 0) {\n lines.push(...errorAliases);\n lines.push('');\n }\n\n if (decimalPrelude.decls.length > 0) {\n lines.push('');\n lines.push(...decimalPrelude.decls);\n }\n\n // Wrappers for bodies with no `reviveX` of their own — an inline object, a record, a tuple.\n for (const decl of inlineRevivers.values()) {\n lines.push('');\n lines.push(...decl);\n }\n\n // Client class\n lines.push('/**');\n const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file;\n lines.push(` * generated from [${basename(root.file)}](file://./${relFile})`);\n lines.push(' */');\n lines.push(`export class ${clientClassName} {`);\n lines.push(' constructor(private fetch: SdkFetch) {}');\n lines.push(...classBody);\n\n lines.push('}');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Render the method-block lines for an operation file as if they were declared inside a\n * client class.\n *\n * Skips operations marked `internal` unless `options.includeInternal` is set.\n *\n * @returns `lines`, one consolidated array pre-indented for class-body level with leading blank\n * lines between methods; `methodNames`, used by the caller to detect cross-file collisions when\n * several files contribute to the same area-level client; `preludeLines`, module-level\n * declarations the methods reference (decimal revivers and their `__dec` helper) which the caller\n * must splice in above the class; and `needsDecimalImport`, true when those declarations require\n * `import { Decimal } from 'decimal.js'` in the emitting file.\n */\nexport function generateClientMethods(\n root: OpRootNode,\n options: SdkCodegenOptions,\n): { lines: string[]; methodNames: string[]; preludeLines: string[]; needsDecimalImport: boolean } {\n const lines: string[] = [];\n const methodNames: string[] = [];\n const includeInternal = options.includeInternal ?? false;\n const inlineRevivers = new Map<string, string[]>();\n for (const route of root.routes) {\n for (const op of route.operations) {\n const mods = resolveModifiers(route, op);\n if (!includeInternal && mods.includes('internal')) continue;\n lines.push('');\n if (mods.includes('deprecated')) lines.push(' /** @deprecated */');\n lines.push(...generateMethod(route, op, root.file, options, inlineRevivers));\n methodNames.push(deriveMethodName(op, route));\n }\n }\n // Module-level declarations the methods reference, spliced above the class by the caller —\n // the same shape `generateErrorBodyAliases` already uses.\n const declLines = [...inlineRevivers.values()].flat();\n const { decls } = decimalPreludeFor(declLines);\n const preludeLines = [...(decls.length > 0 ? ['', ...decls] : []), ...[...inlineRevivers.values()].flatMap(decl => ['', ...decl])];\n return { lines, methodNames, preludeLines, needsDecimalImport: decls.length > 0 };\n}\n\n/**\n * Declarations a client file needs for the inline revivers it carries.\n *\n * An inline wrapper calls `__dec`, which is file-local to the *types* module and not exported, so\n * a client file that has one needs its own copy — along with the decimal.js import and the global\n * config, since nothing else in the file necessarily pulls them in.\n */\nfunction decimalPreludeFor(declLines: string[]): { imports: string[]; decls: string[] } {\n if (!declLines.some(l => l.includes('__dec('))) return { imports: [], decls: [] };\n return { imports: [DECIMAL_IMPORT], decls: [DECIMAL_CONFIG_LINE, '', ...DECIMAL_COERCE_DECL] };\n}\n\n/** Model reviver names referenced by generated method bodies. `__revive…` wrappers are local. */\nfunction usedRevivers(lines: string[]): string[] {\n const found = new Set<string>();\n for (const m of lines.join('\\n').matchAll(/\\brevive[A-Z]\\w*/g)) found.add(m[0]);\n return [...found].sort();\n}\n\n// ─── Method generation ────────────────────────────────────────────────────\n\nfunction generateMethod(\n route: OpRouteNode,\n op: OpOperationNode,\n file: string,\n options: SdkCodegenOptions,\n inlineRevivers?: Map<string, string[]>,\n): string[] {\n const revive: ReviveContext | undefined =\n options.modelsWithDecimal && options.modelsWithDecimal.size > 0 && inlineRevivers\n ? {\n modelsWithDecimal: options.modelsWithDecimal,\n modelsWithOutput: options.modelsWithOutput,\n modelMap: options.modelMap,\n inlineRevivers,\n nameHint: '',\n }\n : undefined;\n const lines: string[] = [];\n const methodName = deriveMethodName(op, route);\n const mRevive = hint(revive, `${methodName.charAt(0).toUpperCase()}${methodName.slice(1)}`);\n const httpMethod = op.method.toUpperCase();\n const { modelsWithInput, modelsWithOutput } = options;\n\n // Build method parameters (request-side — use Input variants)\n const params = buildMethodParams(route, op, modelsWithInput);\n const paramStr = params.map(p => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join(', ');\n\n // Determine return type — response side uses Output variants (post-transform wire shape).\n // For non-JSON responses the schema is ignored: text/* is read as string, binary as Blob.\n //\n // `observableResponses` is the client-side mirror of the router's `emittedResponses`: it also\n // covers statuses the service never writes but a client can still receive, such as a 304 from\n // conditional-GET middleware. Anything left over reaches the caller as a thrown SdkError.\n const observable = observableResponses(op);\n const thrown = thrownResponses(op);\n const isMultiStatus = observable.length > 1;\n const primaryResponse = observable[0];\n const primaryBodies = primaryResponse ? primaryResponse.bodies : [];\n const isVoid = primaryBodies.length === 0;\n const respHeaders = primaryResponse?.headers ?? [];\n const hasRespHeaders = respHeaders.length > 0;\n const headersShape = hasRespHeaders ? renderSdkHeadersShape(respHeaders, modelsWithOutput) : '';\n\n // A union of more than one member is broken across lines — a four-status operation runs to\n // several hundred characters on one line otherwise.\n let returnMembers: string[] | undefined;\n let returnType = '';\n if (isMultiStatus) {\n returnMembers = observable.flatMap(r => sdkResponseMembers(r, modelsWithOutput, true));\n } else if (primaryBodies.length > 1) {\n returnMembers = sdkResponseMembers(primaryResponse!, modelsWithOutput, false);\n } else {\n const dataType = isVoid ? 'void' : sdkDataType(primaryBodies[0]!, modelsWithOutput);\n returnType = hasRespHeaders ? (isVoid ? `{ headers: ${headersShape} }` : `{ data: ${dataType}; headers: ${headersShape} }`) : dataType;\n }\n if (returnMembers?.length === 1) {\n returnType = returnMembers[0]!;\n returnMembers = undefined;\n }\n\n // Statuses the shared fetch would otherwise reject. All-2xx operations pass nothing, so the\n // overwhelmingly common case keeps its existing call shape.\n const expectStatuses = observable.filter(r => r.statusCode < 200 || r.statusCode >= 300).map(r => r.statusCode);\n\n // JSDoc\n const desc = op.description ?? route.description;\n const errorBodyName = thrown.some(r => r.bodies.length > 0) ? errorBodyTypeName(route, op) : undefined;\n if (op.name || desc || errorBodyName) {\n const tags: string[] = [];\n if (op.name) tags.push(`@name ${op.name}`);\n if (desc) tags.push(`@description ${desc}`);\n if (errorBodyName) tags.push(`@throws {SdkError<${errorBodyName}>} on ${thrown.map(r => r.statusCode).join(', ')}`);\n const contentLines = tags.flatMap(t => escapeJsDocLines(t));\n if (contentLines.length === 1) {\n lines.push(` /** ${contentLines[0]} */`);\n } else {\n lines.push(` /**`);\n for (const l of contentLines) lines.push(` * ${l}`);\n lines.push(` */`);\n }\n }\n\n if (returnMembers) {\n lines.push(` async ${methodName}(${paramStr}): Promise<`);\n for (const member of returnMembers) lines.push(` | ${member}`);\n lines.push(` > {`);\n } else {\n lines.push(` async ${methodName}(${paramStr}): Promise<${returnType}> {`);\n }\n\n // Build URL with path params\n const urlExpr = buildUrlExpression(route.path, route.params);\n\n // Query string\n const hasQuery = !!op.query;\n let fetchUrl = urlExpr;\n if (hasQuery) {\n lines.push(` const qs = buildQueryString(query);`);\n fetchUrl = urlExpr;\n }\n\n // Build fetch options\n const strategy = classifyBodyStrategy(op);\n const hasBody = strategy.kind !== 'none';\n const hasOpHeaders = !!op.headers;\n\n // Pre-emit serialization preludes for multi-MIME strategies\n if (strategy.kind === 'multi-equal') {\n const defaultCt = strategy.bodies[0]!.contentType;\n lines.push(` const __contentType = options?.contentType ?? '${defaultCt}';`);\n lines.push(` const __serialized = ${renderSerializeExpr('body', strategy.bodies, '__contentType')};`);\n } else if (strategy.kind === 'multi-formdata-detect') {\n lines.push(` const __isFormData = body instanceof FormData;`);\n const nonMultipart = strategy.bodies.find(b => b.contentType !== 'multipart/form-data')!;\n lines.push(` const __contentType: string = __isFormData ? 'multipart/form-data' : '${nonMultipart.contentType}';`);\n lines.push(\n ` const __serialized: BodyInit = __isFormData ? (body as FormData) : ${jsonOrFormSerialize('body', nonMultipart.contentType)};`,\n );\n } else if (strategy.kind === 'multi-required-arg') {\n lines.push(` const __contentType = options.contentType;`);\n lines.push(` const __serialized = ${renderSerializeExpr('body', strategy.bodies, '__contentType')};`);\n }\n\n const fetchArgs: string[] = [];\n\n if (hasQuery) {\n fetchArgs.push(`url: \\`${fetchUrl}\\${qs}\\``);\n } else {\n fetchArgs.push(`url: \\`${fetchUrl}\\``);\n }\n\n fetchArgs.push(`method: '${httpMethod}'`);\n\n if (strategy.kind === 'single') {\n const body = strategy.body;\n const cat = classifyContentType(body.contentType);\n if (cat === 'multipart') {\n // FormData supplies its own Content-Type with boundary; don't override it.\n fetchArgs.push('body: body');\n } else if (cat === 'urlencoded') {\n fetchArgs.push(`headers: { 'Content-Type': '${body.contentType}' }`);\n fetchArgs.push('body: new URLSearchParams(body as unknown as Record<string, string>).toString()');\n } else if (cat === 'text' || cat === 'binary') {\n // text/* and binary mimes pass the body through to fetch as-is — no schema serialization.\n fetchArgs.push(`headers: { 'Content-Type': '${body.contentType}' }`);\n fetchArgs.push('body: body');\n } else {\n fetchArgs.push(`headers: { 'Content-Type': '${body.contentType}' }`);\n fetchArgs.push('body: JSON.stringify(body, bigIntReplacer)');\n }\n } else if (hasBody) {\n // multi-equal | multi-formdata-detect | multi-required-arg — share a __contentType / __serialized prelude\n fetchArgs.push(`headers: { 'Content-Type': __contentType }`);\n fetchArgs.push('body: __serialized');\n }\n\n if (hasOpHeaders) {\n const lastHeaderIdx = fetchArgs.findIndex(a => a.startsWith('headers:'));\n if (lastHeaderIdx !== -1) {\n const existing = fetchArgs[lastHeaderIdx]!;\n const inner = existing.slice('headers: '.length).replace(/^\\{\\s*|\\s*\\}$/g, '');\n fetchArgs[lastHeaderIdx] = `headers: { ${inner}, ...customHeaders }`;\n } else {\n fetchArgs.push('headers: customHeaders');\n }\n }\n\n if (expectStatuses.length > 0) fetchArgs.push(`expectStatuses: [${expectStatuses.join(', ')}]`);\n\n const needsResult = isMultiStatus || !isVoid || hasRespHeaders;\n const resultPrefix = needsResult ? 'const result = ' : '';\n if (fetchArgs.length === 2 && !hasBody && !hasOpHeaders && !hasQuery) {\n // Simple case — inline\n lines.push(` ${resultPrefix}await this.fetch(\\`${fetchUrl}\\`, { method: '${httpMethod}' });`);\n } else {\n lines.push(` ${resultPrefix}await this.fetch(${fetchArgs[0]!.split(': ').slice(1).join(': ')}, {`);\n for (let i = 1; i < fetchArgs.length; i++) {\n lines.push(` ${fetchArgs[i]},`);\n }\n lines.push(` });`);\n }\n\n if (isMultiStatus) {\n // The status is only known at runtime, so the caller gets a union to narrow. The lowest\n // status is the default branch, which keeps the function exhaustively returning.\n const [fallback, ...rest] = observable;\n lines.push(` switch (result.status) {`);\n for (const resp of rest) {\n lines.push(` case ${resp.statusCode}:`);\n lines.push(...sdkReturnLines(resp, modelsWithOutput, ' ', true, mRevive));\n }\n lines.push(` default:`);\n lines.push(...sdkReturnLines(fallback!, modelsWithOutput, ' ', true, mRevive));\n lines.push(` }`);\n } else if (primaryBodies.length > 1) {\n lines.push(...sdkReturnLines(primaryResponse!, modelsWithOutput, ' ', false, mRevive));\n } else if (hasRespHeaders) {\n const headerEntries = sdkHeaderEntries(respHeaders);\n if (isVoid) {\n lines.push(` return { headers: { ${headerEntries} } };`);\n } else {\n lines.push(` const data = ${sdkReadExpr(primaryBodies[0]!, modelsWithOutput, hint(mRevive, primaryResponse!.statusCode))};`);\n lines.push(` return { data, headers: { ${headerEntries} } };`);\n }\n } else if (!isVoid) {\n lines.push(` return ${sdkReadExpr(primaryBodies[0]!, modelsWithOutput, hint(mRevive, primaryResponse!.statusCode))};`);\n }\n\n lines.push(' }');\n\n return lines;\n}\n\n// ─── Response shapes ──────────────────────────────────────────────────────\n\n/** The TypeScript type a client sees for one response body. */\nfunction sdkDataType(body: OpResponseBodyNode, modelsWithOutput?: Set<string>): string {\n const category = classifyContentType(body.contentType);\n if (category === 'text') return 'string';\n if (category === 'binary') return 'Blob';\n return renderOutputTsType(body.bodyType, modelsWithOutput);\n}\n\n/**\n * How a client reads one response body off the `Response`.\n *\n * A decimal-bearing body is wrapped in its reviver: `parseJson` is a bare cast, so without this the\n * type would say `Decimal` while the runtime held a string. Bodies with no decimal are emitted\n * byte-identically to before.\n */\nfunction sdkReadExpr(body: OpResponseBodyNode, modelsWithOutput?: Set<string>, revive?: ReviveContext): string {\n const category = classifyContentType(body.contentType);\n if (category === 'text') return 'await result.text()';\n if (category === 'binary') return 'await result.blob()';\n const tsType = renderOutputTsType(body.bodyType, modelsWithOutput);\n const read = `await parseJson<${tsType}>(result)`;\n const reviver = reviveExprFor(body.bodyType, revive);\n if (!reviver) return read;\n // `.map` over an array of refs rather than a wrapper function: the reviver returns the same\n // object it mutated, so the mapped array holds the same elements.\n return reviver.kind === 'array' ? `(${read}).map(${reviver.name})` : `${reviver.name}(${read})`;\n}\n\n/**\n * Extend the inline-reviver name with one more path segment.\n *\n * Built up compositionally — method, then status, then mime index — because each of those lives in\n * a different function, and the resulting name has to be distinct per body: two operations with\n * different inline decimal bodies must not share one wrapper.\n */\nfunction hint(revive: ReviveContext | undefined, segment: string | number): ReviveContext | undefined {\n if (!revive) return undefined;\n return { ...revive, nameHint: `${revive.nameHint}${segment}` };\n}\n\n/** What `sdkReadExpr` needs to decide whether a body has to be revived, and with which function. */\ninterface ReviveContext {\n modelsWithDecimal: Set<string>;\n modelsWithOutput?: Set<string>;\n /** Inline reviver declarations accumulated for the current file, keyed by function name. */\n inlineRevivers: Map<string, string[]>;\n modelMap?: Map<string, ModelNode>;\n /** Distinguishes the inline wrapper emitted for each body. */\n nameHint: string;\n}\n\n/** The reviver to apply to a response body, or `null` when the body holds no decimal. */\nfunction reviveExprFor(bodyType: ContractTypeNode, ctx: ReviveContext | undefined): { name: string; kind: 'value' | 'array' } | null {\n if (!ctx || ctx.modelsWithDecimal.size === 0) return null;\n const opts = { modelsWithDecimal: ctx.modelsWithDecimal, modelsWithOutput: ctx.modelsWithOutput, modelMap: ctx.modelMap };\n if (!typeReachesDecimal(bodyType, opts)) return null;\n\n const refName = (t: ContractTypeNode): string | null => (t.kind === 'ref' ? t.name : t.kind === 'lazy' ? refName(t.inner) : null);\n const pick = (name: string) => reviveFnName(name, ctx.modelsWithOutput?.has(name) ? 'output' : 'base');\n\n const direct = refName(bodyType);\n if (direct && ctx.modelsWithDecimal.has(direct)) return { name: pick(direct), kind: 'value' };\n\n if (bodyType.kind === 'array') {\n const item = refName(bodyType.item);\n if (item && ctx.modelsWithDecimal.has(item)) return { name: pick(item), kind: 'array' };\n }\n\n // Anything else — an inline object, a record, a tuple — has no `reviveX` to call, so the file\n // gets a wrapper of its own.\n const fnName = `__revive${ctx.nameHint}`;\n if (!ctx.inlineRevivers.has(fnName)) {\n const decl = renderInlineReviver(fnName, renderOutputTsType(bodyType, ctx.modelsWithOutput), bodyType, opts);\n if (!decl) return null;\n ctx.inlineRevivers.set(fnName, decl);\n }\n return { name: fnName, kind: 'value' };\n}\n\nfunction renderSdkHeadersShape(headers: OpResponseHeaderNode[], modelsWithOutput?: Set<string>): string {\n const fields = headers.map(\n h => `${quoteKey(headerNameToProperty(h.name))}${h.optional ? '?' : ''}: ${renderOutputTsType(h.type, modelsWithOutput)}`,\n );\n return `{ ${fields.join('; ')} }`;\n}\n\nfunction sdkHeaderEntries(headers: OpResponseHeaderNode[]): string {\n return headers.map(h => `${quoteKey(headerNameToProperty(h.name))}: result.headers.get('${h.name}') ?? undefined`).join(', ');\n}\n\n/**\n * Render one response as the members of the client's return union — the mirror of the router's\n * service-result members, with `data` in place of `body`.\n *\n * Collapses to a single member with a union of mime literals when every declared mime yields the\n * same data type; otherwise one member per mime, so `contentType` and `data` stay correlated.\n */\nfunction sdkResponseMembers(resp: OpResponseNode, modelsWithOutput: Set<string> | undefined, includeStatus: boolean): string[] {\n const bodies = resp.bodies;\n const headers = resp.headers ?? [];\n const leading = includeStatus ? [`status: ${resp.statusCode}`] : [];\n const trailing = headers.length > 0 ? [`headers: ${renderSdkHeadersShape(headers, modelsWithOutput)}`] : [];\n\n if (bodies.length === 0) {\n return [`{ ${[...leading, ...trailing].join('; ')} }`];\n }\n\n const dataTypes = bodies.map(b => sdkDataType(b, modelsWithOutput));\n if (dataTypes.every(t => t === dataTypes[0])) {\n const contentType = bodies.map(b => `'${b.contentType}'`).join(' | ');\n return [`{ ${[...leading, `contentType: ${contentType}`, `data: ${dataTypes[0]}`, ...trailing].join('; ')} }`];\n }\n return bodies.map((b, i) => `{ ${[...leading, `contentType: '${b.contentType}'`, `data: ${dataTypes[i]}`, ...trailing].join('; ')} }`);\n}\n\n/** The `return` statement(s) that build one response's member of the return union. */\nfunction sdkReturnLines(\n resp: OpResponseNode,\n modelsWithOutput: Set<string> | undefined,\n indent: string,\n includeStatus: boolean,\n revive?: ReviveContext,\n): string[] {\n const bodies = resp.bodies;\n const headers = resp.headers ?? [];\n const leading = includeStatus ? [`status: ${resp.statusCode}`] : [];\n const trailing = headers.length > 0 ? [`headers: { ${sdkHeaderEntries(headers)} }`] : [];\n\n if (bodies.length === 0) {\n return [`${indent}return { ${[...leading, ...trailing].join(', ')} };`];\n }\n if (bodies.length === 1) {\n const fields = [\n ...leading,\n `contentType: '${bodies[0]!.contentType}'`,\n `data: ${sdkReadExpr(bodies[0]!, modelsWithOutput, hint(revive, resp.statusCode))}`,\n ...trailing,\n ];\n return [`${indent}return { ${fields.join(', ')} };`];\n }\n\n const dataTypes = bodies.map(b => sdkDataType(b, modelsWithOutput));\n if (dataTypes.every(t => t === dataTypes[0])) {\n // Every mime reads the same way, so only the label has to come off the wire.\n const cast = bodies.map(b => `'${b.contentType}'`).join(' | ');\n const fields = [\n ...leading,\n `contentType: readContentType(result) as ${cast}`,\n `data: ${sdkReadExpr(bodies[0]!, modelsWithOutput, hint(revive, resp.statusCode))}`,\n ...trailing,\n ];\n return [`${indent}return { ${fields.join(', ')} };`];\n }\n\n // The mimes read differently, so the client has to dispatch on what actually came back.\n const lines = [`${indent}switch (readContentType(result)) {`];\n for (const [i, body] of bodies.slice(1).entries()) {\n const fields = [\n ...leading,\n `contentType: '${body.contentType}'`,\n `data: ${sdkReadExpr(body, modelsWithOutput, hint(revive, `${resp.statusCode}_${i + 1}`))}`,\n ...trailing,\n ];\n lines.push(`${indent} case '${body.contentType}':`);\n lines.push(`${indent} return { ${fields.join(', ')} };`);\n }\n const first = bodies[0]!;\n const fallbackFields = [\n ...leading,\n `contentType: '${first.contentType}'`,\n `data: ${sdkReadExpr(first, modelsWithOutput, hint(revive, `${resp.statusCode}_0`))}`,\n ...trailing,\n ];\n lines.push(`${indent} default:`);\n lines.push(`${indent} return { ${fallbackFields.join(', ')} };`);\n lines.push(`${indent}}`);\n return lines;\n}\n\n// ─── Error body typing ────────────────────────────────────────────────────\n\nfunction errorBodyTypeName(route: OpRouteNode, op: OpOperationNode): string {\n const method = deriveMethodName(op, route);\n return `${method.charAt(0).toUpperCase()}${method.slice(1)}ErrorBody`;\n}\n\n/**\n * Module-level `…ErrorBody` aliases for every operation whose thrown statuses declare a body.\n *\n * TypeScript cannot type a `throw`, so the alias plus the method's `@throws` tag is as far as the\n * error contract can be carried: it gives callers something to narrow `SdkError.body` to instead\n * of leaving them with `unknown`.\n */\nexport function generateErrorBodyAliases(root: OpRootNode, options: SdkCodegenOptions): string[] {\n const includeInternal = options.includeInternal ?? false;\n const lines: string[] = [];\n for (const route of root.routes) {\n for (const op of route.operations) {\n const mods = resolveModifiers(route, op);\n if (!includeInternal && mods.includes('internal')) continue;\n const types = new Set<string>();\n for (const resp of thrownResponses(op)) {\n for (const body of resp.bodies) types.add(sdkDataType(body, options.modelsWithOutput));\n }\n if (types.size === 0) continue;\n lines.push(`export type ${errorBodyTypeName(route, op)} = ${[...types].join(' | ')};`);\n }\n }\n return lines;\n}\n\n// ─── URL building ─────────────────────────────────────────────────────────\n\nfunction buildUrlExpression(path: string, _?: ParamSource): string {\n // Replace {paramName} with ${encodeURIComponent(paramName)}\n return path.replace(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (_match, name) => {\n return `\\${encodeURIComponent(${name})}`;\n });\n}\n\n// ─── Method parameters ────────────────────────────────────────────────────\n\ninterface MethodParam {\n name: string;\n type: string;\n optional: boolean;\n}\n\nfunction buildMethodParams(route: OpRouteNode, op: OpOperationNode, modelsWithInput?: Set<string>): MethodParam[] {\n const params: MethodParam[] = [];\n\n // Path params — always first, always required (request-side — use Input variants)\n if (route.params) {\n if (route.params.kind === 'params') {\n for (const p of route.params.nodes) {\n params.push({ name: p.name, type: renderInputTsType(p.type, modelsWithInput), optional: false });\n }\n } else if (route.params.kind === 'ref') {\n const typeName = modelsWithInput?.has(route.params.name) ? `${route.params.name}Input` : route.params.name;\n params.push({ name: 'params', type: typeName, optional: false });\n } else {\n params.push({ name: 'params', type: renderInputTsType(route.params.node, modelsWithInput), optional: false });\n }\n }\n\n // Body (request-side — use Input variants)\n const strategy = classifyBodyStrategy(op);\n if (strategy.kind === 'single') {\n const body = strategy.body;\n const cat = classifyContentType(body.contentType);\n if (cat === 'multipart') {\n params.push({ name: 'body', type: 'FormData', optional: false });\n } else if (cat === 'text') {\n params.push({ name: 'body', type: 'string', optional: false });\n } else if (cat === 'binary') {\n params.push({ name: 'body', type: 'Blob | ArrayBuffer | Uint8Array | string', optional: false });\n } else {\n params.push({ name: 'body', type: renderInputTsType(body.bodyType, modelsWithInput), optional: false });\n }\n } else if (strategy.kind === 'multi-equal') {\n const bodies = strategy.bodies;\n const bodyType = renderInputTsType(bodies[0]!.bodyType, modelsWithInput);\n params.push({ name: 'body', type: bodyType, optional: false });\n const ctUnion = bodies.map(b => `'${b.contentType}'`).join(' | ');\n params.push({ name: 'options', type: `{ contentType?: ${ctUnion} }`, optional: true });\n } else if (strategy.kind === 'multi-formdata-detect') {\n const types = strategy.bodies\n .map(b => (b.contentType === 'multipart/form-data' ? 'FormData' : renderInputTsType(b.bodyType, modelsWithInput)))\n .join(' | ');\n params.push({ name: 'body', type: types, optional: false });\n } else if (strategy.kind === 'multi-required-arg') {\n const types = strategy.bodies\n .map(b => (b.contentType === 'multipart/form-data' ? 'FormData' : renderInputTsType(b.bodyType, modelsWithInput)))\n .join(' | ');\n params.push({ name: 'body', type: types, optional: false });\n const ctUnion = strategy.bodies.map(b => `'${b.contentType}'`).join(' | ');\n params.push({ name: 'options', type: `{ contentType: ${ctUnion} }`, optional: false });\n }\n\n // Query (request-side — use Input variants)\n if (op.query) {\n if (op.query.kind === 'params') {\n const fields = op.query.nodes.map(p => `${quoteKey(p.name)}?: ${renderInputTsType(p.type, modelsWithInput)}`).join('; ');\n params.push({ name: 'query', type: `{ ${fields} }`, optional: true });\n } else if (op.query.kind === 'ref') {\n const typeName = modelsWithInput?.has(op.query.name) ? `${op.query.name}Input` : op.query.name;\n params.push({ name: 'query', type: typeName, optional: true });\n } else {\n params.push({ name: 'query', type: renderInputTsType(op.query.node, modelsWithInput), optional: true });\n }\n }\n\n // Headers (request-side — use Input variants)\n if (op.headers) {\n if (op.headers.kind === 'params') {\n const fields = op.headers.nodes.map(p => `${quoteKey(p.name)}?: ${renderInputTsType(p.type, modelsWithInput)}`).join('; ');\n params.push({ name: 'customHeaders', type: `{ ${fields} }`, optional: true });\n } else if (op.headers.kind === 'ref') {\n const typeName = modelsWithInput?.has(op.headers.name) ? `${op.headers.name}Input` : op.headers.name;\n params.push({ name: 'customHeaders', type: typeName, optional: true });\n } else {\n params.push({ name: 'customHeaders', type: renderInputTsType(op.headers.node, modelsWithInput), optional: true });\n }\n }\n\n return params;\n}\n\n// ─── Method name inference ────────────────────────────────────────────────\n\nfunction deriveMethodName(op: OpOperationNode, route: OpRouteNode): string {\n if (op.sdk) return op.sdk;\n if (op.name) return nameToMethodName(op.name);\n return inferMethodName(op.method, route.path);\n}\n\nfunction nameToMethodName(name: string): string {\n const parts = name.split(/[\\s\\-_]+/).filter(Boolean);\n return parts.map((p, i) => (i === 0 ? p.charAt(0).toLowerCase() + p.slice(1) : p.charAt(0).toUpperCase() + p.slice(1))).join('');\n}\n\nfunction inferMethodName(method: string, path: string): string {\n // Build a name from the path segments + method\n // e.g. GET /users/:id → getUsersById\n // e.g. POST /users → postUsers\n // e.g. DELETE /users/:id → deleteUsersById\n const segments = path.split('/').filter(s => s.length > 0);\n const parts: string[] = [method.toLowerCase()];\n\n for (const seg of segments) {\n if (seg.startsWith('{')) {\n // {id} → ById, {accountId} → ByAccountId\n const paramName = seg.slice(1, -1);\n parts.push('By' + paramName.charAt(0).toUpperCase() + paramName.slice(1));\n } else {\n // Regular segment — camelCase it\n const segParts = seg.split(/[.-]/).filter(Boolean);\n for (const sp of segParts) {\n parts.push(sp.charAt(0).toUpperCase() + sp.slice(1));\n }\n }\n }\n\n return parts[0]! + parts.slice(1).join('');\n}\n\n// ─── Naming conventions ────────────────────────────────────────────────────\n\nfunction deriveBaseName(file: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'Resource';\n return base\n .split('.')\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('');\n}\n\n/** Derive a client class name from a `.ck` file path, e.g. `users.ck` → `UsersClient`. Used for legacy flat (no-area) files. */\nexport function deriveClientClassName(file: string): string {\n return `${deriveBaseName(file)}Client`;\n}\n\n/** Camel-cased property name for a flat client on the SDK aggregator, e.g. `users.ck` → `users`. */\nexport function deriveClientPropertyName(file: string): string {\n const base = deriveBaseName(file);\n return base.charAt(0).toLowerCase() + base.slice(1);\n}\n\n/**\n * Pull `area` / `subarea` from a file's `root.meta` (set via `options { keys: { ... } }`).\n * Both are optional. `area` drives top-level SDK grouping; `subarea` drives nesting under\n * an area's client class.\n */\nexport function getAreaSubarea(root: OpRootNode): { area?: string; subarea?: string } {\n return { area: root.meta?.area, subarea: root.meta?.subarea };\n}\n\nfunction pascal(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('');\n}\n\nfunction camel(value: string): string {\n const p = pascal(value);\n return p.charAt(0).toLowerCase() + p.slice(1);\n}\n\n/** Class name for the area-level client, e.g. `area=identity` → `IdentityClient`. */\nexport function deriveAreaClientClassName(area: string): string {\n return `${pascal(area)}Client`;\n}\n\n/** Property name on the SDK aggregator for an area, e.g. `area=identity` → `identity`. */\nexport function deriveAreaPropertyName(area: string): string {\n return camel(area);\n}\n\n/** Class name for a leaf subarea client, e.g. `(identity, invitations)` → `IdentityInvitationsClient`. */\nexport function deriveSubareaClientClassName(area: string, subarea: string): string {\n return `${pascal(area)}${pascal(subarea)}Client`;\n}\n\n/** Property name on the area client for a subarea, e.g. `subarea=invitations` → `invitations`. */\nexport function deriveSubareaPropertyName(subarea: string): string {\n return camel(subarea);\n}\n\n// ─── Type collection ──────────────────────────────────────────────────────\n\nfunction collectTypes(root: OpRootNode, modelsWithInput?: Set<string>, modelsWithOutput?: Set<string>, includeInternal = false): string[] {\n const types = new Set<string>();\n for (const route of root.routes) {\n const publicOps = route.operations.filter(op => includeInternal || !resolveModifiers(route, op).includes('internal'));\n if (publicOps.length === 0) continue;\n // Only collect path-param types if there are public ops on this route\n collectParamSourceRefs(route.params, types);\n collectParamSourceInputRefs(route.params, types, modelsWithInput);\n for (const op of publicOps) {\n if (op.request) {\n for (const body of op.request.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectInputTypeNodeRefs(body.bodyType, types, modelsWithInput);\n }\n }\n for (const resp of op.responses) {\n for (const body of resp.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectOutputTypeNodeRefs(body.bodyType, types, modelsWithOutput);\n }\n if (resp.headers) {\n for (const h of resp.headers) {\n collectTypeNodeRefs(h.type, types);\n collectOutputTypeNodeRefs(h.type, types, modelsWithOutput);\n }\n }\n }\n collectParamSourceRefs(op.query, types);\n collectParamSourceInputRefs(op.query, types, modelsWithInput);\n collectParamSourceRefs(op.headers, types);\n collectParamSourceInputRefs(op.headers, types, modelsWithInput);\n }\n }\n return [...types].sort();\n}\n\n/** Collect Output variant refs for response-side ContractTypeNode types. */\nfunction collectOutputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithOutput?: Set<string>): void {\n if (!modelsWithOutput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithOutput.has(type.name)) out.add(`${type.name}Output`);\n break;\n case 'array':\n collectOutputTypeNodeRefs(type.item, out, modelsWithOutput);\n break;\n case 'intersection':\n case 'union':\n case 'discriminatedUnion':\n type.members.forEach(m => collectOutputTypeNodeRefs(m, out, modelsWithOutput));\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectOutputTypeNodeRefs(f.type, out, modelsWithOutput));\n break;\n case 'lazy':\n collectOutputTypeNodeRefs(type.inner, out, modelsWithOutput);\n break;\n }\n}\n\n/** Collect Input variant refs for request-side ParamSource types. */\nfunction collectParamSourceInputRefs(source: ParamSource | undefined, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!source || !modelsWithInput) return;\n if (source.kind === 'ref') {\n if (modelsWithInput.has(source.name)) out.add(`${source.name}Input`);\n } else if (source.kind === 'params') {\n for (const param of source.nodes) {\n collectInputTypeNodeRefs(param.type, out, modelsWithInput);\n }\n } else {\n collectInputTypeNodeRefs(source.node, out, modelsWithInput);\n }\n}\n\n/** Collect Input variant refs for request-side ContractTypeNode types. */\nfunction collectInputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!modelsWithInput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`);\n break;\n case 'array':\n collectInputTypeNodeRefs(type.item, out, modelsWithInput);\n break;\n case 'intersection':\n case 'union':\n case 'discriminatedUnion':\n type.members.forEach(m => collectInputTypeNodeRefs(m, out, modelsWithInput));\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectInputTypeNodeRefs(f.type, out, modelsWithInput));\n break;\n case 'lazy':\n collectInputTypeNodeRefs(type.inner, out, modelsWithInput);\n break;\n }\n}\n\nfunction collectParamSourceRefs(source: ParamSource | undefined, out: Set<string>): void {\n if (!source) return;\n if (source.kind === 'ref') {\n if (/^[A-Z]/.test(source.name)) out.add(source.name);\n } else if (source.kind === 'params') {\n for (const param of source.nodes) {\n collectTypeNodeRefs(param.type, out);\n }\n } else {\n collectTypeNodeRefs(source.node, out);\n }\n}\n\n/** True if any emitted operation has query params (drives the `buildQueryString` import). */\nfunction sdkNeedsQueryString(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n if (op.query) return true;\n }\n }\n return false;\n}\n\n/**\n * True if any emitted operation has a status declaring several mimes, so the client has to read\n * the actual content type off the response to know which it got.\n */\nfunction sdkNeedsReadContentType(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n if (observableResponses(op).some(r => r.bodies.length > 1)) return true;\n }\n }\n return false;\n}\n\n/** True if any emitted operation serializes a JSON request body (uses bigIntReplacer). */\nfunction sdkNeedsBigIntReplacer(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n if (op.request && op.request.bodies.some(b => isJsonMime(b.contentType))) return true;\n }\n }\n return false;\n}\n\n/** True if any public operation parses a JSON response body (uses bigIntReviver). */\nfunction sdkNeedsBigIntReviver(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n // Only JSON-shaped responses use parseJson — text/binary read raw.\n if (op.responses.some(r => r.bodies.some(b => classifyContentType(b.contentType) === 'json'))) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction sdkNeedsJson(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n const check = (src: ParamSource | undefined) => {\n if (!src || src.kind === 'ref') return false;\n if (src.kind === 'params') return src.nodes.some(p => typeNeedsScalar(p.type, 'json'));\n return typeNeedsScalar(src.node, 'json');\n };\n if (\n !!op.request?.bodies.some(b => typeNeedsScalar(b.bodyType, 'json')) ||\n op.responses.some(r => r.bodies.some(b => typeNeedsScalar(b.bodyType, 'json'))) ||\n check(op.query) ||\n check(op.headers) ||\n check(route.params)\n )\n return true;\n }\n }\n return false;\n}\n\nfunction collectTypeNodeRefs(type: ContractTypeNode, out: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n if (/^[A-Z]/.test(type.name)) out.add(type.name);\n break;\n case 'array':\n collectTypeNodeRefs(type.item, out);\n break;\n case 'tuple':\n type.items.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'record':\n collectTypeNodeRefs(type.key, out);\n collectTypeNodeRefs(type.value, out);\n break;\n case 'union':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'intersection':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'lazy':\n collectTypeNodeRefs(type.inner, out);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectTypeNodeRefs(f.type, out));\n break;\n }\n}\n\n// ─── Type import resolution ───────────────────────────────────────────────\n\nfunction generateTypeImports(types: string[], opFile: string, options: SdkCodegenOptions, revivers: string[] = []): string[] {\n const lines: string[] = [];\n const { modelOutPaths, outPath } = options;\n\n if (modelOutPaths && outPath) {\n const byFile = new Map<string, string[]>();\n const unresolved: string[] = [];\n\n for (const type of types) {\n const typeOutPath = modelOutPaths.get(type);\n if (typeOutPath) {\n const group = byFile.get(typeOutPath) ?? [];\n group.push(type);\n byFile.set(typeOutPath, group);\n } else {\n unresolved.push(type);\n }\n }\n\n const fromDir = dirname(outPath);\n for (const [typeOutPath, names] of byFile) {\n let rel = relative(fromDir, typeOutPath);\n rel = rel.replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n lines.push(`import type { ${names.sort().join(', ')} } from '${rel}';`);\n // Revivers are values, so they need a second, non-type import from the same module.\n const fromHere = revivers.filter(r => modelOutPaths.get(reviverModelName(r, names)) === typeOutPath);\n if (fromHere.length > 0) lines.push(`import { ${fromHere.sort().join(', ')} } from '${rel}';`);\n }\n\n for (const type of unresolved) {\n const moduleName = pascalToDotCase(type);\n lines.push(`import type { ${type} } from './${moduleName}.js';`);\n }\n } else {\n const typeImport = deriveTypeImportPath(opFile, options.typeImportPathTemplate);\n lines.push(`import type { ${types.join(', ')} } from '${typeImport}';`);\n }\n\n return lines;\n}\n\n/**\n * The model a reviver belongs to. `reviveInvoiceOutput` can come from either `Invoice` (with an\n * `Output` variant) or a model literally called `InvoiceOutput`, so the names actually imported\n * from the module decide it.\n */\nfunction reviverModelName(reviver: string, namesInModule: string[]): string {\n const stem = reviver.replace(/^revive/, '');\n if (namesInModule.includes(stem)) return stem;\n const base = stem.replace(/Output$/, '');\n return namesInModule.includes(base) ? base : stem;\n}\n\nfunction deriveTypeImportPath(file: string, template?: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'resource';\n const module = base.split('.')[0] ?? base;\n if (template) {\n return template.replace(/\\{module\\}/g, module).replace(/\\{base\\}/g, base);\n }\n return `#modules/${module}/types/index.js`;\n}\n\n// ─── Shared SDK files ──────────────────────────────────────────────────────\n\n/** Generate the shared SdkOptions interface file. */\nexport function generateSdkOptions(): string {\n return [\n 'export class SdkError<TBody = unknown> extends Error {',\n ' constructor(',\n ' public readonly status: number,',\n ' public readonly statusText: string,',\n ' public readonly body: TBody,',\n ' public readonly headers: Headers,',\n ' ) {',\n ' super(`${status} ${statusText}`);',\n \" this.name = 'SdkError';\",\n ' }',\n '}',\n '',\n 'export interface SdkRequestInit extends RequestInit {',\n ' /**',\n ' * Statuses this operation declares as values rather than errors — a 304 from',\n ' * conditional-GET middleware, or an error status the service returns deliberately.',\n ' * Anything else at or above 400 still throws SdkError.',\n ' */',\n ' expectStatuses?: number[];',\n '}',\n '',\n 'export type SdkFetch = (url: string, init: SdkRequestInit) => Promise<Response>;',\n '',\n 'export interface SdkOptions {',\n ' baseUrl: string;',\n ' headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);',\n ' fetch?: SdkFetch;',\n ' /** Called once per request to produce a unique X-Request-ID header value */',\n ' requestIdFactory?: () => string;',\n '}',\n '',\n 'export const bigIntReplacer = (_: string, value: any): any => {',\n \" if (typeof value === 'bigint') {\",\n \" return value.toString() + 'n';\",\n ' }',\n ' return value;',\n '};',\n '',\n 'export const bigIntReviver = (_: string, value: any): any => {',\n \" if (typeof value === 'string' && /^-?\\\\d+n$/.test(value)) {\",\n ' return BigInt(value.slice(0, -1));',\n ' }',\n ' return value;',\n '};',\n '',\n JSON_VALUE_TYPE_DECL,\n '',\n 'export function readContentType(res: Response): string {',\n \" return res.headers.get('content-type')?.split(';')[0]?.trim() ?? '';\",\n '}',\n '',\n 'export function createSdkFetch(options: SdkOptions): SdkFetch {',\n ' const getRequestId = options.requestIdFactory ?? (() => crypto.randomUUID());',\n ' return async (url: string, init: SdkRequestInit): Promise<Response> => {',\n \" const baseHeaders = typeof options.headers === 'function'\",\n ' ? await options.headers()',\n ' : options.headers ?? {};',\n ' const res = await fetch(`${options.baseUrl}${url}`, {',\n ' ...init,',\n \" headers: { ...baseHeaders, 'X-Request-ID': getRequestId(), ...init.headers as Record<string, string> },\",\n ' });',\n ' if (!res.ok && !(init.expectStatuses ?? []).includes(res.status)) {',\n ' const text = await res.text();',\n ' let body: unknown;',\n ' try { body = JSON.parse(text); } catch { body = text; }',\n ' throw new SdkError(res.status, res.statusText, body, res.headers);',\n ' }',\n ' return res;',\n ' };',\n '}',\n '',\n 'export function buildQueryString(query: object | undefined): string {',\n ' const searchParams = new URLSearchParams();',\n ' if (query) {',\n ' for (const [k, v] of Object.entries(query)) {',\n ' if (v === undefined || v === null) continue;',\n ' if (Array.isArray(v)) { for (const item of v) searchParams.append(k, String(item)); }',\n ' else searchParams.set(k, String(v));',\n ' }',\n ' }',\n ' const qs = searchParams.toString();',\n \" return qs ? `?${qs}` : '';\",\n '}',\n '',\n 'export async function parseJson<T>(res: Response): Promise<T> {',\n ' return JSON.parse(await res.text(), bigIntReviver) as T;',\n '}',\n '',\n ].join('\\n');\n}\n\n// ─── Scaffold files (package.json / tsconfig.json) ─────────────────────────\n\n/** Pinned dependency ranges for scaffolded SDK packages. Kept in one place so they're easy to bump. */\nconst SCAFFOLD_DEP_VERSIONS = {\n zod: '^4.3.6',\n luxon: '^3.5.0',\n decimalJs: '^10.4.3',\n typesLuxon: '^3.4.2',\n typescript: '^6.0.3',\n} as const;\n\n/** Which optional runtime deps the generated SDK references, derived from the contracts it covers. */\nexport interface SdkScaffoldDeps {\n /** Zod schema files are emitted (`config.zod`) — the SDK imports `zod`. */\n zod: boolean;\n /** Any covered model uses a `date`/`time`/`datetime`/`duration`/`interval` scalar — the SDK imports `luxon`. */\n luxon: boolean;\n /** Any covered model uses a `decimal` scalar — the SDK imports `decimal.js`. */\n decimal: boolean;\n}\n\n/**\n * Generate a starter `package.json` for a generated SDK package. Emitted with\n * `ifAbsent` semantics — written once, then owned by the user — so the dependency\n * ranges here are only ever a starting point, never re-applied on later builds.\n */\nexport function generateSdkPackageJson(input: { name: string; deps: SdkScaffoldDeps }): string {\n const dependencies: Record<string, string> = {};\n if (input.deps.zod) dependencies.zod = SCAFFOLD_DEP_VERSIONS.zod;\n if (input.deps.luxon) dependencies.luxon = SCAFFOLD_DEP_VERSIONS.luxon;\n // No `@types/` half — decimal.js ships its own declarations.\n if (input.deps.decimal) dependencies['decimal.js'] = SCAFFOLD_DEP_VERSIONS.decimalJs;\n\n const devDependencies: Record<string, string> = { typescript: SCAFFOLD_DEP_VERSIONS.typescript };\n if (input.deps.luxon) devDependencies['@types/luxon'] = SCAFFOLD_DEP_VERSIONS.typesLuxon;\n\n const pkg = {\n name: input.name,\n version: '0.0.0',\n type: 'module',\n main: './dist/index.js',\n types: './dist/index.d.ts',\n exports: {\n '.': {\n types: './dist/index.d.ts',\n import: './dist/index.js',\n },\n },\n files: ['dist'],\n scripts: {\n build: 'tsc -p tsconfig.json',\n },\n ...(Object.keys(dependencies).length > 0 ? { dependencies } : {}),\n devDependencies,\n };\n return JSON.stringify(pkg, null, 4) + '\\n';\n}\n\n/**\n * Generate a standalone `tsconfig.json` for a generated SDK package. Deliberately\n * self-contained (no workspace `extends`) so the scaffold works in a freshly\n * `npm init`'d package outside this monorepo. Emitted with `ifAbsent` semantics.\n */\nexport function generateSdkTsconfig(): string {\n const tsconfig = {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n declaration: true,\n outDir: './dist',\n rootDir: './src',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n },\n include: ['src'],\n exclude: ['dist', 'node_modules'],\n };\n return JSON.stringify(tsconfig, null, 4) + '\\n';\n}\n\n/**\n * Reference to a per-file leaf client emitted to its own `*.client.ts`. Used by the\n * aggregator to import the class and wire it as either a top-level `sdk.<prop>` or a\n * nested `sdk.<area>.<subarea>` property.\n */\nexport interface SdkClientInfo {\n /** Client class name (e.g. `UsersClient`, `IdentityInvitationsClient`). */\n className: string;\n /** Property name to expose this client under (e.g. `users`, `invitations`). */\n propertyName: string;\n /** Module specifier for the leaf file, relative to `sdk.ts` and `.js`-suffixed. */\n importPath: string;\n}\n\n/**\n * One area-level (no-subarea) `.ck` file whose methods are merged into the area's\n * `<Area>Client` (emitted to its own `<area>.client.ts`).\n */\nexport interface SdkAreaInlineFile {\n /** Parsed AST. */\n root: OpRootNode;\n /** Codegen options for this file (must have `outPath` pointing at the area client file so type-import paths resolve correctly). */\n codegenOptions: SdkCodegenOptions;\n}\n\n/** A grouping of files that share the same `keys.area`. */\nexport interface SdkAreaInfo {\n area: string;\n /**\n * Reference to the `<Area>Client` class — the file that holds it lives at\n * `client.importPath` (relative to `sdk.ts`) and is generated separately by\n * {@link generateAreaClient}. The aggregator just imports it.\n */\n client: SdkClientInfo;\n}\n\nexport interface SdkAggregatorInput {\n /** Files with no `keys.area` — kept as flat `Sdk.<filename>` properties (legacy behavior). */\n topLevelClients: SdkClientInfo[];\n /** One entry per `keys.area`. */\n areas: SdkAreaInfo[];\n /** Path to `sdk-options.ts` to import `SdkOptions`/`createSdkFetch`/etc. from. */\n sdkOptionsImportPath?: string;\n /** Name of the top-level aggregator class. Defaults to `Sdk`. */\n sdkClassName?: string;\n}\n\n/** Inputs to {@link generateAreaClient}. */\nexport interface AreaClientInput {\n /** Area name (e.g. `payments`). Drives the generated class name (`PaymentsClient`). */\n area: string;\n /** Output path of the generated `<area>.client.ts` file. Used to resolve relative type / leaf-client / sdk-options imports. */\n outPath: string;\n /** Files contributing inlined methods to the area client (typically area-level files with no subarea). */\n inlineFiles: SdkAreaInlineFile[];\n /** Subarea leaf clients exposed as named properties on the area client. */\n subareaClients: { propertyName: string; client: SdkClientInfo }[];\n /** Path to `sdk-options.ts`, used for `SdkFetch` and runtime helpers. */\n sdkOptionsPath: string;\n}\n\n/**\n * Generate a complete `<area>.client.ts` file: the `<Area>Client` class with\n * subarea property fields, a constructor that wires them, and inlined methods\n * merged from every area-level file in `inlineFiles`.\n *\n * Emitted by the plugin alongside the per-leaf `*.client.ts` files. The SDK\n * aggregator just imports the resulting class — see {@link generateSdkAggregator}.\n *\n * @throws if two area-level files contribute the same method name to the area —\n * disambiguate via `sdk:` on the operation, or move one into a subarea.\n */\nexport function generateAreaClient(input: AreaClientInput): string {\n const { area, outPath, inlineFiles, subareaClients, sdkOptionsPath } = input;\n const className = deriveAreaClientClassName(area);\n\n // ── Merge inputs across all inline files ────────────────────────────────\n const collectedMethodLines: string[] = [];\n const collectedRevivePrelude: string[] = [];\n let areaNeedsDecimalImport = false;\n /** Reviver value imports, grouped the same way `typesByImportPath` groups the type imports. */\n const reviversByImportPath = new Map<string, Set<string>>();\n // Aliases are keyed off method names, which already collide-check below, so a Set is enough.\n const collectedErrorAliases = new Set<string>();\n const seenMethods = new Set<string>();\n const typesByImportPath = new Map<string, Set<string>>();\n const unresolvedTypes = new Set<string>();\n let needsJson = false;\n let needsBigIntReplacer = false;\n let needsBigIntReviver = false;\n let needsQueryString = false;\n let needsReadContentType = false;\n\n for (const inline of inlineFiles) {\n const includeInternal = inline.codegenOptions.includeInternal ?? false;\n const { lines: methodLines, methodNames, preludeLines, needsDecimalImport } = generateClientMethods(inline.root, inline.codegenOptions);\n collectedRevivePrelude.push(...preludeLines);\n if (needsDecimalImport) areaNeedsDecimalImport = true;\n for (const name of methodNames) {\n if (seenMethods.has(name)) {\n throw new Error(\n `[sdk] duplicate method '${name}' in area '${area}': two area-level files contribute the same method. Disambiguate via 'sdk:' or move one into a subarea.`,\n );\n }\n seenMethods.add(name);\n }\n collectedMethodLines.push(...methodLines);\n for (const alias of generateErrorBodyAliases(inline.root, inline.codegenOptions)) collectedErrorAliases.add(alias);\n if (sdkNeedsJson(inline.root, includeInternal)) needsJson = true;\n if (sdkNeedsBigIntReplacer(inline.root, includeInternal)) needsBigIntReplacer = true;\n if (sdkNeedsBigIntReviver(inline.root, includeInternal)) needsBigIntReviver = true;\n if (sdkNeedsQueryString(inline.root, includeInternal)) needsQueryString = true;\n if (sdkNeedsReadContentType(inline.root, includeInternal)) needsReadContentType = true;\n\n // Revivers this file's methods call, resolved against the same modelOutPaths. Derived from\n // the emitted lines, exactly as `generateSdk` does, so the two paths cannot disagree.\n for (const reviver of usedRevivers(methodLines)) {\n const stem = reviver.replace(/^revive/, '');\n const modelOut = inline.codegenOptions.modelOutPaths?.get(stem) ?? inline.codegenOptions.modelOutPaths?.get(stem.replace(/Output$/, ''));\n if (!modelOut) continue;\n let rel = relative(dirname(outPath), modelOut).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n const set = reviversByImportPath.get(rel) ?? new Set<string>();\n set.add(reviver);\n reviversByImportPath.set(rel, set);\n }\n\n // Resolve each file's type refs against THIS file's modelOutPaths, but\n // produce import paths relative to the area client's outPath (not the\n // contributing file's outPath, which pointed at the now-defunct sdk.ts).\n const typesForFile = collectTypes(\n inline.root,\n inline.codegenOptions.modelsWithInput,\n inline.codegenOptions.modelsWithOutput,\n includeInternal,\n );\n const { modelOutPaths } = inline.codegenOptions;\n if (modelOutPaths) {\n const fromDir = dirname(outPath);\n for (const t of typesForFile) {\n const typeOutPath = modelOutPaths.get(t);\n if (typeOutPath) {\n let rel = relative(fromDir, typeOutPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n const set = typesByImportPath.get(rel) ?? new Set();\n set.add(t);\n typesByImportPath.set(rel, set);\n } else {\n unresolvedTypes.add(t);\n }\n }\n }\n }\n\n // ── Imports ─────────────────────────────────────────────────────────────\n let sdkOptionsRel = relative(dirname(outPath), sdkOptionsPath).replace(/\\.ts$/, '.js');\n if (!sdkOptionsRel.startsWith('.')) sdkOptionsRel = './' + sdkOptionsRel;\n\n const lines: string[] = [];\n const jsonImport = needsJson ? ', JsonValue' : '';\n lines.push(`import type { SdkFetch${jsonImport} } from '${sdkOptionsRel}';`);\n const valueImports: string[] = [];\n if (needsBigIntReplacer) valueImports.push('bigIntReplacer');\n if (needsBigIntReviver) valueImports.push('parseJson');\n if (needsQueryString) valueImports.push('buildQueryString');\n if (needsReadContentType) valueImports.push('readContentType');\n if (valueImports.length > 0) {\n lines.push(`import { ${valueImports.join(', ')} } from '${sdkOptionsRel}';`);\n }\n\n for (const path of [...typesByImportPath.keys()].sort()) {\n const names = [...typesByImportPath.get(path)!].sort();\n lines.push(`import type { ${names.join(', ')} } from '${path}';`);\n const revivers = reviversByImportPath.get(path);\n if (revivers && revivers.size > 0) lines.push(`import { ${[...revivers].sort().join(', ')} } from '${path}';`);\n }\n for (const t of [...unresolvedTypes].sort()) {\n lines.push(`import type { ${t} } from './${pascalToDotCase(t)}.js';`);\n }\n\n if (areaNeedsDecimalImport) lines.push(DECIMAL_IMPORT);\n\n // Leaf client imports (subareas only — top-level clients live next to sdk.ts).\n const importedClients = new Set<string>();\n for (const sc of subareaClients) {\n const key = `${sc.client.className}|${sc.client.importPath}`;\n if (importedClients.has(key)) continue;\n importedClients.add(key);\n lines.push(`import { ${sc.client.className} } from '${sc.client.importPath}';`);\n }\n lines.push('');\n\n if (collectedErrorAliases.size > 0) {\n lines.push(...collectedErrorAliases);\n lines.push('');\n }\n\n if (collectedRevivePrelude.length > 0) {\n lines.push(...collectedRevivePrelude);\n lines.push('');\n }\n\n // ── <Area>Client class ──────────────────────────────────────────────────\n lines.push(`export class ${className} {`);\n for (const sc of subareaClients) {\n lines.push(` readonly ${sc.propertyName}: ${sc.client.className};`);\n }\n if (subareaClients.length > 0) lines.push('');\n if (collectedMethodLines.length > 0 || subareaClients.length > 0) {\n const fetchModifier = collectedMethodLines.length > 0 ? 'private ' : '';\n lines.push(` constructor(${fetchModifier}fetch: SdkFetch) {`);\n for (const sc of subareaClients) {\n lines.push(` this.${sc.propertyName} = new ${sc.client.className}(fetch);`);\n }\n lines.push(' }');\n }\n for (const ln of collectedMethodLines) lines.push(ln);\n lines.push('}');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate the SDK aggregator (`sdk.ts`) — the entry-point file consumers import.\n *\n * Imports every `<Area>Client` (one per area, generated by {@link generateAreaClient}\n * to its own `<area>.client.ts`) and every leaf top-level client, then emits a\n * `class Sdk` that exposes them as properties.\n */\nexport function generateSdkAggregator(input: SdkAggregatorInput): string {\n const sdkOptionsImportPath = input.sdkOptionsImportPath ?? './sdk-options.js';\n const sdkClassName = input.sdkClassName ?? 'Sdk';\n\n const lines: string[] = [];\n lines.push(`import type { SdkOptions } from '${sdkOptionsImportPath}';`);\n lines.push(`import { createSdkFetch } from '${sdkOptionsImportPath}';`);\n\n const importedClients = new Set<string>();\n const pushClientImport = (c: SdkClientInfo): void => {\n const key = `${c.className}|${c.importPath}`;\n if (importedClients.has(key)) return;\n importedClients.add(key);\n lines.push(`import { ${c.className} } from '${c.importPath}';`);\n };\n // Areas first, then top-level — keeps the aggregator's import order stable.\n for (const area of input.areas) pushClientImport(area.client);\n for (const c of input.topLevelClients) pushClientImport(c);\n lines.push('');\n\n lines.push(`export class ${sdkClassName} {`);\n for (const area of input.areas) {\n lines.push(` readonly ${deriveAreaPropertyName(area.area)}: ${area.client.className};`);\n }\n for (const c of input.topLevelClients) {\n lines.push(` readonly ${c.propertyName}: ${c.className};`);\n }\n lines.push('');\n lines.push(' constructor(options: SdkOptions) {');\n lines.push(' const sdkFetch = options.fetch ?? createSdkFetch(options);');\n for (const area of input.areas) {\n lines.push(` this.${deriveAreaPropertyName(area.area)} = new ${area.client.className}(sdkFetch);`);\n }\n for (const c of input.topLevelClients) {\n lines.push(` this.${c.propertyName} = new ${c.className}(sdkFetch);`);\n }\n lines.push(' }');\n lines.push('}');\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { relative, dirname } from 'node:path';\nimport type { ContractRootNode, ModelNode, FieldNode } from '@contractkit/core';\nimport { computeModelsWithOutput, collectExternalOutputRefs } from '@contractkit/core';\nimport type { ContractCodegenContext } from './codegen-contract.js';\nimport {\n collectExternalRefs,\n collectExternalInputRefs,\n computeModelsWithInput,\n topoSortModels,\n resolveImportPath,\n rootNeedsScalar,\n} from './codegen-contract.js';\nimport { renderTsType, renderInputTsType, renderOutputTsType, quoteKey, escapeJsDocLines, JSON_VALUE_TYPE_DECL } from './ts-render.js';\nimport type { TsRenderTarget } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_CONFIG_LINE } from './decimal-runtime.js';\nimport { renderReviveFunctions, reviveFnName, DECIMAL_COERCE_DECL } from './codegen-revive.js';\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/**\n * Generate plain TypeScript interfaces/types from a contract AST.\n * Unlike `generateContract()` which produces Zod schemas, this emits\n * vanilla TypeScript `interface` and `type` declarations suitable\n * for SDK consumers that don't need runtime validation.\n *\n * @param context Import resolution and Input/Output variant sets. `context.target` selects the\n * runtime the types describe (`'server'` renders `binary` as `Buffer`, `'client'` as `Blob`).\n */\nexport function generatePlainTypes(root: ContractRootNode, context?: ContractCodegenContext): string {\n const target: TsRenderTarget = context?.target ?? 'client';\n const externalRefs = collectExternalRefs(root);\n const lines: string[] = [];\n\n // Compute which models have Input variants (local, incl. transitive deps + external)\n const externalModelsWithInput = context?.modelsWithInput ?? new Set<string>();\n const localModelsWithInput = computeModelsWithInput(root.models, externalModelsWithInput);\n const allModelsWithInput = new Set([...localModelsWithInput, ...externalModelsWithInput]);\n\n // Compute which models have Output variants (post-transform wire shape)\n const externalModelsWithOutput = context?.modelsWithOutput ?? new Set<string>();\n const localModelsWithOutput = computeModelsWithOutput(root.models, externalModelsWithOutput);\n const allModelsWithOutput = new Set([...localModelsWithOutput, ...externalModelsWithOutput]);\n\n // Collect additional external Input/Output refs needed for variant fields\n const externalInputRefs = allModelsWithInput.size > 0 ? collectExternalInputRefs(root, allModelsWithInput) : [];\n const externalOutputRefs = allModelsWithOutput.size > 0 ? collectExternalOutputRefs(root, allModelsWithOutput) : [];\n const allExternalRefs = [...new Set([...externalRefs, ...externalInputRefs, ...externalOutputRefs])].sort();\n\n // Not `import type`: `renderTsScalar` maps `decimal` to `Decimal` in this mode too, so the class\n // is a real runtime dependency of any consumer holding one — same position as in\n // `generateContract`, which emits it ahead of the external model refs.\n const needsDecimal = rootNeedsScalar(root, 'decimal') || (context?.emitRevivers && context.modelsWithDecimal ? root.models.some(m => context.modelsWithDecimal!.has(m.name)) : false);\n if (needsDecimal) lines.push(DECIMAL_IMPORT);\n\n // Type-only imports for external references. A cross-file model carrying a decimal also\n // contributes its reviver, which is a value and so needs a second, non-type import.\n for (const ref of allExternalRefs) {\n const importPath = resolveImportPath(ref, context);\n lines.push(`import type { ${ref} } from '${importPath}';`);\n if (context?.emitRevivers && context.modelsWithDecimal?.has(ref)) {\n lines.push(`import { ${reviveFnName(ref)} } from '${importPath}';`);\n }\n }\n if (allExternalRefs.length > 0) lines.push('');\n\n if (rootNeedsScalar(root, 'json')) {\n if (context?.jsonValueImportPath) {\n lines.push(`import type { JsonValue } from '${context.jsonValueImportPath}';`);\n } else {\n lines.push(JSON_VALUE_TYPE_DECL);\n }\n lines.push('');\n }\n\n const modelMap = new Map(root.models.map(m => [m.name, m]));\n\n const reviveOpts =\n context?.emitRevivers && context.modelsWithDecimal\n ? { modelsWithDecimal: context.modelsWithDecimal, modelsWithOutput: allModelsWithOutput, modelMap }\n : undefined;\n\n const bodyLines: string[] = [];\n for (const model of topoSortModels(root.models)) {\n bodyLines.push(...generateModel(model, target, context?.currentOutPath, allModelsWithInput, allModelsWithOutput, modelMap));\n if (reviveOpts) {\n const revivers = renderReviveFunctions(model, reviveOpts);\n if (revivers.length > 0) {\n bodyLines.push('');\n bodyLines.push(...revivers);\n }\n }\n bodyLines.push('');\n }\n\n // Global decimal.js config belongs in any file holding a `Decimal`: there is no Zod schema in\n // this mode, but `String(value)` and `JSON.stringify` still have to stay out of exponential form.\n if (needsDecimal) {\n lines.push('');\n lines.push(DECIMAL_CONFIG_LINE);\n }\n\n // Same rule as in `generateContract`: the helper is emitted only if the revivers actually\n // reference it, so the two cannot drift and trip `noUnusedLocals`.\n if (bodyLines.some(l => l.includes('__dec('))) {\n lines.push(...DECIMAL_COERCE_DECL);\n lines.push('');\n }\n lines.push(...bodyLines);\n\n return lines.join('\\n');\n}\n\n// ─── Model ─────────────────────────────────────────────────────────────────\n\nfunction generateModel(\n model: ModelNode,\n target: TsRenderTarget,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithOutput?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n): string[] {\n // Type alias: Name : typeExpression\n if (model.type) {\n return generateTypeAlias(model, target, outPath, modelsWithInput, modelsWithOutput);\n }\n\n // A model needs Input/read split if it has visibility-modified fields OR if it\n // transitively references models that have Input variants (captured in modelsWithInput).\n const needsInputSplit = model.fields.some(f => f.visibility !== 'normal') || (modelsWithInput?.has(model.name) ?? false);\n\n const lines = needsInputSplit\n ? generateVisibilityModel(model, target, outPath, modelsWithInput, modelMap)\n : generateSimpleModel(model, target, outPath, modelMap);\n\n if (modelsWithOutput?.has(model.name)) {\n lines.push('');\n lines.push(...generateOutputModel(model, target, modelsWithOutput));\n }\n return lines;\n}\n\n/** Recursively collect every field name defined on `bases` and their ancestors. Used to detect\n * fields that the child re-declares without an explicit `override` keyword — those still need an\n * `Omit<Base, …>` wrap, otherwise the child's narrower/incompatible declaration collides with the\n * inherited one. */\nfunction collectInheritedFieldNames(bases: string[], modelMap: Map<string, ModelNode>): Set<string> {\n const result = new Set<string>();\n const visit = (name: string): void => {\n const m = modelMap.get(name);\n if (!m || m.type) return;\n for (const f of m.fields) result.add(f.name);\n for (const b of m.bases ?? []) visit(b);\n };\n for (const b of bases) visit(b);\n return result;\n}\n\n/** Names of fields the child declaration overrides — explicit `override` plus any field whose\n * name shadows an inherited one. The latter catches single-base redeclarations that omit the\n * `override` keyword (e.g. narrowing `kind: BusinessRoleKind` → `kind: 'employee'`). */\nfunction computeOverrideNames(model: ModelNode, modelMap?: Map<string, ModelNode>): string[] {\n const inherited = modelMap ? collectInheritedFieldNames(model.bases ?? [], modelMap) : new Set<string>();\n return model.fields.filter(f => f.override || inherited.has(f.name)).map(f => f.name);\n}\n\nfunction generateComments(model: ModelNode, outPath?: string): string[] {\n const lines: string[] = [];\n lines.push('/**');\n if (model.deprecated) {\n lines.push(` * @deprecated`);\n }\n if (model.description) {\n for (const l of escapeJsDocLines(model.description)) lines.push(` * ${l}`);\n }\n\n const relPath = outPath ? relative(dirname(outPath), model.loc.file) : model.loc.file;\n lines.push(` * generated from [${model.name}](file://./${relPath}#L${model.loc.line})`);\n lines.push(' */');\n return lines;\n}\n\nfunction generateTypeAlias(\n model: ModelNode,\n target: TsRenderTarget,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithOutput?: Set<string>,\n): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n lines.push(`export type ${model.name} = ${renderTsType(model.type!, target)};`);\n if (modelsWithInput?.has(model.name)) {\n lines.push(`export type ${model.name}Input = ${renderInputTsType(model.type!, modelsWithInput, target)};`);\n }\n if (modelsWithOutput?.has(model.name)) {\n lines.push(`export type ${model.name}Output = ${renderOutputTsType(model.type!, modelsWithOutput, target)};`);\n }\n return lines;\n}\n\n/** Build the `extends` clause for a model.\n * Each entry in `overrideNames` is wrapped in `Omit<Base, 'name1' | 'name2'>` per base so the\n * subclass can legally redeclare those fields with new (possibly incompatible) types.\n * TypeScript's `Omit<T, K extends keyof any>` tolerates omit keys that don't appear on the base,\n * so we apply the same omit list to every base without per-base field-set lookup. */\nfunction buildExtendsClause(bases: string[], overrideNames: string[], baseNameResolver: (b: string) => string): string {\n if (bases.length === 0) return '';\n if (overrideNames.length === 0) return ` extends ${bases.map(baseNameResolver).join(', ')}`;\n const omitKeys = overrideNames.map(n => `'${n}'`).join(' | ');\n const wrapped = bases.map(b => `Omit<${baseNameResolver(b)}, ${omitKeys}>`);\n return ` extends ${wrapped.join(', ')}`;\n}\n\nfunction generateSimpleModel(model: ModelNode, target: TsRenderTarget, outPath?: string, modelMap?: Map<string, ModelNode>): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n\n const bases = model.bases ?? [];\n const overrideNames = computeOverrideNames(model, modelMap);\n lines.push(`export interface ${model.name}${buildExtendsClause(bases, overrideNames, b => b)} {`);\n\n for (const field of model.fields) {\n lines.push(` ${renderField(field, target)}`);\n }\n\n lines.push('}');\n return lines;\n}\n\nfunction generateVisibilityModel(\n model: ModelNode,\n target: TsRenderTarget,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n\n const bases = model.bases ?? [];\n const overrideNames = computeOverrideNames(model, modelMap);\n\n // Read type — omit writeonly fields\n const readFields = model.fields.filter(f => f.visibility !== 'writeonly');\n lines.push(`export interface ${model.name}${buildExtendsClause(bases, overrideNames, b => b)} {`);\n for (const field of readFields) {\n lines.push(` ${renderField(field, target)}`);\n }\n lines.push('}');\n lines.push('');\n\n // Write type — omit readonly fields (use Input variants for sub-type refs);\n // extends ParentInput if parent has an Input variant, else extends parent read type\n const writeFields = model.fields.filter(f => f.visibility !== 'readonly');\n const inputResolver = (b: string) => (modelsWithInput?.has(b) ? `${b}Input` : b);\n lines.push(`export interface ${model.name}Input${buildExtendsClause(bases, overrideNames, inputResolver)} {`);\n for (const field of writeFields) {\n lines.push(` ${modelsWithInput ? renderInputField(field, modelsWithInput, target) : renderField(field, target)}`);\n }\n lines.push('}');\n\n return lines;\n}\n\n// ─── Field rendering ──────────────────────────────────────────────────────\n\n/** Prefix a field declaration with a JSDoc comment built from `@deprecated` / description parts,\n * neutralizing any block-comment terminator and expanding embedded newlines into continuation lines. */\nfunction withFieldJsDoc(jsdocParts: string[], line: string): string {\n if (jsdocParts.length === 0) return line;\n const contentLines = escapeJsDocLines(jsdocParts.join(' '));\n if (contentLines.length === 1) {\n return `/** ${contentLines[0]} */\\n ${line}`;\n }\n const body = contentLines.map(l => ` * ${l}`).join('\\n');\n return `/**\\n${body}\\n */\\n ${line}`;\n}\n\nfunction renderField(field: FieldNode, target: TsRenderTarget): string {\n const opt = field.optional || field.default !== undefined ? '?' : '';\n let typeStr = renderTsType(field.type, target);\n if (field.nullable) typeStr += ' | null';\n const line = `${quoteKey(field.name)}${opt}: ${typeStr};`;\n const jsdocParts: string[] = [];\n if (field.deprecated) jsdocParts.push('@deprecated');\n if (field.description) jsdocParts.push(field.description);\n return withFieldJsDoc(jsdocParts, line);\n}\n\nfunction renderInputField(field: FieldNode, modelsWithInput: Set<string>, target: TsRenderTarget): string {\n const opt = field.optional || field.default !== undefined ? '?' : '';\n let typeStr = renderInputTsType(field.type, modelsWithInput, target);\n if (field.nullable) typeStr += ' | null';\n const line = `${quoteKey(field.name)}${opt}: ${typeStr};`;\n const jsdocParts: string[] = [];\n if (field.deprecated) jsdocParts.push('@deprecated');\n if (field.description) jsdocParts.push(field.description);\n return withFieldJsDoc(jsdocParts, line);\n}\n\n// ─── Output (post-transform wire shape) ──────────────────────────────────\n\nfunction camelToSnake(s: string): string {\n return s.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`);\n}\n\nfunction camelToPascal(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction applyOutputCase(name: string, c: 'camel' | 'snake' | 'pascal' | undefined): string {\n if (!c || c === 'camel') return name;\n if (c === 'snake') return camelToSnake(name);\n return camelToPascal(name);\n}\n\n/**\n * Emit `${name}Output` for a model in the output transitive set.\n * - Direct hits (model.outputCase set): rename keys per the transform and substitute nested refs.\n * - Transitive hits: keep field names as-is but substitute nested refs with their Output variants.\n *\n * `extends` is dropped for direct-hit models because the Zod schema flattens fields when an\n * ancestor has format(...) (see `flattenFormatChain` in codegen-contract); we mirror that here\n * so the plain interface matches the wire shape produced by the Zod transform.\n */\nfunction generateOutputModel(model: ModelNode, target: TsRenderTarget, modelsWithOutput: Set<string>): string[] {\n const lines: string[] = [];\n const outputCase = model.outputCase && model.outputCase !== 'camel' ? model.outputCase : undefined;\n const readFields = model.fields.filter(f => f.visibility !== 'writeonly');\n\n // Transitive-only (no direct outputCase): preserve `extends` and original key names.\n if (!outputCase) {\n const baseExt =\n model.bases?.[0] && modelsWithOutput.has(model.bases?.[0])\n ? ` extends ${model.bases?.[0]}Output`\n : model.bases?.[0]\n ? ` extends ${model.bases?.[0]}`\n : '';\n lines.push(`export interface ${model.name}Output${baseExt} {`);\n for (const field of readFields) {\n lines.push(` ${renderOutputField(field, model.outputCase, modelsWithOutput, target)}`);\n }\n lines.push('}');\n return lines;\n }\n\n // Direct hit: emit a flat interface with renamed keys.\n lines.push(`export interface ${model.name}Output {`);\n for (const field of readFields) {\n lines.push(` ${renderOutputField(field, outputCase, modelsWithOutput, target)}`);\n }\n lines.push('}');\n return lines;\n}\n\nfunction renderOutputField(\n field: FieldNode,\n outputCase: 'camel' | 'snake' | 'pascal' | undefined,\n modelsWithOutput: Set<string>,\n target: TsRenderTarget,\n): string {\n const opt = field.optional || field.default !== undefined ? '?' : '';\n const key = applyOutputCase(field.name, outputCase);\n let typeStr = renderOutputTsType(field.type, modelsWithOutput, target);\n if (field.nullable) typeStr += ' | null';\n const line = `${quoteKey(key)}${opt}: ${typeStr};`;\n const jsdocParts: string[] = [];\n if (field.deprecated) jsdocParts.push('@deprecated');\n if (field.description) jsdocParts.push(field.description);\n return withFieldJsDoc(jsdocParts, line);\n}\n","import type { OpRootNode, OpRouteNode, OpOperationNode, McpConfigNode, ParamSource, ContractTypeNode } from '@contractkit/core';\nimport { resolveModifiers, emittedResponses } from '@contractkit/core';\nimport { renderType, renderInputType, pascalToDotCase } from './codegen-contract.js';\nimport { inferService, deriveModulePath, buildArgs, deriveBaseName } from './codegen-operation.js';\nimport { quoteKey, escapeSingleQuoted } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_PRELUDE_LINES } from './decimal-runtime.js';\nimport { basename, dirname, relative } from 'node:path';\n\n// ─── Options ────────────────────────────────────────────────────────────────\n\nexport interface McpCodegenOptions {\n /** Absolute path of the file being generated. Used to compute relative imports. */\n outPath?: string;\n /** Map from schema identifier (model name / `${name}Input`) → absolute output file. */\n modelOutPaths?: Map<string, string>;\n /** Model names that have an Input variant schema. */\n modelsWithInput?: Set<string>;\n /** Model names that have an Output variant schema. */\n modelsWithOutput?: Set<string>;\n /** Import-path template for service implementations (same semantics as ServerConfig). */\n servicePathTemplate?: string;\n /** Emit tools for `internal` operations. Default false. */\n includeInternal?: boolean;\n}\n\n// ─── MCP flag helpers ─────────────────────────────────────────────────────\n\n/** The explicit settings block, if the operation used the object form of `mcp:`. */\nfunction mcpConfig(op: OpOperationNode): McpConfigNode | undefined {\n return op.mcp && typeof op.mcp === 'object' ? op.mcp : undefined;\n}\n\n/**\n * True if the root has at least one MCP-exposed operation. With `includeInternal: false`\n * (default) `internal` operations don't count. Mirrors `hasPublicOperations`.\n */\nexport function hasMcpOperations(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!op.mcp) continue;\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n return true;\n }\n }\n return false;\n}\n\n// ─── Name derivation ────────────────────────────────────────────────────────\n\n/** camelCase / PascalCase / spaced / hyphenated → snake_case. */\nfunction toSnake(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[\\s\\-.]+/g, '_')\n .toLowerCase()\n .replace(/[^a-z0-9_]/g, '')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '');\n}\n\n/** snake_case → PascalCase. */\nfunction toPascal(s: string): string {\n return s\n .split('_')\n .filter(Boolean)\n .map(p => p.charAt(0).toUpperCase() + p.slice(1))\n .join('');\n}\n\n/** Inferred snake_case tool name from method + path, e.g. GET /payments/{id} → get_payments_by_id. */\nfunction inferToolName(method: string, path: string): string {\n const parts: string[] = [method.toLowerCase()];\n for (const seg of path.split('/').filter(Boolean)) {\n if (seg.startsWith('{')) {\n parts.push('by', toSnake(seg.slice(1, -1)));\n } else {\n parts.push(toSnake(seg));\n }\n }\n return parts.filter(Boolean).join('_');\n}\n\n/** Tool name: explicit `mcp.name` (verbatim) → `sdk` → `name` → inferred; derived forms snake_cased. */\nfunction deriveToolName(op: OpOperationNode, route: OpRouteNode): string {\n const cfg = mcpConfig(op);\n if (cfg?.name) return cfg.name;\n if (op.sdk) return toSnake(op.sdk);\n if (op.name) return toSnake(op.name);\n return inferToolName(op.method, route.path);\n}\n\n/** Tool class name — PascalCase of the tool name with an `McpTool` suffix for clarity. */\nfunction deriveToolClassName(toolName: string): string {\n return `${toPascal(toolName)}McpTool`;\n}\n\n// ─── Input args schema ────────────────────────────────────────────────────\n\ninterface ArgsProp {\n key: string;\n expr: string;\n optional: boolean;\n}\n\n/** Build the flat args properties for a tool, matching the router's `buildArgs` variable names. */\nfunction buildArgsProps(route: OpRouteNode, op: OpOperationNode, modelsWithInput?: Set<string>): ArgsProp[] {\n const props: ArgsProp[] = [];\n\n // Path params — spread individually (inline) or as a single `params` object (ref/type).\n if (route.params) {\n if (route.params.kind === 'params') {\n for (const node of route.params.nodes) {\n props.push({ key: node.name, expr: renderInputType(node.type, modelsWithInput), optional: false });\n }\n } else if (route.params.kind === 'ref') {\n props.push({ key: 'params', expr: refSchema(route.params.name, modelsWithInput), optional: false });\n } else {\n props.push({ key: 'params', expr: renderInputType(route.params.node, modelsWithInput), optional: false });\n }\n }\n\n // Body — single JSON body maps to a `body` field; multipart/binary/multi bodies aren't cleanly\n // representable as JSON tool args, so they fall back to `z.unknown()` (advisory only).\n const bodies = op.request?.bodies ?? [];\n if (bodies.length === 1 && bodies[0]!.contentType === 'multipart/form-data') {\n props.push({ key: 'multipartBody', expr: 'z.unknown()', optional: false });\n } else if (bodies.length === 1) {\n props.push({ key: 'body', expr: renderInputType(bodies[0]!.bodyType, modelsWithInput), optional: false });\n } else if (bodies.length > 1) {\n props.push({ key: 'body', expr: 'z.unknown()', optional: false });\n }\n\n // Query / headers — whole objects, optional.\n if (op.query) props.push({ key: 'query', expr: paramSourceSchema(op.query, modelsWithInput), optional: true });\n if (op.headers) props.push({ key: 'headers', expr: paramSourceSchema(op.headers, modelsWithInput), optional: true });\n\n return props;\n}\n\nfunction refSchema(name: string, modelsWithInput?: Set<string>): string {\n return modelsWithInput?.has(name) ? `${name}Input` : name;\n}\n\nfunction paramSourceSchema(src: ParamSource, modelsWithInput?: Set<string>): string {\n if (src.kind === 'ref') return refSchema(src.name, modelsWithInput);\n if (src.kind === 'type') return renderInputType(src.node, modelsWithInput);\n const fields = src.nodes.map(n => `${quoteKey(n.name)}: ${renderInputType(n.type, modelsWithInput)}`).join(', ');\n return `z.object({ ${fields} })`;\n}\n\nfunction argsSchemaExpr(props: ArgsProp[]): string {\n if (props.length === 0) return 'z.object({})';\n const fields = props.map(p => `${quoteKey(p.key)}: ${p.expr}${p.optional ? '.optional()' : ''}`).join(', ');\n return `z.object({ ${fields} })`;\n}\n\n// ─── Output schema ──────────────────────────────────────────────────────────\n\n/**\n * The body an MCP tool reports as its output: the first body the service can actually return.\n *\n * Documented and thrown statuses are skipped — an MCP tool describes what a successful call\n * produces, not what the operation is allowed to document.\n */\nfunction primaryResponseBody(op: OpOperationNode): ContractTypeNode | undefined {\n for (const resp of emittedResponses(op)) {\n if (resp.bodies[0]) return resp.bodies[0].bodyType;\n }\n return undefined;\n}\n\n/** MCP output schemas must be objects — only model refs and inline objects qualify. */\nfunction outputSchemaExpr(op: OpOperationNode): string | undefined {\n const body = primaryResponseBody(op);\n if (!body) return undefined;\n if (body.kind === 'ref') return body.name;\n if (body.kind === 'inlineObject') return renderType(body);\n return undefined;\n}\n\n// ─── Annotations ────────────────────────────────────────────────────────────\n\nconst HINT_KEYS = ['readOnlyHint', 'destructiveHint', 'idempotentHint', 'openWorldHint'] as const;\n\nfunction annotationsExpr(cfg: McpConfigNode | undefined): string | undefined {\n if (!cfg) return undefined;\n const parts: string[] = [];\n for (const key of HINT_KEYS) {\n const val = cfg[key];\n if (val !== undefined) parts.push(`${key}: ${val}`);\n }\n return parts.length > 0 ? `{ ${parts.join(', ')} }` : undefined;\n}\n\n// ─── Schema-import collection ───────────────────────────────────────────────\n\nfunction walkTypeRefs(type: ContractTypeNode, ids: Set<string>, variant: 'input' | 'read', modelsWithInput?: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n ids.add(variant === 'input' ? refSchema(type.name, modelsWithInput) : type.name);\n break;\n case 'array':\n walkTypeRefs(type.item, ids, variant, modelsWithInput);\n break;\n case 'tuple':\n type.items.forEach(t => walkTypeRefs(t, ids, variant, modelsWithInput));\n break;\n case 'record':\n walkTypeRefs(type.key, ids, variant, modelsWithInput);\n walkTypeRefs(type.value, ids, variant, modelsWithInput);\n break;\n case 'union':\n case 'discriminatedUnion':\n case 'intersection':\n type.members.forEach(t => walkTypeRefs(t, ids, variant, modelsWithInput));\n break;\n case 'inlineObject':\n type.fields.forEach(f => walkTypeRefs(f.type, ids, variant, modelsWithInput));\n break;\n case 'lazy':\n walkTypeRefs(type.inner, ids, variant, modelsWithInput);\n break;\n }\n}\n\nfunction walkSourceRefs(src: ParamSource | undefined, ids: Set<string>, modelsWithInput?: Set<string>): void {\n if (!src) return;\n if (src.kind === 'ref') ids.add(refSchema(src.name, modelsWithInput));\n else if (src.kind === 'params') src.nodes.forEach(n => walkTypeRefs(n.type, ids, 'input', modelsWithInput));\n else walkTypeRefs(src.node, ids, 'input', modelsWithInput);\n}\n\n/** Collect every schema identifier the emitted tools import (input variants + read variants for output). */\nfunction collectSchemaIds(ops: { route: OpRouteNode; op: OpOperationNode }[], modelsWithInput?: Set<string>): Set<string> {\n const ids = new Set<string>();\n for (const { route, op } of ops) {\n walkSourceRefs(route.params, ids, modelsWithInput);\n const bodies = op.request?.bodies ?? [];\n if (bodies.length === 1 && bodies[0]!.contentType !== 'multipart/form-data') {\n walkTypeRefs(bodies[0]!.bodyType, ids, 'input', modelsWithInput);\n }\n walkSourceRefs(op.query, ids, modelsWithInput);\n walkSourceRefs(op.headers, ids, modelsWithInput);\n\n const body = primaryResponseBody(op);\n if (body && (body.kind === 'ref' || body.kind === 'inlineObject')) walkTypeRefs(body, ids, 'read');\n }\n return ids;\n}\n\nfunction schemaImportLines(ids: Set<string>, options: McpCodegenOptions): string[] {\n const lines: string[] = [];\n const { modelOutPaths, outPath } = options;\n if (ids.size === 0) return lines;\n if (modelOutPaths && outPath) {\n const byFile = new Map<string, string[]>();\n const unresolved: string[] = [];\n for (const id of ids) {\n const p = modelOutPaths.get(id);\n if (p) {\n const group = byFile.get(p) ?? [];\n group.push(id);\n byFile.set(p, group);\n } else {\n unresolved.push(id);\n }\n }\n const fromDir = dirname(outPath);\n for (const [file, names] of byFile) {\n let rel = relative(fromDir, file).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n lines.push(`import { ${names.sort().join(', ')} } from '${rel}';`);\n }\n for (const id of unresolved.sort()) lines.push(`import { ${id} } from './${pascalToDotCase(id)}.js';`);\n } else {\n for (const id of [...ids].sort()) lines.push(`import { ${id} } from './${pascalToDotCase(id)}.js';`);\n }\n return lines;\n}\n\n// ─── Zod scalar helper preludes ─────────────────────────────────────────────\n\nfunction scalarHelperLines(body: string): string[] {\n const lines: string[] = [];\n if (body.includes('_ZodBinary')) {\n lines.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`);\n }\n if (body.includes('_ZodDatetime')) {\n lines.push(\n `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`,\n );\n }\n if (body.includes('_ZodDecimal')) {\n lines.push(...DECIMAL_PRELUDE_LINES);\n }\n if (body.includes('_ZodInterval')) {\n lines.push(\n `const _ZodInterval = z.preprocess((val) => typeof val === 'string' ? Interval.fromISO(val) : val, z.custom<Interval>((val) => val instanceof Interval && val.isValid, { message: 'Must be an ISO 8601 interval' })).transform(val => val.toISO()!);`,\n );\n }\n if (body.includes('_ZodJson')) {\n lines.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`);\n lines.push(\n `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`,\n );\n }\n return lines;\n}\n\n// ─── Per-tool codegen ─────────────────────────────────────────────────────\n\ninterface ToolPlan {\n route: OpRouteNode;\n op: OpOperationNode;\n toolName: string;\n className: string;\n argsConstName: string;\n}\n\nfunction planTools(root: OpRootNode, includeInternal: boolean): ToolPlan[] {\n const plans: ToolPlan[] = [];\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!op.mcp) continue;\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n const toolName = deriveToolName(op, route);\n const className = deriveToolClassName(toolName);\n plans.push({ route, op, toolName, className, argsConstName: `${toPascal(toolName)}Args` });\n }\n }\n return plans;\n}\n\nfunction renderToolClass(plan: ToolPlan, file: string, options: McpCodegenOptions): string[] {\n const { route, op, toolName, className, argsConstName } = plan;\n const cfg = mcpConfig(op);\n const lines: string[] = [];\n\n // JSDoc source link\n const relFile = options.outPath ? relative(dirname(options.outPath), file) : file;\n lines.push('/**');\n lines.push(` * from [${basename(file)}](file://./${relFile}#L${op.loc.line})`);\n lines.push(' */');\n\n lines.push('@Injectable()');\n lines.push(`export class ${className} implements McpToolHandler {`);\n\n // definition\n lines.push(' readonly definition: Tool = {');\n lines.push(` name: '${escapeSingleQuoted(toolName)}',`);\n if (cfg?.title) lines.push(` title: '${escapeSingleQuoted(cfg.title)}',`);\n const desc = cfg?.description ?? op.description ?? route.description;\n if (desc) lines.push(` description: '${escapeSingleQuoted(desc)}',`);\n lines.push(` inputSchema: z.toJSONSchema(${argsConstName}, { unrepresentable: 'any' }) as Tool['inputSchema'],`);\n const outExpr = outputSchemaExpr(op);\n if (outExpr) lines.push(` outputSchema: z.toJSONSchema(${outExpr}, { unrepresentable: 'any' }) as Tool['outputSchema'],`);\n const annotations = annotationsExpr(cfg);\n if (annotations) lines.push(` annotations: ${annotations},`);\n lines.push(' };');\n lines.push('');\n\n // constructor injects the operation's service\n const service = inferService(op, route, file);\n lines.push(` constructor(private readonly service: ${service.className}) {}`);\n lines.push('');\n\n // handle\n const props = buildArgsProps(route, op, options.modelsWithInput);\n const destructure = props.map(p => p.key);\n const callArgs = buildArgs(route, op);\n const isVoid = !primaryResponseBody(op);\n const structured = !!outExpr;\n\n lines.push(' async handle(args: Record<string, unknown>, _context: McpToolContext): Promise<CallToolResult> {');\n if (destructure.length > 0) {\n lines.push(` const { ${destructure.join(', ')} } = await parseAndValidate(args, ${argsConstName});`);\n }\n if (isVoid) {\n lines.push(` await this.service.${service.methodName}(${callArgs});`);\n lines.push(` return { content: [{ type: 'text', text: 'OK' }] };`);\n } else {\n lines.push(` const result = await this.service.${service.methodName}(${callArgs});`);\n if (structured) {\n lines.push(` return { content: [{ type: 'text', text: JSON.stringify(result) }], structuredContent: result };`);\n } else {\n lines.push(` return { content: [{ type: 'text', text: JSON.stringify(result) }] };`);\n }\n }\n lines.push(' }');\n lines.push('}');\n\n return lines;\n}\n\n// ─── Public entry points ────────────────────────────────────────────────────\n\n/** The exported register-fn name for an op-root file, e.g. `payments.op` → `registerPaymentsMcpTools`. */\nexport function deriveMcpRegisterFnName(file: string): string {\n return `register${deriveBaseName(file)}McpTools`;\n}\n\n/** Generate one `<filename>.mcp.ts` for an op-root: tool handler classes + a per-file register fn. */\nexport function generateMcpFile(root: OpRootNode, options: McpCodegenOptions = {}): string {\n const includeInternal = options.includeInternal ?? false;\n const plans = planTools(root, includeInternal);\n\n // Args schema consts (also drive the JSON-Schema definitions).\n const argsConsts = plans.map(p => `const ${p.argsConstName} = ${argsSchemaExpr(buildArgsProps(p.route, p.op, options.modelsWithInput))};`);\n\n // Tool classes.\n const classes = plans.map(p => renderToolClass(p, root.file, options).join('\\n'));\n\n // Per-file register fn.\n const registerFn: string[] = [];\n registerFn.push(`/** Add this file's tools to the shared catalog. */`);\n registerFn.push(`export function ${deriveMcpRegisterFnName(root.file)}(map: McpToolHandlerMap, container: Container): void {`);\n for (const p of plans) registerFn.push(` map.set('${escapeSingleQuoted(p.toolName)}', container.get(${p.className}));`);\n registerFn.push('}');\n\n const bodyCore = [argsConsts.join('\\n'), classes.join('\\n\\n'), registerFn.join('\\n')].filter(Boolean).join('\\n\\n');\n\n // Zod scalar helper consts (must precede the args consts that reference them).\n const helperConsts = scalarHelperLines(bodyCore);\n const bodyWithHelpers = [helperConsts.join('\\n'), bodyCore].filter(Boolean).join('\\n\\n');\n\n // ── Imports ──\n const needsParseAndValidate = plans.some(p => buildArgsProps(p.route, p.op, options.modelsWithInput).length > 0);\n const imports: string[] = [];\n imports.push(`import { Injectable, type Container } from 'injectkit';`);\n imports.push(`import { z } from 'zod';`);\n\n const luxon: string[] = [];\n if (/\\bDateTime\\b/.test(bodyWithHelpers)) luxon.push('DateTime');\n if (/\\bInterval\\b/.test(bodyWithHelpers)) luxon.push('Interval');\n if (/\\bDuration\\b/.test(bodyWithHelpers)) luxon.push('Duration');\n if (luxon.length > 0) imports.push(`import { ${luxon.join(', ')} } from 'luxon';`);\n if (/\\bDecimal\\b/.test(bodyWithHelpers)) imports.push(DECIMAL_IMPORT);\n\n imports.push(`import type { CallToolResult, Tool } from '@modelcontextprotocol/sdk/types.js';`);\n imports.push(`import type { McpToolHandler, McpToolHandlerMap, McpToolContext } from '@maroonedsoftware/mcp';`);\n if (needsParseAndValidate) imports.push(`import { parseAndValidate } from '@maroonedsoftware/zod';`);\n\n // Service imports (one per distinct service used by the emitted tools).\n const serviceModules = new Map<string, string>();\n for (const p of plans) {\n const svc = inferService(p.op, p.route, root.file).className;\n if (!serviceModules.has(svc)) {\n serviceModules.set(svc, root.services?.[svc] ?? root.meta[svc] ?? deriveModulePath(svc, options.servicePathTemplate));\n }\n }\n for (const [svc, mod] of [...serviceModules.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n imports.push(`import { ${svc} } from '${mod}';`);\n }\n\n // Schema imports.\n imports.push(...schemaImportLines(collectSchemaIds(plans, options.modelsWithInput), options));\n\n const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file;\n const header = `// Auto-generated MCP tools\\n// generated from [${basename(root.file)}](file://./${relFile})`;\n\n return `${header}\\n${imports.join('\\n')}\\n\\n${bodyWithHelpers}\\n`;\n}\n\n/** One entry per emitted `<filename>.mcp.ts` for the aggregator to import. */\nexport interface McpAggregatorEntry {\n /** The file's exported register fn name, e.g. `registerPaymentsMcpTools`. */\n registerFn: string;\n /** Module specifier for the file, relative to the aggregator and `.js`-suffixed. */\n importPath: string;\n}\n\n/** Generate the aggregator `mcp.tools.ts` that assembles the single McpToolHandlerMap. */\nexport function generateMcpAggregator(entries: McpAggregatorEntry[]): string {\n const sorted = [...entries].sort((a, b) => a.registerFn.localeCompare(b.registerFn));\n const lines: string[] = [];\n lines.push(`import { type Container } from 'injectkit';`);\n lines.push(`import { McpToolHandlerMap } from '@maroonedsoftware/mcp';`);\n for (const e of sorted) lines.push(`import { ${e.registerFn} } from '${e.importPath}';`);\n lines.push('');\n lines.push('/** Build + register the MCP tool catalog. Call once at startup. */');\n lines.push('export function registerMcpTools(container: Container): McpToolHandlerMap {');\n lines.push(' const map = new McpToolHandlerMap();');\n for (const e of sorted) lines.push(` ${e.registerFn}(map, container);`);\n lines.push(' container.register(McpToolHandlerMap, { useValue: map });');\n lines.push(' return map;');\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\n\n/** Generate the optional `mcp.router.ts` — the standard ServerKit route wiring for the dispatcher. */\nexport function generateMcpRouter(options: { path?: string } = {}): string {\n const path = options.path ?? '/mcp';\n return `import { ServerKitRouter, requireSignature } from '@maroonedsoftware/koa';\nimport { McpDispatcher, createMcpRequestContext, MCP_AUTH_POLICY } from '@maroonedsoftware/mcp';\n\n/** Mount the MCP endpoint onto a ServerKit router. Call \\`registerMcpTools(container)\\` at startup. */\nexport function mountMcp(router: ReturnType<typeof ServerKitRouter>): void {\n router.post('${path}', requireSignature('mcp', { policy: MCP_AUTH_POLICY }), async (ctx) => {\n const dispatcher = ctx.container.get(McpDispatcher);\n const context = createMcpRequestContext({ requestId: ctx.requestId, logger: ctx.logger });\n if (dispatcher.sessionMode === 'stateful') {\n ctx.respond = false;\n await dispatcher.dispatchStateful(\n { req: ctx.req, res: ctx.res, body: ctx.request.body, sessionId: ctx.get('mcp-session-id') },\n context,\n );\n } else {\n const response = await dispatcher.dispatch(JSON.parse(ctx.rawBody), context);\n if (response) ctx.body = response;\n }\n });\n}\n`;\n}\n","import { resolve, join, relative, dirname, isAbsolute } from 'node:path';\nimport type { ContractRootNode, OpRootNode } from '@contractkit/core';\nimport { collectTypeRefs, collectPublicTypeNames } from '@contractkit/core';\n\nexport const TEMPLATE_VAR_RE = /\\{\\w+\\}/;\n\n/**\n * Guard against path traversal in output-path templates. Output-path template variables\n * (`{area}`, `{dir}`, `{filename}`, `{name}`) can be sourced from a `.ck` file's\n * `options { keys }` block, so a malicious value like `../../../tmp/x` could escape the\n * plugin's output directory. After the final absolute path is computed, verify it stays\n * within `baseOutDir`; otherwise throw.\n */\nfunction assertWithinBase(baseOutDir: string, outPath: string): string {\n const rel = relative(resolve(baseOutDir), resolve(outPath));\n if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {\n throw new Error(\n `Refusing to emit outside output directory: resolved path \"${outPath}\" escapes \"${baseOutDir}\" (check options { keys } values used in output path templates)`,\n );\n }\n return outPath;\n}\n\nexport function resolveTemplate(template: string, vars: Record<string, string>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => vars[key] ?? `{${key}}`);\n}\n\nexport function includesFilename(p: string): boolean {\n const last = p.split('/').pop() ?? '';\n return last.includes('.');\n}\n\nexport function commonDir(files: string[], rootDir: string): string {\n if (files.length === 0) return resolve(rootDir);\n const parts = files.map(f => dirname(f).split('/'));\n const first = parts[0]!;\n let depth = first.length;\n for (const p of parts) {\n for (let i = 0; i < depth; i++) {\n if (p[i] !== first[i]) {\n depth = i;\n break;\n }\n }\n }\n return first.slice(0, depth).join('/') || '/';\n}\n\n// ─── Server / Zod output paths ─────────────────────────────────────────────\n\nexport function computeOpOutPath(\n filePath: string,\n baseDir: string,\n output: string | undefined,\n defaultSuffix: string,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string {\n const baseName = filePath.split('/').pop()!;\n const relDir = relative(commonRoot, dirname(filePath));\n const filename = baseName.replace(/\\.ck$/, '');\n const defaultName = `${filename}${defaultSuffix}`;\n const baseOutDir = resolve(baseDir);\n\n if (output && TEMPLATE_VAR_RE.test(output)) {\n const resolved = resolveTemplate(output, { filename, dir: relDir, ext: 'ck', ...meta });\n if (includesFilename(resolved)) return assertWithinBase(baseOutDir, join(baseOutDir, resolved));\n return assertWithinBase(baseOutDir, join(baseOutDir, resolved, defaultName));\n }\n if (output) {\n if (includesFilename(output)) return assertWithinBase(baseOutDir, join(baseOutDir, output));\n return assertWithinBase(baseOutDir, join(baseOutDir, output, relDir, defaultName));\n }\n return assertWithinBase(baseOutDir, join(baseOutDir, relDir, defaultName));\n}\n\nexport function computeContractOutPath(\n filePath: string,\n baseDir: string,\n output: string | undefined,\n defaultSuffix: string,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string {\n return computeOpOutPath(filePath, baseDir, output, defaultSuffix, commonRoot, meta);\n}\n\n// ─── SDK output paths ──────────────────────────────────────────────────────\n\nexport function computeSdkOutPath(\n filePath: string,\n rootDir: string,\n clientOutput: string | undefined,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string | null {\n if (!filePath.endsWith('.ck')) return null;\n const baseName = filePath.split('/').pop()!;\n const defaultOutName = baseName.replace(/\\.ck$/, '.client.ts');\n const baseOutDir = resolve(rootDir);\n const relDir = relative(commonRoot, dirname(filePath));\n const filename = baseName.replace(/\\.ck$/, '');\n\n if (clientOutput && TEMPLATE_VAR_RE.test(clientOutput)) {\n const resolved = resolveTemplate(clientOutput, { filename, dir: relDir, ext: 'ck', ...meta });\n if (includesFilename(resolved)) return assertWithinBase(baseOutDir, join(baseOutDir, resolved));\n return assertWithinBase(baseOutDir, join(baseOutDir, resolved, defaultOutName));\n }\n if (clientOutput) {\n if (includesFilename(clientOutput)) return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput));\n return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput, relDir, defaultOutName));\n }\n return assertWithinBase(baseOutDir, join(baseOutDir, relDir, defaultOutName));\n}\n\n/**\n * Resolve the output path for a synthesized `<area>.client.ts` — the file holding the\n * `<Area>Client` class that aggregates an area's inlined methods and subarea wiring.\n *\n * Uses the same `output.clients` template as leaf clients, with `{filename}` and `{area}`\n * substituted to the area name and `{subarea}` substituted to the empty string. Resulting\n * double-slashes from the empty substitution are collapsed, and a final segment that\n * would otherwise begin with a dot (e.g. `.client.ts` from `{subarea}.client.ts`) is\n * prefixed with the area so the file isn't hidden.\n */\nexport function computeSdkAreaClientOutPath(area: string, rootDir: string, clientOutput: string | undefined): string {\n const filename = area;\n const baseOutDir = resolve(rootDir);\n const fixHiddenSegment = (path: string): string => {\n const segments = path.split('/');\n const last = segments[segments.length - 1] ?? '';\n if (last.startsWith('.')) segments[segments.length - 1] = `${filename}${last}`;\n return segments.join('/');\n };\n if (clientOutput && TEMPLATE_VAR_RE.test(clientOutput)) {\n const resolved = resolveTemplate(clientOutput, { filename, dir: '', ext: 'ck', area, subarea: '' });\n const cleaned = fixHiddenSegment(resolved.replace(/\\/+/g, '/').replace(/^\\//, ''));\n if (includesFilename(cleaned)) return assertWithinBase(baseOutDir, join(baseOutDir, cleaned));\n return assertWithinBase(baseOutDir, join(baseOutDir, cleaned, `${filename}.client.ts`));\n }\n if (clientOutput) {\n if (includesFilename(clientOutput)) return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput));\n return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput, `${filename}.client.ts`));\n }\n return assertWithinBase(baseOutDir, join(baseOutDir, `${filename}.client.ts`));\n}\n\nexport function computeSdkTypeOutPath(\n filePath: string,\n rootDir: string,\n typeOutput: string,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string | null {\n if (!filePath.endsWith('.ck')) return null;\n const baseName = filePath.split('/').pop()!;\n const defaultOutName = baseName.replace(/\\.ck$/, '.ts');\n const baseOutDir = resolve(rootDir);\n const relDir = relative(commonRoot, dirname(filePath));\n const filename = baseName.replace(/\\.ck$/, '');\n\n if (TEMPLATE_VAR_RE.test(typeOutput)) {\n const resolved = resolveTemplate(typeOutput, { filename, dir: relDir, ext: 'ck', ...meta });\n if (includesFilename(resolved)) return assertWithinBase(baseOutDir, join(baseOutDir, resolved));\n return assertWithinBase(baseOutDir, join(baseOutDir, resolved, defaultOutName));\n }\n if (includesFilename(typeOutput)) return assertWithinBase(baseOutDir, join(baseOutDir, typeOutput));\n return assertWithinBase(baseOutDir, join(baseOutDir, typeOutput, relDir, defaultOutName));\n}\n\nexport function generateBarrelFiles(contractPaths: string[]): { outPath: string; content: string }[] {\n const byDir = new Map<string, string[]>();\n for (const outPath of contractPaths) {\n const dir = dirname(outPath);\n const group = byDir.get(dir) ?? [];\n group.push(outPath);\n byDir.set(dir, group);\n }\n const results: { outPath: string; content: string }[] = [];\n for (const [dir, files] of byDir) {\n const exports = files\n .map(f => `export * from './${f.split('/').pop()!.replace(/\\.ts$/, '.js')}';`)\n .sort()\n .join('\\n');\n results.push({ outPath: join(dir, 'index.ts'), content: `// Auto-generated barrel file\\n${exports}\\n` });\n }\n return results;\n}\n\nexport function computePubliclyReachableTypes(\n opAsts: OpRootNode[],\n contractAsts: ContractRootNode[],\n modelsWithInput: Set<string>,\n modelsWithOutput: Set<string> = new Set(),\n): Set<string> | null {\n if (opAsts.length === 0) return null;\n const reachable = new Set<string>();\n for (const opAst of opAsts) {\n for (const name of collectPublicTypeNames(opAst, modelsWithInput, modelsWithOutput)) reachable.add(name);\n }\n const modelDeps = new Map<string, Set<string>>();\n for (const contractAst of contractAsts) {\n for (const model of contractAst.models) {\n const deps = new Set<string>();\n if (model.bases) for (const b of model.bases) deps.add(b);\n if (model.type) collectTypeRefs(model.type, deps);\n for (const field of model.fields) collectTypeRefs(field.type, deps);\n modelDeps.set(model.name, deps);\n }\n }\n const frontier = [...reachable];\n while (frontier.length > 0) {\n const name = frontier.pop()!;\n const baseName = name.endsWith('Input') ? name.slice(0, -5) : name.endsWith('Output') ? name.slice(0, -6) : name;\n for (const dep of modelDeps.get(baseName) ?? []) {\n if (!reachable.has(dep)) {\n reachable.add(dep);\n frontier.push(dep);\n }\n if (modelsWithInput.has(dep)) {\n const inputDep = `${dep}Input`;\n if (!reachable.has(inputDep)) {\n reachable.add(inputDep);\n frontier.push(inputDep);\n }\n }\n if (modelsWithOutput.has(dep)) {\n const outputDep = `${dep}Output`;\n if (!reachable.has(outputDep)) {\n reachable.add(outputDep);\n frontier.push(outputDep);\n }\n }\n }\n }\n return reachable;\n}\n"],"mappings":"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AAK5N,QAAQ,WAAW,EAAA;AACrC,SAAO2N,cAAczP,SAASsM,IAAAA,IAAQA,OAAOoD;AACjD;AALSP;AAOT,SAASI,sBAAqB7O,MAAciP,UAAiB;AACzD,QAAMrD,OACF5L,KACKgI,MAAM,GAAA,EACN6D,IAAG,GACFzK,QAAQ,cAAc,EAAA,KAAO;AACvC,QAAM8N,SAAStD,KAAK5D,MAAM,GAAA,EAAK,CAAA,KAAM4D;AACrC,MAAIqD,UAAU;AACV,WAAOA,SAAS7N,QAAQ,eAAe8N,MAAAA,EAAQ9N,QAAQ,aAAawK,IAAAA;EACxE;AACA,SAAO,YAAYsD,MAAAA;AACvB;AAXSL,OAAAA,uBAAAA;AAgBF,SAASM,qBAAAA;AACZ,SAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACArN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACFD,KAAK,IAAA;AACX;AA3FgBsN;AAgGhB,IAAMC,wBAAwB;EAC1BC,KAAK;EACLC,OAAO;EACPC,WAAW;EACXC,YAAY;EACZC,YAAY;AAChB;AAiBO,SAASC,uBAAuBC,OAA8C;AACjF,QAAMC,eAAuC,CAAC;AAC9C,MAAID,MAAME,KAAKR,IAAKO,cAAaP,MAAMD,sBAAsBC;AAC7D,MAAIM,MAAME,KAAKP,MAAOM,cAAaN,QAAQF,sBAAsBE;AAEjE,MAAIK,MAAME,KAAKC,QAASF,cAAa,YAAA,IAAgBR,sBAAsBG;AAE3E,QAAMQ,kBAA0C;IAAEN,YAAYL,sBAAsBK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","names":["resolve","join","relative","dirname","basename","existsSync","readFileSync","writeFileSync","mkdirSync","rmSync","readdirSync","rmdirSync","relative","dirname","collectTypeRefs","computeModelsWithOutput","ckComputeModelsWithOutput","collectExternalOutputRefs","ckCollectExternalOutputRefs","JSON_VALUE_TYPE_DECL","quoteKey","name","test","escapeJsDocLines","text","replace","split","escapeSingleQuoted","s","headerNameToProperty","parts","filter","Boolean","map","p","i","lower","toLowerCase","charAt","toUpperCase","slice","join","renderTsType","type","target","kind","renderTsScalar","inner","item","needsParens","items","key","value","values","v","String","members","m","renderTsInlineObject","fields","_exhaustive","Error","entries","f","opt","optional","renderInputTsType","modelsWithInput","size","has","renderOutputTsType","modelsWithOutput","DECIMAL_IMPORT","DECIMAL_CONFIG_LINE","DECIMAL_ZOD_SCHEMA_LINE","DECIMAL_PRELUDE_LINES","DECIMAL_COERCE_DECL","reviveFnName","model","variant","applyCase","name","caseTransform","replace","c","toLowerCase","charAt","toUpperCase","slice","typeReachesDecimal","type","opts","kind","modelsWithDecimal","has","item","inner","items","some","t","value","members","fields","f","Scope","n","next","prefix","emit","slot","path","scope","reviveRefName","arr","i","map","l","flatMap","idx","rec","k","relevant","filter","length","obj","body","fieldStatements","undefined","m","real","target","find","branches","disc","member","tag","discriminatorTag","discriminator","push","JSON","stringify","modelMap","get","field","values","objVar","outputCase","key","optional","nullable","modelsWithOutput","renderInlineReviver","fnName","tsType","renderReviveFunctions","lines","renderOne","typeName","modeToWrapper","mode","computeModelsWithInput","models","externalModelsWithInput","Set","result","model","fields","some","f","visibility","add","name","changed","has","refs","field","collectTypeRefs","type","bases","b","ref","generateComments","outPath","lines","push","deprecated","description","l","escapeJsDocLines","relPath","relative","dirname","loc","file","line","generateContract","root","context","needsDateTime","rootNeedsDateTime","needsDuration","rootNeedsScalar","needsInterval","needsBinary","needsDatetime","needsJson","needsDecimal","externalRefs","collectExternalRefs","modelsWithInput","localModelsWithInput","allModelsWithInput","externalModelsWithOutput","modelsWithOutput","localModelsWithOutput","ckComputeModelsWithOutput","allModelsWithOutput","externalInputRefs","size","collectExternalInputRefs","externalOutputRefs","ckCollectExternalOutputRefs","allExternalRefs","sort","luxonImports","length","join","DECIMAL_IMPORT","importPath","resolveImportPath","names","emitRevivers","modelsWithDecimal","reviveFnName","DECIMAL_PRELUDE_LINES","modelsWithWriteonly","filter","m","map","modelMap","Map","reviveOpts","undefined","bodyLines","topoSortModels","generateModel","currentOutPath","revivers","renderReviveFunctions","includes","DECIMAL_COERCE_DECL","flattenFormatChain","firstBase","parent","get","flatParent","parentHasFormat","inputCase","outputCase","merged","set","values","generateTypeAlias","effective","needsInputSplit","generateThreeSchemaModel","generateSimpleModel","renderType","renderInputType","wrapper","hasInputTransform","hasOutputTransform","inputBody","renderFieldsAsSnakeCase","renderFieldsAsPascalCase","renderFields","inputKey","applyCase","outputKey","optional","guard","quoteKey","typeSource","body","head","tail","slice","buildExtendChain","resolveName","collectEffectiveWritableFieldNames","modelName","base","delete","allFields","hasWriteonly","baseBody","readFields","readBody","writeFields","writeBody","renderInputFields","fieldsToOmit","omitClause","camelToSnake","s","replace","c","toLowerCase","camelToPascal","charAt","toUpperCase","caseTransform","defaultMode","flatMap","renderField","pascalKey","expr","default","nullable","dv","escapeString","String","snakeKey","parseCaseTransform","kind","renderScalar","renderArray","renderTuple","renderRecord","renderEnum","renderLiteral","renderUnion","renderDiscriminatedUnion","renderIntersection","inner","renderInlineObject","renderRegexLiteral","source","regexHasAnchor","startsWith","endsWith","i","backslashes","e","min","max","len","regex","checks","scale","messageParts","fmt","format","validParts","validation","message","_exhaustive","Error","a","item","t","items","r","key","value","vals","v","u","members","discriminator","first","rest","every","member","fieldLines","o","snakeLines","joined","transformEntries","pascalLines","renderInputScalar","renderInputField","renderQueryType","renderQueryField","isValidIdentifier","test","typeNeedsDateTime","typeNeedsScalar","localNames","collectInputTypeRefs","out","forEach","deps","localDeps","inDegree","d","dep","remaining","queue","sorted","shift","other","rem","refName","refOutPath","modelOutPaths","fromDir","rel","moduleName","pascalToDotCase","resolveModifiers","resolveSecurity","SECURITY_NONE","classifyContentType","emittedResponses","basename","dirname","relative","bodyParserToken","contentType","classifyContentType","bodyTypesStructurallyEqual","a","b","kind","bb","name","min","max","len","scale","regex","format","item","items","length","every","x","i","key","value","values","v","members","m","discriminator","lazy","inner","mode","fields","f","g","optional","nullable","visibility","default","deprecated","type","generateOp","root","options","types","collectTypes","modelsWithInput","modelsWithOutput","services","collectServices","routerName","deriveRouterName","file","lines","push","relFile","outPath","relative","dirname","basename","includeInternal","route","routes","op","operations","resolveModifiers","includes","generateHandler","handlerBody","join","references","symbol","RegExp","test","helpers","DECIMAL_PRELUDE_LINES","needsZodJson","generated","uses","body","koaImports","filter","svc","modulePath","meta","deriveModulePath","servicePathTemplate","usedTypes","generateTypeImports","luxonImports","DECIMAL_IMPORT","allContent","needsZod","desc","description","l","escapeJsDocLines","loc","line","effectiveSecurity","resolveSecurity","SECURITY_NONE","mods","method","path","replace","bodies","request","hasBody","isSingleMultipart","middlewares","policy","args","undefined","parserTokens","Array","from","Set","map","tokensExpr","t","signature","sigArgs","signaturePolicy","escapeSingleQuoted","middlewareStr","generateParamValidation","params","paramsMode","query","queryMode","headers","headersMode","renderInputType","bodyType","annotation","emitted","emittedResponses","serviceParts","inferService","call","methodName","buildArgs","generateMultiStatusResult","className","generateSingleStatusResult","resp","respHeaders","hasRespHeaders","headersAnnotation","renderHeadersAnnotation","bodySchema","prelude","formatTypeAnnotation","responseBodySchema","rendered","renderResponseMembers","includeStatus","varPrefix","preludes","statusCode","responses","headerSetLines","responseBodyExpr","bodySchemas","Map","set","member","get","opts","leading","trailing","uniform","h","quoteKey","headerNameToProperty","renderOutputTsType","indent","accessor","JSON","stringify","service","cls","split","baseName","deriveBaseName","inferMethodName","hasParam","nodes","p","serverTsScalar","_exhaustive","Error","String","varName","has","schema","renderType","isRevalidatable","modelsWithTransform","rec","first","rest","usesExtendChain","preludeVar","validateResponses","source","ctxExpr","suffix","isQuery","typeName","lhs","modeToWrapper","param","isValidIdentifier","renderQueryType","node","opFile","modelOutPaths","byFile","unresolved","typeOutPath","group","fromDir","names","rel","startsWith","sort","moduleName","pascalToDotCase","typeImport","deriveTypeImportPath","typeImportPathTemplate","collectParamSourceRefs","collectParamSourceInputRefs","collectTypeNodeRefs","collectInputTypeNodeRefs","collectOutputTypeNodeRefs","out","add","forEach","inferredService","base","pop","s","charAt","toUpperCase","slice","serviceName","template","kebab","toLowerCase","module","runIncrementalCodegen","parseIncrementalManifest","emptyIncrementalManifest","serializeIncrementalManifest","hashFingerprint","collectTransitiveModelRefs","computeModelsWithCaseTransform","computeModelsWithDecimal","resolveModifiers","isJsonMime","classifyContentType","observableResponses","thrownResponses","basename","dirname","relative","jsonOrFormSerialize","varName","contentType","renderSerializeExpr","bodies","ctVar","arms","slice","last","length","expr","i","arm","classifyBodyStrategy","op","request","kind","body","every","b","bodyTypesStructurallyEqual","bodyType","some","hasPublicOperations","root","includeInternal","route","routes","operations","resolveModifiers","includes","generateSdk","options","lines","types","collectTypes","modelsWithInput","modelsWithOutput","clientClassName","deriveClientClassName","file","inlineRevivers","Map","classBody","mods","push","generateMethod","inlineReviverDecls","values","flat","decimalPrelude","decimalPreludeFor","generateTypeImports","usedRevivers","imports","sdkOptionsPath","outPath","rel","relative","dirname","replace","startsWith","jsonImport","sdkNeedsJson","valueImports","sdkNeedsBigIntReplacer","sdkNeedsBigIntReviver","sdkNeedsQueryString","sdkNeedsReadContentType","join","JSON_VALUE_TYPE_DECL","errorAliases","generateErrorBodyAliases","decls","decl","relFile","basename","generateClientMethods","methodNames","deriveMethodName","declLines","preludeLines","flatMap","needsDecimalImport","l","DECIMAL_IMPORT","DECIMAL_CONFIG_LINE","DECIMAL_COERCE_DECL","found","Set","m","matchAll","add","sort","revive","modelsWithDecimal","size","modelMap","nameHint","undefined","methodName","mRevive","hint","charAt","toUpperCase","httpMethod","method","params","buildMethodParams","paramStr","map","p","name","optional","type","observable","observableResponses","thrown","thrownResponses","isMultiStatus","primaryResponse","primaryBodies","isVoid","respHeaders","headers","hasRespHeaders","headersShape","renderSdkHeadersShape","returnMembers","returnType","r","sdkResponseMembers","dataType","sdkDataType","expectStatuses","filter","statusCode","desc","description","errorBodyName","errorBodyTypeName","tags","contentLines","t","escapeJsDocLines","member","urlExpr","buildUrlExpression","path","hasQuery","query","fetchUrl","strategy","hasBody","hasOpHeaders","defaultCt","nonMultipart","find","fetchArgs","cat","classifyContentType","lastHeaderIdx","findIndex","a","existing","inner","needsResult","resultPrefix","split","fallback","rest","resp","sdkReturnLines","headerEntries","sdkHeaderEntries","sdkReadExpr","category","renderOutputTsType","tsType","read","reviver","reviveExprFor","segment","ctx","opts","typeReachesDecimal","refName","pick","reviveFnName","has","direct","item","fnName","renderInlineReviver","set","fields","h","quoteKey","headerNameToProperty","includeStatus","leading","trailing","dataTypes","indent","cast","entries","first","fallbackFields","_","_match","nodes","renderInputTsType","typeName","node","ctUnion","sdk","nameToMethodName","inferMethodName","parts","Boolean","toLowerCase","segments","s","seg","paramName","segParts","sp","deriveBaseName","base","pop","deriveClientPropertyName","getAreaSubarea","area","meta","subarea","pascal","value","camel","deriveAreaClientClassName","deriveAreaPropertyName","deriveSubareaClientClassName","deriveSubareaPropertyName","publicOps","collectParamSourceRefs","collectParamSourceInputRefs","collectTypeNodeRefs","collectInputTypeNodeRefs","responses","collectOutputTypeNodeRefs","out","members","forEach","f","source","param","test","isJsonMime","check","src","typeNeedsScalar","items","key","opFile","revivers","modelOutPaths","byFile","unresolved","typeOutPath","get","group","fromDir","names","fromHere","reviverModelName","moduleName","pascalToDotCase","typeImport","deriveTypeImportPath","typeImportPathTemplate","namesInModule","stem","template","module","generateSdkOptions","SCAFFOLD_DEP_VERSIONS","zod","luxon","decimalJs","typesLuxon","typescript","generateSdkPackageJson","input","dependencies","deps","decimal","devDependencies","pkg","version","main","exports","import","files","scripts","build","Object","keys","JSON","stringify","generateSdkTsconfig","tsconfig","compilerOptions","target","moduleResolution","declaration","outDir","rootDir","strict","esModuleInterop","skipLibCheck","forceConsistentCasingInFileNames","include","exclude","generateAreaClient","inlineFiles","subareaClients","className","collectedMethodLines","collectedRevivePrelude","areaNeedsDecimalImport","reviversByImportPath","collectedErrorAliases","seenMethods","typesByImportPath","unresolvedTypes","needsJson","needsBigIntReplacer","needsBigIntReviver","needsQueryString","needsReadContentType","inline","codegenOptions","methodLines","Error","alias","modelOut","typesForFile","sdkOptionsRel","importedClients","sc","client","importPath","propertyName","fetchModifier","ln","generateSdkAggregator","sdkOptionsImportPath","sdkClassName","pushClientImport","c","areas","topLevelClients","relative","dirname","computeModelsWithOutput","collectExternalOutputRefs","generatePlainTypes","root","context","target","externalRefs","collectExternalRefs","lines","externalModelsWithInput","modelsWithInput","Set","localModelsWithInput","computeModelsWithInput","models","allModelsWithInput","externalModelsWithOutput","modelsWithOutput","localModelsWithOutput","computeModelsWithOutput","allModelsWithOutput","externalInputRefs","size","collectExternalInputRefs","externalOutputRefs","collectExternalOutputRefs","allExternalRefs","sort","needsDecimal","rootNeedsScalar","emitRevivers","modelsWithDecimal","some","m","has","name","push","DECIMAL_IMPORT","ref","importPath","resolveImportPath","reviveFnName","length","jsonValueImportPath","JSON_VALUE_TYPE_DECL","modelMap","Map","map","reviveOpts","undefined","bodyLines","model","topoSortModels","generateModel","currentOutPath","revivers","renderReviveFunctions","DECIMAL_CONFIG_LINE","l","includes","DECIMAL_COERCE_DECL","join","outPath","type","generateTypeAlias","needsInputSplit","fields","f","visibility","generateVisibilityModel","generateSimpleModel","generateOutputModel","collectInheritedFieldNames","bases","result","visit","get","add","b","computeOverrideNames","inherited","filter","override","generateComments","deprecated","description","escapeJsDocLines","relPath","relative","dirname","loc","file","line","renderTsType","renderInputTsType","renderOutputTsType","buildExtendsClause","overrideNames","baseNameResolver","omitKeys","n","wrapped","field","renderField","readFields","writeFields","inputResolver","renderInputField","withFieldJsDoc","jsdocParts","contentLines","body","opt","optional","default","typeStr","nullable","quoteKey","camelToSnake","s","replace","c","toLowerCase","camelToPascal","charAt","toUpperCase","slice","applyOutputCase","outputCase","baseExt","renderOutputField","key","resolveModifiers","emittedResponses","basename","dirname","relative","mcpConfig","op","mcp","undefined","hasMcpOperations","root","includeInternal","route","routes","operations","resolveModifiers","includes","toSnake","s","replace","toLowerCase","toPascal","split","filter","Boolean","map","p","charAt","toUpperCase","slice","join","inferToolName","method","path","parts","seg","startsWith","push","deriveToolName","cfg","name","sdk","deriveToolClassName","toolName","buildArgsProps","modelsWithInput","props","params","kind","node","nodes","key","expr","renderInputType","type","optional","refSchema","bodies","request","length","contentType","bodyType","query","paramSourceSchema","headers","has","src","fields","n","quoteKey","argsSchemaExpr","primaryResponseBody","resp","emittedResponses","outputSchemaExpr","body","renderType","HINT_KEYS","annotationsExpr","val","walkTypeRefs","ids","variant","add","item","items","forEach","t","value","members","f","inner","walkSourceRefs","collectSchemaIds","ops","Set","schemaImportLines","options","lines","modelOutPaths","outPath","size","byFile","Map","unresolved","id","get","group","set","fromDir","dirname","file","names","rel","relative","sort","pascalToDotCase","scalarHelperLines","DECIMAL_PRELUDE_LINES","planTools","plans","className","argsConstName","renderToolClass","plan","relFile","basename","loc","line","escapeSingleQuoted","title","desc","description","outExpr","annotations","service","inferService","destructure","callArgs","buildArgs","isVoid","structured","methodName","deriveMcpRegisterFnName","deriveBaseName","generateMcpFile","argsConsts","classes","registerFn","bodyCore","helperConsts","bodyWithHelpers","needsParseAndValidate","some","imports","luxon","test","DECIMAL_IMPORT","serviceModules","svc","services","meta","deriveModulePath","servicePathTemplate","mod","entries","a","b","localeCompare","header","generateMcpAggregator","sorted","e","importPath","generateMcpRouter","resolve","join","relative","dirname","isAbsolute","collectTypeRefs","collectPublicTypeNames","TEMPLATE_VAR_RE","assertWithinBase","baseOutDir","outPath","rel","relative","resolve","startsWith","isAbsolute","Error","resolveTemplate","template","vars","replace","_","key","includesFilename","p","last","split","pop","includes","commonDir","files","rootDir","length","parts","map","f","dirname","first","depth","i","slice","join","computeOpOutPath","filePath","baseDir","output","defaultSuffix","commonRoot","meta","baseName","relDir","filename","defaultName","test","resolved","dir","ext","computeContractOutPath","computeSdkOutPath","clientOutput","endsWith","defaultOutName","computeSdkAreaClientOutPath","area","fixHiddenSegment","path","segments","subarea","cleaned","computeSdkTypeOutPath","typeOutput","generateBarrelFiles","contractPaths","byDir","Map","group","get","push","set","results","exports","sort","content","computePubliclyReachableTypes","opAsts","contractAsts","modelsWithInput","modelsWithOutput","Set","reachable","opAst","name","collectPublicTypeNames","add","modelDeps","contractAst","model","models","deps","bases","b","type","collectTypeRefs","field","fields","frontier","dep","has","inputDep","outputDep","TYPESCRIPT_CODEGEN_VERSION","CACHE_MANIFEST_FILENAME","plugin","name","generateTargets","inputs","ctx","config","options","runTypescriptCodegen","rootDir","createTypescriptPlugin","assertValidConfig","server","validateResponses","zod","Error","manifestPath","resolve","cacheDir","prevManifest","cacheEnabled","readManifest","emptyIncrementalManifest","units","globalFiles","collectServerOutput","sdk","collectSdkOutput","collectZodOutput","types","collectTypesOutput","mcp","collectMcpOutput","result","runIncrementalCodegen","codegenVersion","fileExists","existsSync","deleteStalePaths","deletedPaths","relativePath","content","ifAbsent","filesToWrite","emitFile","undefined","writeManifest","manifest","buildModelMap","contractRoots","map","Map","root","model","models","set","collectContractRootRefs","modelMap","seeds","m","type","push","f","fields","bases","b","kind","collectTransitiveModelRefs","collectOpRootRefs","route","routes","params","paramSourceTypes","op","operations","query","headers","request","body","bodies","bodyType","resp","responses","h","src","out","n","nodes","node","sliceOutPathMap","refs","modelOutPaths","modelsWithInput","modelsWithOutput","slice","ref","sort","p","get","has","ip","sliceModelSet","ownNames","serverBase","baseDir","modelsWithTransform","computeModelsWithCaseTransform","flatMap","r","allFiles","file","opRoots","commonRoot","commonDir","subConfigKey","stableSubConfig","serverModelOutPaths","typeEntries","output","ast","typeOutPath","computeContractOutPath","meta","Set","fingerprint","hashFingerprint","v","outPath","outPathSlice","sub","key","render","renderCtx","currentOutPath","target","generateContract","generatePlainTypes","computeOpOutPath","servicePathTemplate","includeInternal","generateOp","sdkBase","sdkName","sdkOutput","sdkEntryPath","join","TEMPLATE_VAR_RE","test","resolveTemplate","sdkOptionsPath","dirname","modelsWithDecimal","computeModelsWithDecimal","ckCommonRoot","sdkModelOutPaths","sdkTypePaths","sdkClientInfos","sdkContractEntries","publicTypes","computePubliclyReachableTypes","computeSdkTypeOutPath","some","emitRevivers","rel","relative","replace","startsWith","jsonValueImportPath","areaBuckets","topLevelEntries","clients","sdkOutPath","computeSdkOutPath","hasPublicOperations","area","subarea","getAreaSubarea","bucket","leaves","inlineRoots","entries","leaf","className","deriveSubareaClientClassName","propertyName","deriveSubareaPropertyName","generateSdk","typeImportPathTemplate","clientClassName","deriveClientClassName","deriveClientPropertyName","generateSdkOptions","hasAnything","length","size","areaClientOutPaths","sdkEntryDir","sdkOptionsRel","sdkOptionsImportPath","sdkClassName","split","s","charAt","toUpperCase","toClientImport","sourceDir","info","importPath","topLevelClients","e","areaInfos","sortedAreas","a","localeCompare","areaClientOutPath","computeSdkAreaClientOutPath","areaClassName","deriveAreaClientClassName","areaPropertyName","deriveAreaPropertyName","subareaClients","l","client","allInlineRefs","add","inlineFilesForGen","codegenOptions","generateAreaClient","inlineFiles","generateSdkAggregator","areas","sdkSrcDir","sdkTypeBarrels","generateBarrelFiles","barrel","rootExports","basename","c","scaffold","coveredRoots","deps","luxon","rootNeedsScalar","decimal","generateSdkPackageJson","generateSdkTsconfig","zodBase","typesBase","resolveMcpModelOutPaths","base","template","suffix","fullConfig","mcpBase","hasMcpOperations","tools","generateMcpFile","registerFn","deriveMcpRegisterFnName","indexPath","index","aggregatorEntries","generateMcpAggregator","emitRouter","routerPath","router","generateMcpRouter","path","parseIncrementalManifest","readFileSync","mkdirSync","recursive","writeFileSync","serializeIncrementalManifest","absPaths","removedDirs","abs","rmSync","force","dir","current","readdirSync","rmdirSync","JSON","stringify"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/codegen-contract.ts","../src/ts-render.ts","../src/decimal-runtime.ts","../src/codegen-revive.ts","../src/codegen-operation.ts","../src/codegen-sdk.ts","../src/codegen-plain-types.ts","../src/codegen-mcp.ts","../src/path-utils.ts"],"sourcesContent":["import { resolve, join, relative, dirname, basename } from 'node:path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync, rmdirSync } from 'node:fs';\nimport { generateContract, rootNeedsScalar } from './codegen-contract.js';\nimport { generateOp } from './codegen-operation.js';\nimport type {\n ContractKitPlugin,\n PluginContext,\n ContractRootNode,\n OpRootNode,\n ModelNode,\n IncrementalManifest,\n IncrementalUnit,\n IncrementalOutputFile,\n} from '@contractkit/core';\nimport {\n runIncrementalCodegen,\n parseIncrementalManifest,\n emptyIncrementalManifest,\n serializeIncrementalManifest,\n hashFingerprint,\n collectTransitiveModelRefs,\n collectTypeRefs,\n computeModelsWithCaseTransform,\n computeModelsWithDecimal,\n} from '@contractkit/core';\nimport {\n generateSdk,\n generateSdkOptions,\n generateSdkAggregator,\n generateAreaClient,\n deriveClientClassName,\n deriveClientPropertyName,\n deriveAreaClientClassName,\n deriveAreaPropertyName,\n deriveSubareaClientClassName,\n deriveSubareaPropertyName,\n getAreaSubarea,\n hasPublicOperations,\n generateSdkPackageJson,\n generateSdkTsconfig,\n type SdkClientInfo,\n type SdkAreaInfo,\n type SdkScaffoldDeps,\n} from './codegen-sdk.js';\nimport { generatePlainTypes } from './codegen-plain-types.js';\nimport { generateMcpFile, generateMcpAggregator, generateMcpRouter, hasMcpOperations, deriveMcpRegisterFnName } from './codegen-mcp.js';\nimport {\n TEMPLATE_VAR_RE,\n resolveTemplate,\n commonDir,\n computeOpOutPath,\n computeContractOutPath,\n computeSdkOutPath,\n computeSdkAreaClientOutPath,\n computeSdkTypeOutPath,\n generateBarrelFiles,\n computePubliclyReachableTypes,\n} from './path-utils.js';\n\n// ─── Sub-config interfaces ─────────────────────────────────────────────────\n\n/** Koa server output: routers, and the type or Zod schema files they import. */\nexport interface ServerConfig {\n /** Directory (relative to rootDir) where server files are written. Default: rootDir. */\n baseDir?: string;\n /** When true, `output.types` emits Zod schema files (via `generateContract`). When false/omitted, emits plain TypeScript. */\n zod?: boolean;\n output?: {\n /** Path template for Koa router files. Supports {filename}, {dir}, {area}. */\n routes?: string;\n /** Path template for type/schema files. Supports {filename}, {dir}, {area}. */\n types?: string;\n };\n /** Import path template for service implementations. */\n servicePathTemplate?: string;\n /** Whether to emit handlers for `internal` operations. Default true. */\n includeInternal?: boolean;\n /**\n * When true, each handler re-parses the service result through its declared response schema\n * before writing `ctx.body`, and writes the parsed value. Requires `zod: true` — without it\n * `output.types` emits plain interfaces, which are types with no runtime schema value.\n *\n * A body that transitively references a model with `format(input=...)`/`format(output=...)`, and\n * a status whose several mimes carry different body types, are left unvalidated. Default false.\n */\n validateResponses?: boolean;\n}\n\n/** TypeScript SDK client output: the client class, per-area operation clients, and their types. */\nexport interface SdkConfig {\n baseDir?: string;\n name?: string;\n zod?: boolean;\n output?: {\n sdk?: string;\n types?: string;\n clients?: string;\n };\n includeInternal?: boolean;\n /**\n * Emit a starter `package.json` and `tsconfig.json` at the SDK `baseDir` so the\n * generated output is a buildable, publishable package on its own. Opt-in and\n * write-once: the files are created only when absent and are never overwritten or\n * cleaned up on later builds, so any edits you make to them are preserved.\n * Dependency ranges are derived from the contracts (always `zod` when `zod: true`;\n * `luxon` when any covered model uses a date/time/datetime/duration/interval scalar;\n * `decimal.js` when any uses a decimal).\n */\n scaffold?: boolean;\n}\n\n/** Standalone Zod schema output, independent of the server and SDK sub-generators. */\nexport interface ZodConfig {\n baseDir?: string;\n output?: string;\n}\n\n/** Standalone plain TypeScript type output, independent of the server and SDK sub-generators. */\nexport interface TypesConfig {\n baseDir?: string;\n output?: string;\n /**\n * Runtime the emitted types describe. Affects scalars whose TypeScript type is runtime-specific:\n * `binary` renders as `Buffer` for `'server'` and `Blob` for `'client'`. Default `'client'`.\n * The `server` and `sdk` sub-generators set this themselves.\n */\n target?: 'client' | 'server';\n}\n\n/** MCP tool output: per-op-file handlers, the aggregator, and the optional POST route. */\nexport interface McpConfig {\n /** Directory (relative to rootDir) where MCP files are written. Default: rootDir. */\n baseDir?: string;\n output?: {\n /** Path template for per-op-file tool handlers. Supports {filename}, {dir}, {area}. Default `{filename}.mcp.ts`. */\n tools?: string;\n /** Path (or template) for the aggregator that assembles the McpToolHandlerMap. Default `mcp.tools.ts`. */\n index?: string;\n /** Path (or template) for the optional POST /mcp route file. Default `mcp.router.ts`. */\n router?: string;\n /**\n * Path template for the model **Zod schema** files the tools import (for arg validation and\n * `z.toJSONSchema`). When omitted, falls back to the `server` sub-config's `output.types`\n * (if `server.zod`) or the `zod` sub-config's output. Tools require Zod schemas, not plain types.\n */\n types?: string;\n };\n /** Emit the `mcp.router.ts` route boilerplate. Default true. */\n emitRouter?: boolean;\n /** Mount path used in the emitted router. Default `/mcp`. */\n path?: string;\n /** Import path template for service implementations (same semantics as ServerConfig). */\n servicePathTemplate?: string;\n /** Whether to expose operations marked `internal` as MCP tools. Default false. */\n includeInternal?: boolean;\n}\n\n/** Top-level plugin config. Each sub-config that is present enables its sub-generator. */\nexport interface TypescriptPluginConfig {\n server?: ServerConfig;\n sdk?: SdkConfig;\n zod?: ZodConfig;\n types?: TypesConfig;\n mcp?: McpConfig;\n}\n\n// ─── Caching constants ─────────────────────────────────────────────────────\n\n/** Bumped when the codegen output shape changes in a way that should bust every per-file fingerprint. */\nexport const TYPESCRIPT_CODEGEN_VERSION = '1';\n\n/** Filename for the persisted TypeScript manifest under the CLI cache directory. */\nconst CACHE_MANIFEST_FILENAME = 'typescript-manifest.json';\n\n// ─── Plugin entry points ──────────────────────────────────────────────────\n\nconst plugin: ContractKitPlugin = {\n name: 'typescript',\n async generateTargets(inputs, ctx) {\n const config = ctx.options as TypescriptPluginConfig;\n await runTypescriptCodegen(inputs, ctx, config, ctx.rootDir);\n },\n};\n\nexport default plugin;\n\n/** Build a `@contractkit/plugin-typescript` instance with explicit configuration, for programmatic use. */\nexport function createTypescriptPlugin(config: TypescriptPluginConfig, rootDir: string): ContractKitPlugin {\n return {\n name: 'typescript',\n async generateTargets(inputs, ctx) {\n await runTypescriptCodegen(inputs, ctx, config, rootDir);\n },\n };\n}\n\n/** Reject config combinations that would generate code that cannot compile or cannot run. */\nfunction assertValidConfig(config: TypescriptPluginConfig): void {\n if (config.server?.validateResponses && !config.server.zod) {\n throw new Error(\n 'plugin-typescript: server.validateResponses requires server.zod: true — without it output.types emits plain TypeScript interfaces, which are types with no runtime schema value for the router to validate against.',\n );\n }\n}\n\n/**\n * Shared orchestration. Each sub-generator (server / sdk / zod / types) contributes a\n * set of cacheable units (per-file fingerprints) plus a set of always-regenerated global\n * files (aggregators, barrels, sdk-options). Units share a single manifest so the cache\n * survives cross-cutting reads — the manifest lives at `<rootDir>/.contractkit-typescript-manifest.json`.\n *\n * Honors `ctx.cacheEnabled` — `--force` bypasses the manifest entirely.\n */\nasync function runTypescriptCodegen(\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n ctx: PluginContext,\n config: TypescriptPluginConfig,\n rootDir: string,\n): Promise<void> {\n assertValidConfig(config);\n const manifestPath = resolve(ctx.cacheDir, CACHE_MANIFEST_FILENAME);\n const prevManifest: IncrementalManifest = ctx.cacheEnabled ? readManifest(manifestPath) : emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);\n\n const units: IncrementalUnit[] = [];\n const globalFiles: IncrementalOutputFile[] = [];\n\n if (config.server) collectServerOutput(config.server, rootDir, inputs, units);\n if (config.sdk) collectSdkOutput(config.sdk, rootDir, inputs, units, globalFiles);\n if (config.zod) collectZodOutput(config.zod, rootDir, inputs, units);\n if (config.types) collectTypesOutput(config.types, rootDir, inputs, units);\n if (config.mcp) collectMcpOutput(config.mcp, config, rootDir, inputs, units, globalFiles);\n\n const result = runIncrementalCodegen({\n codegenVersion: TYPESCRIPT_CODEGEN_VERSION,\n prevManifest,\n globalFiles,\n units,\n // Paths are absolute, so existsSync works directly.\n fileExists: existsSync,\n });\n\n deleteStalePaths(result.deletedPaths);\n\n for (const { relativePath, content, ifAbsent } of result.filesToWrite) {\n ctx.emitFile(relativePath, content, ifAbsent ? { ifAbsent: true } : undefined);\n }\n\n writeManifest(manifestPath, result.manifest);\n}\n\n// ─── Cross-file dependency analysis ────────────────────────────────────────\n\n/** Build a quick lookup from model name → its definition. */\nfunction buildModelMap(contractRoots: readonly ContractRootNode[]): Map<string, ModelNode> {\n const map = new Map<string, ModelNode>();\n for (const root of contractRoots) {\n for (const model of root.models) map.set(model.name, model);\n }\n return map;\n}\n\n/** Collect every model referenced by this contract root (own models' fields + bases). Used to slice cross-file fingerprint inputs to just what this file actually depends on. */\nfunction collectContractRootRefs(root: ContractRootNode, modelMap: Map<string, ModelNode>): Set<string> {\n const seeds: Parameters<typeof collectTypeRefs>[0][] = [];\n for (const m of root.models) {\n if (m.type) seeds.push(m.type);\n for (const f of m.fields) seeds.push(f.type);\n if (m.bases) {\n for (const b of m.bases) seeds.push({ kind: 'ref', name: b } as Parameters<typeof collectTypeRefs>[0]);\n }\n }\n return collectTransitiveModelRefs(seeds, modelMap);\n}\n\n/** Collect every model referenced by an op root's routes/operations (transitive). */\nfunction collectOpRootRefs(root: OpRootNode, modelMap: Map<string, ModelNode>): Set<string> {\n const seeds: Parameters<typeof collectTypeRefs>[0][] = [];\n for (const route of root.routes) {\n if (route.params) seeds.push(...paramSourceTypes(route.params));\n for (const op of route.operations) {\n if (op.query) seeds.push(...paramSourceTypes(op.query));\n if (op.headers) seeds.push(...paramSourceTypes(op.headers));\n if (op.request) {\n for (const body of op.request.bodies) seeds.push(body.bodyType);\n }\n for (const resp of op.responses) {\n for (const body of resp.bodies) seeds.push(body.bodyType);\n if (resp.headers) {\n for (const h of resp.headers) seeds.push(h.type);\n }\n }\n }\n }\n return collectTransitiveModelRefs(seeds, modelMap);\n}\n\nfunction paramSourceTypes(src: NonNullable<OpRootNode['routes'][number]['params']>): Parameters<typeof collectTypeRefs>[0][] {\n const out: Parameters<typeof collectTypeRefs>[0][] = [];\n if (src.kind === 'params') {\n for (const n of src.nodes) out.push(n.type);\n } else if (src.kind === 'ref') {\n out.push({ kind: 'ref', name: src.name } as Parameters<typeof collectTypeRefs>[0]);\n } else if (src.kind === 'type') {\n out.push(src.node);\n }\n return out;\n}\n\n/** Build a sorted, JSON-stable record of (modelName -> outPath) for refs this unit depends on. */\nfunction sliceOutPathMap(refs: Set<string>, modelOutPaths: Map<string, string>, modelsWithInput: Set<string>, modelsWithOutput: Set<string>): Record<string, string> {\n const slice: Record<string, string> = {};\n for (const ref of [...refs].sort()) {\n const p = modelOutPaths.get(ref);\n if (p) slice[ref] = p;\n if (modelsWithInput.has(ref)) {\n const ip = modelOutPaths.get(`${ref}Input`);\n if (ip) slice[`${ref}Input`] = ip;\n }\n if (modelsWithOutput.has(ref)) {\n const op = modelOutPaths.get(`${ref}Output`);\n if (op) slice[`${ref}Output`] = op;\n }\n }\n return slice;\n}\n\n/** Slice modelsWithInput/Output to only the names relevant to this unit. */\nfunction sliceModelSet(refs: Set<string>, ownNames: Set<string>, set: Set<string>): string[] {\n const result: string[] = [];\n for (const name of set) {\n if (refs.has(name) || ownNames.has(name)) result.push(name);\n }\n return result.sort();\n}\n\n// ─── Server sub-generator ──────────────────────────────────────────────────\n\nfunction collectServerOutput(\n config: ServerConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n): void {\n const serverBase = resolve(rootDir, config.baseDir ?? '.');\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n // Not `modelsWithOutput`: that set seeds only from `format(output=...)`, because only that case\n // needs an `Output` type alias. A `format(input=...)`-only model is just as untouchable for\n // response validation — its schema's input casing is not what the service hands back.\n const modelsWithTransform = computeModelsWithCaseTransform(inputs.contractRoots.flatMap(r => r.models));\n const modelMap = buildModelMap(inputs.contractRoots);\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const subConfigKey = stableSubConfig(config);\n\n // Pre-pass: register all model → outPath. Cross-file refs need to resolve correctly,\n // which means we need the COMPLETE map (not a slice) — even though each unit's fingerprint\n // only includes its own slice.\n const serverModelOutPaths = new Map<string, string>();\n const typeEntries: { ast: ContractRootNode; typeOutPath: string }[] = [];\n if (config.output?.types) {\n for (const ast of inputs.contractRoots) {\n const typeOutPath = computeContractOutPath(ast.file, serverBase, config.output.types, '.ts', commonRoot, ast.meta);\n typeEntries.push({ ast, typeOutPath });\n for (const model of ast.models) {\n serverModelOutPaths.set(model.name, typeOutPath);\n if (modelsWithInput.has(model.name)) serverModelOutPaths.set(`${model.name}Input`, typeOutPath);\n if (modelsWithOutput.has(model.name)) serverModelOutPaths.set(`${model.name}Output`, typeOutPath);\n }\n }\n }\n\n // ── Per-contract-root types unit ──\n for (const { ast, typeOutPath } of typeEntries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'server-types',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: typeOutPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, serverModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n sub: subConfigKey,\n });\n units.push({\n key: `server-types::${typeOutPath}`,\n fingerprint,\n render: () => {\n const renderCtx = {\n modelOutPaths: serverModelOutPaths,\n currentOutPath: typeOutPath,\n modelsWithInput,\n modelsWithOutput,\n // These types are consumed by Koa handlers, so `binary` is a Buffer, not a Blob.\n target: 'server' as const,\n };\n const content = config.zod ? generateContract(ast, renderCtx) : generatePlainTypes(ast, renderCtx);\n return [{ relativePath: typeOutPath, content }];\n },\n });\n }\n\n // ── Per-op-root router unit ──\n for (const ast of inputs.opRoots) {\n const outPath = computeOpOutPath(ast.file, serverBase, config.output?.routes, '.router.ts', commonRoot, ast.meta);\n const refs = collectOpRootRefs(ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'server-router',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n // The router imports types from each contract root's type file; the slice covers exactly that.\n outPathSlice: sliceOutPathMap(refs, serverModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n servicePathTemplate: config.servicePathTemplate ?? null,\n includeInternal: config.includeInternal ?? true,\n // Not covered by `sub`: adding `format(input=snake)` to a *different* .ck file changes\n // this router's output with no change to `root` or the config.\n modelsWithTransform: sliceModelSet(refs, new Set(), modelsWithTransform),\n validateResponses: config.validateResponses ?? false,\n sub: subConfigKey,\n });\n units.push({\n key: `server-router::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateOp(ast, {\n servicePathTemplate: config.servicePathTemplate,\n outPath,\n modelOutPaths: serverModelOutPaths,\n modelsWithInput,\n modelsWithOutput,\n modelsWithTransform,\n includeInternal: config.includeInternal,\n validateResponses: config.validateResponses,\n }),\n },\n ],\n });\n }\n}\n\n// ─── SDK sub-generator ─────────────────────────────────────────────────────\n\nfunction collectSdkOutput(\n config: SdkConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n globalFiles: IncrementalOutputFile[],\n): void {\n const sdkBase = config.baseDir ? resolve(rootDir, config.baseDir) : rootDir;\n const sdkName = config.name;\n const sdkOutput = config.output?.sdk;\n const sdkEntryPath = sdkOutput\n ? join(sdkBase, TEMPLATE_VAR_RE.test(sdkOutput) ? resolveTemplate(sdkOutput, { name: sdkName ?? 'sdk' }) : sdkOutput)\n : join(sdkBase, 'sdk.ts');\n const sdkOptionsPath = join(dirname(sdkEntryPath), 'sdk-options.ts');\n const subConfigKey = stableSubConfig(config);\n\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n // Computed across every contract root, not per file: one decimal below a model taints it, and\n // the reference that reaches it may live in another .ck file entirely.\n const modelsWithDecimal = computeModelsWithDecimal(inputs.contractRoots.flatMap(r => r.models));\n const modelMap = buildModelMap(inputs.contractRoots);\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const ckCommonRoot = commonDir(allFiles, rootDir);\n\n const sdkModelOutPaths = new Map<string, string>();\n const sdkTypePaths: string[] = [];\n const sdkClientInfos: { outPath: string; className: string; propertyName: string }[] = [];\n\n // ── Pre-pass: SDK type files ──\n const sdkContractEntries: { ast: ContractRootNode; typeOutPath: string }[] = [];\n if (config.output?.types) {\n const publicTypes = computePubliclyReachableTypes(inputs.opRoots, inputs.contractRoots, modelsWithInput, modelsWithOutput);\n for (const ast of inputs.contractRoots) {\n const typeOutPath = computeSdkTypeOutPath(ast.file, sdkBase, config.output.types, ckCommonRoot, ast.meta);\n if (!typeOutPath) continue;\n if (publicTypes !== null && !ast.models.some(m => publicTypes.has(m.name))) continue;\n sdkTypePaths.push(typeOutPath);\n sdkContractEntries.push({ ast, typeOutPath });\n for (const model of ast.models) {\n sdkModelOutPaths.set(model.name, typeOutPath);\n if (modelsWithInput.has(model.name)) sdkModelOutPaths.set(`${model.name}Input`, typeOutPath);\n if (modelsWithOutput.has(model.name)) sdkModelOutPaths.set(`${model.name}Output`, typeOutPath);\n }\n }\n }\n\n // ── SDK type units ──\n for (const { ast, typeOutPath } of sdkContractEntries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'sdk-types',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: typeOutPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n // Not covered by `root`: adding a decimal to a model in a *different* .ck file changes\n // this file's revivers with no change to `root` or the config.\n modelsWithDecimal: sliceModelSet(refs, ownNames, modelsWithDecimal),\n sdkOptionsPath,\n sub: subConfigKey,\n });\n units.push({\n key: `sdk-types::${typeOutPath}`,\n fingerprint,\n render: () => {\n let content: string;\n // `emitRevivers` is set for SDK type files only: a server handler receives decimals\n // already parsed by `_ZodDecimal`, so it has nothing to rehydrate.\n if (config.zod) {\n content = generateContract(ast, {\n modelOutPaths: sdkModelOutPaths,\n currentOutPath: typeOutPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n emitRevivers: true,\n });\n } else {\n let rel = relative(dirname(typeOutPath), sdkOptionsPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n content = generatePlainTypes(ast, {\n modelOutPaths: sdkModelOutPaths,\n currentOutPath: typeOutPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n emitRevivers: true,\n jsonValueImportPath: rel,\n });\n }\n return [{ relativePath: typeOutPath, content }];\n },\n });\n }\n\n // ── Bucket op roots by area/subarea ──\n interface AreaBucket {\n leaves: { ast: OpRootNode; outPath: string; subarea: string }[];\n inlineRoots: OpRootNode[];\n }\n const areaBuckets = new Map<string, AreaBucket>();\n const topLevelEntries: { ast: OpRootNode; outPath: string }[] = [];\n\n if (config.output?.clients) {\n for (const ast of inputs.opRoots) {\n const sdkOutPath = computeSdkOutPath(ast.file, sdkBase, config.output.clients, ckCommonRoot, ast.meta);\n if (!sdkOutPath || !hasPublicOperations(ast, config.includeInternal)) continue;\n const { area, subarea } = getAreaSubarea(ast);\n if (area && subarea) {\n const bucket = areaBuckets.get(area) ?? { leaves: [], inlineRoots: [] };\n bucket.leaves.push({ ast, outPath: sdkOutPath, subarea });\n areaBuckets.set(area, bucket);\n } else if (area) {\n const bucket = areaBuckets.get(area) ?? { leaves: [], inlineRoots: [] };\n bucket.inlineRoots.push(ast);\n areaBuckets.set(area, bucket);\n } else {\n topLevelEntries.push({ ast, outPath: sdkOutPath });\n }\n }\n\n // ── Per-leaf-client (area+subarea) units ──\n for (const [area, bucket] of areaBuckets.entries()) {\n for (const leaf of bucket.leaves) {\n const className = deriveSubareaClientClassName(area, leaf.subarea);\n sdkClientInfos.push({ outPath: leaf.outPath, className, propertyName: deriveSubareaPropertyName(leaf.subarea) });\n const refs = collectOpRootRefs(leaf.ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'sdk-leaf-client',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: leaf.outPath,\n root: leaf.ast,\n outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n modelsWithDecimal: sliceModelSet(refs, new Set(), modelsWithDecimal),\n sdkOptionsPath,\n className,\n includeInternal: config.includeInternal ?? false,\n sub: subConfigKey,\n });\n units.push({\n key: `sdk-leaf-client::${leaf.outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: leaf.outPath,\n content: generateSdk(leaf.ast, {\n typeImportPathTemplate: undefined,\n outPath: leaf.outPath,\n modelOutPaths: sdkModelOutPaths,\n sdkOptionsPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n modelMap,\n includeInternal: config.includeInternal,\n clientClassName: className,\n }),\n },\n ],\n });\n }\n }\n\n // ── Top-level (no area) client units ──\n for (const { ast, outPath } of topLevelEntries) {\n const className = deriveClientClassName(ast.file);\n sdkClientInfos.push({ outPath, className, propertyName: deriveClientPropertyName(ast.file) });\n const refs = collectOpRootRefs(ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'sdk-top-client',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n modelsWithDecimal: sliceModelSet(refs, new Set(), modelsWithDecimal),\n sdkOptionsPath,\n includeInternal: config.includeInternal ?? false,\n sub: subConfigKey,\n });\n units.push({\n key: `sdk-top-client::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateSdk(ast, {\n typeImportPathTemplate: undefined,\n outPath,\n modelOutPaths: sdkModelOutPaths,\n sdkOptionsPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n modelMap,\n includeInternal: config.includeInternal,\n }),\n },\n ],\n });\n }\n }\n\n // ── Global files: sdk-options, aggregator, barrels, root index ──\n // sdk-options.ts is a constant; the aggregator is small (just imports + a wrapper class)\n // and depends on the cross-cutting client list, so it's cheap to regenerate every run.\n // Per-area `<area>.client.ts` files are cached as their own units below.\n globalFiles.push({ relativePath: sdkOptionsPath, content: generateSdkOptions() });\n\n const hasAnything = sdkClientInfos.length > 0 || areaBuckets.size > 0;\n const areaClientOutPaths = new Map<string, string>(); // area → absolute outPath of <area>.client.ts\n if (hasAnything) {\n const sdkEntryDir = dirname(sdkEntryPath);\n const sdkOptionsRel = relative(sdkEntryDir, sdkOptionsPath).replace(/\\.ts$/, '.js');\n const sdkOptionsImportPath = sdkOptionsRel.startsWith('.') ? sdkOptionsRel : './' + sdkOptionsRel;\n const sdkClassName = sdkName\n ? sdkName\n .split(/[-._\\s]+/)\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('') + 'Sdk'\n : 'Sdk';\n\n const toClientImport = (sourceDir: string, info: { outPath: string; className: string; propertyName: string }): SdkClientInfo => {\n let rel = relative(sourceDir, info.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n return { className: info.className, propertyName: info.propertyName, importPath: rel };\n };\n\n const topLevelClients: SdkClientInfo[] = topLevelEntries.map(e =>\n toClientImport(sdkEntryDir, {\n outPath: e.outPath,\n className: deriveClientClassName(e.ast.file),\n propertyName: deriveClientPropertyName(e.ast.file),\n }),\n );\n\n // ── Per-area `<area>.client.ts` units ──\n const areaInfos: SdkAreaInfo[] = [];\n const sortedAreas = [...areaBuckets.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [area, bucket] of sortedAreas) {\n const areaClientOutPath = computeSdkAreaClientOutPath(area, sdkBase, config.output!.clients);\n areaClientOutPaths.set(area, areaClientOutPath);\n const areaClassName = deriveAreaClientClassName(area);\n const areaPropertyName = deriveAreaPropertyName(area);\n sdkClientInfos.push({ outPath: areaClientOutPath, className: areaClassName, propertyName: areaPropertyName });\n\n const subareaClients = bucket.leaves\n .sort((a, b) => a.subarea.localeCompare(b.subarea))\n .map(l => ({\n propertyName: deriveSubareaPropertyName(l.subarea),\n client: toClientImport(dirname(areaClientOutPath), {\n outPath: l.outPath,\n className: deriveSubareaClientClassName(area, l.subarea),\n propertyName: deriveSubareaPropertyName(l.subarea),\n }),\n }));\n\n // Fingerprint covers every input the area client depends on:\n // - all inline roots (full AST)\n // - subarea client metadata (className / propertyName / import path)\n // - the modelOutPaths slice for refs across all inline roots\n // - modelsWithInput/Output slices\n const allInlineRefs = new Set<string>();\n for (const r of bucket.inlineRoots) {\n for (const ref of collectOpRootRefs(r, modelMap)) allInlineRefs.add(ref);\n }\n const fingerprint = hashFingerprint({\n kind: 'sdk-area-client',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath: areaClientOutPath,\n area,\n inlineRoots: bucket.inlineRoots,\n subareaClients,\n outPathSlice: sliceOutPathMap(allInlineRefs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(allInlineRefs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(allInlineRefs, new Set(), modelsWithOutput),\n modelsWithDecimal: sliceModelSet(allInlineRefs, new Set(), modelsWithDecimal),\n sdkOptionsPath,\n includeInternal: config.includeInternal ?? false,\n sub: subConfigKey,\n });\n\n const inlineFilesForGen = bucket.inlineRoots.map(root => ({\n root,\n codegenOptions: {\n typeImportPathTemplate: undefined,\n outPath: areaClientOutPath,\n modelOutPaths: sdkModelOutPaths,\n sdkOptionsPath,\n modelsWithInput,\n modelsWithOutput,\n modelsWithDecimal,\n modelMap,\n includeInternal: config.includeInternal,\n },\n }));\n\n units.push({\n key: `sdk-area-client::${areaClientOutPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: areaClientOutPath,\n content: generateAreaClient({\n area,\n outPath: areaClientOutPath,\n inlineFiles: inlineFilesForGen,\n subareaClients,\n sdkOptionsPath,\n }),\n },\n ],\n });\n\n areaInfos.push({\n area,\n client: toClientImport(sdkEntryDir, { outPath: areaClientOutPath, className: areaClassName, propertyName: areaPropertyName }),\n });\n }\n\n globalFiles.push({\n relativePath: sdkEntryPath,\n content: generateSdkAggregator({ topLevelClients, areas: areaInfos, sdkOptionsImportPath, sdkClassName }),\n });\n }\n\n const sdkSrcDir = dirname(sdkEntryPath);\n const sdkTypeBarrels = generateBarrelFiles(sdkTypePaths);\n for (const barrel of sdkTypeBarrels) globalFiles.push({ relativePath: barrel.outPath, content: barrel.content });\n\n const rootExports: string[] = [`export * from './${basename(sdkOptionsPath).replace(/\\.ts$/, '.js')}';`];\n if (hasAnything) rootExports.push(`export * from './${basename(sdkEntryPath).replace(/\\.ts$/, '.js')}';`);\n for (const c of sdkClientInfos) {\n let rel = relative(sdkSrcDir, c.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n rootExports.push(`export * from '${rel}';`);\n }\n for (const barrel of sdkTypeBarrels) {\n let rel = relative(sdkSrcDir, barrel.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n rootExports.push(`export * from '${rel}';`);\n }\n globalFiles.push({\n relativePath: join(sdkSrcDir, 'index.ts'),\n content: `// Auto-generated barrel file\\n${rootExports.sort().join('\\n')}\\n`,\n });\n\n // ── Scaffold files (opt-in, write-once) ──\n // Emitted at the SDK package root with `ifAbsent` so they're created once and\n // then owned by the user. Deps are derived from the contracts actually surfaced\n // into the SDK: zod when schema output is on, luxon when any covered model uses a\n // date/time/datetime/interval scalar.\n if (config.scaffold) {\n const coveredRoots = sdkContractEntries.map(e => e.ast);\n const deps: SdkScaffoldDeps = {\n zod: !!config.zod,\n // `duration` belongs here too: `generateContract` imports `Duration` from luxon for it,\n // so a contract whose only temporal scalar is a duration used to scaffold a package.json\n // with no luxon dependency and fail to compile.\n luxon: coveredRoots.some(r =>\n (['datetime', 'date', 'time', 'duration', 'interval'] as const).some(name => rootNeedsScalar(r, name)),\n ),\n decimal: coveredRoots.some(r => rootNeedsScalar(r, 'decimal')),\n };\n globalFiles.push({\n relativePath: join(sdkBase, 'package.json'),\n content: generateSdkPackageJson({ name: sdkName ?? 'sdk', deps }),\n ifAbsent: true,\n });\n globalFiles.push({\n relativePath: join(sdkBase, 'tsconfig.json'),\n content: generateSdkTsconfig(),\n ifAbsent: true,\n });\n }\n}\n\n// ─── Zod sub-generator ─────────────────────────────────────────────────────\n\nfunction collectZodOutput(\n config: ZodConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n): void {\n const zodBase = resolve(rootDir, config.baseDir ?? '.');\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n const modelMap = buildModelMap(inputs.contractRoots);\n const subConfigKey = stableSubConfig(config);\n\n const modelOutPaths = new Map<string, string>();\n const entries: { ast: ContractRootNode; outPath: string }[] = [];\n for (const ast of inputs.contractRoots) {\n const outPath = computeContractOutPath(ast.file, zodBase, config.output, '.schema.ts', commonRoot, ast.meta);\n entries.push({ ast, outPath });\n for (const model of ast.models) {\n modelOutPaths.set(model.name, outPath);\n if (modelsWithInput.has(model.name)) modelOutPaths.set(`${model.name}Input`, outPath);\n if (modelsWithOutput.has(model.name)) modelOutPaths.set(`${model.name}Output`, outPath);\n }\n }\n\n for (const { ast, outPath } of entries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'zod',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n sub: subConfigKey,\n });\n units.push({\n key: `zod::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateContract(ast, { modelOutPaths, currentOutPath: outPath, modelsWithInput, modelsWithOutput }),\n },\n ],\n });\n }\n}\n\n// ─── Plain types sub-generator ─────────────────────────────────────────────\n\nfunction collectTypesOutput(\n config: TypesConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n): void {\n const typesBase = resolve(rootDir, config.baseDir ?? '.');\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n const modelMap = buildModelMap(inputs.contractRoots);\n const subConfigKey = stableSubConfig(config);\n\n const modelOutPaths = new Map<string, string>();\n const entries: { ast: ContractRootNode; outPath: string }[] = [];\n for (const ast of inputs.contractRoots) {\n const outPath = computeContractOutPath(ast.file, typesBase, config.output, '.types.ts', commonRoot, ast.meta);\n entries.push({ ast, outPath });\n for (const model of ast.models) {\n modelOutPaths.set(model.name, outPath);\n if (modelsWithInput.has(model.name)) modelOutPaths.set(`${model.name}Input`, outPath);\n if (modelsWithOutput.has(model.name)) modelOutPaths.set(`${model.name}Output`, outPath);\n }\n }\n\n for (const { ast, outPath } of entries) {\n const refs = collectContractRootRefs(ast, modelMap);\n const ownNames = new Set(ast.models.map(m => m.name));\n const fingerprint = hashFingerprint({\n kind: 'plain-types',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),\n sub: subConfigKey,\n });\n units.push({\n key: `plain-types::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generatePlainTypes(ast, {\n modelOutPaths,\n currentOutPath: outPath,\n modelsWithInput,\n modelsWithOutput,\n target: config.target,\n }),\n },\n ],\n });\n }\n}\n\n// ─── MCP sub-generator ─────────────────────────────────────────────────────\n\n/**\n * Resolve where the model **Zod schema** files live so the MCP tools can import them (for arg\n * validation + `z.toJSONSchema`). Precedence: explicit `mcp.output.types` → the `server` sub-config's\n * `output.types` (only when `server.zod`) → the `zod` sub-config's output. Returns an empty map when\n * none resolve (imports then fall back to a colocated `./<name>.js` guess).\n */\nfunction resolveMcpModelOutPaths(\n config: TypescriptPluginConfig,\n rootDir: string,\n contractRoots: readonly ContractRootNode[],\n commonRoot: string,\n modelsWithInput: Set<string>,\n modelsWithOutput: Set<string>,\n): Map<string, string> {\n const map = new Map<string, string>();\n let base: string;\n let template: string | undefined;\n let suffix: string;\n if (config.mcp?.output?.types) {\n base = resolve(rootDir, config.mcp.baseDir ?? '.');\n template = config.mcp.output.types;\n suffix = '.ts';\n } else if (config.server?.zod && config.server.output?.types) {\n base = resolve(rootDir, config.server.baseDir ?? '.');\n template = config.server.output.types;\n suffix = '.ts';\n } else if (config.zod) {\n base = resolve(rootDir, config.zod.baseDir ?? '.');\n template = config.zod.output;\n suffix = '.schema.ts';\n } else {\n return map;\n }\n\n for (const ast of contractRoots) {\n const outPath = computeContractOutPath(ast.file, base, template, suffix, commonRoot, ast.meta);\n for (const model of ast.models) {\n map.set(model.name, outPath);\n if (modelsWithInput.has(model.name)) map.set(`${model.name}Input`, outPath);\n if (modelsWithOutput.has(model.name)) map.set(`${model.name}Output`, outPath);\n }\n }\n return map;\n}\n\nfunction collectMcpOutput(\n config: McpConfig,\n fullConfig: TypescriptPluginConfig,\n rootDir: string,\n inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],\n units: IncrementalUnit[],\n globalFiles: IncrementalOutputFile[],\n): void {\n const mcpBase = resolve(rootDir, config.baseDir ?? '.');\n const modelsWithInput = inputs.modelsWithInput as Set<string>;\n const modelsWithOutput = inputs.modelsWithOutput as Set<string>;\n const modelMap = buildModelMap(inputs.contractRoots);\n const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];\n const commonRoot = commonDir(allFiles, rootDir);\n const subConfigKey = stableSubConfig(config);\n const includeInternal = config.includeInternal ?? false;\n\n const modelOutPaths = resolveMcpModelOutPaths(fullConfig, rootDir, inputs.contractRoots, commonRoot, modelsWithInput, modelsWithOutput);\n\n // ── Per-op-root tool-handler units (only files with MCP-exposed ops) ──\n const entries: { outPath: string; registerFn: string }[] = [];\n for (const ast of inputs.opRoots) {\n if (!hasMcpOperations(ast, includeInternal)) continue;\n const outPath = computeOpOutPath(ast.file, mcpBase, config.output?.tools, '.mcp.ts', commonRoot, ast.meta);\n const refs = collectOpRootRefs(ast, modelMap);\n const fingerprint = hashFingerprint({\n kind: 'mcp-tools',\n v: TYPESCRIPT_CODEGEN_VERSION,\n outPath,\n root: ast,\n outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),\n modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),\n modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),\n servicePathTemplate: config.servicePathTemplate ?? null,\n includeInternal,\n sub: subConfigKey,\n });\n units.push({\n key: `mcp-tools::${outPath}`,\n fingerprint,\n render: () => [\n {\n relativePath: outPath,\n content: generateMcpFile(ast, {\n outPath,\n modelOutPaths,\n modelsWithInput,\n modelsWithOutput,\n servicePathTemplate: config.servicePathTemplate,\n includeInternal,\n }),\n },\n ],\n });\n entries.push({ outPath, registerFn: deriveMcpRegisterFnName(ast.file) });\n }\n\n if (entries.length === 0) return;\n\n // ── Aggregator (global) ──\n const indexPath = join(mcpBase, config.output?.index ?? 'mcp.tools.ts');\n const aggregatorEntries = entries\n .map(e => {\n let rel = relative(dirname(indexPath), e.outPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n return { registerFn: e.registerFn, importPath: rel };\n })\n .sort((a, b) => a.registerFn.localeCompare(b.registerFn));\n globalFiles.push({ relativePath: indexPath, content: generateMcpAggregator(aggregatorEntries) });\n\n // ── Router (global, optional) ──\n if (config.emitRouter !== false) {\n const routerPath = join(mcpBase, config.output?.router ?? 'mcp.router.ts');\n globalFiles.push({ relativePath: routerPath, content: generateMcpRouter({ path: config.path }) });\n }\n}\n\n// ─── Manifest IO + cleanup ─────────────────────────────────────────────────\n\nfunction readManifest(manifestPath: string): IncrementalManifest {\n if (!existsSync(manifestPath)) return emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);\n try {\n return parseIncrementalManifest(readFileSync(manifestPath, 'utf-8'));\n } catch {\n return emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);\n }\n}\n\n/** Write the manifest to `manifestPath`. Creates parent dirs as needed. Errors are swallowed so a broken cache never blocks the build. */\nfunction writeManifest(manifestPath: string, manifest: IncrementalManifest): void {\n try {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeIncrementalManifest(manifest), 'utf-8');\n } catch {\n // best-effort\n }\n}\n\nfunction deleteStalePaths(absPaths: string[]): void {\n if (absPaths.length === 0) return;\n const removedDirs = new Set<string>();\n for (const abs of absPaths) {\n if (existsSync(abs)) {\n rmSync(abs, { force: true });\n removedDirs.add(dirname(abs));\n }\n }\n // Walk up affected dirs and remove if empty. Bounded — stops at filesystem root or first non-empty dir.\n for (const dir of removedDirs) {\n let current = dir;\n while (current.length > 1) {\n try {\n if (readdirSync(current).length === 0) {\n rmdirSync(current);\n current = dirname(current);\n } else {\n break;\n }\n } catch {\n break;\n }\n }\n }\n}\n\n/** Stringify a sub-config so it can participate in fingerprints. JSON.stringify gives stable output for typical config shapes. */\nfunction stableSubConfig(config: unknown): string {\n return JSON.stringify(config ?? null);\n}\n","import { relative, dirname } from 'node:path';\nimport type {\n ContractRootNode,\n ModelNode,\n FieldNode,\n ContractTypeNode,\n ScalarTypeNode,\n ArrayTypeNode,\n TupleTypeNode,\n RecordTypeNode,\n EnumTypeNode,\n LiteralTypeNode,\n UnionTypeNode,\n DiscriminatedUnionTypeNode,\n InlineObjectTypeNode,\n IntersectionTypeNode,\n ObjectMode,\n} from '@contractkit/core';\nimport {\n collectTypeRefs,\n computeModelsWithOutput as ckComputeModelsWithOutput,\n collectExternalOutputRefs as ckCollectExternalOutputRefs,\n} from '@contractkit/core';\nimport { escapeJsDocLines } from './ts-render.js';\nimport type { TsRenderTarget } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_PRELUDE_LINES } from './decimal-runtime.js';\nimport { renderReviveFunctions, reviveFnName, DECIMAL_COERCE_DECL } from './codegen-revive.js';\n\n/**\n * Maps a ContractKit object mode to its Zod constructor name.\n *\n * @returns `\"z.strictObject\"` | `\"z.object\"` | `\"z.looseObject\"`\n */\nexport function modeToWrapper(mode: ObjectMode): string {\n switch (mode) {\n case 'strict':\n return 'z.strictObject';\n case 'strip':\n return 'z.object';\n case 'loose':\n return 'z.looseObject';\n }\n}\n\n// ─── Cross-file import resolution ─────────────────────────────────────────\n\n/** Cross-file context passed to `generateContract` to wire up imports and Input/Output variant tracking. */\nexport interface ContractCodegenContext {\n /** Map from model name → absolute output file path */\n modelOutPaths: Map<string, string>;\n /** Absolute output file path for the current contract file */\n currentOutPath: string;\n /** Set of model names that have Input variants (models with visibility modifiers) */\n modelsWithInput?: Set<string>;\n /** Set of model names that have Output variants (models with format(output=...)) */\n modelsWithOutput?: Set<string>;\n /** If set, import JsonValue from this path instead of re-declaring it (avoids barrel re-export conflicts) */\n jsonValueImportPath?: string;\n /**\n * Runtime the emitted plain types describe. Only affects scalars whose TypeScript type differs\n * per runtime (`binary` → `Buffer` on the server, `Blob` in the client). Ignored by\n * `generateContract`, whose Zod schemas are server-shaped by construction. Default `'client'`.\n */\n target?: TsRenderTarget;\n /** Model names that carry a `decimal`, directly or transitively. */\n modelsWithDecimal?: Set<string>;\n /**\n * Emit `reviveX()` hydration functions alongside the schemas. Set only for SDK type files: a\n * server handler receives decimals already parsed by `_ZodDecimal`, so it has nothing to revive.\n */\n emitRevivers?: boolean;\n}\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/**\n * Compute which models need Input variants, including transitive dependencies.\n * A model needs an Input variant if it has visibility-modified fields, OR if\n * any of its field types (recursively) reference a model that has an Input variant.\n */\nexport function computeModelsWithInput(models: ModelNode[], externalModelsWithInput: Set<string> = new Set()): Set<string> {\n const result = new Set<string>();\n\n // Initial pass: direct visibility modifiers\n for (const model of models) {\n if (model.fields.some(f => f.visibility !== 'normal')) {\n result.add(model.name);\n }\n }\n\n // Transitive closure: add models that reference models with Input variants,\n // including through base model inheritance.\n let changed = true;\n while (changed) {\n changed = false;\n for (const model of models) {\n if (result.has(model.name)) continue;\n const refs = new Set<string>();\n for (const field of model.fields) {\n collectTypeRefs(field.type, refs);\n }\n // A model that extends a parent with Input variants also needs an Input variant,\n // so that the write schema can extend ParentInput instead of Parent.\n if (model.bases) for (const b of model.bases) refs.add(b);\n // A type alias (model.type set) that references a model with Input variants\n // also needs an Input variant.\n if (model.type) collectTypeRefs(model.type, refs);\n for (const ref of refs) {\n if (result.has(ref) || externalModelsWithInput.has(ref)) {\n result.add(model.name);\n changed = true;\n break;\n }\n }\n }\n }\n\n return result;\n}\n\nfunction generateComments(model: ModelNode, outPath?: string): string[] {\n const lines: string[] = [];\n lines.push('/**');\n if (model.deprecated) {\n lines.push(` * @deprecated`);\n }\n if (model.description) {\n for (const l of escapeJsDocLines(model.description)) lines.push(` * ${l}`);\n }\n\n const relPath = outPath ? relative(dirname(outPath), model.loc.file) : model.loc.file;\n lines.push(` * generated from [${model.name}](file://./${relPath}#L${model.loc.line})`);\n lines.push('*/');\n return lines;\n}\n\n/**\n * Generate a TypeScript module containing Zod schemas for every model in `root`.\n *\n * Emits up to three schemas per model when visibility modifiers are present:\n * `ModelBase` (all fields), `Model` (read — no writeonly), `ModelInput` (write — no readonly).\n *\n * @param root - The parsed contract root node.\n * @param context - Optional cross-file context for import resolution and Input/Output variant tracking.\n * @returns The full TypeScript source as a string.\n */\nexport function generateContract(root: ContractRootNode, context?: ContractCodegenContext): string {\n const needsDateTime = rootNeedsDateTime(root);\n const needsDuration = rootNeedsScalar(root, 'duration');\n const needsInterval = rootNeedsScalar(root, 'interval');\n const needsBinary = rootNeedsScalar(root, 'binary');\n const needsDatetime = rootNeedsScalar(root, 'datetime');\n const needsJson = rootNeedsScalar(root, 'json');\n const needsDecimal = rootNeedsScalar(root, 'decimal');\n const externalRefs = collectExternalRefs(root);\n const lines: string[] = [];\n\n // Compute which models have Input variants (local, incl. transitive deps + external)\n const externalModelsWithInput = context?.modelsWithInput ?? new Set<string>();\n const localModelsWithInput = computeModelsWithInput(root.models, externalModelsWithInput);\n const allModelsWithInput = new Set([...localModelsWithInput, ...externalModelsWithInput]);\n\n // Compute which models have Output variants (post-transform wire shape)\n const externalModelsWithOutput = context?.modelsWithOutput ?? new Set<string>();\n const localModelsWithOutput = ckComputeModelsWithOutput(root.models, externalModelsWithOutput);\n const allModelsWithOutput = new Set([...localModelsWithOutput, ...externalModelsWithOutput]);\n\n // Collect additional external Input refs needed for Input schema fields\n const externalInputRefs = allModelsWithInput.size > 0 ? collectExternalInputRefs(root, allModelsWithInput) : [];\n const externalOutputRefs = allModelsWithOutput.size > 0 ? ckCollectExternalOutputRefs(root, allModelsWithOutput) : [];\n const allExternalRefs = [...new Set([...externalRefs, ...externalInputRefs, ...externalOutputRefs])].sort();\n\n lines.push(`import { z } from 'zod';`);\n const luxonImports: string[] = [];\n if (needsDateTime) luxonImports.push('DateTime');\n if (needsDuration) luxonImports.push('Duration');\n if (needsInterval) luxonImports.push('Interval');\n if (luxonImports.length > 0) lines.push(`import { ${luxonImports.join(', ')} } from 'luxon';`);\n if (needsDecimal) lines.push(DECIMAL_IMPORT);\n for (const ref of allExternalRefs) {\n const importPath = resolveImportPath(ref, context);\n // A cross-file model that carries a decimal contributes its reviver too — the local\n // reviver calls it rather than re-deriving the other file's shape.\n const names =\n context?.emitRevivers && context.modelsWithDecimal?.has(ref) ? `${ref}, ${reviveFnName(ref)}` : ref;\n lines.push(`import { ${names} } from '${importPath}';`);\n }\n lines.push('');\n if (needsBinary) {\n lines.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`);\n }\n if (needsDatetime) {\n lines.push(\n `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`,\n );\n }\n if (needsInterval) {\n lines.push(\n `const _ZodInterval = z.preprocess((val) => typeof val === 'string' ? Interval.fromISO(val) : val, z.custom<Interval>((val) => val instanceof Interval && val.isValid, { message: 'Must be an ISO 8601 interval' })).transform(val => val.toISO()!);`,\n );\n }\n if (needsDecimal) {\n lines.push(...DECIMAL_PRELUDE_LINES);\n }\n if (needsJson) {\n lines.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`);\n lines.push(\n `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`,\n );\n }\n if (needsBinary || needsDatetime || needsInterval || needsDecimal || needsJson) lines.push('');\n\n const modelsWithWriteonly = new Set(root.models.filter(m => m.fields.some(f => f.visibility === 'writeonly')).map(m => m.name));\n const modelMap = new Map(root.models.map(m => [m.name, m]));\n\n const reviveOpts =\n context?.emitRevivers && context.modelsWithDecimal\n ? { modelsWithDecimal: context.modelsWithDecimal, modelsWithOutput: allModelsWithOutput, modelMap }\n : undefined;\n\n const bodyLines: string[] = [];\n for (const model of topoSortModels(root.models)) {\n bodyLines.push(...generateModel(model, context?.currentOutPath, allModelsWithInput, modelsWithWriteonly, modelMap, allModelsWithOutput));\n if (reviveOpts) {\n const revivers = renderReviveFunctions(model, reviveOpts);\n if (revivers.length > 0) {\n bodyLines.push('');\n bodyLines.push(...revivers);\n }\n }\n bodyLines.push('');\n }\n\n // Decided from the emitted revivers rather than from a predicate over the AST, so the\n // declaration and its uses cannot drift apart and leave an unused local behind.\n if (bodyLines.some(l => l.includes('__dec('))) {\n lines.push(...DECIMAL_COERCE_DECL);\n lines.push('');\n }\n lines.push(...bodyLines);\n\n return lines.join('\\n');\n}\n\n// ─── Model ─────────────────────────────────────────────────────────────────\n\n/**\n * If any ancestor in the base chain has a format(input=)/format(output=) transform,\n * the parent schema compiles to a `ZodPipe` (object().transform()) which has no `.extend()`.\n * To keep extension working, inline the parent's fields into the child and inherit format/mode\n * so the child re-applies the transform on the merged shape. Returns the model unchanged when\n * no ancestor has format, preserving the existing `.extend()`-based output.\n */\nfunction flattenFormatChain(model: ModelNode, modelMap: Map<string, ModelNode>): ModelNode {\n if (!model.bases || model.bases.length === 0) return model;\n // TODO(multi-base): currently only the first base is followed for format inheritance.\n // Multi-base format flattening will need a topological merge across all bases.\n const firstBase = model.bases[0]!;\n const parent = modelMap.get(firstBase);\n if (!parent) return model;\n const flatParent = flattenFormatChain(parent, modelMap);\n const parentHasFormat =\n (flatParent.inputCase !== undefined && flatParent.inputCase !== 'camel') ||\n (flatParent.outputCase !== undefined && flatParent.outputCase !== 'camel');\n if (!parentHasFormat) return model;\n\n const merged = new Map<string, FieldNode>();\n for (const f of flatParent.fields) merged.set(f.name, f);\n for (const f of model.fields) merged.set(f.name, f);\n\n return {\n ...model,\n bases: undefined,\n fields: [...merged.values()],\n inputCase: model.inputCase ?? flatParent.inputCase,\n outputCase: model.outputCase ?? flatParent.outputCase,\n mode: model.mode ?? flatParent.mode,\n };\n}\n\nfunction generateModel(\n model: ModelNode,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithWriteonly?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n modelsWithOutput?: Set<string>,\n): string[] {\n // Type alias: Name : typeExpression\n if (model.type) {\n return generateTypeAlias(model, outPath, modelsWithInput, modelsWithOutput);\n }\n\n const effective = modelMap ? flattenFormatChain(model, modelMap) : model;\n\n // A model needs Input/read split if it has visibility-modified fields OR if it\n // transitively references models that have Input variants (captured in modelsWithInput).\n const needsInputSplit = effective.fields.some(f => f.visibility !== 'normal') || (modelsWithInput?.has(effective.name) ?? false);\n\n const lines = needsInputSplit\n ? generateThreeSchemaModel(effective, outPath, modelsWithInput, modelsWithWriteonly, modelMap)\n : generateSimpleModel(effective, outPath);\n\n // Emit Output type alias when this model (transitively) has format(output=...)\n if (modelsWithOutput?.has(effective.name)) {\n lines.push(`export type ${effective.name}Output = z.output<typeof ${effective.name}>;`);\n }\n\n return lines;\n}\n\nfunction generateTypeAlias(model: ModelNode, outPath?: string, modelsWithInput?: Set<string>, modelsWithOutput?: Set<string>): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n lines.push(`export const ${model.name} = ${renderType(model.type!)};`);\n lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`);\n if (modelsWithInput?.has(model.name)) {\n lines.push(`export const ${model.name}Input = ${renderInputType(model.type!, modelsWithInput)};`);\n lines.push(`export type ${model.name}Input = z.infer<typeof ${model.name}Input>;`);\n }\n if (modelsWithOutput?.has(model.name)) {\n lines.push(`export type ${model.name}Output = z.output<typeof ${model.name}>;`);\n }\n return lines;\n}\n\nfunction generateSimpleModel(model: ModelNode, outPath?: string): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n\n const wrapper = modeToWrapper(model.mode ?? 'strict');\n\n const { inputCase, outputCase } = model;\n const hasInputTransform = !!inputCase && inputCase !== 'camel';\n const hasOutputTransform = !!outputCase && outputCase !== 'camel';\n\n if (hasInputTransform || hasOutputTransform) {\n const inputBody =\n inputCase === 'snake'\n ? renderFieldsAsSnakeCase(model.fields, model.mode)\n : inputCase === 'pascal'\n ? renderFieldsAsPascalCase(model.fields, model.mode)\n : renderFields(model.fields, model.mode);\n lines.push(`export const ${model.name} = ${wrapper}({`);\n lines.push(...inputBody.map(l => ` ${l}`));\n lines.push(`}).transform(data => ({`);\n for (const field of model.fields) {\n const inputKey = applyCase(field.name, inputCase);\n const outputKey = applyCase(field.name, outputCase);\n if (field.optional) {\n // Conditional spread keeps the field optional (`k?: T`) in the inferred\n // z.output / z.input type, instead of widening to required-nullable (`k: T | undefined`).\n // Consumer code built with `...(x ? { k: x } : {})` is only assignable to the optional form.\n // When inputCase is set, the input schema uses `.nullish()` so the guard must reject both\n // null and undefined; otherwise `.optional()` only allows undefined.\n const guard = hasInputTransform ? `data.${inputKey} != null` : `data.${inputKey} !== undefined`;\n lines.push(` ...(${guard} ? { ${quoteKey(outputKey)}: data.${inputKey} } : {}),`);\n } else {\n lines.push(` ${quoteKey(outputKey)}: data.${inputKey},`);\n }\n }\n lines.push(`}));`);\n // When only outputCase is set, the developer-facing type is the schema's\n // pre-transform shape (camelCase). With inputCase, the post-transform\n // shape is what consumers work with.\n const typeSource = hasOutputTransform && !hasInputTransform ? 'input' : 'output';\n lines.push(`export type ${model.name} = z.${typeSource}<typeof ${model.name}>;`);\n return lines;\n }\n\n const body = renderFields(model.fields, model.mode);\n const bases = model.bases ?? [];\n if (bases.length > 0) {\n const head = bases[0]!;\n const tail = bases\n .slice(1)\n .map(b => `.extend(${b}.shape)`)\n .join('');\n lines.push(`export const ${model.name} = ${head}${tail}.extend({`);\n lines.push(...body.map(l => ` ${l}`));\n lines.push(`});`);\n } else {\n lines.push(`export const ${model.name} = ${wrapper}({`);\n lines.push(...body.map(l => ` ${l}`));\n lines.push(`});`);\n }\n\n lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`);\n return lines;\n}\n\n/** Builds a Zod extension chain \"Head.extend(B.shape).extend(C.shape)...\" for a list of base names,\n * applying a per-base name resolver (e.g. choosing \"BaseInput\" for bases that have an Input variant). */\nfunction buildExtendChain(bases: string[], resolveName: (b: string) => string): { head: string; tail: string } {\n const head = resolveName(bases[0]!);\n const tail = bases\n .slice(1)\n .map(b => `.extend(${resolveName(b)}.shape)`)\n .join('');\n return { head, tail };\n}\n\nfunction collectEffectiveWritableFieldNames(modelName: string, modelMap: Map<string, ModelNode>): Set<string> {\n const model = modelMap.get(modelName);\n if (!model || model.type) return new Set();\n const result = new Set<string>();\n for (const base of model.bases ?? []) {\n for (const f of collectEffectiveWritableFieldNames(base, modelMap)) result.add(f);\n }\n for (const field of model.fields) {\n if (field.visibility === 'readonly') result.delete(field.name);\n else result.add(field.name);\n }\n return result;\n}\n\nfunction generateThreeSchemaModel(\n model: ModelNode,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithWriteonly?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n): string[] {\n const lines: string[] = [];\n const name = model.name;\n\n lines.push(...generateComments(model, outPath));\n\n const wrapper = modeToWrapper(model.mode ?? 'strict');\n\n const allFields = model.fields;\n const hasWriteonly = allFields.some(f => f.visibility === 'writeonly');\n\n const bases = model.bases ?? [];\n\n // Base schema — all fields (used internally when a submodel extends this one).\n // Only needed when this model has writeonly fields; otherwise Base === Read.\n if (hasWriteonly) {\n const baseBody = renderFields(allFields, model.mode);\n if (bases.length > 0) {\n const { head, tail } = buildExtendChain(bases, b => (modelsWithWriteonly?.has(b) ? `${b}Base` : b));\n lines.push(`const ${name}Base = ${head}${tail}.extend({`);\n } else {\n lines.push(`const ${name}Base = ${wrapper}({`);\n }\n lines.push(...baseBody.map(l => ` ${l}`));\n lines.push(`});`);\n lines.push('');\n }\n\n // Read schema — omit writeonly fields; extends parent read schema\n const readFields = allFields.filter(f => f.visibility !== 'writeonly');\n const readBody = renderFields(readFields, model.mode);\n if (bases.length > 0) {\n const { head, tail } = buildExtendChain(bases, b => b);\n lines.push(`export const ${name} = ${head}${tail}.extend({`);\n } else {\n lines.push(`export const ${name} = ${wrapper}({`);\n }\n lines.push(...readBody.map(l => ` ${l}`));\n lines.push(`});`);\n lines.push(`export type ${name} = z.infer<typeof ${name}>;`);\n lines.push('');\n\n // Write schema — omit readonly fields (use Input variants for sub-type refs);\n // extends ParentInput if parent has an Input variant, else extends parent read schema\n const writeFields = allFields.filter(f => f.visibility !== 'readonly');\n const writeBody = modelsWithInput ? renderInputFields(writeFields, modelsWithInput, model.mode) : renderFields(writeFields, model.mode);\n // Fields that become readonly in this model but were writable in a base must be omitted from\n // the base Input schema — Zod's .extend() cannot remove inherited fields.\n const fieldsToOmit = new Set<string>();\n if (bases.length > 0 && modelMap) {\n for (const field of allFields) {\n if (field.visibility === 'readonly') {\n for (const base of bases) {\n if (collectEffectiveWritableFieldNames(base, modelMap).has(field.name)) {\n fieldsToOmit.add(field.name);\n break;\n }\n }\n }\n }\n }\n const omitClause =\n fieldsToOmit.size > 0\n ? `.omit({ ${[...fieldsToOmit].map(f => `${quoteKey(f)}: true`).join(', ')} })`\n : '';\n if (bases.length > 0) {\n const { head, tail } = buildExtendChain(bases, b => (modelsWithInput?.has(b) ? `${b}Input` : b));\n lines.push(`export const ${name}Input = ${head}${tail}${omitClause}.extend({`);\n } else {\n lines.push(`export const ${name}Input = ${wrapper}({`);\n }\n lines.push(...writeBody.map(l => ` ${l}`));\n lines.push(`});`);\n lines.push(`export type ${name}Input = z.infer<typeof ${name}Input>;`);\n\n return lines;\n}\n\n// ─── Fields ────────────────────────────────────────────────────────────────\n\nfunction camelToSnake(s: string): string {\n return s.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`);\n}\n\nfunction camelToPascal(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction applyCase(name: string, caseTransform: 'camel' | 'snake' | 'pascal' | undefined): string {\n if (!caseTransform || caseTransform === 'camel') return name;\n if (caseTransform === 'snake') return camelToSnake(name);\n return camelToPascal(name);\n}\n\nfunction renderFields(fields: FieldNode[], defaultMode?: ObjectMode): string[] {\n return fields.flatMap(f => renderField(f, defaultMode));\n}\n\nfunction renderFieldsAsPascalCase(fields: FieldNode[], defaultMode?: ObjectMode): string[] {\n return fields.map(f => {\n const pascalKey = camelToPascal(f.name);\n let expr = renderType(f.type, 'pascal', defaultMode);\n if (f.default !== undefined) {\n if (f.nullable) expr += '.nullable()';\n const dv = typeof f.default === 'string' ? `\"${escapeString(f.default)}\"` : String(f.default);\n expr += `.default(${dv})`;\n } else if (f.optional) {\n expr += '.nullish()';\n } else if (f.nullable) {\n expr += '.nullable()';\n }\n if (f.description) expr += `.describe(\"${escapeString(f.description)}\")`;\n return `${quoteKey(pascalKey)}: ${expr},`;\n });\n}\n\nfunction renderFieldsAsSnakeCase(fields: FieldNode[], defaultMode?: ObjectMode): string[] {\n return fields.map(f => {\n const snakeKey = camelToSnake(f.name);\n let expr = renderType(f.type, 'snake', defaultMode);\n if (f.default !== undefined) {\n if (f.nullable) expr += '.nullable()';\n const dv = typeof f.default === 'string' ? `\"${escapeString(f.default)}\"` : String(f.default);\n expr += `.default(${dv})`;\n } else if (f.optional) {\n // .nullish() accepts null or undefined from the API; the transform coerces null → undefined\n expr += '.nullish()';\n } else if (f.nullable) {\n expr += '.nullable()';\n }\n if (f.description) expr += `.describe(\"${escapeString(f.description)}\")`;\n return `${quoteKey(snakeKey)}: ${expr},`;\n });\n}\n\nfunction renderField(field: FieldNode, defaultMode?: ObjectMode): string[] {\n const lines: string[] = [];\n if (field.deprecated) lines.push('/** @deprecated */');\n\n let expr = renderType(field.type, undefined, defaultMode);\n\n if (field.nullable) expr += '.nullable()';\n if (field.default !== undefined) {\n const dv = typeof field.default === 'string' ? `\"${escapeString(field.default)}\"` : String(field.default);\n expr += `.default(${dv})`;\n } else if (field.optional) {\n expr += '.optional()';\n }\n if (field.description) expr += `.describe(\"${escapeString(field.description)}\")`;\n\n lines.push(`${quoteKey(field.name)}: ${expr},`);\n return lines;\n}\n\n// ─── Type rendering ────────────────────────────────────────────────────────\n\n/**\n * Render a ContractKit AST type node as a Zod schema expression string.\n *\n * @param parseCaseTransform - When set, generates a `.transform()` that remaps incoming keys from\n * the given casing (`'snake'` | `'pascal'`) to camelCase for `inlineObject` types.\n * @param defaultMode - Fallback object mode (`'strict'` | `'strip'` | `'loose'`) when the node\n * doesn't specify its own mode.\n */\nexport function renderType(type: ContractTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n switch (type.kind) {\n case 'scalar':\n return renderScalar(type);\n case 'array':\n return renderArray(type, parseCaseTransform, defaultMode);\n case 'tuple':\n return renderTuple(type);\n case 'record':\n return renderRecord(type);\n case 'enum':\n return renderEnum(type);\n case 'literal':\n return renderLiteral(type);\n case 'union':\n return renderUnion(type, parseCaseTransform, defaultMode);\n case 'discriminatedUnion':\n return renderDiscriminatedUnion(type, parseCaseTransform, defaultMode);\n case 'intersection':\n return renderIntersection(type, parseCaseTransform, defaultMode);\n case 'ref':\n return type.name;\n case 'lazy':\n return `z.lazy(() => ${renderType(type.inner, parseCaseTransform, defaultMode)})`;\n case 'inlineObject':\n return renderInlineObject(type, parseCaseTransform, defaultMode);\n default:\n return 'z.unknown()';\n }\n}\n\n/**\n * Render a regex source as a JS regex literal for `.regex(...)`. If the source already has\n * anchors (`^` at the start and/or an unescaped `$` at the end) we trust the user's intent\n * and emit it as-is; otherwise we wrap with `^...$` so contracts default to full-match\n * semantics. Forward slashes are always escaped since `/` is the literal delimiter.\n */\nfunction renderRegexLiteral(source: string): string {\n const body = source.replace(/\\//g, '\\\\/');\n if (regexHasAnchor(source)) return `/${body}/`;\n return `/^${body}$/`;\n}\n\nfunction regexHasAnchor(source: string): boolean {\n if (source.startsWith('^')) return true;\n if (!source.endsWith('$')) return false;\n // The trailing `$` is an anchor only if it isn't escaped — count immediately preceding\n // backslashes; an even count (including zero) means `$` is unescaped.\n let i = source.length - 2;\n let backslashes = 0;\n while (i >= 0 && source[i] === '\\\\') {\n backslashes++;\n i--;\n }\n return backslashes % 2 === 0;\n}\n\nfunction renderScalar(s: ScalarTypeNode): string {\n switch (s.name) {\n case 'string': {\n let e = 'z.string()';\n if (s.min !== undefined && s.max !== undefined) e += `.min(${s.min}).max(${s.max})`;\n else if (s.min !== undefined) e += `.min(${s.min})`;\n else if (s.max !== undefined) e += `.max(${s.max})`;\n if (s.len !== undefined) e += `.length(${s.len})`;\n if (s.regex) e += `.regex(${renderRegexLiteral(s.regex)})`;\n return e;\n }\n case 'number': {\n let e = 'z.coerce.number()';\n if (s.min !== undefined) e += `.min(${s.min})`;\n if (s.max !== undefined) e += `.max(${s.max})`;\n return e;\n }\n case 'int': {\n let e = 'z.coerce.number().int()';\n if (s.min !== undefined) e += `.min(${s.min})`;\n if (s.max !== undefined) e += `.max(${s.max})`;\n return e;\n }\n case 'bigint': {\n let inner = 'z.bigint()';\n if (s.min !== undefined) inner += `.min(${s.min}n)`;\n if (s.max !== undefined) inner += `.max(${s.max}n)`;\n return `z.preprocess((val) => typeof val === 'string' ? BigInt(val.replace(/n$/, '')) : val, ${inner})`;\n }\n case 'decimal': {\n // Deliberately no output `.transform()`: `isRevalidatable` in codegen-operation treats\n // every scalar as idempotent under re-parse, which `server.validateResponses` relies on.\n // Preprocess passes an already-`Decimal` value straight through, so parse(parse(x)) is\n // stable. Modelling this on `_ZodInterval` — which does transform — would break that.\n const checks: string[] = [];\n if (s.scale !== undefined) checks.push(`v.decimalPlaces() <= ${s.scale}`);\n if (s.min !== undefined) checks.push(`v.gte('${escapeString(String(s.min))}')`);\n if (s.max !== undefined) checks.push(`v.lte('${escapeString(String(s.max))}')`);\n if (checks.length === 0) return '_ZodDecimal';\n const messageParts: string[] = [];\n if (s.scale !== undefined) messageParts.push(`at most ${s.scale} decimal place${s.scale === 1 ? '' : 's'}`);\n if (s.min !== undefined) messageParts.push(`at least ${s.min}`);\n if (s.max !== undefined) messageParts.push(`at most ${s.max}`);\n return `_ZodDecimal.refine((v) => ${checks.join(' && ')}, { message: 'Must be ${escapeString(messageParts.join(', '))}' })`;\n }\n case 'boolean':\n return `z.preprocess((v) => v === 'true' ? true : v === 'false' ? false : v, z.boolean())`;\n case 'date': {\n const fmt = s.format ?? 'yyyy-MM-dd';\n return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a date in format ${escapeString(fmt)}' }))`;\n }\n case 'time': {\n const fmt = s.format ?? 'HH:mm:ss';\n return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a time in format ${escapeString(fmt)}' }))`;\n }\n case 'datetime':\n return '_ZodDatetime';\n case 'interval':\n return '_ZodInterval';\n case 'duration': {\n const validParts = [`val instanceof Duration && val.isValid`];\n if (s.min !== undefined) validParts.push(`val.toMillis() >= Duration.fromISO('${s.min}').toMillis()`);\n if (s.max !== undefined) validParts.push(`val.toMillis() <= Duration.fromISO('${s.max}').toMillis()`);\n const validation = validParts.join(' && ');\n let message = 'Must be an ISO 8601 duration';\n if (s.min !== undefined && s.max !== undefined) message += ` between ${s.min} and ${s.max}`;\n else if (s.min !== undefined) message += ` of at least ${s.min}`;\n else if (s.max !== undefined) message += ` of at most ${s.max}`;\n return `z.preprocess((val) => typeof val === 'string' ? Duration.fromISO(val) : val, z.custom<Duration>((val) => ${validation}, { message: '${message}' }))`;\n }\n case 'email':\n return 'z.email()';\n case 'url':\n return 'z.url()';\n case 'uuid':\n return 'z.uuid()';\n case 'unknown':\n return 'z.unknown()';\n case 'null':\n return 'z.null()';\n case 'object':\n return 'z.record(z.string(), z.unknown())';\n case 'binary':\n return '_ZodBinary';\n case 'json':\n return '_ZodJson';\n default: {\n const _exhaustive: never = s.name;\n throw new Error(`plugin-typescript: unmapped scalar '${String(_exhaustive)}' — add a case`);\n }\n }\n}\n\nfunction renderArray(a: ArrayTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n let e = `z.array(${renderType(a.item, parseCaseTransform, defaultMode)})`;\n if (a.min !== undefined) e += `.min(${a.min})`;\n if (a.max !== undefined) e += `.max(${a.max})`;\n return e;\n}\n\nfunction renderTuple(t: TupleTypeNode): string {\n return `z.tuple([${t.items.map(i => renderType(i)).join(', ')}])`;\n}\n\nfunction renderRecord(r: RecordTypeNode): string {\n return `z.record(${renderType(r.key)}, ${renderType(r.value)})`;\n}\n\nfunction renderEnum(e: EnumTypeNode): string {\n const vals = e.values.map(v => `\"${escapeString(v)}\"`).join(', ');\n return `z.enum([${vals}])`;\n}\n\nfunction renderLiteral(l: LiteralTypeNode): string {\n if (typeof l.value === 'string') return `z.literal(\"${escapeString(l.value)}\")`;\n return `z.literal(${l.value})`;\n}\n\nfunction renderUnion(u: UnionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n return `z.union([${u.members.map(m => renderType(m, parseCaseTransform, defaultMode)).join(', ')}])`;\n}\n\nfunction renderDiscriminatedUnion(u: DiscriminatedUnionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n return `z.discriminatedUnion(\"${escapeString(u.discriminator)}\", [${u.members.map(m => renderType(m, parseCaseTransform, defaultMode)).join(', ')}])`;\n}\n\nfunction renderIntersection(i: IntersectionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n const [first, ...rest] = i.members;\n // When the pattern is ref & (ref | inlineObject)*, use .extend() chains to\n // produce a single ZodObject. .and() breaks strict objects — each strict side\n // rejects the other side's keys during intersection parsing, and ZodIntersection\n // has no .strict() method.\n if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {\n let expr = first.name;\n for (const member of rest) {\n if (member.kind === 'ref') {\n expr += `.extend(${member.name}.shape)`;\n } else {\n const m = member as InlineObjectTypeNode;\n const fieldLines =\n parseCaseTransform === 'snake'\n ? renderFieldsAsSnakeCase(m.fields, defaultMode)\n .map(l => ` ${l}`)\n .join('\\n')\n : parseCaseTransform === 'pascal'\n ? renderFieldsAsPascalCase(m.fields, defaultMode)\n .map(l => ` ${l}`)\n .join('\\n')\n : m.fields\n .flatMap(f => renderField(f, defaultMode))\n .map(l => ` ${l}`)\n .join('\\n');\n expr += `.extend({\\n${fieldLines}\\n})`;\n }\n }\n return expr;\n }\n let expr = renderType(first!, parseCaseTransform, defaultMode);\n for (const member of rest) {\n expr += `.and(${renderType(member, parseCaseTransform, defaultMode)})`;\n }\n return expr;\n}\n\nfunction renderInlineObject(o: InlineObjectTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {\n const wrapper = modeToWrapper(o.mode ?? defaultMode ?? 'strict');\n if (parseCaseTransform === 'snake') {\n const snakeLines = renderFieldsAsSnakeCase(o.fields, defaultMode);\n const joined = snakeLines.map(l => ` ${l}`).join('\\n');\n const transformEntries = o.fields\n .map(f => {\n const snakeKey = camelToSnake(f.name);\n // Optional fields use .nullish() on input. Conditional spread (instead of `?? undefined`)\n // keeps the key optional in the inferred output type (`k?: T`) rather than widening to\n // required-nullable (`k: T | undefined`).\n if (f.optional) {\n return ` ...(data.${snakeKey} != null ? { ${quoteKey(f.name)}: data.${snakeKey} } : {}),`;\n }\n return ` ${quoteKey(f.name)}: data.${snakeKey},`;\n })\n .join('\\n');\n return `${wrapper}({\\n${joined}\\n}).transform(data => ({\\n${transformEntries}\\n}))`;\n }\n if (parseCaseTransform === 'pascal') {\n const pascalLines = renderFieldsAsPascalCase(o.fields, defaultMode);\n const joined = pascalLines.map(l => ` ${l}`).join('\\n');\n const transformEntries = o.fields\n .map(f => {\n const pascalKey = camelToPascal(f.name);\n if (f.optional) {\n return ` ...(data.${pascalKey} != null ? { ${quoteKey(f.name)}: data.${pascalKey} } : {}),`;\n }\n return ` ${quoteKey(f.name)}: data.${pascalKey},`;\n })\n .join('\\n');\n return `${wrapper}({\\n${joined}\\n}).transform(data => ({\\n${transformEntries}\\n}))`;\n }\n const fields = o.fields\n .flatMap(f => renderField(f, defaultMode))\n .map(l => ` ${l}`)\n .join('\\n');\n return `${wrapper}({\\n${fields}\\n})`;\n}\n\n// ─── Input type rendering ─────────────────────────────────────────────────\n\n/**\n * Like renderScalar, but coerces from string input (JSON wire format).\n * Used for Input (write) schemas where data arrives as JSON strings.\n */\nfunction renderInputScalar(s: ScalarTypeNode): string {\n return renderScalar(s);\n}\n\n/**\n * Like renderType, but substitutes model refs with their Input variant\n * when the model has visibility modifiers, and coerces scalars from strings.\n * Used for Input (write) schema fields so that sub-type references also\n * point to their Input variants.\n */\nexport function renderInputType(type: ContractTypeNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {\n switch (type.kind) {\n case 'scalar':\n return renderInputScalar(type);\n case 'ref':\n return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name;\n case 'array': {\n let e = `z.array(${renderInputType(type.item, modelsWithInput, defaultMode)})`;\n if (type.min !== undefined) e += `.min(${type.min})`;\n if (type.max !== undefined) e += `.max(${type.max})`;\n return e;\n }\n case 'tuple':\n return `z.tuple([${type.items.map(i => renderInputType(i, modelsWithInput, defaultMode)).join(', ')}])`;\n case 'record':\n return `z.record(${renderInputType(type.key, modelsWithInput, defaultMode)}, ${renderInputType(type.value, modelsWithInput, defaultMode)})`;\n case 'union':\n return `z.union([${type.members.map(m => renderInputType(m, modelsWithInput, defaultMode)).join(', ')}])`;\n case 'discriminatedUnion':\n return `z.discriminatedUnion(\"${escapeString(type.discriminator)}\", [${type.members.map(m => renderInputType(m, modelsWithInput, defaultMode)).join(', ')}])`;\n case 'intersection': {\n const [first, ...rest] = type.members;\n if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {\n let expr = modelsWithInput?.has(first.name) ? `${first.name}Input` : first.name;\n for (const member of rest) {\n if (member.kind === 'ref') {\n const name = modelsWithInput?.has(member.name) ? `${member.name}Input` : member.name;\n expr += `.extend(${name}.shape)`;\n } else {\n const fieldLines = (member as InlineObjectTypeNode).fields\n .map(f => ` ${renderInputField(f, modelsWithInput ?? new Set(), defaultMode)}`)\n .join('\\n');\n expr += `.extend({\\n${fieldLines}\\n})`;\n }\n }\n return expr;\n }\n let expr = renderInputType(first!, modelsWithInput, defaultMode);\n for (const member of rest) {\n expr += `.and(${renderInputType(member, modelsWithInput, defaultMode)})`;\n }\n return expr;\n }\n case 'lazy':\n return `z.lazy(() => ${renderInputType(type.inner, modelsWithInput, defaultMode)})`;\n case 'inlineObject': {\n const fields = type.fields\n .flatMap(f => renderInputField(f, modelsWithInput ?? new Set(), defaultMode))\n .map(l => ` ${l}`)\n .join('\\n');\n return `${modeToWrapper(type.mode ?? defaultMode ?? 'strict')}({\\n${fields}\\n})`;\n }\n default:\n return renderType(type, undefined, defaultMode);\n }\n}\n\nfunction renderInputField(field: FieldNode, modelsWithInput: Set<string>, defaultMode?: ObjectMode): string[] {\n const lines: string[] = [];\n if (field.deprecated) lines.push('/** @deprecated */');\n\n let expr = renderInputType(field.type, modelsWithInput, defaultMode);\n\n if (field.nullable) expr += '.nullable()';\n if (field.default !== undefined) {\n const dv = typeof field.default === 'string' ? `\"${escapeString(field.default)}\"` : String(field.default);\n expr += `.default(${dv})`;\n } else if (field.optional) {\n expr += '.optional()';\n }\n if (field.description) expr += `.describe(\"${escapeString(field.description)}\")`;\n\n lines.push(`${quoteKey(field.name)}: ${expr},`);\n return lines;\n}\n\nfunction renderInputFields(fields: FieldNode[], modelsWithInput: Set<string>, defaultMode?: ObjectMode): string[] {\n return fields.flatMap(f => renderInputField(f, modelsWithInput, defaultMode));\n}\n\n// ─── Query type rendering ─────────────────────────────────────────────────\n\n/**\n * Like renderType, but wraps array types with z.preprocess to handle\n * query strings where a single value arrives as a string instead of a string[].\n * Also uses Input variants for model refs when modelsWithInput is provided.\n */\nexport function renderQueryType(type: ContractTypeNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {\n switch (type.kind) {\n case 'array': {\n const inner = modelsWithInput ? renderInputType(type, modelsWithInput, defaultMode) : renderType(type, undefined, defaultMode);\n return `z.preprocess((v) => typeof v === 'string' ? v.split(',') : v, ${inner})`;\n }\n case 'inlineObject': {\n const fields = type.fields.map(f => ` ${renderQueryField(f, modelsWithInput, defaultMode)}`).join('\\n');\n return `${modeToWrapper(type.mode ?? defaultMode ?? 'strict')}({\\n${fields}\\n})`;\n }\n case 'intersection': {\n const [first, ...rest] = type.members;\n if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {\n let expr = modelsWithInput?.has(first.name) ? `${first.name}Input` : first.name;\n for (const member of rest) {\n if (member.kind === 'ref') {\n const name = modelsWithInput?.has(member.name) ? `${member.name}Input` : member.name;\n expr += `.extend(${name}.shape)`;\n } else {\n const fieldLines = (member as InlineObjectTypeNode).fields\n .map(f => ` ${renderQueryField(f, modelsWithInput, defaultMode)}`)\n .join('\\n');\n expr += `.extend({\\n${fieldLines}\\n})`;\n }\n }\n return expr;\n }\n let expr = renderQueryType(first!, modelsWithInput, defaultMode);\n for (const member of rest) {\n expr += `.and(${renderQueryType(member, modelsWithInput, defaultMode)})`;\n }\n return expr;\n }\n case 'ref':\n return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name;\n default:\n return modelsWithInput ? renderInputType(type, modelsWithInput, defaultMode) : renderType(type, undefined, defaultMode);\n }\n}\n\nfunction renderQueryField(field: FieldNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {\n let expr =\n field.type.kind === 'array'\n ? renderQueryType(field.type, modelsWithInput, defaultMode)\n : modelsWithInput\n ? renderInputType(field.type, modelsWithInput, defaultMode)\n : renderType(field.type, undefined, defaultMode);\n\n if (field.nullable) expr += '.nullable()';\n if (field.default !== undefined) {\n const dv = typeof field.default === 'string' ? `\"${escapeString(field.default)}\"` : String(field.default);\n expr += `.default(${dv})`;\n } else if (field.optional) {\n expr += '.optional()';\n }\n if (field.description) expr += `.describe(\"${escapeString(field.description)}\")`;\n\n return `${quoteKey(field.name)}: ${expr},`;\n}\n\nfunction isValidIdentifier(name: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);\n}\n\nfunction quoteKey(name: string): string {\n return isValidIdentifier(name) ? name : `'${name}'`;\n}\n\n// ─── String escaping ──────────────────────────────────────────────────────\n\nfunction escapeString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r');\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction rootNeedsDateTime(root: ContractRootNode): boolean {\n return root.models.some(m => (m.type && typeNeedsDateTime(m.type)) || m.fields.some(f => typeNeedsDateTime(f.type)));\n}\n\n/** Returns true if `type` (recursively) contains a scalar with the given `name`. */\nexport function typeNeedsScalar(type: ContractTypeNode, name: string): boolean {\n switch (type.kind) {\n case 'scalar':\n return type.name === name;\n case 'array':\n return typeNeedsScalar(type.item, name);\n case 'tuple':\n return type.items.some(i => typeNeedsScalar(i, name));\n case 'record':\n return typeNeedsScalar(type.key, name) || typeNeedsScalar(type.value, name);\n case 'union':\n return type.members.some(m => typeNeedsScalar(m, name));\n case 'discriminatedUnion':\n return type.members.some(m => typeNeedsScalar(m, name));\n case 'intersection':\n return type.members.some(m => typeNeedsScalar(m, name));\n case 'lazy':\n return typeNeedsScalar(type.inner, name);\n case 'inlineObject':\n return type.fields.some(f => typeNeedsScalar(f.type, name));\n default:\n return false;\n }\n}\n\n/** Returns true if any model in `root` uses a scalar with the given `name`. */\nexport function rootNeedsScalar(root: ContractRootNode, name: string): boolean {\n return root.models.some(m => (m.type && typeNeedsScalar(m.type, name)) || m.fields.some(f => typeNeedsScalar(f.type, name)));\n}\n\n/** Returns true if `type` (recursively) contains a `date`, `time`, or `datetime` scalar. */\nexport function typeNeedsDateTime(type: ContractTypeNode): boolean {\n switch (type.kind) {\n case 'scalar':\n return type.name === 'date' || type.name === 'time' || type.name === 'datetime';\n case 'array':\n return typeNeedsDateTime(type.item);\n case 'union':\n return type.members.some(typeNeedsDateTime);\n case 'discriminatedUnion':\n return type.members.some(typeNeedsDateTime);\n case 'intersection':\n return type.members.some(typeNeedsDateTime);\n case 'inlineObject':\n return type.fields.some(f => typeNeedsDateTime(f.type));\n default:\n return false;\n }\n}\n\n/** Collect model names referenced in `root` that are not defined locally (need to be imported). */\nexport function collectExternalRefs(root: ContractRootNode): string[] {\n const localNames = new Set(root.models.map(m => m.name));\n const refs = new Set<string>();\n\n for (const model of root.models) {\n if (model.bases?.[0] && !localNames.has(model.bases?.[0])) refs.add(model.bases?.[0]);\n if (model.type) collectTypeRefs(model.type, refs);\n for (const field of model.fields) {\n collectTypeRefs(field.type, refs);\n }\n }\n\n for (const name of localNames) refs.delete(name);\n return [...refs].sort();\n}\n\n/** Collect external Input variant refs needed for Input schema fields. */\nexport function collectExternalInputRefs(root: ContractRootNode, modelsWithInput: Set<string>): string[] {\n const localNames = new Set(root.models.map(m => m.name));\n const refs = new Set<string>();\n\n for (const model of root.models) {\n if (!modelsWithInput.has(model.name)) continue;\n // Type alias: collect Input refs from the aliased type expression.\n if (model.type) {\n collectInputTypeRefs(model.type, refs, modelsWithInput);\n continue;\n }\n // When a model extends an external parent that has an Input variant,\n // the write schema extends ParentInput — so we need to import it.\n if (model.bases?.[0] && modelsWithInput.has(model.bases?.[0]) && !localNames.has(model.bases?.[0])) {\n refs.add(`${model.bases?.[0]}Input`);\n }\n const writeFields = model.fields.filter(f => f.visibility !== 'readonly');\n for (const field of writeFields) {\n collectInputTypeRefs(field.type, refs, modelsWithInput);\n }\n }\n\n // Remove locally defined Input variants (generated in this file)\n for (const name of localNames) {\n refs.delete(`${name}Input`);\n }\n\n return [...refs].sort();\n}\n\nfunction collectInputTypeRefs(type: ContractTypeNode, out: Set<string>, modelsWithInput: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`);\n break;\n case 'array':\n collectInputTypeRefs(type.item, out, modelsWithInput);\n break;\n case 'tuple':\n type.items.forEach(i => collectInputTypeRefs(i, out, modelsWithInput));\n break;\n case 'record':\n collectInputTypeRefs(type.key, out, modelsWithInput);\n collectInputTypeRefs(type.value, out, modelsWithInput);\n break;\n case 'union':\n type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));\n break;\n case 'discriminatedUnion':\n type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));\n break;\n case 'intersection':\n type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));\n break;\n case 'lazy':\n collectInputTypeRefs(type.inner, out, modelsWithInput);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectInputTypeRefs(f.type, out, modelsWithInput));\n break;\n }\n}\n\n/**\n * Topologically sort models so dependencies are emitted before dependents.\n * Falls back to source order for cycles (which would need z.lazy at runtime).\n */\nexport function topoSortModels(models: ModelNode[]): ModelNode[] {\n const localNames = new Set(models.map(m => m.name));\n const modelMap = new Map(models.map(m => [m.name, m]));\n\n // Build adjacency: model name → set of local model names it depends on\n const deps = new Map<string, Set<string>>();\n for (const model of models) {\n const refs = new Set<string>();\n if (model.bases?.[0] && localNames.has(model.bases?.[0])) refs.add(model.bases?.[0]);\n if (model.type) collectTypeRefs(model.type, refs);\n for (const field of model.fields) {\n collectTypeRefs(field.type, refs);\n }\n // Keep only local dependencies\n const localDeps = new Set<string>();\n for (const r of refs) {\n if (localNames.has(r) && r !== model.name) localDeps.add(r);\n }\n deps.set(model.name, localDeps);\n }\n\n // Kahn's algorithm\n const inDegree = new Map<string, number>();\n for (const name of localNames) inDegree.set(name, 0);\n for (const [, d] of deps) {\n for (const dep of d) {\n inDegree.set(dep, (inDegree.get(dep) ?? 0) + 1);\n }\n }\n\n // Note: inDegree counts how many models *depend on* this model,\n // but for Kahn's we need how many dependencies each model has.\n // Re-do: inDegree = number of unresolved deps for each model.\n const remaining = new Map<string, Set<string>>();\n for (const [name, d] of deps) {\n remaining.set(name, new Set(d));\n }\n\n const queue: string[] = [];\n for (const name of localNames) {\n if (remaining.get(name)!.size === 0) queue.push(name);\n }\n\n const sorted: ModelNode[] = [];\n while (queue.length > 0) {\n const name = queue.shift()!;\n sorted.push(modelMap.get(name)!);\n // Remove this model from all dependents' remaining sets\n for (const [other, rem] of remaining) {\n if (rem.delete(name) && rem.size === 0) {\n queue.push(other);\n }\n }\n }\n\n // Append any models not yet emitted (cycles)\n for (const model of models) {\n if (!sorted.includes(model)) sorted.push(model);\n }\n\n return sorted;\n}\n\n/**\n * Resolve the import path for an external model reference.\n * When a codegen context is available, computes the correct relative path\n * from the current file to the referenced model's output file.\n * Falls back to same-directory PascalCase → dot.case convention.\n */\nexport function resolveImportPath(refName: string, context?: ContractCodegenContext): string {\n if (context) {\n const refOutPath = context.modelOutPaths.get(refName);\n if (refOutPath) {\n const fromDir = dirname(context.currentOutPath);\n let rel = relative(fromDir, refOutPath);\n // Replace .ts extension with .js for ESM imports\n rel = rel.replace(/\\.ts$/, '.js');\n // Ensure relative path starts with ./ or ../\n if (!rel.startsWith('.')) rel = './' + rel;\n return rel;\n }\n }\n // Fallback: assume same directory, use PascalCase → dot.case convention\n const moduleName = pascalToDotCase(refName);\n return `./${moduleName}.js`;\n}\n\n/** Convert PascalCase to dot-separated lowercase: CounterpartyAccount → counterparty.account */\nexport function pascalToDotCase(name: string): string {\n return name.replace(/([a-z0-9])([A-Z])/g, '$1.$2').toLowerCase();\n}\n","import type { ContractTypeNode, FieldNode, ScalarTypeNode } from '@contractkit/core';\n\n/** Declaration emitted into generated files that reference the `json` scalar. */\nexport const JSON_VALUE_TYPE_DECL = 'export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };';\n\n/** Quote a property name unless it is already a valid bare TypeScript identifier. */\nexport function quoteKey(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`;\n}\n\n/** Escape text for safe inclusion inside a JSDoc block comment: neutralize the\n * block-comment terminator sequence and split embedded newlines into separate\n * ` * ` continuation lines. Returns the content lines (WITHOUT a leading prefix). */\nexport function escapeJsDocLines(text: string): string[] {\n return text.replace(/\\*\\//g, '*\\\\/').split('\\n');\n}\n\n/** Escape a string for inclusion inside a single-quoted TypeScript string literal. */\nexport function escapeSingleQuoted(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r');\n}\n\n/** Convert an HTTP header name (e.g. `preference-applied`, `X-Request-ID`, `ETag`) to camelCase for use as a JS property. */\nexport function headerNameToProperty(name: string): string {\n const parts = name.split(/[-_]/).filter(Boolean);\n return parts\n .map((p, i) => {\n const lower = p.toLowerCase();\n return i === 0 ? lower : lower.charAt(0).toUpperCase() + lower.slice(1);\n })\n .join('');\n}\n\n// ─── TypeScript type rendering ────────────────────────────────────────────\n\n/**\n * Which runtime the emitted types describe. A few scalars have no single correct TypeScript\n * type: `binary` is a `Blob` in a fetch-based client but a `Buffer` on a Node server. Everything\n * else renders identically for both targets. Defaults to `'client'`.\n */\nexport type TsRenderTarget = 'client' | 'server';\n\n/**\n * Render a contract type as a plain TypeScript type expression. Model refs render as their bare\n * name; use `renderInputTsType` / `renderOutputTsType` to substitute Input/Output variants.\n *\n * @param target Runtime the type describes; only `binary` differs (`Buffer` vs `Blob`).\n */\nexport function renderTsType(type: ContractTypeNode, target: TsRenderTarget = 'client'): string {\n switch (type.kind) {\n case 'scalar':\n return renderTsScalar(type.name, target);\n case 'array': {\n const inner = renderTsType(type.item, target);\n const needsParens =\n type.item.kind === 'union' ||\n type.item.kind === 'discriminatedUnion' ||\n type.item.kind === 'intersection' ||\n type.item.kind === 'enum';\n return needsParens ? `(${inner})[]` : `${inner}[]`;\n }\n case 'tuple':\n return `[${type.items.map(i => renderTsType(i, target)).join(', ')}]`;\n case 'record':\n return `Record<${renderTsType(type.key, target)}, ${renderTsType(type.value, target)}>`;\n case 'enum':\n return type.values.map(v => `'${escapeSingleQuoted(v)}'`).join(' | ');\n case 'literal':\n return typeof type.value === 'string' ? `'${escapeSingleQuoted(type.value)}'` : String(type.value);\n case 'union':\n return type.members.map(m => renderTsType(m, target)).join(' | ');\n case 'discriminatedUnion':\n return type.members.map(m => renderTsType(m, target)).join(' | ');\n case 'intersection':\n return type.members.map(m => renderTsType(m, target)).join(' & ');\n case 'ref':\n return type.name;\n case 'lazy':\n return renderTsType(type.inner, target);\n case 'inlineObject':\n return renderTsInlineObject(type.fields, target);\n default:\n return 'unknown';\n }\n}\n\nfunction renderTsScalar(name: ScalarTypeNode['name'], target: TsRenderTarget): string {\n switch (name) {\n case 'string':\n case 'email':\n case 'url':\n case 'uuid':\n return 'string';\n case 'number':\n case 'int':\n return 'number';\n case 'bigint':\n return 'bigint';\n case 'decimal':\n // The one scalar whose wire view and server view agree — see the note on this\n // function and on `serverTsScalar`. A `decimal` travels as a quoted string, and both\n // the router (via `_ZodDecimal`) and the SDK (via the generated `reviveX` functions)\n // hand the developer a real `Decimal`, so there is no `target` split to make.\n return 'Decimal';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n case 'duration':\n case 'interval':\n return 'string';\n case 'null':\n return 'null';\n case 'unknown':\n return 'unknown';\n case 'object':\n return 'Record<string, unknown>';\n case 'binary':\n // Node servers hand the handler a Buffer (matching `_ZodBinary`); fetch clients get a Blob.\n return target === 'server' ? 'Buffer' : 'Blob';\n case 'json':\n return 'JsonValue';\n default: {\n const _exhaustive: never = name;\n throw new Error(`plugin-typescript: unmapped scalar '${String(_exhaustive)}' — add a case`);\n }\n }\n}\n\nfunction renderTsInlineObject(fields: FieldNode[], target: TsRenderTarget): string {\n const entries = fields.map(f => {\n const opt = f.optional ? '?' : '';\n return `${quoteKey(f.name)}${opt}: ${renderTsType(f.type, target)}`;\n });\n return `{ ${entries.join('; ')} }`;\n}\n\n/**\n * Like renderTsType, but substitutes model refs with their Input variant\n * when the model has visibility modifiers. Used for request-side types\n * (body, params, query, headers).\n *\n * @param target Runtime the type describes; only `binary` differs (`Buffer` vs `Blob`).\n */\nexport function renderInputTsType(type: ContractTypeNode, modelsWithInput?: Set<string>, target: TsRenderTarget = 'client'): string {\n if (!modelsWithInput || modelsWithInput.size === 0) return renderTsType(type, target);\n switch (type.kind) {\n case 'ref':\n return modelsWithInput.has(type.name) ? `${type.name}Input` : type.name;\n case 'array': {\n const inner = renderInputTsType(type.item, modelsWithInput, target);\n const needsParens =\n type.item.kind === 'union' ||\n type.item.kind === 'discriminatedUnion' ||\n type.item.kind === 'intersection' ||\n type.item.kind === 'enum';\n return needsParens ? `(${inner})[]` : `${inner}[]`;\n }\n case 'intersection':\n return type.members.map(m => renderInputTsType(m, modelsWithInput, target)).join(' & ');\n case 'union':\n return type.members.map(m => renderInputTsType(m, modelsWithInput, target)).join(' | ');\n case 'discriminatedUnion':\n return type.members.map(m => renderInputTsType(m, modelsWithInput, target)).join(' | ');\n case 'inlineObject':\n return `{ ${type.fields.map(f => `${quoteKey(f.name)}${f.optional ? '?' : ''}: ${renderInputTsType(f.type, modelsWithInput, target)}`).join('; ')} }`;\n case 'lazy':\n return renderInputTsType(type.inner, modelsWithInput, target);\n default:\n return renderTsType(type, target);\n }\n}\n\n/**\n * Like renderTsType, but substitutes model refs with their Output variant\n * (post-transform wire shape) when the model has format(output=...) or\n * transitively references one. Used for response-side types in routers\n * and SDK return types.\n *\n * @param target Runtime the type describes; only `binary` differs (`Buffer` vs `Blob`).\n */\nexport function renderOutputTsType(type: ContractTypeNode, modelsWithOutput?: Set<string>, target: TsRenderTarget = 'client'): string {\n if (!modelsWithOutput || modelsWithOutput.size === 0) return renderTsType(type, target);\n switch (type.kind) {\n case 'ref':\n return modelsWithOutput.has(type.name) ? `${type.name}Output` : type.name;\n case 'array': {\n const inner = renderOutputTsType(type.item, modelsWithOutput, target);\n const needsParens =\n type.item.kind === 'union' ||\n type.item.kind === 'discriminatedUnion' ||\n type.item.kind === 'intersection' ||\n type.item.kind === 'enum';\n return needsParens ? `(${inner})[]` : `${inner}[]`;\n }\n case 'intersection':\n return type.members.map(m => renderOutputTsType(m, modelsWithOutput, target)).join(' & ');\n case 'union':\n return type.members.map(m => renderOutputTsType(m, modelsWithOutput, target)).join(' | ');\n case 'discriminatedUnion':\n return type.members.map(m => renderOutputTsType(m, modelsWithOutput, target)).join(' | ');\n case 'inlineObject':\n return `{ ${type.fields.map(f => `${quoteKey(f.name)}${f.optional ? '?' : ''}: ${renderOutputTsType(f.type, modelsWithOutput, target)}`).join('; ')} }`;\n case 'lazy':\n return renderOutputTsType(type.inner, modelsWithOutput, target);\n default:\n return renderTsType(type, target);\n }\n}\n","/**\n * The emitted decimal.js runtime shared by every generator that renders a `decimal` scalar.\n *\n * `_ZodBinary`/`_ZodDatetime`/`_ZodInterval` are duplicated as literals across codegen-contract,\n * codegen-operation and codegen-mcp, and have already drifted once (the three files emit their\n * luxon import lists in two different orders). The decimal runtime is defined once here so the\n * three call sites cannot disagree about it; each still decides *whether* to emit it with its own\n * detection strategy, which is the part that legitimately differs between them.\n */\n\n/**\n * The decimal.js import — **named, not default**.\n *\n * `decimal.d.ts` declares `Decimal` three times over: a class, a namespace, and a function, with\n * `export default Decimal` alongside. Under the `NodeNext` resolution the scaffolded SDK uses\n * (`module: NodeNext` + `\"type\": \"module\"`), the default export resolves to the *namespace*\n * meaning, so `import Decimal from 'decimal.js'` fails to compile with \"Cannot use namespace\n * 'Decimal' as a type\" and \"Property 'set' does not exist\". The named import binds the merged\n * class and is the only form that typechecks.\n */\nexport const DECIMAL_IMPORT = `import { Decimal } from 'decimal.js';`;\n\n/**\n * Global decimal.js configuration, emitted in **every** file that imports `Decimal` — plain-types\n * mode included, where there is no Zod schema but `String(value)` and `JSON.stringify` still run.\n *\n * Load-bearing, not cosmetic. decimal.js switches to exponential\n * notation outside `toExpNeg`/`toExpPos` (defaults -7/21), so without it `new Decimal('0.00000001')`\n * serializes as `\"1e-8\"` and any peer validating `^-?\\d+(\\.\\d+)?$` rejects it. It is the only lever\n * that reaches the `JSON.stringify` Koa runs over `ctx.body`, which we do not otherwise control.\n *\n */\nexport const DECIMAL_CONFIG_LINE = `Decimal.set({ toExpNeg: -9e15, toExpPos: 9e15 });`;\n\n/**\n * The Zod schema for a `decimal`.\n *\n * Deliberately has no output `.transform()`. `isRevalidatable` in codegen-operation treats every\n * scalar as idempotent under re-parse — the assumption `server.validateResponses` rests on — and\n * preprocess passes an already-`Decimal` value through untouched, so it holds.\n *\n * A raw JSON number fails validation rather than being coerced: by the time one reaches us it has\n * already been through an IEEE-754 double, which is the loss this scalar exists to prevent. Bad\n * strings are returned unchanged from preprocess rather than throwing, so they surface as an\n * ordinary Zod issue instead of a `DecimalError` escaping the parse.\n */\nexport const DECIMAL_ZOD_SCHEMA_LINE = `const _ZodDecimal = z.preprocess((val) => { if (typeof val !== 'string') return val; try { return new Decimal(val); } catch { return val; } }, z.custom<Decimal>((val) => Decimal.isDecimal(val), { message: 'Must be an exact decimal sent as a quoted string, e.g. \"1250.00\"' }));`;\n\n/** The decimal runtime for a file that also holds Zod schemas, in emission order. */\nexport const DECIMAL_PRELUDE_LINES: readonly string[] = [DECIMAL_CONFIG_LINE, DECIMAL_ZOD_SCHEMA_LINE];\n","import type { ContractTypeNode, FieldNode, ModelNode } from '@contractkit/core';\n\n/**\n * Emitters for the `reviveX` functions that rehydrate `decimal` fields in an SDK response.\n *\n * A decimal arrives as a quoted JSON string, but the generated types say `Decimal`, so something\n * has to construct one. The SDK cannot do it the way `bigint` does — `bigIntReviver` works only\n * because bigint invented a tagged `\"123n\"` wire encoding, and `\"10.50\"` is indistinguishable from\n * an ordinary string without knowing the schema. Nor can it re-parse the response through the Zod\n * schema: `XOutput` is a `z.output<>` type alias with no runtime value behind it, and models\n * default to `z.strictObject`, so any field the server added would throw in every deployed client.\n *\n * So the knowledge lives in generated code instead: one function per model that walks to the field\n * positions a decimal can occupy and converts in place. Mutating rather than rebuilding keeps the\n * cost proportional to the number of decimal fields, and preserves unknown server-added keys —\n * the forward compatibility a strict re-parse would destroy.\n *\n * Emitted from the AST, so zod mode and plain-types mode produce identical runtime behaviour.\n */\n\nexport interface ReviveCodegenOptions {\n /** Models that carry a decimal, directly or transitively. Only these get a reviver. */\n modelsWithDecimal: Set<string>;\n /** Models with an `Output` variant, which need a second reviver keyed by the output casing. */\n modelsWithOutput?: Set<string>;\n /** Every model in scope, for resolving discriminated-union members to their literal tag. */\n modelMap?: Map<string, ModelNode>;\n}\n\n/** The per-file coercion helper. Emitted once in any file that declares a reviver. */\nexport const DECIMAL_COERCE_DECL = [\n `const __dec = (v: unknown, path: string): Decimal => {`,\n ` if (typeof v !== 'string') {`,\n ` throw new TypeError(\\`ContractKit: expected a decimal string at '\\${path}', received \\${typeof v} — decimals must be sent as quoted JSON strings.\\`);`,\n ` }`,\n ` try {`,\n ` return new Decimal(v);`,\n ` } catch {`,\n ` throw new TypeError(\\`ContractKit: '\\${v}' at '\\${path}' is not a valid decimal.\\`);`,\n ` }`,\n `};`,\n];\n\n/** `reviveInvoice` / `reviveInvoiceOutput`. */\nexport function reviveFnName(model: string, variant: 'base' | 'output' = 'base'): string {\n return `revive${model}${variant === 'output' ? 'Output' : ''}`;\n}\n\nfunction applyCase(name: string, caseTransform: 'camel' | 'snake' | 'pascal' | undefined): string {\n if (!caseTransform || caseTransform === 'camel') return name;\n if (caseTransform === 'snake') return name.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`);\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n/** Whether a type reaches a decimal, following refs through `modelsWithDecimal`. */\nexport function typeReachesDecimal(type: ContractTypeNode, opts: ReviveCodegenOptions): boolean {\n switch (type.kind) {\n case 'scalar':\n return type.name === 'decimal';\n case 'ref':\n return opts.modelsWithDecimal.has(type.name);\n case 'array':\n return typeReachesDecimal(type.item, opts);\n case 'lazy':\n return typeReachesDecimal(type.inner, opts);\n case 'tuple':\n return type.items.some(t => typeReachesDecimal(t, opts));\n case 'record':\n return typeReachesDecimal(type.value, opts);\n case 'union':\n case 'discriminatedUnion':\n case 'intersection':\n return type.members.some(t => typeReachesDecimal(t, opts));\n case 'inlineObject':\n return type.fields.some(f => typeReachesDecimal(f.type, opts));\n default:\n return false;\n }\n}\n\n/** Fresh local names, so nested loops in one function body cannot collide. */\nclass Scope {\n private n = 0;\n next(prefix: string): string {\n return `__${prefix}${this.n++}`;\n }\n}\n\n/**\n * Statements that hydrate `slot` — an assignable expression — in place.\n *\n * `path` is threaded purely for the error message; it is what tells a consumer *which* field of a\n * large response was malformed.\n */\nfunction emit(slot: string, type: ContractTypeNode, path: string, opts: ReviveCodegenOptions, scope: Scope, variant: 'base' | 'output'): string[] {\n switch (type.kind) {\n case 'scalar':\n return type.name === 'decimal' ? [`${slot} = __dec(${slot}, '${path}');`] : [];\n\n case 'ref':\n return opts.modelsWithDecimal.has(type.name) ? [`${reviveRefName(type.name, opts, variant)}(${slot} as never);`] : [];\n\n case 'lazy':\n return emit(slot, type.inner, path, opts, scope, variant);\n\n case 'array': {\n if (!typeReachesDecimal(type.item, opts)) return [];\n const arr = scope.next('a');\n const i = scope.next('i');\n const inner = emit(`${arr}[${i}]`, type.item, `${path}[]`, opts, scope, variant);\n return [\n `{`,\n ` const ${arr} = ${slot} as unknown[];`,\n ` for (let ${i} = 0; ${i} < ${arr}.length; ${i}++) {`,\n ...inner.map(l => ` ${l}`),\n ` }`,\n `}`,\n ];\n }\n\n case 'tuple': {\n const items = type.items.flatMap((t, idx) =>\n typeReachesDecimal(t, opts) ? emit(`(${slot} as unknown[])[${idx}]`, t, `${path}[${idx}]`, opts, scope, variant) : [],\n );\n return items;\n }\n\n case 'record': {\n if (!typeReachesDecimal(type.value, opts)) return [];\n const rec = scope.next('r');\n const k = scope.next('k');\n const inner = emit(`${rec}[${k}]`, type.value, `${path}{}`, opts, scope, variant);\n return [\n `{`,\n ` const ${rec} = ${slot} as Record<string, unknown>;`,\n ` for (const ${k} of Object.keys(${rec})) {`,\n ...inner.map(l => ` ${l}`),\n ` }`,\n `}`,\n ];\n }\n\n case 'inlineObject': {\n const relevant = type.fields.filter(f => typeReachesDecimal(f.type, opts));\n if (relevant.length === 0) return [];\n const obj = scope.next('o');\n const body = relevant.flatMap(f => fieldStatements(obj, f, path, opts, scope, variant, undefined));\n return [`{`, ` const ${obj} = ${slot} as Record<string, unknown>;`, ...body.map(l => ` ${l}`), `}`];\n }\n\n case 'intersection':\n return type.members.flatMap(m => emit(slot, m, path, opts, scope, variant));\n\n case 'union': {\n // `validateDecimal` rejects a decimal in a union with more than one non-null member, so\n // anything reaching here is `T | null`: hydrate the single real member behind a guard.\n const real = type.members.filter(m => !(m.kind === 'scalar' && m.name === 'null'));\n const target = real.find(m => typeReachesDecimal(m, opts));\n if (!target) return [];\n const inner = emit(slot, target, path, opts, scope, variant);\n return [`if (${slot} != null) {`, ...inner.map(l => ` ${l}`), `}`];\n }\n\n case 'discriminatedUnion': {\n const branches: string[] = [];\n const disc = scope.next('d');\n for (const member of type.members) {\n if (!typeReachesDecimal(member, opts)) continue;\n const tag = discriminatorTag(member, type.discriminator, opts);\n const inner = emit(slot, member, path, opts, scope, variant);\n if (inner.length === 0) continue;\n if (tag === undefined) {\n // No resolvable literal: hydrating unconditionally could apply the wrong arm's\n // shape, so skip it rather than risk corrupting a sibling member's field.\n continue;\n }\n branches.push(` if (${disc} === ${JSON.stringify(tag)}) {`, ...inner.map(l => ` ${l}`), ` }`);\n }\n if (branches.length === 0) return [];\n return [`{`, ` const ${disc} = (${slot} as Record<string, unknown>)[${JSON.stringify(type.discriminator)}];`, ...branches, `}`];\n }\n\n default:\n return [];\n }\n}\n\n/** The literal value that selects `member` in a discriminated union, when it can be resolved. */\nfunction discriminatorTag(member: ContractTypeNode, discriminator: string, opts: ReviveCodegenOptions): string | number | boolean | undefined {\n const fields: FieldNode[] | undefined =\n member.kind === 'inlineObject' ? member.fields : member.kind === 'ref' ? opts.modelMap?.get(member.name)?.fields : undefined;\n const field = fields?.find(f => f.name === discriminator);\n if (field?.type.kind === 'literal') return field.type.value;\n // A single-valued enum is the other way a discriminator gets written.\n if (field?.type.kind === 'enum' && field.type.values.length === 1) return field.type.values[0];\n return undefined;\n}\n\n/** Statements for one field of an object held in `objVar`. */\nfunction fieldStatements(\n objVar: string,\n field: FieldNode,\n path: string,\n opts: ReviveCodegenOptions,\n scope: Scope,\n variant: 'base' | 'output',\n outputCase: 'camel' | 'snake' | 'pascal' | undefined,\n): string[] {\n const key = variant === 'output' ? applyCase(field.name, outputCase) : field.name;\n const slot = `${objVar}[${JSON.stringify(key)}]`;\n const inner = emit(slot, field.type, `${path}.${key}`, opts, scope, variant);\n if (inner.length === 0) return [];\n // A union already emits its own null guard; adding a second would just nest.\n if (field.type.kind === 'union') return inner;\n if (field.optional || field.nullable) {\n return [`if (${slot} != null) {`, ...inner.map(l => ` ${l}`), `}`];\n }\n return inner;\n}\n\n/**\n * Pick the reviver for a referenced model.\n *\n * Mirrors `renderOutputTsType`: inside an output reviver, a referenced model uses its *own* output\n * reviver only if it has one. `computeModelsWithOutput` propagates referrer→referenced, so a child\n * of a transformed parent is not itself transformed and keeps camelCase keys.\n */\nfunction reviveRefName(name: string, opts: ReviveCodegenOptions, variant: 'base' | 'output'): string {\n if (variant === 'output' && opts.modelsWithOutput?.has(name)) return reviveFnName(name, 'output');\n return reviveFnName(name, 'base');\n}\n\n/**\n * A standalone reviver for an arbitrary type node — used for a response body that is not a plain\n * model reference (an inline object, a record, a tuple), where there is no `reviveX` to call.\n *\n * Returns `null` when the type holds no decimal, so the caller emits nothing at all.\n */\nexport function renderInlineReviver(\n fnName: string,\n tsType: string,\n type: ContractTypeNode,\n opts: ReviveCodegenOptions,\n variant: 'base' | 'output' = 'output',\n): string[] | null {\n if (!typeReachesDecimal(type, opts)) return null;\n const scope = new Scope();\n const body = emit('__v[0]', type, fnName.replace(/^__revive/, ''), opts, scope, variant);\n if (body.length === 0) return null;\n return [\n `/** Rehydrates the \\`decimal\\` fields of one response body. Mutates and returns \\`raw\\`. */`,\n `function ${fnName}(raw: ${tsType}): ${tsType} {`,\n ` const __v = [raw] as unknown[];`,\n ...body.map(l => ` ${l}`),\n ` return __v[0] as ${tsType};`,\n `}`,\n ];\n}\n\n/** The `reviveX` (and `reviveXOutput`) declarations for one model, or `[]` if it holds no decimal. */\nexport function renderReviveFunctions(model: ModelNode, opts: ReviveCodegenOptions): string[] {\n if (!opts.modelsWithDecimal.has(model.name)) return [];\n const lines = renderOne(model, opts, 'base');\n if (opts.modelsWithOutput?.has(model.name)) {\n lines.push('');\n lines.push(...renderOne(model, opts, 'output'));\n }\n return lines;\n}\n\nfunction renderOne(model: ModelNode, opts: ReviveCodegenOptions, variant: 'base' | 'output'): string[] {\n const scope = new Scope();\n const typeName = `${model.name}${variant === 'output' ? 'Output' : ''}`;\n const fnName = reviveFnName(model.name, variant);\n\n // A type-alias model has no fields — hydrate the aliased type as a whole.\n if (model.type) {\n const body = emit('__v[0]', model.type, model.name, opts, scope, variant);\n if (body.length === 0) return [];\n return [\n `/** Rehydrates every \\`decimal\\` in a ${typeName} from its wire string. Mutates and returns \\`raw\\`. */`,\n `export function ${fnName}(raw: ${typeName}): ${typeName} {`,\n ` const __v = [raw] as unknown[];`,\n ...body.map(l => ` ${l}`),\n ` return __v[0] as ${typeName};`,\n `}`,\n ];\n }\n\n const obj = scope.next('o');\n const body = model.fields.flatMap(f =>\n typeReachesDecimal(f.type, opts) ? fieldStatements(obj, f, model.name, opts, scope, variant, model.outputCase) : [],\n );\n if (body.length === 0) return [];\n\n return [\n `/** Rehydrates every \\`decimal\\` in a ${typeName} from its wire string. Mutates and returns \\`raw\\`. */`,\n `export function ${fnName}(raw: ${typeName}): ${typeName} {`,\n ` const ${obj} = raw as unknown as Record<string, unknown>;`,\n ...body.map(l => ` ${l}`),\n ` return raw;`,\n `}`,\n ];\n}\n","import type {\n OpRootNode,\n OpRouteNode,\n OpOperationNode,\n OpResponseNode,\n OpResponseHeaderNode,\n ContractTypeNode,\n ScalarTypeNode,\n ParamSource,\n ObjectMode,\n} from '@contractkit/core';\nimport { resolveModifiers, resolveSecurity, SECURITY_NONE, classifyContentType, emittedResponses } from '@contractkit/core';\nimport {\n renderType,\n renderInputType,\n renderQueryType,\n pascalToDotCase,\n modeToWrapper,\n} from './codegen-contract.js';\nimport { renderOutputTsType, quoteKey, headerNameToProperty, escapeJsDocLines, escapeSingleQuoted } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_PRELUDE_LINES } from './decimal-runtime.js';\nimport { basename, dirname, relative } from 'path';\n\n// ─── Content-type helpers ──────────────────────────────────────────────────\n\n/** Map a request MIME type to the koa-bodyparser parser token used in middleware. */\nfunction bodyParserToken(contentType: string): string {\n switch (classifyContentType(contentType)) {\n case 'urlencoded':\n return 'urlencoded';\n case 'multipart':\n return 'multipart';\n case 'text':\n return 'text';\n case 'binary':\n // koa-bodyparser has no native binary token; fall back to text so the body is\n // still readable as a string. Services handling binary uploads should switch to\n // multipart/form-data.\n return 'text';\n default:\n return 'json';\n }\n}\n\n/**\n * Deep structural equality on ContractTypeNode, ignoring source locations on inline fields.\n * Used to decide whether multiple declared request MIMEs can share a single validate path.\n */\nexport function bodyTypesStructurallyEqual(a: ContractTypeNode, b: ContractTypeNode): boolean {\n if (a.kind !== b.kind) return false;\n switch (a.kind) {\n case 'scalar': {\n const bb = b as typeof a;\n return (\n a.name === bb.name &&\n a.min === bb.min &&\n a.max === bb.max &&\n a.len === bb.len &&\n a.scale === bb.scale &&\n a.regex === bb.regex &&\n a.format === bb.format\n );\n }\n case 'array': {\n const bb = b as typeof a;\n return a.min === bb.min && a.max === bb.max && bodyTypesStructurallyEqual(a.item, bb.item);\n }\n case 'tuple': {\n const bb = b as typeof a;\n return a.items.length === bb.items.length && a.items.every((x, i) => bodyTypesStructurallyEqual(x, bb.items[i]!));\n }\n case 'record': {\n const bb = b as typeof a;\n return bodyTypesStructurallyEqual(a.key, bb.key) && bodyTypesStructurallyEqual(a.value, bb.value);\n }\n case 'enum': {\n const bb = b as typeof a;\n return a.values.length === bb.values.length && a.values.every((v, i) => v === bb.values[i]);\n }\n case 'literal': {\n const bb = b as typeof a;\n return a.value === bb.value;\n }\n case 'union':\n case 'intersection': {\n const bb = b as typeof a;\n return a.members.length === bb.members.length && a.members.every((m, i) => bodyTypesStructurallyEqual(m, bb.members[i]!));\n }\n case 'discriminatedUnion': {\n const bb = b as typeof a;\n return (\n a.discriminator === bb.discriminator &&\n a.members.length === bb.members.length &&\n a.members.every((m, i) => bodyTypesStructurallyEqual(m, bb.members[i]!))\n );\n }\n case 'ref': {\n const bb = b as typeof a;\n return a.name === bb.name && !!a.lazy === !!bb.lazy;\n }\n case 'lazy': {\n const bb = b as typeof a;\n return bodyTypesStructurallyEqual(a.inner, bb.inner);\n }\n case 'inlineObject': {\n const bb = b as typeof a;\n if (a.mode !== bb.mode) return false;\n if (a.fields.length !== bb.fields.length) return false;\n return a.fields.every((f, i) => {\n const g = bb.fields[i]!;\n return (\n f.name === g.name &&\n f.optional === g.optional &&\n f.nullable === g.nullable &&\n f.visibility === g.visibility &&\n f.default === g.default &&\n !!f.deprecated === !!g.deprecated &&\n bodyTypesStructurallyEqual(f.type, g.type)\n );\n });\n }\n }\n}\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/** Options controlling how {@link generateOp} renders a Koa router module. */\nexport interface OpCodegenOptions {\n servicePathTemplate?: string;\n typeImportPathTemplate?: string;\n outPath?: string;\n /** Map from model name → absolute output file path (for cross-module type imports) */\n modelOutPaths?: Map<string, string>;\n /** Set of model names that have Input variants (models with visibility modifiers) */\n modelsWithInput?: Set<string>;\n /** Set of model names that have Output variants (models with format(output=...)) */\n modelsWithOutput?: Set<string>;\n /**\n * Whether to emit handlers for operations marked `internal`. Defaults to `true` because\n * the server still needs routes for internal endpoints; set to `false` to omit them\n * from the generated router entirely.\n */\n includeInternal?: boolean;\n /**\n * Re-parse the service result through its declared response schema before writing `ctx.body`,\n * and write the parsed value. Requires the type file to hold Zod schemas (`server.zod`) —\n * plain interfaces are types, with no runtime schema value to validate against. Default false.\n */\n validateResponses?: boolean;\n /**\n * Set of model names whose schema applies a `format(...)` key transform, directly or through a\n * referenced model. Response bodies touching one are left unvalidated: the service returns the\n * post-transform shape, which the schema itself cannot re-parse.\n */\n modelsWithTransform?: Set<string>;\n}\n\n/**\n * Generate a Koa router module for every operation in `root`, including the imports, type\n * aliases, and handler list.\n *\n * Imports are derived from the generated body — each candidate symbol is emitted only if it\n * actually appears in the output. Deciding them from predicates over the AST instead means any\n * drift between predicate and codegen leaves an unused import in every generated file, which\n * trips `noUnusedLocals` and lint downstream.\n */\nexport function generateOp(root: OpRootNode, options: OpCodegenOptions = {}): string {\n // Collect all referenced types across all routes\n const types = collectTypes(root, options.modelsWithInput, options.modelsWithOutput);\n const services = collectServices(root);\n const routerName = deriveRouterName(root.file);\n\n const lines: string[] = [];\n\n lines.push('');\n lines.push('/**');\n const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file;\n lines.push(` * generated from [${basename(root.file)}](file://./${relFile})`);\n lines.push('*/');\n lines.push(`export const ${routerName} = ServerKitRouter();`);\n lines.push('');\n\n const includeInternal = options.includeInternal ?? true;\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n lines.push(...generateHandler(route, op, root, options));\n lines.push('');\n }\n }\n\n // Helpers and imports are both decided from the code we just generated, not from predicates\n // over the AST that have to be kept in step with it by hand. A predicate that drifts leaves an\n // unused declaration in every generated file, which trips `noUnusedLocals` and lint in\n // consuming projects — `opNeedsScalar(root, 'binary')` over-approximates exactly that way,\n // since a binary *response* body is a plain `Buffer` annotation with no schema behind it.\n const handlerBody = lines.join('\\n');\n const references = (symbol: string) => new RegExp(`\\\\b${symbol}\\\\b`).test(handlerBody);\n\n const helpers: string[] = [];\n if (references('_ZodBinary')) {\n helpers.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`);\n }\n if (references('_ZodDatetime')) {\n helpers.push(\n `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`,\n );\n }\n if (references('_ZodDecimal')) {\n helpers.push(...DECIMAL_PRELUDE_LINES);\n }\n if (references('_ZodInterval')) {\n helpers.push(\n `const _ZodInterval = z.preprocess((val) => typeof val === 'string' ? Interval.fromISO(val) : val, z.custom<Interval>((val) => val instanceof Interval && val.isValid, { message: 'Must be an ISO 8601 interval' })).transform(val => val.toISO()!);`,\n );\n }\n // `_ZodJson`'s own declaration is annotated with `_JsonValue`, so the type alias comes along\n // with it; the alias is also needed on its own for a `json` body's server-side annotation.\n const needsZodJson = references('_ZodJson');\n if (needsZodJson || references('_JsonValue')) {\n helpers.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`);\n }\n if (needsZodJson) {\n helpers.push(\n `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`,\n );\n }\n\n const generated = [...(helpers.length ? ['', ...helpers] : []), ...lines].join('\\n');\n const uses = (symbol: string) => new RegExp(`\\\\b${symbol}\\\\b`).test(generated);\n\n const body: string[] = [];\n\n const koaImports = ['ServerKitRouter', 'bodyParserMiddleware', 'requirePolicy', 'requireSignature'].filter(uses);\n if (koaImports.length > 0) {\n body.push(`import { ${koaImports.join(', ')} } from '@maroonedsoftware/koa';`);\n }\n\n // Services and model names come from the AST, which over-approximates two ways: a model with an\n // Input/Output variant contributes its base name even when only the variant is ever annotated,\n // and `collectServices`/`collectTypes` walk every operation including the `internal` ones\n // `includeInternal: false` drops. Filtering through `uses` — the same gate every symbol above\n // goes through — keeps the import list to what the handlers actually reference, so generated\n // code does not trip `noUnusedLocals` in the consuming project.\n for (const svc of services.filter(uses)) {\n const modulePath = root.services?.[svc] ?? root.meta[svc] ?? deriveModulePath(svc, options.servicePathTemplate);\n body.push(`import { ${svc} } from '${modulePath}';`);\n }\n\n const usedTypes = types.filter(uses);\n if (usedTypes.length > 0) {\n body.push(...generateTypeImports(usedTypes, root.file, options));\n }\n\n // luxon is needed for date/time/datetime (DateTime), duration (Duration) and interval (Interval);\n // the rendered Zod schemas and the service-result annotations both reference these classes.\n const luxonImports = ['DateTime', 'Duration', 'Interval'].filter(uses);\n if (luxonImports.length > 0) {\n body.push(`import { ${luxonImports.join(', ')} } from 'luxon';`);\n }\n\n // Same `uses` gate: `Decimal` appears in the `_ZodDecimal` helper and in service-result\n // annotations via `serverTsScalar`, and the helper text is folded into `generated` above.\n if (uses('Decimal')) {\n body.push(DECIMAL_IMPORT);\n }\n\n if (uses('parseAndValidate')) {\n body.push(`import { parseAndValidate } from '@maroonedsoftware/zod';`);\n }\n\n if (uses('MultipartBody')) {\n body.push(`import { MultipartBody } from '@maroonedsoftware/multipart';`);\n }\n\n const allContent = [...body, ...(helpers.length ? ['', ...helpers] : []), ...lines].join('\\n');\n const needsZod = /\\bz\\./.test(allContent);\n return (needsZod ? `import { z } from 'zod';\\n` : '') + allContent;\n}\n\n// ─── Handler generation ────────────────────────────────────────────────────\n\nfunction generateHandler(route: OpRouteNode, op: OpOperationNode, root: OpRootNode, options: OpCodegenOptions): string[] {\n const lines: string[] = [];\n const file = root.file;\n const outPath = options.outPath;\n const modelsWithInput = options.modelsWithInput;\n\n lines.push('/**');\n\n // JSDoc from description\n const desc = op.description ?? route.description;\n if (desc) {\n for (const l of escapeJsDocLines(desc)) lines.push(` * ${l}`);\n }\n // Source location comment\n const relFile = outPath ? relative(dirname(outPath), file) : file;\n lines.push(` * from [${basename(file)}](file://./${relFile}#L${op.loc.line})`);\n\n // Security annotation (operation-level wins; falls back to route → file level)\n const effectiveSecurity = resolveSecurity(route, op, root);\n if (effectiveSecurity === SECURITY_NONE) {\n lines.push(` * anonymous access, no security required`);\n }\n\n // Modifier annotations\n const mods = resolveModifiers(route, op);\n if (mods.includes('internal')) lines.push(` * @internal`);\n if (mods.includes('deprecated')) lines.push(` * @deprecated`);\n\n lines.push('*/');\n\n const method = op.method;\n const path = route.path.replace(/\\{(\\w+)\\}/g, ':$1');\n const bodies = op.request?.bodies ?? [];\n const hasBody = bodies.length > 0;\n const isSingleMultipart = bodies.length === 1 && bodies[0]!.contentType === 'multipart/form-data';\n\n // Middleware list\n const middlewares: string[] = [];\n if (effectiveSecurity !== SECURITY_NONE) {\n const policy = effectiveSecurity?.policy;\n const args =\n policy === undefined\n ? ''\n : policy === false\n ? '{ policy: false }'\n : `{ policy: '${policy}' }`;\n middlewares.push(`requirePolicy(${args})`);\n }\n if (hasBody) {\n const parserTokens = Array.from(new Set(bodies.map(b => bodyParserToken(b.contentType))));\n const tokensExpr = parserTokens.map(t => `'${t}'`).join(', ');\n middlewares.push(`bodyParserMiddleware([${tokensExpr}])`);\n }\n if (op.signature) {\n const sigArgs = op.signaturePolicy\n ? `'${escapeSingleQuoted(op.signature)}', { policy: '${escapeSingleQuoted(op.signaturePolicy)}' }`\n : `'${escapeSingleQuoted(op.signature)}'`;\n middlewares.push(`requireSignature(${sigArgs})`);\n }\n const middlewareStr = middlewares.length > 0 ? `, ${middlewares.join(', ')},` : ',';\n\n lines.push(`${deriveRouterName(file)}.${method}('${path}'${middlewareStr} async ctx => {`);\n\n // Params / query / headers validation (request-side — use Input variants)\n lines.push(...generateParamValidation(route.params, 'ctx.params', 'params', route.paramsMode ?? 'strict', '', modelsWithInput));\n lines.push(...generateParamValidation(op.query, 'ctx.query', 'query', op.queryMode ?? 'strict', '', modelsWithInput));\n lines.push(...generateParamValidation(op.headers, 'ctx.headers', 'headers', op.headersMode ?? 'strip', '', modelsWithInput));\n\n // Body validation (request-side — use Input variants)\n if (hasBody && op.request) {\n if (isSingleMultipart) {\n lines.push(` const multipartBody = ctx.parsedBody as MultipartBody;`);\n lines.push('');\n } else if (bodies.length === 1) {\n lines.push(` const body = await parseAndValidate(ctx.parsedBody, ${renderInputType(bodies[0]!.bodyType, modelsWithInput)});`);\n lines.push('');\n } else if (bodies.every(b => bodyTypesStructurallyEqual(b.bodyType, bodies[0]!.bodyType))) {\n // All declared MIMEs share the same body shape — single validation suffices\n lines.push(` const body = await parseAndValidate(ctx.parsedBody, ${renderInputType(bodies[0]!.bodyType, modelsWithInput)});`);\n lines.push('');\n } else {\n // Different body types per MIME — dispatch on Content-Type\n const annotation = bodies\n .map(b =>\n b.contentType === 'multipart/form-data' ? 'MultipartBody' : `z.infer<typeof ${renderInputType(b.bodyType, modelsWithInput)}>`,\n )\n .join(' | ');\n lines.push(` let body!: ${annotation};`);\n lines.push(` switch (ctx.request.type) {`);\n for (const b of bodies) {\n lines.push(` case '${b.contentType}':`);\n if (b.contentType === 'multipart/form-data') {\n lines.push(` body = ctx.parsedBody as MultipartBody;`);\n } else {\n lines.push(` body = await parseAndValidate(ctx.parsedBody, ${renderInputType(b.bodyType, modelsWithInput)});`);\n }\n lines.push(` break;`);\n }\n lines.push(` }`);\n lines.push('');\n }\n }\n\n // Service call. `emittedResponses` decides which of the declared statuses the service is\n // responsible for producing; the rest are documentation, or the thrown-error path.\n const emitted = emittedResponses(op);\n const serviceParts = inferService(op, route, file);\n const call = `await service.${serviceParts.methodName}(${buildArgs(route, op)})`;\n\n if (emitted.length > 1) {\n lines.push(...generateMultiStatusResult(emitted, serviceParts.className, call, options));\n } else {\n lines.push(...generateSingleStatusResult(emitted[0], op, serviceParts.className, call, options));\n }\n\n lines.push(`});`);\n\n return lines;\n}\n\n/**\n * The service produces exactly one status (or none): the result is the body itself, or\n * `{ body, headers }` when the status declares headers, and `ctx.status` is a constant.\n *\n * A status declaring several mimes also gains a `contentType` the service picks, which is the\n * only thing here that can turn `ctx.type` from a literal into an expression.\n */\nfunction generateSingleStatusResult(\n resp: OpResponseNode | undefined,\n op: OpOperationNode,\n className: string,\n call: string,\n options: OpCodegenOptions,\n): string[] {\n const lines: string[] = [];\n const bodies = resp ? resp.bodies : [];\n const respHeaders = resp?.headers ?? [];\n const hasRespHeaders = respHeaders.length > 0;\n const headersAnnotation = hasRespHeaders ? renderHeadersAnnotation(respHeaders, options.modelsWithOutput) : '';\n\n let bodySchema: string | undefined;\n\n if (bodies.length === 1) {\n const { annotation, prelude } = formatTypeAnnotation(bodies[0]!.bodyType, options.modelsWithOutput);\n if (prelude) lines.push(` ${prelude}`);\n bodySchema = responseBodySchema(bodies[0]!.bodyType, options, prelude ? 'resultType' : undefined);\n lines.push(` const service = ctx.container.get(${className});`);\n if (hasRespHeaders) {\n lines.push(` const result: { body: ${annotation}; headers: ${headersAnnotation} } = ${call};`);\n } else {\n lines.push(` const result: ${annotation} = ${call};`);\n }\n } else if (bodies.length > 1) {\n const rendered = renderResponseMembers(resp!, options, { includeStatus: false, varPrefix: 'result' });\n const { members, preludes } = rendered;\n bodySchema = rendered.bodySchema;\n for (const prelude of preludes) lines.push(` ${prelude}`);\n lines.push(` const service = ctx.container.get(${className});`);\n lines.push(` const result: ${members.join(' | ')} = ${call};`);\n } else {\n lines.push(` const service = ctx.container.get(${className});`);\n if (hasRespHeaders) {\n lines.push(` const result: { headers: ${headersAnnotation} } = ${call};`);\n } else {\n lines.push(` ${call};`);\n }\n }\n\n lines.push('');\n // With nothing emitted, the status is still declared somewhere — fall back to the first\n // one written, which is what a documentation-only 3xx/4xx operation means.\n lines.push(` ctx.status = ${resp?.statusCode ?? op.responses[0]?.statusCode ?? 200};`);\n lines.push(...headerSetLines(respHeaders, ' '));\n\n if (bodies.length === 1) {\n lines.push(` ctx.type = '${bodies[0]!.contentType}';`);\n lines.push(` ctx.body = ${responseBodyExpr(hasRespHeaders ? 'result.body' : 'result', bodySchema)};`);\n } else if (bodies.length > 1) {\n lines.push(` ctx.type = result.contentType;`);\n lines.push(` ctx.body = ${responseBodyExpr('result.body', bodySchema)};`);\n }\n\n return lines;\n}\n\n/**\n * The service chooses between several statuses: the result is a union discriminated on\n * `status`, and the handler switches on it so each status writes only its own headers, mime\n * and body.\n */\nfunction generateMultiStatusResult(emitted: OpResponseNode[], className: string, call: string, options: OpCodegenOptions): string[] {\n const lines: string[] = [];\n const members: string[] = [];\n const preludes: string[] = [];\n\n const bodySchemas = new Map<number, string | undefined>();\n\n for (const resp of emitted) {\n const rendered = renderResponseMembers(resp, options, { includeStatus: true, varPrefix: `result${resp.statusCode}` });\n members.push(...rendered.members);\n preludes.push(...rendered.preludes);\n bodySchemas.set(resp.statusCode, rendered.bodySchema);\n }\n\n for (const prelude of preludes) lines.push(` ${prelude}`);\n lines.push(` const service = ctx.container.get(${className});`);\n lines.push(` const result:`);\n for (const member of members) lines.push(` | ${member}`);\n lines.push(` = ${call};`);\n lines.push('');\n lines.push(` ctx.status = result.status;`);\n lines.push(` switch (result.status) {`);\n for (const resp of emitted) {\n lines.push(` case ${resp.statusCode}:`);\n lines.push(...headerSetLines(resp.headers ?? [], ' '));\n if (resp.bodies.length > 0) {\n lines.push(` ctx.type = result.contentType;`);\n lines.push(` ctx.body = ${responseBodyExpr('result.body', bodySchemas.get(resp.statusCode))};`);\n }\n lines.push(` break;`);\n }\n lines.push(` }`);\n\n return lines;\n}\n\n/**\n * Render one status as the members of the service-result union — its `contentType`, `body` and\n * `headers`, plus `status` when the operation emits more than one.\n *\n * A status declaring several mimes collapses to a single member with a union of mime literals\n * when the bodies are structurally identical (`image/png` and `image/jpeg` both `binary`).\n * When they differ, it produces one member per mime so `contentType` and `body` stay correlated.\n */\nfunction renderResponseMembers(\n resp: OpResponseNode,\n options: OpCodegenOptions,\n opts: { includeStatus: boolean; varPrefix: string },\n): { members: string[]; preludes: string[]; bodySchema?: string } {\n const bodies = resp.bodies;\n const headers = resp.headers ?? [];\n const leading = opts.includeStatus ? [`status: ${resp.statusCode}`] : [];\n const trailing = headers.length > 0 ? [`headers: ${renderHeadersAnnotation(headers, options.modelsWithOutput)}`] : [];\n const preludes: string[] = [];\n\n if (bodies.length === 0) {\n return { members: [`{ ${[...leading, ...trailing].join('; ')} }`], preludes };\n }\n\n const uniform = bodies.every(b => bodyTypesStructurallyEqual(b.bodyType, bodies[0]!.bodyType));\n if (uniform) {\n const { annotation, prelude } = formatTypeAnnotation(bodies[0]!.bodyType, options.modelsWithOutput, `${opts.varPrefix}Type`);\n if (prelude) preludes.push(prelude);\n const bodySchema = responseBodySchema(bodies[0]!.bodyType, options, prelude ? `${opts.varPrefix}Type` : undefined);\n const contentType = bodies.map(b => `'${b.contentType}'`).join(' | ');\n return {\n members: [`{ ${[...leading, `contentType: ${contentType}`, `body: ${annotation}`, ...trailing].join('; ')} }`],\n preludes,\n bodySchema,\n };\n }\n\n // One member per mime: `contentType` and `body` stay correlated, so validating would need a\n // second switch on `result.contentType` nested inside the status switch. Left unvalidated —\n // note the absent `bodySchema` in the return below.\n const members = bodies.map((b, i) => {\n const { annotation, prelude } = formatTypeAnnotation(b.bodyType, options.modelsWithOutput, `${opts.varPrefix}Type${i}`);\n if (prelude) preludes.push(prelude);\n return `{ ${[...leading, `contentType: '${b.contentType}'`, `body: ${annotation}`, ...trailing].join('; ')} }`;\n });\n return { members, preludes };\n}\n\nfunction renderHeadersAnnotation(headers: OpResponseHeaderNode[], modelsWithOutput?: Set<string>): string {\n const fields = headers.map(\n h => `${quoteKey(headerNameToProperty(h.name))}${h.optional ? '?' : ''}: ${renderOutputTsType(h.type, modelsWithOutput, 'server')}`,\n );\n return `{ ${fields.join('; ')} }`;\n}\n\n/** `ctx.set(...)` calls for a status's declared response headers, guarding the optional ones. */\nfunction headerSetLines(headers: OpResponseHeaderNode[], indent: string): string[] {\n return headers.map(h => {\n const accessor = `result.headers[${JSON.stringify(headerNameToProperty(h.name))}]`;\n return h.optional\n ? `${indent}if (${accessor} !== undefined) ctx.set('${h.name}', String(${accessor}));`\n : `${indent}ctx.set('${h.name}', String(${accessor}));`;\n });\n}\n\n// ─── Inference helpers ─────────────────────────────────────────────────────\n\n/**\n * Resolve the service class and method a handler should delegate to.\n *\n * Uses the operation's explicit `service: Class.method` declaration when present; otherwise derives\n * the class from the contract file name (`ledger.categories.ck` → `LedgerCategoriesService`) and the\n * method from the HTTP verb and whether the path carries a parameter (`get` → `list` / `getById`).\n *\n * @param file Path of the `.ck` file the operation came from.\n */\nexport function inferService(op: OpOperationNode, route: OpRouteNode, file: string): { className: string; methodName: string } {\n // If explicitly declared: service: ServiceClass.methodName\n if (op.service) {\n const [cls = '', method] = op.service.split('.');\n return { className: cls, methodName: method ?? 'handle' };\n }\n\n // Infer from file name + method + path\n const baseName = deriveBaseName(file); // e.g. \"ledger.categories\" -> \"LedgerCategories\"\n const className = `${baseName}Service`;\n const methodName = inferMethodName(op.method, route.path);\n return { className, methodName };\n}\n\nfunction inferMethodName(method: string, path: string): string {\n const hasParam = path.includes('{');\n switch (method) {\n case 'get':\n return hasParam ? 'getById' : 'list';\n case 'post':\n return 'create';\n case 'put':\n return 'replace';\n case 'patch':\n return 'update';\n case 'delete':\n return 'delete';\n default:\n return 'handle';\n }\n}\n\n/**\n * Build the comma-separated argument list passed to the service method in a generated handler.\n *\n * Order is params, body, query, headers. Inline path params are spread as individual identifiers;\n * a referenced/compound params type is passed as a single `params` object. A lone\n * `multipart/form-data` request body is passed as `multipartBody` rather than `body`.\n *\n * @returns The rendered argument list, or an empty string when the method takes no arguments.\n */\nexport function buildArgs(route: OpRouteNode, op: OpOperationNode): string {\n const args: string[] = [];\n // Path params: spread individually (inline) or pass 'params' object (type-ref/ContractTypeNode)\n if (route.params) {\n if (route.params.kind === 'params') {\n args.push(...route.params.nodes.map(p => p.name));\n } else {\n args.push('params');\n }\n }\n // Body\n if (op.request && op.request.bodies.length > 0) {\n const bodies = op.request.bodies;\n const isSingleMultipart = bodies.length === 1 && bodies[0]!.contentType === 'multipart/form-data';\n args.push(isSingleMultipart ? 'multipartBody' : 'body');\n }\n // Query\n if (op.query) args.push('query');\n // Headers\n if (op.headers) args.push('headers');\n return args.join(', ');\n}\n\n/**\n * Map a `.ck` scalar to the TypeScript type a server handler sees, i.e. `z.infer` of the schema\n * `renderType` emits for that scalar. This is deliberately NOT `renderTsScalar` from ts-render:\n * that one describes the wire/SDK view (`binary` → `Blob`, dates → `string`), while the router\n * runs on Node against the parsed Zod output (`binary` → `Buffer`, dates → luxon `DateTime`).\n */\nfunction serverTsScalar(name: ScalarTypeNode['name']): string {\n switch (name) {\n case 'string':\n case 'email':\n case 'url':\n case 'uuid':\n return 'string';\n case 'number':\n case 'int':\n return 'number';\n case 'bigint':\n return 'bigint';\n case 'decimal':\n // Unlike the date scalars, this matches `renderTsScalar`'s wire view — `_ZodDecimal`\n // has no output transform, so `z.infer` is a `Decimal` on both sides.\n return 'Decimal';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n return 'DateTime';\n case 'duration':\n return 'Duration';\n case 'interval':\n // _ZodInterval transforms to an ISO string, so the inferred output type is string.\n return 'string';\n case 'binary':\n return 'Buffer';\n case 'json':\n return '_JsonValue';\n case 'object':\n return 'Record<string, unknown>';\n case 'null':\n return 'null';\n case 'unknown':\n return 'unknown';\n default: {\n const _exhaustive: never = name;\n throw new Error(`plugin-typescript: unmapped scalar '${String(_exhaustive)}' — add a case`);\n }\n }\n}\n\n/**\n * @param varName Name for the extracted schema variable. Distinct per status and per mime when\n * an operation emits several, so two complex bodies in one handler cannot collide.\n */\nfunction formatTypeAnnotation(bodyType: ContractTypeNode, modelsWithOutput?: Set<string>, varName = 'resultType'): { annotation: string; prelude?: string } {\n if (bodyType.kind === 'array') {\n const inner = formatTypeAnnotation(bodyType.item, modelsWithOutput, varName);\n return { annotation: `${inner.annotation}[]`, prelude: inner.prelude };\n }\n if (bodyType.kind === 'ref') {\n const name = modelsWithOutput?.has(bodyType.name) ? `${bodyType.name}Output` : bodyType.name;\n return { annotation: name };\n }\n if (bodyType.kind === 'scalar') return { annotation: serverTsScalar(bodyType.name) };\n // For complex types, extract schema into a variable so the result line stays readable\n const schema = renderType(bodyType);\n return {\n annotation: `z.infer<typeof ${varName}>`,\n prelude: `const ${varName} = ${schema};`,\n };\n}\n\n/**\n * Whether a response body can be soundly re-parsed through the schema `renderType` emits for it.\n *\n * False for anything transitively touching a model with a `format(...)` key transform — the service\n * returns the post-transform value while the schema expects the pre-transform one — and for an\n * intersection outside `renderIntersection`'s `.extend()` fast path, where `.and()` of two strict\n * objects rejects every value because each side sees the other's keys as unrecognized.\n */\nfunction isRevalidatable(type: ContractTypeNode, modelsWithOutput?: Set<string>, modelsWithTransform?: Set<string>): boolean {\n const rec = (t: ContractTypeNode): boolean => isRevalidatable(t, modelsWithOutput, modelsWithTransform);\n switch (type.kind) {\n case 'ref':\n return !modelsWithOutput?.has(type.name) && !modelsWithTransform?.has(type.name);\n case 'array':\n return rec(type.item);\n case 'tuple':\n return type.items.every(rec);\n case 'record':\n return rec(type.key) && rec(type.value);\n case 'intersection': {\n // Mirrors renderIntersection: a lone member renders as itself, `ref & (ref|object)*`\n // renders as an `.extend()` chain, and anything else falls back to `.and()`.\n const [first, ...rest] = type.members;\n if (!first) return true;\n if (rest.length === 0) return rec(first);\n const usesExtendChain = first.kind === 'ref' && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject');\n return usesExtendChain && type.members.every(rec);\n }\n case 'union':\n case 'discriminatedUnion':\n return type.members.every(rec);\n case 'inlineObject':\n return type.fields.every(f => rec(f.type));\n case 'lazy':\n return rec(type.inner);\n default:\n // scalar, enum, literal — identity or idempotent under re-parse\n return true;\n }\n}\n\n/**\n * The runtime schema a handler validates a response body against, or `undefined` when the body\n * cannot be soundly re-parsed and validation must be skipped.\n *\n * @param preludeVar The schema const {@link formatTypeAnnotation} already emitted for this body\n * (complex types only — `undefined` when it returned no prelude). Reusing it keeps a large object\n * literal from appearing twice in the same handler.\n */\nfunction responseBodySchema(bodyType: ContractTypeNode, options: OpCodegenOptions, preludeVar: string | undefined): string | undefined {\n if (!options.validateResponses) return undefined;\n if (!isRevalidatable(bodyType, options.modelsWithOutput, options.modelsWithTransform)) return undefined;\n return preludeVar ?? renderType(bodyType);\n}\n\n/**\n * The `ctx.body = ...` right-hand side for a response body: the raw result expression, or a\n * `parseAndValidate` of it. The `500` is deliberate — a service returning a shape its own contract\n * rejects is a server fault, not a client one, and `@maroonedsoftware/zod` routes the field-level\n * detail to `internalDetails` (log-only) rather than the response body at 5xx.\n */\nfunction responseBodyExpr(value: string, schema: string | undefined): string {\n return schema ? `await parseAndValidate(${value}, ${schema}, 500)` : value;\n}\n\nfunction generateParamValidation(\n source: ParamSource | undefined,\n ctxExpr: string,\n varName: string,\n mode: ObjectMode,\n suffix = '',\n modelsWithInput?: Set<string>,\n): string[] {\n if (!source) return [];\n const lines: string[] = [];\n const isQuery = ctxExpr === 'ctx.query';\n if (source.kind === 'ref') {\n // Type reference — apply mode as a method call on the schema\n const typeName = modelsWithInput?.has(source.name) ? `${source.name}Input` : source.name;\n lines.push(` const ${varName} = await parseAndValidate(${ctxExpr}, ${typeName}.${mode}());`);\n lines.push('');\n } else if (source.kind === 'params') {\n // Inline param declarations — wrap with the appropriate z.*Object constructor\n if (source.nodes.length > 0) {\n // Destructure only for params (spread individually in service call);\n // query/headers are passed as whole objects.\n const lhs = varName === 'params' ? `{ ${source.nodes.map(p => p.name).join(', ')} }` : varName;\n lines.push(` const ${lhs} = await parseAndValidate(`);\n lines.push(` ${ctxExpr},`);\n lines.push(` ${modeToWrapper(mode)}({`);\n for (const param of source.nodes) {\n const key = isValidIdentifier(param.name) ? param.name : `'${param.name}'`;\n if (isQuery && param.type.kind === 'array') {\n const inner = renderType(param.type);\n lines.push(` ${key}: z.preprocess((v) => typeof v === 'string' ? v.split(',') : v, ${inner}),`);\n } else {\n lines.push(` ${key}: ${renderType(param.type)},`);\n }\n }\n lines.push(` })${suffix},`);\n lines.push(` );`);\n lines.push('');\n }\n } else {\n // ContractTypeNode — use query-aware rendering for query params (coerces single string → array),\n // otherwise use Input variant rendering; apply mode as a method call\n const schema = isQuery ? renderQueryType(source.node, modelsWithInput) : renderInputType(source.node, modelsWithInput);\n lines.push(` const ${varName} = await parseAndValidate(${ctxExpr}, (${schema}).${mode}());`);\n lines.push('');\n }\n return lines;\n}\n\n// ─── Type import resolution ────────────────────────────────────────────────\n\n/**\n * Generate per-file type import statements.\n * When modelOutPaths is available, groups types by their actual output file\n * and computes correct relative paths. Falls back to the template-based\n * single-import approach for types not found in the map.\n */\nfunction generateTypeImports(types: string[], opFile: string, options: OpCodegenOptions): string[] {\n const lines: string[] = [];\n const { modelOutPaths, outPath } = options;\n\n if (modelOutPaths && outPath) {\n // Group types by their output file\n const byFile = new Map<string, string[]>();\n const unresolved: string[] = [];\n\n for (const type of types) {\n const typeOutPath = modelOutPaths.get(type);\n if (typeOutPath) {\n const group = byFile.get(typeOutPath) ?? [];\n group.push(type);\n byFile.set(typeOutPath, group);\n } else {\n unresolved.push(type);\n }\n }\n\n // Emit one import per source file with a relative path\n const fromDir = dirname(outPath);\n for (const [typeOutPath, names] of byFile) {\n let rel = relative(fromDir, typeOutPath);\n rel = rel.replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n lines.push(`import { ${names.sort().join(', ')} } from '${rel}';`);\n }\n\n // Fallback for types not in the map\n for (const type of unresolved) {\n const moduleName = pascalToDotCase(type);\n lines.push(`import { ${type} } from './${moduleName}.js';`);\n }\n } else {\n // No resolution context — fall back to template-based single import\n const typeImport = deriveTypeImportPath(opFile, options.typeImportPathTemplate);\n lines.push(`import { ${types.join(', ')} } from '${typeImport}';`);\n }\n\n return lines;\n}\n\n// ─── Collection helpers ────────────────────────────────────────────────────\n\nfunction collectTypes(root: OpRootNode, modelsWithInput?: Set<string>, modelsWithOutput?: Set<string>): string[] {\n const types = new Set<string>();\n for (const route of root.routes) {\n collectParamSourceRefs(route.params, types);\n collectParamSourceInputRefs(route.params, types, modelsWithInput);\n for (const op of route.operations) {\n if (op.request) {\n for (const body of op.request.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectInputTypeNodeRefs(body.bodyType, types, modelsWithInput);\n }\n }\n for (const resp of op.responses) {\n for (const body of resp.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectOutputTypeNodeRefs(body.bodyType, types, modelsWithOutput);\n }\n if (resp.headers) {\n for (const h of resp.headers) {\n collectTypeNodeRefs(h.type, types);\n collectOutputTypeNodeRefs(h.type, types, modelsWithOutput);\n }\n }\n }\n collectParamSourceRefs(op.query, types);\n collectParamSourceInputRefs(op.query, types, modelsWithInput);\n collectParamSourceRefs(op.headers, types);\n collectParamSourceInputRefs(op.headers, types, modelsWithInput);\n }\n }\n return [...types].sort();\n}\n\n/** Collect Output variant refs for response-side ContractTypeNode types. */\nfunction collectOutputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithOutput?: Set<string>): void {\n if (!modelsWithOutput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithOutput.has(type.name)) out.add(`${type.name}Output`);\n break;\n case 'array':\n collectOutputTypeNodeRefs(type.item, out, modelsWithOutput);\n break;\n case 'tuple':\n type.items.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'record':\n collectOutputTypeNodeRefs(type.key, out, modelsWithOutput);\n collectOutputTypeNodeRefs(type.value, out, modelsWithOutput);\n break;\n case 'union':\n type.members.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'intersection':\n type.members.forEach(t => collectOutputTypeNodeRefs(t, out, modelsWithOutput));\n break;\n case 'lazy':\n collectOutputTypeNodeRefs(type.inner, out, modelsWithOutput);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectOutputTypeNodeRefs(f.type, out, modelsWithOutput));\n break;\n }\n}\n\nfunction collectParamSourceRefs(source: ParamSource | undefined, out: Set<string>): void {\n if (!source) return;\n if (source.kind === 'ref') {\n if (/^[A-Z]/.test(source.name)) out.add(source.name);\n } else if (source.kind === 'params') {\n for (const param of source.nodes) {\n collectTypeNodeRefs(param.type, out);\n }\n } else {\n collectTypeNodeRefs(source.node, out);\n }\n}\n\n/** Collect Input variant refs for request-side ParamSource types. */\nfunction collectParamSourceInputRefs(source: ParamSource | undefined, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!source || !modelsWithInput) return;\n if (source.kind === 'ref') {\n if (modelsWithInput.has(source.name)) out.add(`${source.name}Input`);\n } else if (source.kind === 'type') {\n collectInputTypeNodeRefs(source.node, out, modelsWithInput);\n }\n}\n\n/** Collect Input variant refs for request-side ContractTypeNode types. */\nfunction collectInputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!modelsWithInput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`);\n break;\n case 'array':\n collectInputTypeNodeRefs(type.item, out, modelsWithInput);\n break;\n case 'tuple':\n type.items.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'record':\n collectInputTypeNodeRefs(type.key, out, modelsWithInput);\n collectInputTypeNodeRefs(type.value, out, modelsWithInput);\n break;\n case 'union':\n type.members.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'intersection':\n type.members.forEach(t => collectInputTypeNodeRefs(t, out, modelsWithInput));\n break;\n case 'lazy':\n collectInputTypeNodeRefs(type.inner, out, modelsWithInput);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectInputTypeNodeRefs(f.type, out, modelsWithInput));\n break;\n }\n}\n\nfunction collectTypeNodeRefs(type: ContractTypeNode, out: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n if (/^[A-Z]/.test(type.name)) out.add(type.name);\n break;\n case 'array':\n collectTypeNodeRefs(type.item, out);\n break;\n case 'tuple':\n type.items.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'record':\n collectTypeNodeRefs(type.key, out);\n collectTypeNodeRefs(type.value, out);\n break;\n case 'union':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'intersection':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'lazy':\n collectTypeNodeRefs(type.inner, out);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectTypeNodeRefs(f.type, out));\n break;\n }\n}\n\nfunction collectServices(root: OpRootNode): string[] {\n const services = new Set<string>();\n const inferredService = `${deriveBaseName(root.file)}Service`;\n\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (op.service) {\n services.add(op.service.split('.')[0] ?? op.service);\n } else {\n services.add(inferredService);\n }\n }\n }\n return [...services].sort();\n}\n\n\n\n\n\n\nfunction isValidIdentifier(name: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);\n}\n\n// ─── Naming conventions ────────────────────────────────────────────────────\n\n/**\n * Derive the PascalCase base name used for router, service, and type names from a contract file path.\n *\n * Strips directories and the `.op`/`.ck` extension, then PascalCases each dot-separated segment\n * (`contracts/ledger.categories.ck` → `LedgerCategories`). Falls back to `Resource` for an empty path.\n */\nexport function deriveBaseName(file: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'Resource';\n // ledger.categories -> LedgerCategories\n return base\n .split('.')\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('');\n}\n\nfunction deriveRouterName(file: string): string {\n return `${deriveBaseName(file)}Router`;\n}\n\n/**\n * Resolve the import specifier for a service class.\n *\n * Drops the trailing `Service` suffix and kebab-cases the remainder, then applies `template` if given\n * (`{name}` → `Ledger`, `{kebab}` → `ledger`). Without a template, defaults to\n * `#modules/<kebab>/<kebab>.service.js`.\n *\n * @param template Optional `servicePathTemplate` from the plugin config.\n */\nexport function deriveModulePath(serviceName: string, template?: string): string {\n // LedgerService -> #modules/ledger/ledger.service.js\n const base = serviceName.replace(/Service$/, '');\n const kebab = base.replace(/([A-Z])/g, m => `-${m.toLowerCase()}`).replace(/^-/, '');\n if (template) {\n return template.replace(/\\{name\\}/g, base).replace(/\\{kebab\\}/g, kebab);\n }\n return `#modules/${kebab}/${kebab}.service.js`;\n}\n\nfunction deriveTypeImportPath(file: string, template?: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'resource';\n const module = base.split('.')[0] ?? base;\n if (template) {\n return template.replace(/\\{module\\}/g, module).replace(/\\{base\\}/g, base);\n }\n return `#modules/${module}/types/index.js`;\n}\n","import type {\n OpRootNode,\n OpRouteNode,\n OpOperationNode,\n OpRequestBodyNode,\n OpResponseNode,\n OpResponseBodyNode,\n OpResponseHeaderNode,\n ContractTypeNode,\n ModelNode,\n ParamSource,\n} from '@contractkit/core';\nimport { resolveModifiers, isJsonMime, classifyContentType, observableResponses, thrownResponses } from '@contractkit/core';\nimport { renderInputTsType, renderOutputTsType, quoteKey, headerNameToProperty, escapeJsDocLines, JSON_VALUE_TYPE_DECL } from './ts-render.js';\nimport { pascalToDotCase, typeNeedsScalar } from './codegen-contract.js';\nimport { bodyTypesStructurallyEqual } from './codegen-operation.js';\nimport { reviveFnName, renderInlineReviver, typeReachesDecimal, DECIMAL_COERCE_DECL } from './codegen-revive.js';\nimport { DECIMAL_IMPORT, DECIMAL_CONFIG_LINE } from './decimal-runtime.js';\nimport { basename, dirname, relative } from 'path';\n\n// ─── Body strategy ────────────────────────────────────────────────────────\n\ntype BodyStrategy =\n | { kind: 'none' }\n | { kind: 'single'; body: OpRequestBodyNode }\n | { kind: 'multi-equal'; bodies: OpRequestBodyNode[] }\n | { kind: 'multi-formdata-detect'; bodies: OpRequestBodyNode[] }\n | { kind: 'multi-required-arg'; bodies: OpRequestBodyNode[] };\n\n/** Serialize expression for a single MIME, given the source body var (e.g. 'body'). */\nfunction jsonOrFormSerialize(varName: string, contentType: string): string {\n if (contentType === 'application/x-www-form-urlencoded') {\n return `new URLSearchParams(${varName} as unknown as Record<string, string>).toString()`;\n }\n if (contentType === 'multipart/form-data') {\n return `(${varName} as FormData)`;\n }\n // application/json + any `+json` structured suffix — JSON.stringify with bigint support.\n return `JSON.stringify(${varName}, bigIntReplacer)`;\n}\n\n/**\n * Build a runtime expression that picks the right serialization based on a contentType variable.\n * Used by the SDK when the caller passes (or defaults to) a content-type at call time.\n */\nfunction renderSerializeExpr(varName: string, bodies: OpRequestBodyNode[], ctVar: string): string {\n // Build a chained ternary, last MIME is the fallback\n const arms = bodies.slice(0, -1);\n const last = bodies[bodies.length - 1]!;\n let expr = jsonOrFormSerialize(varName, last.contentType);\n for (let i = arms.length - 1; i >= 0; i--) {\n const arm = arms[i]!;\n expr = `${ctVar} === '${arm.contentType}' ? ${jsonOrFormSerialize(varName, arm.contentType)} : ${expr}`;\n }\n return expr;\n}\n\nfunction classifyBodyStrategy(op: OpOperationNode): BodyStrategy {\n const bodies = op.request?.bodies ?? [];\n if (bodies.length === 0) return { kind: 'none' };\n if (bodies.length === 1) return { kind: 'single', body: bodies[0]! };\n if (bodies.every(b => bodyTypesStructurallyEqual(b.bodyType, bodies[0]!.bodyType))) {\n return { kind: 'multi-equal', bodies };\n }\n if (bodies.some(b => b.contentType === 'multipart/form-data')) {\n return { kind: 'multi-formdata-detect', bodies };\n }\n return { kind: 'multi-required-arg', bodies };\n}\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/** Options shared by every SDK code-generation entry point. */\nexport interface SdkCodegenOptions {\n /** Template for type import paths when `modelOutPaths` is not provided. Supports `{module}` and `{base}`. */\n typeImportPathTemplate?: string;\n /** Absolute path of the file currently being generated. Used to compute relative imports. */\n outPath?: string;\n /** Map from model name → absolute output file path (for cross-module type imports) */\n modelOutPaths?: Map<string, string>;\n /** Absolute path to the shared sdk-options.ts file (if set, imports SdkOptions instead of defining inline) */\n sdkOptionsPath?: string;\n /** Set of model names that have Input variants (models with visibility modifiers) */\n modelsWithInput?: Set<string>;\n /** Set of model names that have Output variants (models with format(output=...)) */\n modelsWithOutput?: Set<string>;\n /** Model names carrying a `decimal`, whose response bodies need rehydrating client-side. */\n modelsWithDecimal?: Set<string>;\n /** Every model in scope, for resolving discriminated-union members inside an inline reviver. */\n modelMap?: Map<string, ModelNode>;\n /**\n * Whether to emit SDK methods for operations marked `internal`. Defaults to `false` —\n * internal ops are omitted from the SDK so consumers don't pick them up. Set to `true`\n * to include them (e.g. for an internal-use SDK).\n */\n includeInternal?: boolean;\n /**\n * Override the generated client class name. When omitted, falls back to\n * `deriveClientClassName(root.file)` (the legacy per-file name). The aggregator\n * uses this to emit `<Area><Subarea>Client` for area+subarea leaf files.\n */\n clientClassName?: string;\n}\n\n/**\n * Returns true if the root contains at least one operation eligible for SDK emission.\n * With `includeInternal: false` (default) that means at least one non-internal op; with\n * `includeInternal: true` any op qualifies.\n */\nexport function hasPublicOperations(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (includeInternal || !resolveModifiers(route, op).includes('internal')) return true;\n }\n }\n return false;\n}\n\n/**\n * Generate a complete `*.client.ts` file for one operation root: imports, the client class\n * declaration, and one method per public operation. Used for top-level (no-area) files and\n * for subarea-leaf files. Area-level files are NOT routed through this — their methods get\n * inlined into the SDK aggregator via {@link generateClientMethods} + {@link generateSdkAggregator}.\n */\nexport function generateSdk(root: OpRootNode, options: SdkCodegenOptions = {}): string {\n const lines: string[] = [];\n const includeInternal = options.includeInternal ?? false;\n\n const types = collectTypes(root, options.modelsWithInput, options.modelsWithOutput, includeInternal);\n const clientClassName = options.clientClassName ?? deriveClientClassName(root.file);\n\n // The method bodies are generated first so the imports can be read off them, the same way\n // codegen-operation decides its imports from the code it just emitted. A reviver import that\n // came from a predicate instead could drift and leave an unused local behind.\n const inlineRevivers = new Map<string, string[]>();\n const classBody: string[] = [];\n for (const route of root.routes) {\n for (const op of route.operations) {\n const mods = resolveModifiers(route, op);\n if (!includeInternal && mods.includes('internal')) continue;\n classBody.push('');\n if (mods.includes('deprecated')) classBody.push(' /** @deprecated */');\n classBody.push(...generateMethod(route, op, root.file, options, inlineRevivers));\n }\n }\n\n const inlineReviverDecls = [...inlineRevivers.values()].flat();\n const decimalPrelude = decimalPreludeFor(inlineReviverDecls);\n\n // Type-only imports, plus the model revivers the methods actually call.\n if (types.length > 0) {\n lines.push(...generateTypeImports(types, root.file, options, usedRevivers(classBody)));\n }\n lines.push(...decimalPrelude.imports);\n\n // SdkOptions import (from shared file) or inline fallback\n if (options.sdkOptionsPath && options.outPath) {\n let rel = relative(dirname(options.outPath), options.sdkOptionsPath);\n rel = rel.replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n const jsonImport = sdkNeedsJson(root, includeInternal) ? ', JsonValue' : '';\n lines.push(`import type { SdkFetch${jsonImport} } from '${rel}';`);\n const valueImports: string[] = [];\n if (sdkNeedsBigIntReplacer(root, includeInternal)) valueImports.push('bigIntReplacer');\n if (sdkNeedsBigIntReviver(root, includeInternal)) valueImports.push('parseJson');\n if (sdkNeedsQueryString(root, includeInternal)) valueImports.push('buildQueryString');\n if (sdkNeedsReadContentType(root, includeInternal)) valueImports.push('readContentType');\n if (valueImports.length > 0) {\n lines.push(`import { ${valueImports.join(', ')} } from '${rel}';`);\n }\n } else {\n lines.push('');\n lines.push('export class SdkError<TBody = unknown> extends Error {');\n lines.push(' constructor(');\n lines.push(' public readonly status: number,');\n lines.push(' public readonly statusText: string,');\n lines.push(' public readonly body: TBody,');\n lines.push(' public readonly headers: Headers,');\n lines.push(' ) {');\n lines.push(' super(`${status} ${statusText}`);');\n lines.push(\" this.name = 'SdkError';\");\n lines.push(' }');\n lines.push('}');\n lines.push('');\n lines.push('export interface SdkRequestInit extends RequestInit {');\n lines.push(' /**');\n lines.push(' * Statuses this operation declares as values rather than errors — a 304 from');\n lines.push(' * conditional-GET middleware, or an error status the service returns deliberately.');\n lines.push(' * Anything else at or above 400 still throws SdkError.');\n lines.push(' */');\n lines.push(' expectStatuses?: number[];');\n lines.push('}');\n lines.push('');\n lines.push('export type SdkFetch = (url: string, init: SdkRequestInit) => Promise<Response>;');\n lines.push('');\n lines.push('export interface SdkOptions {');\n lines.push(' baseUrl: string;');\n lines.push(' headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);');\n lines.push(' fetch?: SdkFetch;');\n lines.push(' /** Called once per request to produce a unique X-Request-ID header value */');\n lines.push(' requestIdFactory?: () => string;');\n lines.push('}');\n lines.push('');\n lines.push('export function readContentType(res: Response): string {');\n lines.push(\" return res.headers.get('content-type')?.split(';')[0]?.trim() ?? '';\");\n lines.push('}');\n lines.push('');\n lines.push('export function createSdkFetch(options: SdkOptions): SdkFetch {');\n lines.push(' const getRequestId = options.requestIdFactory ?? (() => crypto.randomUUID());');\n lines.push(' return async (url: string, init: SdkRequestInit): Promise<Response> => {');\n lines.push(\" const baseHeaders = typeof options.headers === 'function'\");\n lines.push(' ? await options.headers()');\n lines.push(' : options.headers ?? {};');\n lines.push(' const res = await fetch(`${options.baseUrl}${url}`, {');\n lines.push(' ...init,');\n lines.push(\" headers: { ...baseHeaders, 'X-Request-ID': getRequestId(), ...init.headers as Record<string, string> },\");\n lines.push(' });');\n lines.push(' if (!res.ok && !(init.expectStatuses ?? []).includes(res.status)) {');\n lines.push(' const text = await res.text();');\n lines.push(' let body: unknown;');\n lines.push(' try { body = JSON.parse(text); } catch { body = text; }');\n lines.push(' throw new SdkError(res.status, res.statusText, body, res.headers);');\n lines.push(' }');\n lines.push(' return res;');\n lines.push(' };');\n lines.push('}');\n lines.push('');\n lines.push('export function buildQueryString(query: object | undefined): string {');\n lines.push(' const searchParams = new URLSearchParams();');\n lines.push(' if (query) {');\n lines.push(' for (const [k, v] of Object.entries(query)) {');\n lines.push(' if (v === undefined || v === null) continue;');\n lines.push(' if (Array.isArray(v)) { for (const item of v) searchParams.append(k, String(item)); }');\n lines.push(' else searchParams.set(k, String(v));');\n lines.push(' }');\n lines.push(' }');\n lines.push(' const qs = searchParams.toString();');\n lines.push(\" return qs ? `?${qs}` : '';\");\n lines.push('}');\n lines.push('');\n lines.push('export async function parseJson<T>(res: Response): Promise<T> {');\n lines.push(' return JSON.parse(await res.text(), bigIntReviver) as T;');\n lines.push('}');\n }\n\n if (sdkNeedsJson(root, includeInternal) && !(options.sdkOptionsPath && options.outPath)) {\n lines.push(JSON_VALUE_TYPE_DECL);\n }\n\n lines.push('');\n\n const errorAliases = generateErrorBodyAliases(root, options);\n if (errorAliases.length > 0) {\n lines.push(...errorAliases);\n lines.push('');\n }\n\n if (decimalPrelude.decls.length > 0) {\n lines.push('');\n lines.push(...decimalPrelude.decls);\n }\n\n // Wrappers for bodies with no `reviveX` of their own — an inline object, a record, a tuple.\n for (const decl of inlineRevivers.values()) {\n lines.push('');\n lines.push(...decl);\n }\n\n // Client class\n lines.push('/**');\n const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file;\n lines.push(` * generated from [${basename(root.file)}](file://./${relFile})`);\n lines.push(' */');\n lines.push(`export class ${clientClassName} {`);\n lines.push(' constructor(private fetch: SdkFetch) {}');\n lines.push(...classBody);\n\n lines.push('}');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Render the method-block lines for an operation file as if they were declared inside a\n * client class.\n *\n * Skips operations marked `internal` unless `options.includeInternal` is set.\n *\n * @returns `lines`, one consolidated array pre-indented for class-body level with leading blank\n * lines between methods; `methodNames`, used by the caller to detect cross-file collisions when\n * several files contribute to the same area-level client; `preludeLines`, module-level\n * declarations the methods reference (decimal revivers and their `__dec` helper) which the caller\n * must splice in above the class; and `needsDecimalImport`, true when those declarations require\n * `import { Decimal } from 'decimal.js'` in the emitting file.\n */\nexport function generateClientMethods(\n root: OpRootNode,\n options: SdkCodegenOptions,\n): { lines: string[]; methodNames: string[]; preludeLines: string[]; needsDecimalImport: boolean } {\n const lines: string[] = [];\n const methodNames: string[] = [];\n const includeInternal = options.includeInternal ?? false;\n const inlineRevivers = new Map<string, string[]>();\n for (const route of root.routes) {\n for (const op of route.operations) {\n const mods = resolveModifiers(route, op);\n if (!includeInternal && mods.includes('internal')) continue;\n lines.push('');\n if (mods.includes('deprecated')) lines.push(' /** @deprecated */');\n lines.push(...generateMethod(route, op, root.file, options, inlineRevivers));\n methodNames.push(deriveMethodName(op, route));\n }\n }\n // Module-level declarations the methods reference, spliced above the class by the caller —\n // the same shape `generateErrorBodyAliases` already uses.\n const declLines = [...inlineRevivers.values()].flat();\n const { decls } = decimalPreludeFor(declLines);\n const preludeLines = [...(decls.length > 0 ? ['', ...decls] : []), ...[...inlineRevivers.values()].flatMap(decl => ['', ...decl])];\n return { lines, methodNames, preludeLines, needsDecimalImport: decls.length > 0 };\n}\n\n/**\n * Declarations a client file needs for the inline revivers it carries.\n *\n * An inline wrapper calls `__dec`, which is file-local to the *types* module and not exported, so\n * a client file that has one needs its own copy — along with the decimal.js import and the global\n * config, since nothing else in the file necessarily pulls them in.\n */\nfunction decimalPreludeFor(declLines: string[]): { imports: string[]; decls: string[] } {\n if (!declLines.some(l => l.includes('__dec('))) return { imports: [], decls: [] };\n return { imports: [DECIMAL_IMPORT], decls: [DECIMAL_CONFIG_LINE, '', ...DECIMAL_COERCE_DECL] };\n}\n\n/** Model reviver names referenced by generated method bodies. `__revive…` wrappers are local. */\nfunction usedRevivers(lines: string[]): string[] {\n const found = new Set<string>();\n for (const m of lines.join('\\n').matchAll(/\\brevive[A-Z]\\w*/g)) found.add(m[0]);\n return [...found].sort();\n}\n\n// ─── Method generation ────────────────────────────────────────────────────\n\nfunction generateMethod(\n route: OpRouteNode,\n op: OpOperationNode,\n file: string,\n options: SdkCodegenOptions,\n inlineRevivers?: Map<string, string[]>,\n): string[] {\n const revive: ReviveContext | undefined =\n options.modelsWithDecimal && options.modelsWithDecimal.size > 0 && inlineRevivers\n ? {\n modelsWithDecimal: options.modelsWithDecimal,\n modelsWithOutput: options.modelsWithOutput,\n modelMap: options.modelMap,\n inlineRevivers,\n nameHint: '',\n }\n : undefined;\n const lines: string[] = [];\n const methodName = deriveMethodName(op, route);\n const mRevive = hint(revive, `${methodName.charAt(0).toUpperCase()}${methodName.slice(1)}`);\n const httpMethod = op.method.toUpperCase();\n const { modelsWithInput, modelsWithOutput } = options;\n\n // Build method parameters (request-side — use Input variants)\n const params = buildMethodParams(route, op, modelsWithInput);\n const paramStr = params.map(p => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join(', ');\n\n // Determine return type — response side uses Output variants (post-transform wire shape).\n // For non-JSON responses the schema is ignored: text/* is read as string, binary as Blob.\n //\n // `observableResponses` is the client-side mirror of the router's `emittedResponses`: it also\n // covers statuses the service never writes but a client can still receive, such as a 304 from\n // conditional-GET middleware. Anything left over reaches the caller as a thrown SdkError.\n const observable = observableResponses(op);\n const thrown = thrownResponses(op);\n const isMultiStatus = observable.length > 1;\n const primaryResponse = observable[0];\n const primaryBodies = primaryResponse ? primaryResponse.bodies : [];\n const isVoid = primaryBodies.length === 0;\n const respHeaders = primaryResponse?.headers ?? [];\n const hasRespHeaders = respHeaders.length > 0;\n const headersShape = hasRespHeaders ? renderSdkHeadersShape(respHeaders, modelsWithOutput) : '';\n\n // A union of more than one member is broken across lines — a four-status operation runs to\n // several hundred characters on one line otherwise.\n let returnMembers: string[] | undefined;\n let returnType = '';\n if (isMultiStatus) {\n returnMembers = observable.flatMap(r => sdkResponseMembers(r, modelsWithOutput, true));\n } else if (primaryBodies.length > 1) {\n returnMembers = sdkResponseMembers(primaryResponse!, modelsWithOutput, false);\n } else {\n const dataType = isVoid ? 'void' : sdkDataType(primaryBodies[0]!, modelsWithOutput);\n returnType = hasRespHeaders ? (isVoid ? `{ headers: ${headersShape} }` : `{ data: ${dataType}; headers: ${headersShape} }`) : dataType;\n }\n if (returnMembers?.length === 1) {\n returnType = returnMembers[0]!;\n returnMembers = undefined;\n }\n\n // Statuses the shared fetch would otherwise reject. All-2xx operations pass nothing, so the\n // overwhelmingly common case keeps its existing call shape.\n const expectStatuses = observable.filter(r => r.statusCode < 200 || r.statusCode >= 300).map(r => r.statusCode);\n\n // JSDoc\n const desc = op.description ?? route.description;\n const errorBodyName = thrown.some(r => r.bodies.length > 0) ? errorBodyTypeName(route, op) : undefined;\n if (op.name || desc || errorBodyName) {\n const tags: string[] = [];\n if (op.name) tags.push(`@name ${op.name}`);\n if (desc) tags.push(`@description ${desc}`);\n if (errorBodyName) tags.push(`@throws {SdkError<${errorBodyName}>} on ${thrown.map(r => r.statusCode).join(', ')}`);\n const contentLines = tags.flatMap(t => escapeJsDocLines(t));\n if (contentLines.length === 1) {\n lines.push(` /** ${contentLines[0]} */`);\n } else {\n lines.push(` /**`);\n for (const l of contentLines) lines.push(` * ${l}`);\n lines.push(` */`);\n }\n }\n\n if (returnMembers) {\n lines.push(` async ${methodName}(${paramStr}): Promise<`);\n for (const member of returnMembers) lines.push(` | ${member}`);\n lines.push(` > {`);\n } else {\n lines.push(` async ${methodName}(${paramStr}): Promise<${returnType}> {`);\n }\n\n // Build URL with path params\n const urlExpr = buildUrlExpression(route.path, route.params);\n\n // Query string\n const hasQuery = !!op.query;\n let fetchUrl = urlExpr;\n if (hasQuery) {\n lines.push(` const qs = buildQueryString(query);`);\n fetchUrl = urlExpr;\n }\n\n // Build fetch options\n const strategy = classifyBodyStrategy(op);\n const hasBody = strategy.kind !== 'none';\n const hasOpHeaders = !!op.headers;\n\n // Pre-emit serialization preludes for multi-MIME strategies\n if (strategy.kind === 'multi-equal') {\n const defaultCt = strategy.bodies[0]!.contentType;\n lines.push(` const __contentType = options?.contentType ?? '${defaultCt}';`);\n lines.push(` const __serialized = ${renderSerializeExpr('body', strategy.bodies, '__contentType')};`);\n } else if (strategy.kind === 'multi-formdata-detect') {\n lines.push(` const __isFormData = body instanceof FormData;`);\n const nonMultipart = strategy.bodies.find(b => b.contentType !== 'multipart/form-data')!;\n lines.push(` const __contentType: string = __isFormData ? 'multipart/form-data' : '${nonMultipart.contentType}';`);\n lines.push(\n ` const __serialized: BodyInit = __isFormData ? (body as FormData) : ${jsonOrFormSerialize('body', nonMultipart.contentType)};`,\n );\n } else if (strategy.kind === 'multi-required-arg') {\n lines.push(` const __contentType = options.contentType;`);\n lines.push(` const __serialized = ${renderSerializeExpr('body', strategy.bodies, '__contentType')};`);\n }\n\n const fetchArgs: string[] = [];\n\n if (hasQuery) {\n fetchArgs.push(`url: \\`${fetchUrl}\\${qs}\\``);\n } else {\n fetchArgs.push(`url: \\`${fetchUrl}\\``);\n }\n\n fetchArgs.push(`method: '${httpMethod}'`);\n\n if (strategy.kind === 'single') {\n const body = strategy.body;\n const cat = classifyContentType(body.contentType);\n if (cat === 'multipart') {\n // FormData supplies its own Content-Type with boundary; don't override it.\n fetchArgs.push('body: body');\n } else if (cat === 'urlencoded') {\n fetchArgs.push(`headers: { 'Content-Type': '${body.contentType}' }`);\n fetchArgs.push('body: new URLSearchParams(body as unknown as Record<string, string>).toString()');\n } else if (cat === 'text' || cat === 'binary') {\n // text/* and binary mimes pass the body through to fetch as-is — no schema serialization.\n fetchArgs.push(`headers: { 'Content-Type': '${body.contentType}' }`);\n fetchArgs.push('body: body');\n } else {\n fetchArgs.push(`headers: { 'Content-Type': '${body.contentType}' }`);\n fetchArgs.push('body: JSON.stringify(body, bigIntReplacer)');\n }\n } else if (hasBody) {\n // multi-equal | multi-formdata-detect | multi-required-arg — share a __contentType / __serialized prelude\n fetchArgs.push(`headers: { 'Content-Type': __contentType }`);\n fetchArgs.push('body: __serialized');\n }\n\n if (hasOpHeaders) {\n const lastHeaderIdx = fetchArgs.findIndex(a => a.startsWith('headers:'));\n if (lastHeaderIdx !== -1) {\n const existing = fetchArgs[lastHeaderIdx]!;\n const inner = existing.slice('headers: '.length).replace(/^\\{\\s*|\\s*\\}$/g, '');\n fetchArgs[lastHeaderIdx] = `headers: { ${inner}, ...customHeaders }`;\n } else {\n fetchArgs.push('headers: customHeaders');\n }\n }\n\n if (expectStatuses.length > 0) fetchArgs.push(`expectStatuses: [${expectStatuses.join(', ')}]`);\n\n const needsResult = isMultiStatus || !isVoid || hasRespHeaders;\n const resultPrefix = needsResult ? 'const result = ' : '';\n if (fetchArgs.length === 2 && !hasBody && !hasOpHeaders && !hasQuery) {\n // Simple case — inline\n lines.push(` ${resultPrefix}await this.fetch(\\`${fetchUrl}\\`, { method: '${httpMethod}' });`);\n } else {\n lines.push(` ${resultPrefix}await this.fetch(${fetchArgs[0]!.split(': ').slice(1).join(': ')}, {`);\n for (let i = 1; i < fetchArgs.length; i++) {\n lines.push(` ${fetchArgs[i]},`);\n }\n lines.push(` });`);\n }\n\n if (isMultiStatus) {\n // The status is only known at runtime, so the caller gets a union to narrow. The lowest\n // status is the default branch, which keeps the function exhaustively returning.\n const [fallback, ...rest] = observable;\n lines.push(` switch (result.status) {`);\n for (const resp of rest) {\n lines.push(` case ${resp.statusCode}:`);\n lines.push(...sdkReturnLines(resp, modelsWithOutput, ' ', true, mRevive));\n }\n lines.push(` default:`);\n lines.push(...sdkReturnLines(fallback!, modelsWithOutput, ' ', true, mRevive));\n lines.push(` }`);\n } else if (primaryBodies.length > 1) {\n lines.push(...sdkReturnLines(primaryResponse!, modelsWithOutput, ' ', false, mRevive));\n } else if (hasRespHeaders) {\n const headerEntries = sdkHeaderEntries(respHeaders);\n if (isVoid) {\n lines.push(` return { headers: { ${headerEntries} } };`);\n } else {\n lines.push(` const data = ${sdkReadExpr(primaryBodies[0]!, modelsWithOutput, hint(mRevive, primaryResponse!.statusCode))};`);\n lines.push(` return { data, headers: { ${headerEntries} } };`);\n }\n } else if (!isVoid) {\n lines.push(` return ${sdkReadExpr(primaryBodies[0]!, modelsWithOutput, hint(mRevive, primaryResponse!.statusCode))};`);\n }\n\n lines.push(' }');\n\n return lines;\n}\n\n// ─── Response shapes ──────────────────────────────────────────────────────\n\n/** The TypeScript type a client sees for one response body. */\nfunction sdkDataType(body: OpResponseBodyNode, modelsWithOutput?: Set<string>): string {\n const category = classifyContentType(body.contentType);\n if (category === 'text') return 'string';\n if (category === 'binary') return 'Blob';\n return renderOutputTsType(body.bodyType, modelsWithOutput);\n}\n\n/**\n * How a client reads one response body off the `Response`.\n *\n * A decimal-bearing body is wrapped in its reviver: `parseJson` is a bare cast, so without this the\n * type would say `Decimal` while the runtime held a string. Bodies with no decimal are emitted\n * byte-identically to before.\n */\nfunction sdkReadExpr(body: OpResponseBodyNode, modelsWithOutput?: Set<string>, revive?: ReviveContext): string {\n const category = classifyContentType(body.contentType);\n if (category === 'text') return 'await result.text()';\n if (category === 'binary') return 'await result.blob()';\n const tsType = renderOutputTsType(body.bodyType, modelsWithOutput);\n const read = `await parseJson<${tsType}>(result)`;\n const reviver = reviveExprFor(body.bodyType, revive);\n if (!reviver) return read;\n // `.map` over an array of refs rather than a wrapper function: the reviver returns the same\n // object it mutated, so the mapped array holds the same elements.\n return reviver.kind === 'array' ? `(${read}).map(${reviver.name})` : `${reviver.name}(${read})`;\n}\n\n/**\n * Extend the inline-reviver name with one more path segment.\n *\n * Built up compositionally — method, then status, then mime index — because each of those lives in\n * a different function, and the resulting name has to be distinct per body: two operations with\n * different inline decimal bodies must not share one wrapper.\n */\nfunction hint(revive: ReviveContext | undefined, segment: string | number): ReviveContext | undefined {\n if (!revive) return undefined;\n return { ...revive, nameHint: `${revive.nameHint}${segment}` };\n}\n\n/** What `sdkReadExpr` needs to decide whether a body has to be revived, and with which function. */\ninterface ReviveContext {\n modelsWithDecimal: Set<string>;\n modelsWithOutput?: Set<string>;\n /** Inline reviver declarations accumulated for the current file, keyed by function name. */\n inlineRevivers: Map<string, string[]>;\n modelMap?: Map<string, ModelNode>;\n /** Distinguishes the inline wrapper emitted for each body. */\n nameHint: string;\n}\n\n/** The reviver to apply to a response body, or `null` when the body holds no decimal. */\nfunction reviveExprFor(bodyType: ContractTypeNode, ctx: ReviveContext | undefined): { name: string; kind: 'value' | 'array' } | null {\n if (!ctx || ctx.modelsWithDecimal.size === 0) return null;\n const opts = { modelsWithDecimal: ctx.modelsWithDecimal, modelsWithOutput: ctx.modelsWithOutput, modelMap: ctx.modelMap };\n if (!typeReachesDecimal(bodyType, opts)) return null;\n\n const refName = (t: ContractTypeNode): string | null => (t.kind === 'ref' ? t.name : t.kind === 'lazy' ? refName(t.inner) : null);\n const pick = (name: string) => reviveFnName(name, ctx.modelsWithOutput?.has(name) ? 'output' : 'base');\n\n const direct = refName(bodyType);\n if (direct && ctx.modelsWithDecimal.has(direct)) return { name: pick(direct), kind: 'value' };\n\n if (bodyType.kind === 'array') {\n const item = refName(bodyType.item);\n if (item && ctx.modelsWithDecimal.has(item)) return { name: pick(item), kind: 'array' };\n }\n\n // Anything else — an inline object, a record, a tuple — has no `reviveX` to call, so the file\n // gets a wrapper of its own.\n const fnName = `__revive${ctx.nameHint}`;\n if (!ctx.inlineRevivers.has(fnName)) {\n const decl = renderInlineReviver(fnName, renderOutputTsType(bodyType, ctx.modelsWithOutput), bodyType, opts);\n if (!decl) return null;\n ctx.inlineRevivers.set(fnName, decl);\n }\n return { name: fnName, kind: 'value' };\n}\n\nfunction renderSdkHeadersShape(headers: OpResponseHeaderNode[], modelsWithOutput?: Set<string>): string {\n const fields = headers.map(\n h => `${quoteKey(headerNameToProperty(h.name))}${h.optional ? '?' : ''}: ${renderOutputTsType(h.type, modelsWithOutput)}`,\n );\n return `{ ${fields.join('; ')} }`;\n}\n\nfunction sdkHeaderEntries(headers: OpResponseHeaderNode[]): string {\n return headers.map(h => `${quoteKey(headerNameToProperty(h.name))}: result.headers.get('${h.name}') ?? undefined`).join(', ');\n}\n\n/**\n * Render one response as the members of the client's return union — the mirror of the router's\n * service-result members, with `data` in place of `body`.\n *\n * Collapses to a single member with a union of mime literals when every declared mime yields the\n * same data type; otherwise one member per mime, so `contentType` and `data` stay correlated.\n */\nfunction sdkResponseMembers(resp: OpResponseNode, modelsWithOutput: Set<string> | undefined, includeStatus: boolean): string[] {\n const bodies = resp.bodies;\n const headers = resp.headers ?? [];\n const leading = includeStatus ? [`status: ${resp.statusCode}`] : [];\n const trailing = headers.length > 0 ? [`headers: ${renderSdkHeadersShape(headers, modelsWithOutput)}`] : [];\n\n if (bodies.length === 0) {\n return [`{ ${[...leading, ...trailing].join('; ')} }`];\n }\n\n const dataTypes = bodies.map(b => sdkDataType(b, modelsWithOutput));\n if (dataTypes.every(t => t === dataTypes[0])) {\n const contentType = bodies.map(b => `'${b.contentType}'`).join(' | ');\n return [`{ ${[...leading, `contentType: ${contentType}`, `data: ${dataTypes[0]}`, ...trailing].join('; ')} }`];\n }\n return bodies.map((b, i) => `{ ${[...leading, `contentType: '${b.contentType}'`, `data: ${dataTypes[i]}`, ...trailing].join('; ')} }`);\n}\n\n/** The `return` statement(s) that build one response's member of the return union. */\nfunction sdkReturnLines(\n resp: OpResponseNode,\n modelsWithOutput: Set<string> | undefined,\n indent: string,\n includeStatus: boolean,\n revive?: ReviveContext,\n): string[] {\n const bodies = resp.bodies;\n const headers = resp.headers ?? [];\n const leading = includeStatus ? [`status: ${resp.statusCode}`] : [];\n const trailing = headers.length > 0 ? [`headers: { ${sdkHeaderEntries(headers)} }`] : [];\n\n if (bodies.length === 0) {\n return [`${indent}return { ${[...leading, ...trailing].join(', ')} };`];\n }\n if (bodies.length === 1) {\n const fields = [\n ...leading,\n `contentType: '${bodies[0]!.contentType}'`,\n `data: ${sdkReadExpr(bodies[0]!, modelsWithOutput, hint(revive, resp.statusCode))}`,\n ...trailing,\n ];\n return [`${indent}return { ${fields.join(', ')} };`];\n }\n\n const dataTypes = bodies.map(b => sdkDataType(b, modelsWithOutput));\n if (dataTypes.every(t => t === dataTypes[0])) {\n // Every mime reads the same way, so only the label has to come off the wire.\n const cast = bodies.map(b => `'${b.contentType}'`).join(' | ');\n const fields = [\n ...leading,\n `contentType: readContentType(result) as ${cast}`,\n `data: ${sdkReadExpr(bodies[0]!, modelsWithOutput, hint(revive, resp.statusCode))}`,\n ...trailing,\n ];\n return [`${indent}return { ${fields.join(', ')} };`];\n }\n\n // The mimes read differently, so the client has to dispatch on what actually came back.\n const lines = [`${indent}switch (readContentType(result)) {`];\n for (const [i, body] of bodies.slice(1).entries()) {\n const fields = [\n ...leading,\n `contentType: '${body.contentType}'`,\n `data: ${sdkReadExpr(body, modelsWithOutput, hint(revive, `${resp.statusCode}_${i + 1}`))}`,\n ...trailing,\n ];\n lines.push(`${indent} case '${body.contentType}':`);\n lines.push(`${indent} return { ${fields.join(', ')} };`);\n }\n const first = bodies[0]!;\n const fallbackFields = [\n ...leading,\n `contentType: '${first.contentType}'`,\n `data: ${sdkReadExpr(first, modelsWithOutput, hint(revive, `${resp.statusCode}_0`))}`,\n ...trailing,\n ];\n lines.push(`${indent} default:`);\n lines.push(`${indent} return { ${fallbackFields.join(', ')} };`);\n lines.push(`${indent}}`);\n return lines;\n}\n\n// ─── Error body typing ────────────────────────────────────────────────────\n\nfunction errorBodyTypeName(route: OpRouteNode, op: OpOperationNode): string {\n const method = deriveMethodName(op, route);\n return `${method.charAt(0).toUpperCase()}${method.slice(1)}ErrorBody`;\n}\n\n/**\n * Module-level `…ErrorBody` aliases for every operation whose thrown statuses declare a body.\n *\n * TypeScript cannot type a `throw`, so the alias plus the method's `@throws` tag is as far as the\n * error contract can be carried: it gives callers something to narrow `SdkError.body` to instead\n * of leaving them with `unknown`.\n */\nexport function generateErrorBodyAliases(root: OpRootNode, options: SdkCodegenOptions): string[] {\n const includeInternal = options.includeInternal ?? false;\n const lines: string[] = [];\n for (const route of root.routes) {\n for (const op of route.operations) {\n const mods = resolveModifiers(route, op);\n if (!includeInternal && mods.includes('internal')) continue;\n const types = new Set<string>();\n for (const resp of thrownResponses(op)) {\n for (const body of resp.bodies) types.add(sdkDataType(body, options.modelsWithOutput));\n }\n if (types.size === 0) continue;\n lines.push(`export type ${errorBodyTypeName(route, op)} = ${[...types].join(' | ')};`);\n }\n }\n return lines;\n}\n\n// ─── URL building ─────────────────────────────────────────────────────────\n\nfunction buildUrlExpression(path: string, _?: ParamSource): string {\n // Replace {paramName} with ${encodeURIComponent(paramName)}\n return path.replace(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (_match, name) => {\n return `\\${encodeURIComponent(${name})}`;\n });\n}\n\n// ─── Method parameters ────────────────────────────────────────────────────\n\ninterface MethodParam {\n name: string;\n type: string;\n optional: boolean;\n}\n\nfunction buildMethodParams(route: OpRouteNode, op: OpOperationNode, modelsWithInput?: Set<string>): MethodParam[] {\n const params: MethodParam[] = [];\n\n // Path params — always first, always required (request-side — use Input variants)\n if (route.params) {\n if (route.params.kind === 'params') {\n for (const p of route.params.nodes) {\n params.push({ name: p.name, type: renderInputTsType(p.type, modelsWithInput), optional: false });\n }\n } else if (route.params.kind === 'ref') {\n const typeName = modelsWithInput?.has(route.params.name) ? `${route.params.name}Input` : route.params.name;\n params.push({ name: 'params', type: typeName, optional: false });\n } else {\n params.push({ name: 'params', type: renderInputTsType(route.params.node, modelsWithInput), optional: false });\n }\n }\n\n // Body (request-side — use Input variants)\n const strategy = classifyBodyStrategy(op);\n if (strategy.kind === 'single') {\n const body = strategy.body;\n const cat = classifyContentType(body.contentType);\n if (cat === 'multipart') {\n params.push({ name: 'body', type: 'FormData', optional: false });\n } else if (cat === 'text') {\n params.push({ name: 'body', type: 'string', optional: false });\n } else if (cat === 'binary') {\n params.push({ name: 'body', type: 'Blob | ArrayBuffer | Uint8Array | string', optional: false });\n } else {\n params.push({ name: 'body', type: renderInputTsType(body.bodyType, modelsWithInput), optional: false });\n }\n } else if (strategy.kind === 'multi-equal') {\n const bodies = strategy.bodies;\n const bodyType = renderInputTsType(bodies[0]!.bodyType, modelsWithInput);\n params.push({ name: 'body', type: bodyType, optional: false });\n const ctUnion = bodies.map(b => `'${b.contentType}'`).join(' | ');\n params.push({ name: 'options', type: `{ contentType?: ${ctUnion} }`, optional: true });\n } else if (strategy.kind === 'multi-formdata-detect') {\n const types = strategy.bodies\n .map(b => (b.contentType === 'multipart/form-data' ? 'FormData' : renderInputTsType(b.bodyType, modelsWithInput)))\n .join(' | ');\n params.push({ name: 'body', type: types, optional: false });\n } else if (strategy.kind === 'multi-required-arg') {\n const types = strategy.bodies\n .map(b => (b.contentType === 'multipart/form-data' ? 'FormData' : renderInputTsType(b.bodyType, modelsWithInput)))\n .join(' | ');\n params.push({ name: 'body', type: types, optional: false });\n const ctUnion = strategy.bodies.map(b => `'${b.contentType}'`).join(' | ');\n params.push({ name: 'options', type: `{ contentType: ${ctUnion} }`, optional: false });\n }\n\n // Query (request-side — use Input variants)\n if (op.query) {\n if (op.query.kind === 'params') {\n const fields = op.query.nodes.map(p => `${quoteKey(p.name)}?: ${renderInputTsType(p.type, modelsWithInput)}`).join('; ');\n params.push({ name: 'query', type: `{ ${fields} }`, optional: true });\n } else if (op.query.kind === 'ref') {\n const typeName = modelsWithInput?.has(op.query.name) ? `${op.query.name}Input` : op.query.name;\n params.push({ name: 'query', type: typeName, optional: true });\n } else {\n params.push({ name: 'query', type: renderInputTsType(op.query.node, modelsWithInput), optional: true });\n }\n }\n\n // Headers (request-side — use Input variants)\n if (op.headers) {\n if (op.headers.kind === 'params') {\n const fields = op.headers.nodes.map(p => `${quoteKey(p.name)}?: ${renderInputTsType(p.type, modelsWithInput)}`).join('; ');\n params.push({ name: 'customHeaders', type: `{ ${fields} }`, optional: true });\n } else if (op.headers.kind === 'ref') {\n const typeName = modelsWithInput?.has(op.headers.name) ? `${op.headers.name}Input` : op.headers.name;\n params.push({ name: 'customHeaders', type: typeName, optional: true });\n } else {\n params.push({ name: 'customHeaders', type: renderInputTsType(op.headers.node, modelsWithInput), optional: true });\n }\n }\n\n return params;\n}\n\n// ─── Method name inference ────────────────────────────────────────────────\n\nfunction deriveMethodName(op: OpOperationNode, route: OpRouteNode): string {\n if (op.sdk) return op.sdk;\n if (op.name) return nameToMethodName(op.name);\n return inferMethodName(op.method, route.path);\n}\n\nfunction nameToMethodName(name: string): string {\n const parts = name.split(/[\\s\\-_]+/).filter(Boolean);\n return parts.map((p, i) => (i === 0 ? p.charAt(0).toLowerCase() + p.slice(1) : p.charAt(0).toUpperCase() + p.slice(1))).join('');\n}\n\nfunction inferMethodName(method: string, path: string): string {\n // Build a name from the path segments + method\n // e.g. GET /users/:id → getUsersById\n // e.g. POST /users → postUsers\n // e.g. DELETE /users/:id → deleteUsersById\n const segments = path.split('/').filter(s => s.length > 0);\n const parts: string[] = [method.toLowerCase()];\n\n for (const seg of segments) {\n if (seg.startsWith('{')) {\n // {id} → ById, {accountId} → ByAccountId\n const paramName = seg.slice(1, -1);\n parts.push('By' + paramName.charAt(0).toUpperCase() + paramName.slice(1));\n } else {\n // Regular segment — camelCase it\n const segParts = seg.split(/[.-]/).filter(Boolean);\n for (const sp of segParts) {\n parts.push(sp.charAt(0).toUpperCase() + sp.slice(1));\n }\n }\n }\n\n return parts[0]! + parts.slice(1).join('');\n}\n\n// ─── Naming conventions ────────────────────────────────────────────────────\n\nfunction deriveBaseName(file: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'Resource';\n return base\n .split('.')\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('');\n}\n\n/** Derive a client class name from a `.ck` file path, e.g. `users.ck` → `UsersClient`. Used for legacy flat (no-area) files. */\nexport function deriveClientClassName(file: string): string {\n return `${deriveBaseName(file)}Client`;\n}\n\n/** Camel-cased property name for a flat client on the SDK aggregator, e.g. `users.ck` → `users`. */\nexport function deriveClientPropertyName(file: string): string {\n const base = deriveBaseName(file);\n return base.charAt(0).toLowerCase() + base.slice(1);\n}\n\n/**\n * Pull `area` / `subarea` from a file's `root.meta` (set via `options { keys: { ... } }`).\n * Both are optional. `area` drives top-level SDK grouping; `subarea` drives nesting under\n * an area's client class.\n */\nexport function getAreaSubarea(root: OpRootNode): { area?: string; subarea?: string } {\n return { area: root.meta?.area, subarea: root.meta?.subarea };\n}\n\nfunction pascal(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join('');\n}\n\nfunction camel(value: string): string {\n const p = pascal(value);\n return p.charAt(0).toLowerCase() + p.slice(1);\n}\n\n/** Class name for the area-level client, e.g. `area=identity` → `IdentityClient`. */\nexport function deriveAreaClientClassName(area: string): string {\n return `${pascal(area)}Client`;\n}\n\n/** Property name on the SDK aggregator for an area, e.g. `area=identity` → `identity`. */\nexport function deriveAreaPropertyName(area: string): string {\n return camel(area);\n}\n\n/** Class name for a leaf subarea client, e.g. `(identity, invitations)` → `IdentityInvitationsClient`. */\nexport function deriveSubareaClientClassName(area: string, subarea: string): string {\n return `${pascal(area)}${pascal(subarea)}Client`;\n}\n\n/** Property name on the area client for a subarea, e.g. `subarea=invitations` → `invitations`. */\nexport function deriveSubareaPropertyName(subarea: string): string {\n return camel(subarea);\n}\n\n// ─── Type collection ──────────────────────────────────────────────────────\n\nfunction collectTypes(root: OpRootNode, modelsWithInput?: Set<string>, modelsWithOutput?: Set<string>, includeInternal = false): string[] {\n const types = new Set<string>();\n for (const route of root.routes) {\n const publicOps = route.operations.filter(op => includeInternal || !resolveModifiers(route, op).includes('internal'));\n if (publicOps.length === 0) continue;\n // Only collect path-param types if there are public ops on this route\n collectParamSourceRefs(route.params, types);\n collectParamSourceInputRefs(route.params, types, modelsWithInput);\n for (const op of publicOps) {\n if (op.request) {\n for (const body of op.request.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectInputTypeNodeRefs(body.bodyType, types, modelsWithInput);\n }\n }\n for (const resp of op.responses) {\n for (const body of resp.bodies) {\n collectTypeNodeRefs(body.bodyType, types);\n collectOutputTypeNodeRefs(body.bodyType, types, modelsWithOutput);\n }\n if (resp.headers) {\n for (const h of resp.headers) {\n collectTypeNodeRefs(h.type, types);\n collectOutputTypeNodeRefs(h.type, types, modelsWithOutput);\n }\n }\n }\n collectParamSourceRefs(op.query, types);\n collectParamSourceInputRefs(op.query, types, modelsWithInput);\n collectParamSourceRefs(op.headers, types);\n collectParamSourceInputRefs(op.headers, types, modelsWithInput);\n }\n }\n return [...types].sort();\n}\n\n/** Collect Output variant refs for response-side ContractTypeNode types. */\nfunction collectOutputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithOutput?: Set<string>): void {\n if (!modelsWithOutput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithOutput.has(type.name)) out.add(`${type.name}Output`);\n break;\n case 'array':\n collectOutputTypeNodeRefs(type.item, out, modelsWithOutput);\n break;\n case 'intersection':\n case 'union':\n case 'discriminatedUnion':\n type.members.forEach(m => collectOutputTypeNodeRefs(m, out, modelsWithOutput));\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectOutputTypeNodeRefs(f.type, out, modelsWithOutput));\n break;\n case 'lazy':\n collectOutputTypeNodeRefs(type.inner, out, modelsWithOutput);\n break;\n }\n}\n\n/** Collect Input variant refs for request-side ParamSource types. */\nfunction collectParamSourceInputRefs(source: ParamSource | undefined, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!source || !modelsWithInput) return;\n if (source.kind === 'ref') {\n if (modelsWithInput.has(source.name)) out.add(`${source.name}Input`);\n } else if (source.kind === 'params') {\n for (const param of source.nodes) {\n collectInputTypeNodeRefs(param.type, out, modelsWithInput);\n }\n } else {\n collectInputTypeNodeRefs(source.node, out, modelsWithInput);\n }\n}\n\n/** Collect Input variant refs for request-side ContractTypeNode types. */\nfunction collectInputTypeNodeRefs(type: ContractTypeNode, out: Set<string>, modelsWithInput?: Set<string>): void {\n if (!modelsWithInput) return;\n switch (type.kind) {\n case 'ref':\n if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`);\n break;\n case 'array':\n collectInputTypeNodeRefs(type.item, out, modelsWithInput);\n break;\n case 'intersection':\n case 'union':\n case 'discriminatedUnion':\n type.members.forEach(m => collectInputTypeNodeRefs(m, out, modelsWithInput));\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectInputTypeNodeRefs(f.type, out, modelsWithInput));\n break;\n case 'lazy':\n collectInputTypeNodeRefs(type.inner, out, modelsWithInput);\n break;\n }\n}\n\nfunction collectParamSourceRefs(source: ParamSource | undefined, out: Set<string>): void {\n if (!source) return;\n if (source.kind === 'ref') {\n if (/^[A-Z]/.test(source.name)) out.add(source.name);\n } else if (source.kind === 'params') {\n for (const param of source.nodes) {\n collectTypeNodeRefs(param.type, out);\n }\n } else {\n collectTypeNodeRefs(source.node, out);\n }\n}\n\n/** True if any emitted operation has query params (drives the `buildQueryString` import). */\nfunction sdkNeedsQueryString(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n if (op.query) return true;\n }\n }\n return false;\n}\n\n/**\n * True if any emitted operation has a status declaring several mimes, so the client has to read\n * the actual content type off the response to know which it got.\n */\nfunction sdkNeedsReadContentType(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n if (observableResponses(op).some(r => r.bodies.length > 1)) return true;\n }\n }\n return false;\n}\n\n/** True if any emitted operation serializes a JSON request body (uses bigIntReplacer). */\nfunction sdkNeedsBigIntReplacer(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n if (op.request && op.request.bodies.some(b => isJsonMime(b.contentType))) return true;\n }\n }\n return false;\n}\n\n/** True if any public operation parses a JSON response body (uses bigIntReviver). */\nfunction sdkNeedsBigIntReviver(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n // Only JSON-shaped responses use parseJson — text/binary read raw.\n if (op.responses.some(r => r.bodies.some(b => classifyContentType(b.contentType) === 'json'))) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction sdkNeedsJson(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n const check = (src: ParamSource | undefined) => {\n if (!src || src.kind === 'ref') return false;\n if (src.kind === 'params') return src.nodes.some(p => typeNeedsScalar(p.type, 'json'));\n return typeNeedsScalar(src.node, 'json');\n };\n if (\n !!op.request?.bodies.some(b => typeNeedsScalar(b.bodyType, 'json')) ||\n op.responses.some(r => r.bodies.some(b => typeNeedsScalar(b.bodyType, 'json'))) ||\n check(op.query) ||\n check(op.headers) ||\n check(route.params)\n )\n return true;\n }\n }\n return false;\n}\n\nfunction collectTypeNodeRefs(type: ContractTypeNode, out: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n if (/^[A-Z]/.test(type.name)) out.add(type.name);\n break;\n case 'array':\n collectTypeNodeRefs(type.item, out);\n break;\n case 'tuple':\n type.items.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'record':\n collectTypeNodeRefs(type.key, out);\n collectTypeNodeRefs(type.value, out);\n break;\n case 'union':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'discriminatedUnion':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'intersection':\n type.members.forEach(t => collectTypeNodeRefs(t, out));\n break;\n case 'lazy':\n collectTypeNodeRefs(type.inner, out);\n break;\n case 'inlineObject':\n type.fields.forEach(f => collectTypeNodeRefs(f.type, out));\n break;\n }\n}\n\n// ─── Type import resolution ───────────────────────────────────────────────\n\nfunction generateTypeImports(types: string[], opFile: string, options: SdkCodegenOptions, revivers: string[] = []): string[] {\n const lines: string[] = [];\n const { modelOutPaths, outPath } = options;\n\n if (modelOutPaths && outPath) {\n const byFile = new Map<string, string[]>();\n const unresolved: string[] = [];\n\n for (const type of types) {\n const typeOutPath = modelOutPaths.get(type);\n if (typeOutPath) {\n const group = byFile.get(typeOutPath) ?? [];\n group.push(type);\n byFile.set(typeOutPath, group);\n } else {\n unresolved.push(type);\n }\n }\n\n const fromDir = dirname(outPath);\n for (const [typeOutPath, names] of byFile) {\n let rel = relative(fromDir, typeOutPath);\n rel = rel.replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n lines.push(`import type { ${names.sort().join(', ')} } from '${rel}';`);\n // Revivers are values, so they need a second, non-type import from the same module.\n const fromHere = revivers.filter(r => modelOutPaths.get(reviverModelName(r, names)) === typeOutPath);\n if (fromHere.length > 0) lines.push(`import { ${fromHere.sort().join(', ')} } from '${rel}';`);\n }\n\n for (const type of unresolved) {\n const moduleName = pascalToDotCase(type);\n lines.push(`import type { ${type} } from './${moduleName}.js';`);\n }\n } else {\n const typeImport = deriveTypeImportPath(opFile, options.typeImportPathTemplate);\n lines.push(`import type { ${types.join(', ')} } from '${typeImport}';`);\n }\n\n return lines;\n}\n\n/**\n * The model a reviver belongs to. `reviveInvoiceOutput` can come from either `Invoice` (with an\n * `Output` variant) or a model literally called `InvoiceOutput`, so the names actually imported\n * from the module decide it.\n */\nfunction reviverModelName(reviver: string, namesInModule: string[]): string {\n const stem = reviver.replace(/^revive/, '');\n if (namesInModule.includes(stem)) return stem;\n const base = stem.replace(/Output$/, '');\n return namesInModule.includes(base) ? base : stem;\n}\n\nfunction deriveTypeImportPath(file: string, template?: string): string {\n const base =\n file\n .split('/')\n .pop()\n ?.replace(/\\.(op|ck)$/, '') ?? 'resource';\n const module = base.split('.')[0] ?? base;\n if (template) {\n return template.replace(/\\{module\\}/g, module).replace(/\\{base\\}/g, base);\n }\n return `#modules/${module}/types/index.js`;\n}\n\n// ─── Shared SDK files ──────────────────────────────────────────────────────\n\n/** Generate the shared SdkOptions interface file. */\nexport function generateSdkOptions(): string {\n return [\n 'export class SdkError<TBody = unknown> extends Error {',\n ' constructor(',\n ' public readonly status: number,',\n ' public readonly statusText: string,',\n ' public readonly body: TBody,',\n ' public readonly headers: Headers,',\n ' ) {',\n ' super(`${status} ${statusText}`);',\n \" this.name = 'SdkError';\",\n ' }',\n '}',\n '',\n 'export interface SdkRequestInit extends RequestInit {',\n ' /**',\n ' * Statuses this operation declares as values rather than errors — a 304 from',\n ' * conditional-GET middleware, or an error status the service returns deliberately.',\n ' * Anything else at or above 400 still throws SdkError.',\n ' */',\n ' expectStatuses?: number[];',\n '}',\n '',\n 'export type SdkFetch = (url: string, init: SdkRequestInit) => Promise<Response>;',\n '',\n 'export interface SdkOptions {',\n ' baseUrl: string;',\n ' headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);',\n ' fetch?: SdkFetch;',\n ' /** Called once per request to produce a unique X-Request-ID header value */',\n ' requestIdFactory?: () => string;',\n '}',\n '',\n 'export const bigIntReplacer = (_: string, value: any): any => {',\n \" if (typeof value === 'bigint') {\",\n \" return value.toString() + 'n';\",\n ' }',\n ' return value;',\n '};',\n '',\n 'export const bigIntReviver = (_: string, value: any): any => {',\n \" if (typeof value === 'string' && /^-?\\\\d+n$/.test(value)) {\",\n ' return BigInt(value.slice(0, -1));',\n ' }',\n ' return value;',\n '};',\n '',\n JSON_VALUE_TYPE_DECL,\n '',\n 'export function readContentType(res: Response): string {',\n \" return res.headers.get('content-type')?.split(';')[0]?.trim() ?? '';\",\n '}',\n '',\n 'export function createSdkFetch(options: SdkOptions): SdkFetch {',\n ' const getRequestId = options.requestIdFactory ?? (() => crypto.randomUUID());',\n ' return async (url: string, init: SdkRequestInit): Promise<Response> => {',\n \" const baseHeaders = typeof options.headers === 'function'\",\n ' ? await options.headers()',\n ' : options.headers ?? {};',\n ' const res = await fetch(`${options.baseUrl}${url}`, {',\n ' ...init,',\n \" headers: { ...baseHeaders, 'X-Request-ID': getRequestId(), ...init.headers as Record<string, string> },\",\n ' });',\n ' if (!res.ok && !(init.expectStatuses ?? []).includes(res.status)) {',\n ' const text = await res.text();',\n ' let body: unknown;',\n ' try { body = JSON.parse(text); } catch { body = text; }',\n ' throw new SdkError(res.status, res.statusText, body, res.headers);',\n ' }',\n ' return res;',\n ' };',\n '}',\n '',\n 'export function buildQueryString(query: object | undefined): string {',\n ' const searchParams = new URLSearchParams();',\n ' if (query) {',\n ' for (const [k, v] of Object.entries(query)) {',\n ' if (v === undefined || v === null) continue;',\n ' if (Array.isArray(v)) { for (const item of v) searchParams.append(k, String(item)); }',\n ' else searchParams.set(k, String(v));',\n ' }',\n ' }',\n ' const qs = searchParams.toString();',\n \" return qs ? `?${qs}` : '';\",\n '}',\n '',\n 'export async function parseJson<T>(res: Response): Promise<T> {',\n ' return JSON.parse(await res.text(), bigIntReviver) as T;',\n '}',\n '',\n ].join('\\n');\n}\n\n// ─── Scaffold files (package.json / tsconfig.json) ─────────────────────────\n\n/** Pinned dependency ranges for scaffolded SDK packages. Kept in one place so they're easy to bump. */\nconst SCAFFOLD_DEP_VERSIONS = {\n zod: '^4.3.6',\n luxon: '^3.5.0',\n decimalJs: '^10.4.3',\n typesLuxon: '^3.4.2',\n typescript: '^6.0.3',\n} as const;\n\n/** Which optional runtime deps the generated SDK references, derived from the contracts it covers. */\nexport interface SdkScaffoldDeps {\n /** Zod schema files are emitted (`config.zod`) — the SDK imports `zod`. */\n zod: boolean;\n /** Any covered model uses a `date`/`time`/`datetime`/`duration`/`interval` scalar — the SDK imports `luxon`. */\n luxon: boolean;\n /** Any covered model uses a `decimal` scalar — the SDK imports `decimal.js`. */\n decimal: boolean;\n}\n\n/**\n * Generate a starter `package.json` for a generated SDK package. Emitted with\n * `ifAbsent` semantics — written once, then owned by the user — so the dependency\n * ranges here are only ever a starting point, never re-applied on later builds.\n */\nexport function generateSdkPackageJson(input: { name: string; deps: SdkScaffoldDeps }): string {\n const dependencies: Record<string, string> = {};\n if (input.deps.zod) dependencies.zod = SCAFFOLD_DEP_VERSIONS.zod;\n if (input.deps.luxon) dependencies.luxon = SCAFFOLD_DEP_VERSIONS.luxon;\n // No `@types/` half — decimal.js ships its own declarations.\n if (input.deps.decimal) dependencies['decimal.js'] = SCAFFOLD_DEP_VERSIONS.decimalJs;\n\n const devDependencies: Record<string, string> = { typescript: SCAFFOLD_DEP_VERSIONS.typescript };\n if (input.deps.luxon) devDependencies['@types/luxon'] = SCAFFOLD_DEP_VERSIONS.typesLuxon;\n\n const pkg = {\n name: input.name,\n version: '0.0.0',\n type: 'module',\n main: './dist/index.js',\n types: './dist/index.d.ts',\n exports: {\n '.': {\n types: './dist/index.d.ts',\n import: './dist/index.js',\n },\n },\n files: ['dist'],\n scripts: {\n build: 'tsc -p tsconfig.json',\n },\n ...(Object.keys(dependencies).length > 0 ? { dependencies } : {}),\n devDependencies,\n };\n return JSON.stringify(pkg, null, 4) + '\\n';\n}\n\n/**\n * Generate a standalone `tsconfig.json` for a generated SDK package. Deliberately\n * self-contained (no workspace `extends`) so the scaffold works in a freshly\n * `npm init`'d package outside this monorepo. Emitted with `ifAbsent` semantics.\n */\nexport function generateSdkTsconfig(): string {\n const tsconfig = {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n declaration: true,\n outDir: './dist',\n rootDir: './src',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n },\n include: ['src'],\n exclude: ['dist', 'node_modules'],\n };\n return JSON.stringify(tsconfig, null, 4) + '\\n';\n}\n\n/**\n * Reference to a per-file leaf client emitted to its own `*.client.ts`. Used by the\n * aggregator to import the class and wire it as either a top-level `sdk.<prop>` or a\n * nested `sdk.<area>.<subarea>` property.\n */\nexport interface SdkClientInfo {\n /** Client class name (e.g. `UsersClient`, `IdentityInvitationsClient`). */\n className: string;\n /** Property name to expose this client under (e.g. `users`, `invitations`). */\n propertyName: string;\n /** Module specifier for the leaf file, relative to `sdk.ts` and `.js`-suffixed. */\n importPath: string;\n}\n\n/**\n * One area-level (no-subarea) `.ck` file whose methods are merged into the area's\n * `<Area>Client` (emitted to its own `<area>.client.ts`).\n */\nexport interface SdkAreaInlineFile {\n /** Parsed AST. */\n root: OpRootNode;\n /** Codegen options for this file (must have `outPath` pointing at the area client file so type-import paths resolve correctly). */\n codegenOptions: SdkCodegenOptions;\n}\n\n/** A grouping of files that share the same `keys.area`. */\nexport interface SdkAreaInfo {\n area: string;\n /**\n * Reference to the `<Area>Client` class — the file that holds it lives at\n * `client.importPath` (relative to `sdk.ts`) and is generated separately by\n * {@link generateAreaClient}. The aggregator just imports it.\n */\n client: SdkClientInfo;\n}\n\nexport interface SdkAggregatorInput {\n /** Files with no `keys.area` — kept as flat `Sdk.<filename>` properties (legacy behavior). */\n topLevelClients: SdkClientInfo[];\n /** One entry per `keys.area`. */\n areas: SdkAreaInfo[];\n /** Path to `sdk-options.ts` to import `SdkOptions`/`createSdkFetch`/etc. from. */\n sdkOptionsImportPath?: string;\n /** Name of the top-level aggregator class. Defaults to `Sdk`. */\n sdkClassName?: string;\n}\n\n/** Inputs to {@link generateAreaClient}. */\nexport interface AreaClientInput {\n /** Area name (e.g. `payments`). Drives the generated class name (`PaymentsClient`). */\n area: string;\n /** Output path of the generated `<area>.client.ts` file. Used to resolve relative type / leaf-client / sdk-options imports. */\n outPath: string;\n /** Files contributing inlined methods to the area client (typically area-level files with no subarea). */\n inlineFiles: SdkAreaInlineFile[];\n /** Subarea leaf clients exposed as named properties on the area client. */\n subareaClients: { propertyName: string; client: SdkClientInfo }[];\n /** Path to `sdk-options.ts`, used for `SdkFetch` and runtime helpers. */\n sdkOptionsPath: string;\n}\n\n/**\n * Generate a complete `<area>.client.ts` file: the `<Area>Client` class with\n * subarea property fields, a constructor that wires them, and inlined methods\n * merged from every area-level file in `inlineFiles`.\n *\n * Emitted by the plugin alongside the per-leaf `*.client.ts` files. The SDK\n * aggregator just imports the resulting class — see {@link generateSdkAggregator}.\n *\n * @throws if two area-level files contribute the same method name to the area —\n * disambiguate via `sdk:` on the operation, or move one into a subarea.\n */\nexport function generateAreaClient(input: AreaClientInput): string {\n const { area, outPath, inlineFiles, subareaClients, sdkOptionsPath } = input;\n const className = deriveAreaClientClassName(area);\n\n // ── Merge inputs across all inline files ────────────────────────────────\n const collectedMethodLines: string[] = [];\n const collectedRevivePrelude: string[] = [];\n let areaNeedsDecimalImport = false;\n /** Reviver value imports, grouped the same way `typesByImportPath` groups the type imports. */\n const reviversByImportPath = new Map<string, Set<string>>();\n // Aliases are keyed off method names, which already collide-check below, so a Set is enough.\n const collectedErrorAliases = new Set<string>();\n const seenMethods = new Set<string>();\n const typesByImportPath = new Map<string, Set<string>>();\n const unresolvedTypes = new Set<string>();\n let needsJson = false;\n let needsBigIntReplacer = false;\n let needsBigIntReviver = false;\n let needsQueryString = false;\n let needsReadContentType = false;\n\n for (const inline of inlineFiles) {\n const includeInternal = inline.codegenOptions.includeInternal ?? false;\n const { lines: methodLines, methodNames, preludeLines, needsDecimalImport } = generateClientMethods(inline.root, inline.codegenOptions);\n collectedRevivePrelude.push(...preludeLines);\n if (needsDecimalImport) areaNeedsDecimalImport = true;\n for (const name of methodNames) {\n if (seenMethods.has(name)) {\n throw new Error(\n `[sdk] duplicate method '${name}' in area '${area}': two area-level files contribute the same method. Disambiguate via 'sdk:' or move one into a subarea.`,\n );\n }\n seenMethods.add(name);\n }\n collectedMethodLines.push(...methodLines);\n for (const alias of generateErrorBodyAliases(inline.root, inline.codegenOptions)) collectedErrorAliases.add(alias);\n if (sdkNeedsJson(inline.root, includeInternal)) needsJson = true;\n if (sdkNeedsBigIntReplacer(inline.root, includeInternal)) needsBigIntReplacer = true;\n if (sdkNeedsBigIntReviver(inline.root, includeInternal)) needsBigIntReviver = true;\n if (sdkNeedsQueryString(inline.root, includeInternal)) needsQueryString = true;\n if (sdkNeedsReadContentType(inline.root, includeInternal)) needsReadContentType = true;\n\n // Revivers this file's methods call, resolved against the same modelOutPaths. Derived from\n // the emitted lines, exactly as `generateSdk` does, so the two paths cannot disagree.\n for (const reviver of usedRevivers(methodLines)) {\n const stem = reviver.replace(/^revive/, '');\n const modelOut = inline.codegenOptions.modelOutPaths?.get(stem) ?? inline.codegenOptions.modelOutPaths?.get(stem.replace(/Output$/, ''));\n if (!modelOut) continue;\n let rel = relative(dirname(outPath), modelOut).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n const set = reviversByImportPath.get(rel) ?? new Set<string>();\n set.add(reviver);\n reviversByImportPath.set(rel, set);\n }\n\n // Resolve each file's type refs against THIS file's modelOutPaths, but\n // produce import paths relative to the area client's outPath (not the\n // contributing file's outPath, which pointed at the now-defunct sdk.ts).\n const typesForFile = collectTypes(\n inline.root,\n inline.codegenOptions.modelsWithInput,\n inline.codegenOptions.modelsWithOutput,\n includeInternal,\n );\n const { modelOutPaths } = inline.codegenOptions;\n if (modelOutPaths) {\n const fromDir = dirname(outPath);\n for (const t of typesForFile) {\n const typeOutPath = modelOutPaths.get(t);\n if (typeOutPath) {\n let rel = relative(fromDir, typeOutPath).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n const set = typesByImportPath.get(rel) ?? new Set();\n set.add(t);\n typesByImportPath.set(rel, set);\n } else {\n unresolvedTypes.add(t);\n }\n }\n }\n }\n\n // ── Imports ─────────────────────────────────────────────────────────────\n let sdkOptionsRel = relative(dirname(outPath), sdkOptionsPath).replace(/\\.ts$/, '.js');\n if (!sdkOptionsRel.startsWith('.')) sdkOptionsRel = './' + sdkOptionsRel;\n\n const lines: string[] = [];\n const jsonImport = needsJson ? ', JsonValue' : '';\n lines.push(`import type { SdkFetch${jsonImport} } from '${sdkOptionsRel}';`);\n const valueImports: string[] = [];\n if (needsBigIntReplacer) valueImports.push('bigIntReplacer');\n if (needsBigIntReviver) valueImports.push('parseJson');\n if (needsQueryString) valueImports.push('buildQueryString');\n if (needsReadContentType) valueImports.push('readContentType');\n if (valueImports.length > 0) {\n lines.push(`import { ${valueImports.join(', ')} } from '${sdkOptionsRel}';`);\n }\n\n for (const path of [...typesByImportPath.keys()].sort()) {\n const names = [...typesByImportPath.get(path)!].sort();\n lines.push(`import type { ${names.join(', ')} } from '${path}';`);\n const revivers = reviversByImportPath.get(path);\n if (revivers && revivers.size > 0) lines.push(`import { ${[...revivers].sort().join(', ')} } from '${path}';`);\n }\n for (const t of [...unresolvedTypes].sort()) {\n lines.push(`import type { ${t} } from './${pascalToDotCase(t)}.js';`);\n }\n\n if (areaNeedsDecimalImport) lines.push(DECIMAL_IMPORT);\n\n // Leaf client imports (subareas only — top-level clients live next to sdk.ts).\n const importedClients = new Set<string>();\n for (const sc of subareaClients) {\n const key = `${sc.client.className}|${sc.client.importPath}`;\n if (importedClients.has(key)) continue;\n importedClients.add(key);\n lines.push(`import { ${sc.client.className} } from '${sc.client.importPath}';`);\n }\n lines.push('');\n\n if (collectedErrorAliases.size > 0) {\n lines.push(...collectedErrorAliases);\n lines.push('');\n }\n\n if (collectedRevivePrelude.length > 0) {\n lines.push(...collectedRevivePrelude);\n lines.push('');\n }\n\n // ── <Area>Client class ──────────────────────────────────────────────────\n lines.push(`export class ${className} {`);\n for (const sc of subareaClients) {\n lines.push(` readonly ${sc.propertyName}: ${sc.client.className};`);\n }\n if (subareaClients.length > 0) lines.push('');\n if (collectedMethodLines.length > 0 || subareaClients.length > 0) {\n const fetchModifier = collectedMethodLines.length > 0 ? 'private ' : '';\n lines.push(` constructor(${fetchModifier}fetch: SdkFetch) {`);\n for (const sc of subareaClients) {\n lines.push(` this.${sc.propertyName} = new ${sc.client.className}(fetch);`);\n }\n lines.push(' }');\n }\n for (const ln of collectedMethodLines) lines.push(ln);\n lines.push('}');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate the SDK aggregator (`sdk.ts`) — the entry-point file consumers import.\n *\n * Imports every `<Area>Client` (one per area, generated by {@link generateAreaClient}\n * to its own `<area>.client.ts`) and every leaf top-level client, then emits a\n * `class Sdk` that exposes them as properties.\n */\nexport function generateSdkAggregator(input: SdkAggregatorInput): string {\n const sdkOptionsImportPath = input.sdkOptionsImportPath ?? './sdk-options.js';\n const sdkClassName = input.sdkClassName ?? 'Sdk';\n\n const lines: string[] = [];\n lines.push(`import type { SdkOptions } from '${sdkOptionsImportPath}';`);\n lines.push(`import { createSdkFetch } from '${sdkOptionsImportPath}';`);\n\n const importedClients = new Set<string>();\n const pushClientImport = (c: SdkClientInfo): void => {\n const key = `${c.className}|${c.importPath}`;\n if (importedClients.has(key)) return;\n importedClients.add(key);\n lines.push(`import { ${c.className} } from '${c.importPath}';`);\n };\n // Areas first, then top-level — keeps the aggregator's import order stable.\n for (const area of input.areas) pushClientImport(area.client);\n for (const c of input.topLevelClients) pushClientImport(c);\n lines.push('');\n\n lines.push(`export class ${sdkClassName} {`);\n for (const area of input.areas) {\n lines.push(` readonly ${deriveAreaPropertyName(area.area)}: ${area.client.className};`);\n }\n for (const c of input.topLevelClients) {\n lines.push(` readonly ${c.propertyName}: ${c.className};`);\n }\n lines.push('');\n lines.push(' constructor(options: SdkOptions) {');\n lines.push(' const sdkFetch = options.fetch ?? createSdkFetch(options);');\n for (const area of input.areas) {\n lines.push(` this.${deriveAreaPropertyName(area.area)} = new ${area.client.className}(sdkFetch);`);\n }\n for (const c of input.topLevelClients) {\n lines.push(` this.${c.propertyName} = new ${c.className}(sdkFetch);`);\n }\n lines.push(' }');\n lines.push('}');\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { relative, dirname } from 'node:path';\nimport type { ContractRootNode, ModelNode, FieldNode } from '@contractkit/core';\nimport { computeModelsWithOutput, collectExternalOutputRefs } from '@contractkit/core';\nimport type { ContractCodegenContext } from './codegen-contract.js';\nimport {\n collectExternalRefs,\n collectExternalInputRefs,\n computeModelsWithInput,\n topoSortModels,\n resolveImportPath,\n rootNeedsScalar,\n} from './codegen-contract.js';\nimport { renderTsType, renderInputTsType, renderOutputTsType, quoteKey, escapeJsDocLines, JSON_VALUE_TYPE_DECL } from './ts-render.js';\nimport type { TsRenderTarget } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_CONFIG_LINE } from './decimal-runtime.js';\nimport { renderReviveFunctions, reviveFnName, DECIMAL_COERCE_DECL } from './codegen-revive.js';\n\n// ─── Public entry point ────────────────────────────────────────────────────\n\n/**\n * Generate plain TypeScript interfaces/types from a contract AST.\n * Unlike `generateContract()` which produces Zod schemas, this emits\n * vanilla TypeScript `interface` and `type` declarations suitable\n * for SDK consumers that don't need runtime validation.\n *\n * @param context Import resolution and Input/Output variant sets. `context.target` selects the\n * runtime the types describe (`'server'` renders `binary` as `Buffer`, `'client'` as `Blob`).\n */\nexport function generatePlainTypes(root: ContractRootNode, context?: ContractCodegenContext): string {\n const target: TsRenderTarget = context?.target ?? 'client';\n const externalRefs = collectExternalRefs(root);\n const lines: string[] = [];\n\n // Compute which models have Input variants (local, incl. transitive deps + external)\n const externalModelsWithInput = context?.modelsWithInput ?? new Set<string>();\n const localModelsWithInput = computeModelsWithInput(root.models, externalModelsWithInput);\n const allModelsWithInput = new Set([...localModelsWithInput, ...externalModelsWithInput]);\n\n // Compute which models have Output variants (post-transform wire shape)\n const externalModelsWithOutput = context?.modelsWithOutput ?? new Set<string>();\n const localModelsWithOutput = computeModelsWithOutput(root.models, externalModelsWithOutput);\n const allModelsWithOutput = new Set([...localModelsWithOutput, ...externalModelsWithOutput]);\n\n // Collect additional external Input/Output refs needed for variant fields\n const externalInputRefs = allModelsWithInput.size > 0 ? collectExternalInputRefs(root, allModelsWithInput) : [];\n const externalOutputRefs = allModelsWithOutput.size > 0 ? collectExternalOutputRefs(root, allModelsWithOutput) : [];\n const allExternalRefs = [...new Set([...externalRefs, ...externalInputRefs, ...externalOutputRefs])].sort();\n\n // Not `import type`: `renderTsScalar` maps `decimal` to `Decimal` in this mode too, so the class\n // is a real runtime dependency of any consumer holding one — same position as in\n // `generateContract`, which emits it ahead of the external model refs.\n const needsDecimal = rootNeedsScalar(root, 'decimal') || (context?.emitRevivers && context.modelsWithDecimal ? root.models.some(m => context.modelsWithDecimal!.has(m.name)) : false);\n if (needsDecimal) lines.push(DECIMAL_IMPORT);\n\n // Type-only imports for external references. A cross-file model carrying a decimal also\n // contributes its reviver, which is a value and so needs a second, non-type import.\n for (const ref of allExternalRefs) {\n const importPath = resolveImportPath(ref, context);\n lines.push(`import type { ${ref} } from '${importPath}';`);\n if (context?.emitRevivers && context.modelsWithDecimal?.has(ref)) {\n lines.push(`import { ${reviveFnName(ref)} } from '${importPath}';`);\n }\n }\n if (allExternalRefs.length > 0) lines.push('');\n\n if (rootNeedsScalar(root, 'json')) {\n if (context?.jsonValueImportPath) {\n lines.push(`import type { JsonValue } from '${context.jsonValueImportPath}';`);\n } else {\n lines.push(JSON_VALUE_TYPE_DECL);\n }\n lines.push('');\n }\n\n const modelMap = new Map(root.models.map(m => [m.name, m]));\n\n const reviveOpts =\n context?.emitRevivers && context.modelsWithDecimal\n ? { modelsWithDecimal: context.modelsWithDecimal, modelsWithOutput: allModelsWithOutput, modelMap }\n : undefined;\n\n const bodyLines: string[] = [];\n for (const model of topoSortModels(root.models)) {\n bodyLines.push(...generateModel(model, target, context?.currentOutPath, allModelsWithInput, allModelsWithOutput, modelMap));\n if (reviveOpts) {\n const revivers = renderReviveFunctions(model, reviveOpts);\n if (revivers.length > 0) {\n bodyLines.push('');\n bodyLines.push(...revivers);\n }\n }\n bodyLines.push('');\n }\n\n // Global decimal.js config belongs in any file holding a `Decimal`: there is no Zod schema in\n // this mode, but `String(value)` and `JSON.stringify` still have to stay out of exponential form.\n if (needsDecimal) {\n lines.push('');\n lines.push(DECIMAL_CONFIG_LINE);\n }\n\n // Same rule as in `generateContract`: the helper is emitted only if the revivers actually\n // reference it, so the two cannot drift and trip `noUnusedLocals`.\n if (bodyLines.some(l => l.includes('__dec('))) {\n lines.push(...DECIMAL_COERCE_DECL);\n lines.push('');\n }\n lines.push(...bodyLines);\n\n return lines.join('\\n');\n}\n\n// ─── Model ─────────────────────────────────────────────────────────────────\n\nfunction generateModel(\n model: ModelNode,\n target: TsRenderTarget,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithOutput?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n): string[] {\n // Type alias: Name : typeExpression\n if (model.type) {\n return generateTypeAlias(model, target, outPath, modelsWithInput, modelsWithOutput);\n }\n\n // A model needs Input/read split if it has visibility-modified fields OR if it\n // transitively references models that have Input variants (captured in modelsWithInput).\n const needsInputSplit = model.fields.some(f => f.visibility !== 'normal') || (modelsWithInput?.has(model.name) ?? false);\n\n const lines = needsInputSplit\n ? generateVisibilityModel(model, target, outPath, modelsWithInput, modelMap)\n : generateSimpleModel(model, target, outPath, modelMap);\n\n if (modelsWithOutput?.has(model.name)) {\n lines.push('');\n lines.push(...generateOutputModel(model, target, modelsWithOutput));\n }\n return lines;\n}\n\n/** Recursively collect every field name defined on `bases` and their ancestors. Used to detect\n * fields that the child re-declares without an explicit `override` keyword — those still need an\n * `Omit<Base, …>` wrap, otherwise the child's narrower/incompatible declaration collides with the\n * inherited one. */\nfunction collectInheritedFieldNames(bases: string[], modelMap: Map<string, ModelNode>): Set<string> {\n const result = new Set<string>();\n const visit = (name: string): void => {\n const m = modelMap.get(name);\n if (!m || m.type) return;\n for (const f of m.fields) result.add(f.name);\n for (const b of m.bases ?? []) visit(b);\n };\n for (const b of bases) visit(b);\n return result;\n}\n\n/** Names of fields the child declaration overrides — explicit `override` plus any field whose\n * name shadows an inherited one. The latter catches single-base redeclarations that omit the\n * `override` keyword (e.g. narrowing `kind: BusinessRoleKind` → `kind: 'employee'`). */\nfunction computeOverrideNames(model: ModelNode, modelMap?: Map<string, ModelNode>): string[] {\n const inherited = modelMap ? collectInheritedFieldNames(model.bases ?? [], modelMap) : new Set<string>();\n return model.fields.filter(f => f.override || inherited.has(f.name)).map(f => f.name);\n}\n\nfunction generateComments(model: ModelNode, outPath?: string): string[] {\n const lines: string[] = [];\n lines.push('/**');\n if (model.deprecated) {\n lines.push(` * @deprecated`);\n }\n if (model.description) {\n for (const l of escapeJsDocLines(model.description)) lines.push(` * ${l}`);\n }\n\n const relPath = outPath ? relative(dirname(outPath), model.loc.file) : model.loc.file;\n lines.push(` * generated from [${model.name}](file://./${relPath}#L${model.loc.line})`);\n lines.push(' */');\n return lines;\n}\n\nfunction generateTypeAlias(\n model: ModelNode,\n target: TsRenderTarget,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelsWithOutput?: Set<string>,\n): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n lines.push(`export type ${model.name} = ${renderTsType(model.type!, target)};`);\n if (modelsWithInput?.has(model.name)) {\n lines.push(`export type ${model.name}Input = ${renderInputTsType(model.type!, modelsWithInput, target)};`);\n }\n if (modelsWithOutput?.has(model.name)) {\n lines.push(`export type ${model.name}Output = ${renderOutputTsType(model.type!, modelsWithOutput, target)};`);\n }\n return lines;\n}\n\n/** Build the `extends` clause for a model.\n * Each entry in `overrideNames` is wrapped in `Omit<Base, 'name1' | 'name2'>` per base so the\n * subclass can legally redeclare those fields with new (possibly incompatible) types.\n * TypeScript's `Omit<T, K extends keyof any>` tolerates omit keys that don't appear on the base,\n * so we apply the same omit list to every base without per-base field-set lookup. */\nfunction buildExtendsClause(bases: string[], overrideNames: string[], baseNameResolver: (b: string) => string): string {\n if (bases.length === 0) return '';\n if (overrideNames.length === 0) return ` extends ${bases.map(baseNameResolver).join(', ')}`;\n const omitKeys = overrideNames.map(n => `'${n}'`).join(' | ');\n const wrapped = bases.map(b => `Omit<${baseNameResolver(b)}, ${omitKeys}>`);\n return ` extends ${wrapped.join(', ')}`;\n}\n\nfunction generateSimpleModel(model: ModelNode, target: TsRenderTarget, outPath?: string, modelMap?: Map<string, ModelNode>): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n\n const bases = model.bases ?? [];\n const overrideNames = computeOverrideNames(model, modelMap);\n lines.push(`export interface ${model.name}${buildExtendsClause(bases, overrideNames, b => b)} {`);\n\n for (const field of model.fields) {\n lines.push(` ${renderField(field, target)}`);\n }\n\n lines.push('}');\n return lines;\n}\n\nfunction generateVisibilityModel(\n model: ModelNode,\n target: TsRenderTarget,\n outPath?: string,\n modelsWithInput?: Set<string>,\n modelMap?: Map<string, ModelNode>,\n): string[] {\n const lines: string[] = [];\n lines.push(...generateComments(model, outPath));\n\n const bases = model.bases ?? [];\n const overrideNames = computeOverrideNames(model, modelMap);\n\n // Read type — omit writeonly fields\n const readFields = model.fields.filter(f => f.visibility !== 'writeonly');\n lines.push(`export interface ${model.name}${buildExtendsClause(bases, overrideNames, b => b)} {`);\n for (const field of readFields) {\n lines.push(` ${renderField(field, target)}`);\n }\n lines.push('}');\n lines.push('');\n\n // Write type — omit readonly fields (use Input variants for sub-type refs);\n // extends ParentInput if parent has an Input variant, else extends parent read type\n const writeFields = model.fields.filter(f => f.visibility !== 'readonly');\n const inputResolver = (b: string) => (modelsWithInput?.has(b) ? `${b}Input` : b);\n lines.push(`export interface ${model.name}Input${buildExtendsClause(bases, overrideNames, inputResolver)} {`);\n for (const field of writeFields) {\n lines.push(` ${modelsWithInput ? renderInputField(field, modelsWithInput, target) : renderField(field, target)}`);\n }\n lines.push('}');\n\n return lines;\n}\n\n// ─── Field rendering ──────────────────────────────────────────────────────\n\n/** Prefix a field declaration with a JSDoc comment built from `@deprecated` / description parts,\n * neutralizing any block-comment terminator and expanding embedded newlines into continuation lines. */\nfunction withFieldJsDoc(jsdocParts: string[], line: string): string {\n if (jsdocParts.length === 0) return line;\n const contentLines = escapeJsDocLines(jsdocParts.join(' '));\n if (contentLines.length === 1) {\n return `/** ${contentLines[0]} */\\n ${line}`;\n }\n const body = contentLines.map(l => ` * ${l}`).join('\\n');\n return `/**\\n${body}\\n */\\n ${line}`;\n}\n\nfunction renderField(field: FieldNode, target: TsRenderTarget): string {\n const opt = field.optional || field.default !== undefined ? '?' : '';\n let typeStr = renderTsType(field.type, target);\n if (field.nullable) typeStr += ' | null';\n const line = `${quoteKey(field.name)}${opt}: ${typeStr};`;\n const jsdocParts: string[] = [];\n if (field.deprecated) jsdocParts.push('@deprecated');\n if (field.description) jsdocParts.push(field.description);\n return withFieldJsDoc(jsdocParts, line);\n}\n\nfunction renderInputField(field: FieldNode, modelsWithInput: Set<string>, target: TsRenderTarget): string {\n const opt = field.optional || field.default !== undefined ? '?' : '';\n let typeStr = renderInputTsType(field.type, modelsWithInput, target);\n if (field.nullable) typeStr += ' | null';\n const line = `${quoteKey(field.name)}${opt}: ${typeStr};`;\n const jsdocParts: string[] = [];\n if (field.deprecated) jsdocParts.push('@deprecated');\n if (field.description) jsdocParts.push(field.description);\n return withFieldJsDoc(jsdocParts, line);\n}\n\n// ─── Output (post-transform wire shape) ──────────────────────────────────\n\nfunction camelToSnake(s: string): string {\n return s.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`);\n}\n\nfunction camelToPascal(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction applyOutputCase(name: string, c: 'camel' | 'snake' | 'pascal' | undefined): string {\n if (!c || c === 'camel') return name;\n if (c === 'snake') return camelToSnake(name);\n return camelToPascal(name);\n}\n\n/**\n * Emit `${name}Output` for a model in the output transitive set.\n * - Direct hits (model.outputCase set): rename keys per the transform and substitute nested refs.\n * - Transitive hits: keep field names as-is but substitute nested refs with their Output variants.\n *\n * `extends` is dropped for direct-hit models because the Zod schema flattens fields when an\n * ancestor has format(...) (see `flattenFormatChain` in codegen-contract); we mirror that here\n * so the plain interface matches the wire shape produced by the Zod transform.\n */\nfunction generateOutputModel(model: ModelNode, target: TsRenderTarget, modelsWithOutput: Set<string>): string[] {\n const lines: string[] = [];\n const outputCase = model.outputCase && model.outputCase !== 'camel' ? model.outputCase : undefined;\n const readFields = model.fields.filter(f => f.visibility !== 'writeonly');\n\n // Transitive-only (no direct outputCase): preserve `extends` and original key names.\n if (!outputCase) {\n const baseExt =\n model.bases?.[0] && modelsWithOutput.has(model.bases?.[0])\n ? ` extends ${model.bases?.[0]}Output`\n : model.bases?.[0]\n ? ` extends ${model.bases?.[0]}`\n : '';\n lines.push(`export interface ${model.name}Output${baseExt} {`);\n for (const field of readFields) {\n lines.push(` ${renderOutputField(field, model.outputCase, modelsWithOutput, target)}`);\n }\n lines.push('}');\n return lines;\n }\n\n // Direct hit: emit a flat interface with renamed keys.\n lines.push(`export interface ${model.name}Output {`);\n for (const field of readFields) {\n lines.push(` ${renderOutputField(field, outputCase, modelsWithOutput, target)}`);\n }\n lines.push('}');\n return lines;\n}\n\nfunction renderOutputField(\n field: FieldNode,\n outputCase: 'camel' | 'snake' | 'pascal' | undefined,\n modelsWithOutput: Set<string>,\n target: TsRenderTarget,\n): string {\n const opt = field.optional || field.default !== undefined ? '?' : '';\n const key = applyOutputCase(field.name, outputCase);\n let typeStr = renderOutputTsType(field.type, modelsWithOutput, target);\n if (field.nullable) typeStr += ' | null';\n const line = `${quoteKey(key)}${opt}: ${typeStr};`;\n const jsdocParts: string[] = [];\n if (field.deprecated) jsdocParts.push('@deprecated');\n if (field.description) jsdocParts.push(field.description);\n return withFieldJsDoc(jsdocParts, line);\n}\n","import type { OpRootNode, OpRouteNode, OpOperationNode, McpConfigNode, ParamSource, ContractTypeNode } from '@contractkit/core';\nimport { resolveModifiers, emittedResponses } from '@contractkit/core';\nimport { renderType, renderInputType, pascalToDotCase } from './codegen-contract.js';\nimport { inferService, deriveModulePath, buildArgs, deriveBaseName } from './codegen-operation.js';\nimport { quoteKey, escapeSingleQuoted } from './ts-render.js';\nimport { DECIMAL_IMPORT, DECIMAL_PRELUDE_LINES } from './decimal-runtime.js';\nimport { basename, dirname, relative } from 'node:path';\n\n// ─── Options ────────────────────────────────────────────────────────────────\n\nexport interface McpCodegenOptions {\n /** Absolute path of the file being generated. Used to compute relative imports. */\n outPath?: string;\n /** Map from schema identifier (model name / `${name}Input`) → absolute output file. */\n modelOutPaths?: Map<string, string>;\n /** Model names that have an Input variant schema. */\n modelsWithInput?: Set<string>;\n /** Model names that have an Output variant schema. */\n modelsWithOutput?: Set<string>;\n /** Import-path template for service implementations (same semantics as ServerConfig). */\n servicePathTemplate?: string;\n /** Emit tools for `internal` operations. Default false. */\n includeInternal?: boolean;\n}\n\n// ─── MCP flag helpers ─────────────────────────────────────────────────────\n\n/** The explicit settings block, if the operation used the object form of `mcp:`. */\nfunction mcpConfig(op: OpOperationNode): McpConfigNode | undefined {\n return op.mcp && typeof op.mcp === 'object' ? op.mcp : undefined;\n}\n\n/**\n * True if the root has at least one MCP-exposed operation. With `includeInternal: false`\n * (default) `internal` operations don't count. Mirrors `hasPublicOperations`.\n */\nexport function hasMcpOperations(root: OpRootNode, includeInternal = false): boolean {\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!op.mcp) continue;\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n return true;\n }\n }\n return false;\n}\n\n// ─── Name derivation ────────────────────────────────────────────────────────\n\n/** camelCase / PascalCase / spaced / hyphenated → snake_case. */\nfunction toSnake(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[\\s\\-.]+/g, '_')\n .toLowerCase()\n .replace(/[^a-z0-9_]/g, '')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '');\n}\n\n/** snake_case → PascalCase. */\nfunction toPascal(s: string): string {\n return s\n .split('_')\n .filter(Boolean)\n .map(p => p.charAt(0).toUpperCase() + p.slice(1))\n .join('');\n}\n\n/** Inferred snake_case tool name from method + path, e.g. GET /payments/{id} → get_payments_by_id. */\nfunction inferToolName(method: string, path: string): string {\n const parts: string[] = [method.toLowerCase()];\n for (const seg of path.split('/').filter(Boolean)) {\n if (seg.startsWith('{')) {\n parts.push('by', toSnake(seg.slice(1, -1)));\n } else {\n parts.push(toSnake(seg));\n }\n }\n return parts.filter(Boolean).join('_');\n}\n\n/** Tool name: explicit `mcp.name` (verbatim) → `sdk` → `name` → inferred; derived forms snake_cased. */\nfunction deriveToolName(op: OpOperationNode, route: OpRouteNode): string {\n const cfg = mcpConfig(op);\n if (cfg?.name) return cfg.name;\n if (op.sdk) return toSnake(op.sdk);\n if (op.name) return toSnake(op.name);\n return inferToolName(op.method, route.path);\n}\n\n/** Tool class name — PascalCase of the tool name with an `McpTool` suffix for clarity. */\nfunction deriveToolClassName(toolName: string): string {\n return `${toPascal(toolName)}McpTool`;\n}\n\n// ─── Input args schema ────────────────────────────────────────────────────\n\ninterface ArgsProp {\n key: string;\n expr: string;\n optional: boolean;\n}\n\n/** Build the flat args properties for a tool, matching the router's `buildArgs` variable names. */\nfunction buildArgsProps(route: OpRouteNode, op: OpOperationNode, modelsWithInput?: Set<string>): ArgsProp[] {\n const props: ArgsProp[] = [];\n\n // Path params — spread individually (inline) or as a single `params` object (ref/type).\n if (route.params) {\n if (route.params.kind === 'params') {\n for (const node of route.params.nodes) {\n props.push({ key: node.name, expr: renderInputType(node.type, modelsWithInput), optional: false });\n }\n } else if (route.params.kind === 'ref') {\n props.push({ key: 'params', expr: refSchema(route.params.name, modelsWithInput), optional: false });\n } else {\n props.push({ key: 'params', expr: renderInputType(route.params.node, modelsWithInput), optional: false });\n }\n }\n\n // Body — single JSON body maps to a `body` field; multipart/binary/multi bodies aren't cleanly\n // representable as JSON tool args, so they fall back to `z.unknown()` (advisory only).\n const bodies = op.request?.bodies ?? [];\n if (bodies.length === 1 && bodies[0]!.contentType === 'multipart/form-data') {\n props.push({ key: 'multipartBody', expr: 'z.unknown()', optional: false });\n } else if (bodies.length === 1) {\n props.push({ key: 'body', expr: renderInputType(bodies[0]!.bodyType, modelsWithInput), optional: false });\n } else if (bodies.length > 1) {\n props.push({ key: 'body', expr: 'z.unknown()', optional: false });\n }\n\n // Query / headers — whole objects, optional.\n if (op.query) props.push({ key: 'query', expr: paramSourceSchema(op.query, modelsWithInput), optional: true });\n if (op.headers) props.push({ key: 'headers', expr: paramSourceSchema(op.headers, modelsWithInput), optional: true });\n\n return props;\n}\n\nfunction refSchema(name: string, modelsWithInput?: Set<string>): string {\n return modelsWithInput?.has(name) ? `${name}Input` : name;\n}\n\nfunction paramSourceSchema(src: ParamSource, modelsWithInput?: Set<string>): string {\n if (src.kind === 'ref') return refSchema(src.name, modelsWithInput);\n if (src.kind === 'type') return renderInputType(src.node, modelsWithInput);\n const fields = src.nodes.map(n => `${quoteKey(n.name)}: ${renderInputType(n.type, modelsWithInput)}`).join(', ');\n return `z.object({ ${fields} })`;\n}\n\nfunction argsSchemaExpr(props: ArgsProp[]): string {\n if (props.length === 0) return 'z.object({})';\n const fields = props.map(p => `${quoteKey(p.key)}: ${p.expr}${p.optional ? '.optional()' : ''}`).join(', ');\n return `z.object({ ${fields} })`;\n}\n\n// ─── Output schema ──────────────────────────────────────────────────────────\n\n/**\n * The body an MCP tool reports as its output: the first body the service can actually return.\n *\n * Documented and thrown statuses are skipped — an MCP tool describes what a successful call\n * produces, not what the operation is allowed to document.\n */\nfunction primaryResponseBody(op: OpOperationNode): ContractTypeNode | undefined {\n for (const resp of emittedResponses(op)) {\n if (resp.bodies[0]) return resp.bodies[0].bodyType;\n }\n return undefined;\n}\n\n/** MCP output schemas must be objects — only model refs and inline objects qualify. */\nfunction outputSchemaExpr(op: OpOperationNode): string | undefined {\n const body = primaryResponseBody(op);\n if (!body) return undefined;\n if (body.kind === 'ref') return body.name;\n if (body.kind === 'inlineObject') return renderType(body);\n return undefined;\n}\n\n// ─── Annotations ────────────────────────────────────────────────────────────\n\nconst HINT_KEYS = ['readOnlyHint', 'destructiveHint', 'idempotentHint', 'openWorldHint'] as const;\n\nfunction annotationsExpr(cfg: McpConfigNode | undefined): string | undefined {\n if (!cfg) return undefined;\n const parts: string[] = [];\n for (const key of HINT_KEYS) {\n const val = cfg[key];\n if (val !== undefined) parts.push(`${key}: ${val}`);\n }\n return parts.length > 0 ? `{ ${parts.join(', ')} }` : undefined;\n}\n\n// ─── Schema-import collection ───────────────────────────────────────────────\n\nfunction walkTypeRefs(type: ContractTypeNode, ids: Set<string>, variant: 'input' | 'read', modelsWithInput?: Set<string>): void {\n switch (type.kind) {\n case 'ref':\n ids.add(variant === 'input' ? refSchema(type.name, modelsWithInput) : type.name);\n break;\n case 'array':\n walkTypeRefs(type.item, ids, variant, modelsWithInput);\n break;\n case 'tuple':\n type.items.forEach(t => walkTypeRefs(t, ids, variant, modelsWithInput));\n break;\n case 'record':\n walkTypeRefs(type.key, ids, variant, modelsWithInput);\n walkTypeRefs(type.value, ids, variant, modelsWithInput);\n break;\n case 'union':\n case 'discriminatedUnion':\n case 'intersection':\n type.members.forEach(t => walkTypeRefs(t, ids, variant, modelsWithInput));\n break;\n case 'inlineObject':\n type.fields.forEach(f => walkTypeRefs(f.type, ids, variant, modelsWithInput));\n break;\n case 'lazy':\n walkTypeRefs(type.inner, ids, variant, modelsWithInput);\n break;\n }\n}\n\nfunction walkSourceRefs(src: ParamSource | undefined, ids: Set<string>, modelsWithInput?: Set<string>): void {\n if (!src) return;\n if (src.kind === 'ref') ids.add(refSchema(src.name, modelsWithInput));\n else if (src.kind === 'params') src.nodes.forEach(n => walkTypeRefs(n.type, ids, 'input', modelsWithInput));\n else walkTypeRefs(src.node, ids, 'input', modelsWithInput);\n}\n\n/** Collect every schema identifier the emitted tools import (input variants + read variants for output). */\nfunction collectSchemaIds(ops: { route: OpRouteNode; op: OpOperationNode }[], modelsWithInput?: Set<string>): Set<string> {\n const ids = new Set<string>();\n for (const { route, op } of ops) {\n walkSourceRefs(route.params, ids, modelsWithInput);\n const bodies = op.request?.bodies ?? [];\n if (bodies.length === 1 && bodies[0]!.contentType !== 'multipart/form-data') {\n walkTypeRefs(bodies[0]!.bodyType, ids, 'input', modelsWithInput);\n }\n walkSourceRefs(op.query, ids, modelsWithInput);\n walkSourceRefs(op.headers, ids, modelsWithInput);\n\n const body = primaryResponseBody(op);\n if (body && (body.kind === 'ref' || body.kind === 'inlineObject')) walkTypeRefs(body, ids, 'read');\n }\n return ids;\n}\n\nfunction schemaImportLines(ids: Set<string>, options: McpCodegenOptions): string[] {\n const lines: string[] = [];\n const { modelOutPaths, outPath } = options;\n if (ids.size === 0) return lines;\n if (modelOutPaths && outPath) {\n const byFile = new Map<string, string[]>();\n const unresolved: string[] = [];\n for (const id of ids) {\n const p = modelOutPaths.get(id);\n if (p) {\n const group = byFile.get(p) ?? [];\n group.push(id);\n byFile.set(p, group);\n } else {\n unresolved.push(id);\n }\n }\n const fromDir = dirname(outPath);\n for (const [file, names] of byFile) {\n let rel = relative(fromDir, file).replace(/\\.ts$/, '.js');\n if (!rel.startsWith('.')) rel = './' + rel;\n lines.push(`import { ${names.sort().join(', ')} } from '${rel}';`);\n }\n for (const id of unresolved.sort()) lines.push(`import { ${id} } from './${pascalToDotCase(id)}.js';`);\n } else {\n for (const id of [...ids].sort()) lines.push(`import { ${id} } from './${pascalToDotCase(id)}.js';`);\n }\n return lines;\n}\n\n// ─── Zod scalar helper preludes ─────────────────────────────────────────────\n\nfunction scalarHelperLines(body: string): string[] {\n const lines: string[] = [];\n if (body.includes('_ZodBinary')) {\n lines.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`);\n }\n if (body.includes('_ZodDatetime')) {\n lines.push(\n `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`,\n );\n }\n if (body.includes('_ZodDecimal')) {\n lines.push(...DECIMAL_PRELUDE_LINES);\n }\n if (body.includes('_ZodInterval')) {\n lines.push(\n `const _ZodInterval = z.preprocess((val) => typeof val === 'string' ? Interval.fromISO(val) : val, z.custom<Interval>((val) => val instanceof Interval && val.isValid, { message: 'Must be an ISO 8601 interval' })).transform(val => val.toISO()!);`,\n );\n }\n if (body.includes('_ZodJson')) {\n lines.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`);\n lines.push(\n `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`,\n );\n }\n return lines;\n}\n\n// ─── Per-tool codegen ─────────────────────────────────────────────────────\n\ninterface ToolPlan {\n route: OpRouteNode;\n op: OpOperationNode;\n toolName: string;\n className: string;\n argsConstName: string;\n}\n\nfunction planTools(root: OpRootNode, includeInternal: boolean): ToolPlan[] {\n const plans: ToolPlan[] = [];\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!op.mcp) continue;\n if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;\n const toolName = deriveToolName(op, route);\n const className = deriveToolClassName(toolName);\n plans.push({ route, op, toolName, className, argsConstName: `${toPascal(toolName)}Args` });\n }\n }\n return plans;\n}\n\nfunction renderToolClass(plan: ToolPlan, file: string, options: McpCodegenOptions): string[] {\n const { route, op, toolName, className, argsConstName } = plan;\n const cfg = mcpConfig(op);\n const lines: string[] = [];\n\n // JSDoc source link\n const relFile = options.outPath ? relative(dirname(options.outPath), file) : file;\n lines.push('/**');\n lines.push(` * from [${basename(file)}](file://./${relFile}#L${op.loc.line})`);\n lines.push(' */');\n\n lines.push('@Injectable()');\n lines.push(`export class ${className} implements McpToolHandler {`);\n\n // definition\n lines.push(' readonly definition: Tool = {');\n lines.push(` name: '${escapeSingleQuoted(toolName)}',`);\n if (cfg?.title) lines.push(` title: '${escapeSingleQuoted(cfg.title)}',`);\n const desc = cfg?.description ?? op.description ?? route.description;\n if (desc) lines.push(` description: '${escapeSingleQuoted(desc)}',`);\n lines.push(` inputSchema: z.toJSONSchema(${argsConstName}, { unrepresentable: 'any' }) as Tool['inputSchema'],`);\n const outExpr = outputSchemaExpr(op);\n if (outExpr) lines.push(` outputSchema: z.toJSONSchema(${outExpr}, { unrepresentable: 'any' }) as Tool['outputSchema'],`);\n const annotations = annotationsExpr(cfg);\n if (annotations) lines.push(` annotations: ${annotations},`);\n lines.push(' };');\n lines.push('');\n\n // constructor injects the operation's service\n const service = inferService(op, route, file);\n lines.push(` constructor(private readonly service: ${service.className}) {}`);\n lines.push('');\n\n // handle\n const props = buildArgsProps(route, op, options.modelsWithInput);\n const destructure = props.map(p => p.key);\n const callArgs = buildArgs(route, op);\n const isVoid = !primaryResponseBody(op);\n const structured = !!outExpr;\n\n lines.push(' async handle(args: Record<string, unknown>, _context: McpToolContext): Promise<CallToolResult> {');\n if (destructure.length > 0) {\n lines.push(` const { ${destructure.join(', ')} } = await parseAndValidate(args, ${argsConstName});`);\n }\n if (isVoid) {\n lines.push(` await this.service.${service.methodName}(${callArgs});`);\n lines.push(` return { content: [{ type: 'text', text: 'OK' }] };`);\n } else {\n lines.push(` const result = await this.service.${service.methodName}(${callArgs});`);\n if (structured) {\n lines.push(` return { content: [{ type: 'text', text: JSON.stringify(result) }], structuredContent: result };`);\n } else {\n lines.push(` return { content: [{ type: 'text', text: JSON.stringify(result) }] };`);\n }\n }\n lines.push(' }');\n lines.push('}');\n\n return lines;\n}\n\n// ─── Public entry points ────────────────────────────────────────────────────\n\n/** The exported register-fn name for an op-root file, e.g. `payments.op` → `registerPaymentsMcpTools`. */\nexport function deriveMcpRegisterFnName(file: string): string {\n return `register${deriveBaseName(file)}McpTools`;\n}\n\n/** Generate one `<filename>.mcp.ts` for an op-root: tool handler classes + a per-file register fn. */\nexport function generateMcpFile(root: OpRootNode, options: McpCodegenOptions = {}): string {\n const includeInternal = options.includeInternal ?? false;\n const plans = planTools(root, includeInternal);\n\n // Args schema consts (also drive the JSON-Schema definitions).\n const argsConsts = plans.map(p => `const ${p.argsConstName} = ${argsSchemaExpr(buildArgsProps(p.route, p.op, options.modelsWithInput))};`);\n\n // Tool classes.\n const classes = plans.map(p => renderToolClass(p, root.file, options).join('\\n'));\n\n // Per-file register fn.\n const registerFn: string[] = [];\n registerFn.push(`/** Add this file's tools to the shared catalog. */`);\n registerFn.push(`export function ${deriveMcpRegisterFnName(root.file)}(map: McpToolHandlerMap, container: Container): void {`);\n for (const p of plans) registerFn.push(` map.set('${escapeSingleQuoted(p.toolName)}', container.get(${p.className}));`);\n registerFn.push('}');\n\n const bodyCore = [argsConsts.join('\\n'), classes.join('\\n\\n'), registerFn.join('\\n')].filter(Boolean).join('\\n\\n');\n\n // Zod scalar helper consts (must precede the args consts that reference them).\n const helperConsts = scalarHelperLines(bodyCore);\n const bodyWithHelpers = [helperConsts.join('\\n'), bodyCore].filter(Boolean).join('\\n\\n');\n\n // ── Imports ──\n const needsParseAndValidate = plans.some(p => buildArgsProps(p.route, p.op, options.modelsWithInput).length > 0);\n const imports: string[] = [];\n imports.push(`import { Injectable, type Container } from 'injectkit';`);\n imports.push(`import { z } from 'zod';`);\n\n const luxon: string[] = [];\n if (/\\bDateTime\\b/.test(bodyWithHelpers)) luxon.push('DateTime');\n if (/\\bInterval\\b/.test(bodyWithHelpers)) luxon.push('Interval');\n if (/\\bDuration\\b/.test(bodyWithHelpers)) luxon.push('Duration');\n if (luxon.length > 0) imports.push(`import { ${luxon.join(', ')} } from 'luxon';`);\n if (/\\bDecimal\\b/.test(bodyWithHelpers)) imports.push(DECIMAL_IMPORT);\n\n imports.push(`import type { CallToolResult, Tool } from '@modelcontextprotocol/sdk/types.js';`);\n imports.push(`import type { McpToolHandler, McpToolHandlerMap, McpToolContext } from '@maroonedsoftware/mcp';`);\n if (needsParseAndValidate) imports.push(`import { parseAndValidate } from '@maroonedsoftware/zod';`);\n\n // Service imports (one per distinct service used by the emitted tools).\n const serviceModules = new Map<string, string>();\n for (const p of plans) {\n const svc = inferService(p.op, p.route, root.file).className;\n if (!serviceModules.has(svc)) {\n serviceModules.set(svc, root.services?.[svc] ?? root.meta[svc] ?? deriveModulePath(svc, options.servicePathTemplate));\n }\n }\n for (const [svc, mod] of [...serviceModules.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n imports.push(`import { ${svc} } from '${mod}';`);\n }\n\n // Schema imports.\n imports.push(...schemaImportLines(collectSchemaIds(plans, options.modelsWithInput), options));\n\n const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file;\n const header = `// Auto-generated MCP tools\\n// generated from [${basename(root.file)}](file://./${relFile})`;\n\n return `${header}\\n${imports.join('\\n')}\\n\\n${bodyWithHelpers}\\n`;\n}\n\n/** One entry per emitted `<filename>.mcp.ts` for the aggregator to import. */\nexport interface McpAggregatorEntry {\n /** The file's exported register fn name, e.g. `registerPaymentsMcpTools`. */\n registerFn: string;\n /** Module specifier for the file, relative to the aggregator and `.js`-suffixed. */\n importPath: string;\n}\n\n/** Generate the aggregator `mcp.tools.ts` that assembles the single McpToolHandlerMap. */\nexport function generateMcpAggregator(entries: McpAggregatorEntry[]): string {\n const sorted = [...entries].sort((a, b) => a.registerFn.localeCompare(b.registerFn));\n const lines: string[] = [];\n lines.push(`import { type Container } from 'injectkit';`);\n lines.push(`import { McpToolHandlerMap } from '@maroonedsoftware/mcp';`);\n for (const e of sorted) lines.push(`import { ${e.registerFn} } from '${e.importPath}';`);\n lines.push('');\n lines.push('/** Build + register the MCP tool catalog. Call once at startup. */');\n lines.push('export function registerMcpTools(container: Container): McpToolHandlerMap {');\n lines.push(' const map = new McpToolHandlerMap();');\n for (const e of sorted) lines.push(` ${e.registerFn}(map, container);`);\n lines.push(' container.register(McpToolHandlerMap, { useValue: map });');\n lines.push(' return map;');\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\n\n/** Generate the optional `mcp.router.ts` — the standard ServerKit route wiring for the dispatcher. */\nexport function generateMcpRouter(options: { path?: string } = {}): string {\n const path = options.path ?? '/mcp';\n return `import { ServerKitRouter, bodyParserMiddleware, requireSignature } from '@maroonedsoftware/koa';\nimport { McpDispatcher, createMcpRequestContext, MCP_AUTH_POLICY } from '@maroonedsoftware/mcp';\n\n/** Mount the MCP endpoint onto a ServerKit router. Call \\`registerMcpTools(container)\\` at startup. */\nexport function mountMcp(router: ReturnType<typeof ServerKitRouter>): void {\n router.post('${path}', bodyParserMiddleware(['json']), requireSignature('mcp', { policy: MCP_AUTH_POLICY }), async (ctx) => {\n const dispatcher = ctx.container.get(McpDispatcher);\n const context = createMcpRequestContext({ requestId: ctx.requestId, logger: ctx.logger });\n if (dispatcher.sessionMode === 'stateful') {\n ctx.respond = false;\n await dispatcher.dispatchStateful(\n { req: ctx.req, res: ctx.res, body: ctx.parsedBody, sessionId: ctx.get('mcp-session-id') },\n context,\n );\n } else {\n const response = await dispatcher.dispatch(JSON.parse(String(ctx.rawBody)), context);\n if (response) ctx.body = response;\n else ctx.status = 202; // a notification — nothing to return\n }\n });\n}\n`;\n}\n","import { resolve, join, relative, dirname, isAbsolute } from 'node:path';\nimport type { ContractRootNode, OpRootNode } from '@contractkit/core';\nimport { collectTypeRefs, collectPublicTypeNames } from '@contractkit/core';\n\nexport const TEMPLATE_VAR_RE = /\\{\\w+\\}/;\n\n/**\n * Guard against path traversal in output-path templates. Output-path template variables\n * (`{area}`, `{dir}`, `{filename}`, `{name}`) can be sourced from a `.ck` file's\n * `options { keys }` block, so a malicious value like `../../../tmp/x` could escape the\n * plugin's output directory. After the final absolute path is computed, verify it stays\n * within `baseOutDir`; otherwise throw.\n */\nfunction assertWithinBase(baseOutDir: string, outPath: string): string {\n const rel = relative(resolve(baseOutDir), resolve(outPath));\n if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {\n throw new Error(\n `Refusing to emit outside output directory: resolved path \"${outPath}\" escapes \"${baseOutDir}\" (check options { keys } values used in output path templates)`,\n );\n }\n return outPath;\n}\n\nexport function resolveTemplate(template: string, vars: Record<string, string>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => vars[key] ?? `{${key}}`);\n}\n\nexport function includesFilename(p: string): boolean {\n const last = p.split('/').pop() ?? '';\n return last.includes('.');\n}\n\nexport function commonDir(files: string[], rootDir: string): string {\n if (files.length === 0) return resolve(rootDir);\n const parts = files.map(f => dirname(f).split('/'));\n const first = parts[0]!;\n let depth = first.length;\n for (const p of parts) {\n for (let i = 0; i < depth; i++) {\n if (p[i] !== first[i]) {\n depth = i;\n break;\n }\n }\n }\n return first.slice(0, depth).join('/') || '/';\n}\n\n// ─── Server / Zod output paths ─────────────────────────────────────────────\n\nexport function computeOpOutPath(\n filePath: string,\n baseDir: string,\n output: string | undefined,\n defaultSuffix: string,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string {\n const baseName = filePath.split('/').pop()!;\n const relDir = relative(commonRoot, dirname(filePath));\n const filename = baseName.replace(/\\.ck$/, '');\n const defaultName = `${filename}${defaultSuffix}`;\n const baseOutDir = resolve(baseDir);\n\n if (output && TEMPLATE_VAR_RE.test(output)) {\n const resolved = resolveTemplate(output, { filename, dir: relDir, ext: 'ck', ...meta });\n if (includesFilename(resolved)) return assertWithinBase(baseOutDir, join(baseOutDir, resolved));\n return assertWithinBase(baseOutDir, join(baseOutDir, resolved, defaultName));\n }\n if (output) {\n if (includesFilename(output)) return assertWithinBase(baseOutDir, join(baseOutDir, output));\n return assertWithinBase(baseOutDir, join(baseOutDir, output, relDir, defaultName));\n }\n return assertWithinBase(baseOutDir, join(baseOutDir, relDir, defaultName));\n}\n\nexport function computeContractOutPath(\n filePath: string,\n baseDir: string,\n output: string | undefined,\n defaultSuffix: string,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string {\n return computeOpOutPath(filePath, baseDir, output, defaultSuffix, commonRoot, meta);\n}\n\n// ─── SDK output paths ──────────────────────────────────────────────────────\n\nexport function computeSdkOutPath(\n filePath: string,\n rootDir: string,\n clientOutput: string | undefined,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string | null {\n if (!filePath.endsWith('.ck')) return null;\n const baseName = filePath.split('/').pop()!;\n const defaultOutName = baseName.replace(/\\.ck$/, '.client.ts');\n const baseOutDir = resolve(rootDir);\n const relDir = relative(commonRoot, dirname(filePath));\n const filename = baseName.replace(/\\.ck$/, '');\n\n if (clientOutput && TEMPLATE_VAR_RE.test(clientOutput)) {\n const resolved = resolveTemplate(clientOutput, { filename, dir: relDir, ext: 'ck', ...meta });\n if (includesFilename(resolved)) return assertWithinBase(baseOutDir, join(baseOutDir, resolved));\n return assertWithinBase(baseOutDir, join(baseOutDir, resolved, defaultOutName));\n }\n if (clientOutput) {\n if (includesFilename(clientOutput)) return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput));\n return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput, relDir, defaultOutName));\n }\n return assertWithinBase(baseOutDir, join(baseOutDir, relDir, defaultOutName));\n}\n\n/**\n * Resolve the output path for a synthesized `<area>.client.ts` — the file holding the\n * `<Area>Client` class that aggregates an area's inlined methods and subarea wiring.\n *\n * Uses the same `output.clients` template as leaf clients, with `{filename}` and `{area}`\n * substituted to the area name and `{subarea}` substituted to the empty string. Resulting\n * double-slashes from the empty substitution are collapsed, and a final segment that\n * would otherwise begin with a dot (e.g. `.client.ts` from `{subarea}.client.ts`) is\n * prefixed with the area so the file isn't hidden.\n */\nexport function computeSdkAreaClientOutPath(area: string, rootDir: string, clientOutput: string | undefined): string {\n const filename = area;\n const baseOutDir = resolve(rootDir);\n const fixHiddenSegment = (path: string): string => {\n const segments = path.split('/');\n const last = segments[segments.length - 1] ?? '';\n if (last.startsWith('.')) segments[segments.length - 1] = `${filename}${last}`;\n return segments.join('/');\n };\n if (clientOutput && TEMPLATE_VAR_RE.test(clientOutput)) {\n const resolved = resolveTemplate(clientOutput, { filename, dir: '', ext: 'ck', area, subarea: '' });\n const cleaned = fixHiddenSegment(resolved.replace(/\\/+/g, '/').replace(/^\\//, ''));\n if (includesFilename(cleaned)) return assertWithinBase(baseOutDir, join(baseOutDir, cleaned));\n return assertWithinBase(baseOutDir, join(baseOutDir, cleaned, `${filename}.client.ts`));\n }\n if (clientOutput) {\n if (includesFilename(clientOutput)) return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput));\n return assertWithinBase(baseOutDir, join(baseOutDir, clientOutput, `${filename}.client.ts`));\n }\n return assertWithinBase(baseOutDir, join(baseOutDir, `${filename}.client.ts`));\n}\n\nexport function computeSdkTypeOutPath(\n filePath: string,\n rootDir: string,\n typeOutput: string,\n commonRoot: string,\n meta: Record<string, string> = {},\n): string | null {\n if (!filePath.endsWith('.ck')) return null;\n const baseName = filePath.split('/').pop()!;\n const defaultOutName = baseName.replace(/\\.ck$/, '.ts');\n const baseOutDir = resolve(rootDir);\n const relDir = relative(commonRoot, dirname(filePath));\n const filename = baseName.replace(/\\.ck$/, '');\n\n if (TEMPLATE_VAR_RE.test(typeOutput)) {\n const resolved = resolveTemplate(typeOutput, { filename, dir: relDir, ext: 'ck', ...meta });\n if (includesFilename(resolved)) return assertWithinBase(baseOutDir, join(baseOutDir, resolved));\n return assertWithinBase(baseOutDir, join(baseOutDir, resolved, defaultOutName));\n }\n if (includesFilename(typeOutput)) return assertWithinBase(baseOutDir, join(baseOutDir, typeOutput));\n return assertWithinBase(baseOutDir, join(baseOutDir, typeOutput, relDir, defaultOutName));\n}\n\nexport function generateBarrelFiles(contractPaths: string[]): { outPath: string; content: string }[] {\n const byDir = new Map<string, string[]>();\n for (const outPath of contractPaths) {\n const dir = dirname(outPath);\n const group = byDir.get(dir) ?? [];\n group.push(outPath);\n byDir.set(dir, group);\n }\n const results: { outPath: string; content: string }[] = [];\n for (const [dir, files] of byDir) {\n const exports = files\n .map(f => `export * from './${f.split('/').pop()!.replace(/\\.ts$/, '.js')}';`)\n .sort()\n .join('\\n');\n results.push({ outPath: join(dir, 'index.ts'), content: `// Auto-generated barrel file\\n${exports}\\n` });\n }\n return results;\n}\n\nexport function computePubliclyReachableTypes(\n opAsts: OpRootNode[],\n contractAsts: ContractRootNode[],\n modelsWithInput: Set<string>,\n modelsWithOutput: Set<string> = new Set(),\n): Set<string> | null {\n if (opAsts.length === 0) return null;\n const reachable = new Set<string>();\n for (const opAst of opAsts) {\n for (const name of collectPublicTypeNames(opAst, modelsWithInput, modelsWithOutput)) reachable.add(name);\n }\n const modelDeps = new Map<string, Set<string>>();\n for (const contractAst of contractAsts) {\n for (const model of contractAst.models) {\n const deps = new Set<string>();\n if (model.bases) for (const b of model.bases) deps.add(b);\n if (model.type) collectTypeRefs(model.type, deps);\n for (const field of model.fields) collectTypeRefs(field.type, deps);\n modelDeps.set(model.name, deps);\n }\n }\n const frontier = [...reachable];\n while (frontier.length > 0) {\n const name = frontier.pop()!;\n const baseName = name.endsWith('Input') ? name.slice(0, -5) : name.endsWith('Output') ? name.slice(0, -6) : name;\n for (const dep of modelDeps.get(baseName) ?? []) {\n if (!reachable.has(dep)) {\n reachable.add(dep);\n frontier.push(dep);\n }\n if (modelsWithInput.has(dep)) {\n const inputDep = `${dep}Input`;\n if (!reachable.has(inputDep)) {\n reachable.add(inputDep);\n frontier.push(inputDep);\n }\n }\n if (modelsWithOutput.has(dep)) {\n const outputDep = `${dep}Output`;\n if (!reachable.has(outputDep)) {\n reachable.add(outputDep);\n frontier.push(outputDep);\n }\n }\n }\n }\n return reachable;\n}\n"],"mappings":"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AAK5N,QAAQ,WAAW,EAAA;AACrC,SAAO2N,cAAczP,SAASsM,IAAAA,IAAQA,OAAOoD;AACjD;AALSP;AAOT,SAASI,sBAAqB7O,MAAciP,UAAiB;AACzD,QAAMrD,OACF5L,KACKgI,MAAM,GAAA,EACN6D,IAAG,GACFzK,QAAQ,cAAc,EAAA,KAAO;AACvC,QAAM8N,SAAStD,KAAK5D,MAAM,GAAA,EAAK,CAAA,KAAM4D;AACrC,MAAIqD,UAAU;AACV,WAAOA,SAAS7N,QAAQ,eAAe8N,MAAAA,EAAQ9N,QAAQ,aAAawK,IAAAA;EACxE;AACA,SAAO,YAAYsD,MAAAA;AACvB;AAXSL,OAAAA,uBAAAA;AAgBF,SAASM,qBAAAA;AACZ,SAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACArN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACFD,KAAK,IAAA;AACX;AA3FgBsN;AAgGhB,IAAMC,wBAAwB;EAC1BC,KAAK;EACLC,OAAO;EACPC,WAAW;EACXC,YAAY;EACZC,YAAY;AAChB;AAiBO,SAASC,uBAAuBC,OAA8C;AACjF,QAAMC,eAAuC,CAAC;AAC9C,MAAID,MAAME,KAAKR,IAAKO,cAAaP,MAAMD,sBAAsBC;AAC7D,MAAIM,MAAME,KAAKP,MAAOM,cAAaN,QAAQF,sBAAsBE;AAEjE,MAAIK,MAAME,KAAKC,QAASF,cAAa,YAAA,IAAgBR,sBAAsBG;AAE3E,QAAMQ,kBAA0C;IAAEN,YAAYL,sBAAsBK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","names":["resolve","join","relative","dirname","basename","existsSync","readFileSync","writeFileSync","mkdirSync","rmSync","readdirSync","rmdirSync","relative","dirname","collectTypeRefs","computeModelsWithOutput","ckComputeModelsWithOutput","collectExternalOutputRefs","ckCollectExternalOutputRefs","JSON_VALUE_TYPE_DECL","quoteKey","name","test","escapeJsDocLines","text","replace","split","escapeSingleQuoted","s","headerNameToProperty","parts","filter","Boolean","map","p","i","lower","toLowerCase","charAt","toUpperCase","slice","join","renderTsType","type","target","kind","renderTsScalar","inner","item","needsParens","items","key","value","values","v","String","members","m","renderTsInlineObject","fields","_exhaustive","Error","entries","f","opt","optional","renderInputTsType","modelsWithInput","size","has","renderOutputTsType","modelsWithOutput","DECIMAL_IMPORT","DECIMAL_CONFIG_LINE","DECIMAL_ZOD_SCHEMA_LINE","DECIMAL_PRELUDE_LINES","DECIMAL_COERCE_DECL","reviveFnName","model","variant","applyCase","name","caseTransform","replace","c","toLowerCase","charAt","toUpperCase","slice","typeReachesDecimal","type","opts","kind","modelsWithDecimal","has","item","inner","items","some","t","value","members","fields","f","Scope","n","next","prefix","emit","slot","path","scope","reviveRefName","arr","i","map","l","flatMap","idx","rec","k","relevant","filter","length","obj","body","fieldStatements","undefined","m","real","target","find","branches","disc","member","tag","discriminatorTag","discriminator","push","JSON","stringify","modelMap","get","field","values","objVar","outputCase","key","optional","nullable","modelsWithOutput","renderInlineReviver","fnName","tsType","renderReviveFunctions","lines","renderOne","typeName","modeToWrapper","mode","computeModelsWithInput","models","externalModelsWithInput","Set","result","model","fields","some","f","visibility","add","name","changed","has","refs","field","collectTypeRefs","type","bases","b","ref","generateComments","outPath","lines","push","deprecated","description","l","escapeJsDocLines","relPath","relative","dirname","loc","file","line","generateContract","root","context","needsDateTime","rootNeedsDateTime","needsDuration","rootNeedsScalar","needsInterval","needsBinary","needsDatetime","needsJson","needsDecimal","externalRefs","collectExternalRefs","modelsWithInput","localModelsWithInput","allModelsWithInput","externalModelsWithOutput","modelsWithOutput","localModelsWithOutput","ckComputeModelsWithOutput","allModelsWithOutput","externalInputRefs","size","collectExternalInputRefs","externalOutputRefs","ckCollectExternalOutputRefs","allExternalRefs","sort","luxonImports","length","join","DECIMAL_IMPORT","importPath","resolveImportPath","names","emitRevivers","modelsWithDecimal","reviveFnName","DECIMAL_PRELUDE_LINES","modelsWithWriteonly","filter","m","map","modelMap","Map","reviveOpts","undefined","bodyLines","topoSortModels","generateModel","currentOutPath","revivers","renderReviveFunctions","includes","DECIMAL_COERCE_DECL","flattenFormatChain","firstBase","parent","get","flatParent","parentHasFormat","inputCase","outputCase","merged","set","values","generateTypeAlias","effective","needsInputSplit","generateThreeSchemaModel","generateSimpleModel","renderType","renderInputType","wrapper","hasInputTransform","hasOutputTransform","inputBody","renderFieldsAsSnakeCase","renderFieldsAsPascalCase","renderFields","inputKey","applyCase","outputKey","optional","guard","quoteKey","typeSource","body","head","tail","slice","buildExtendChain","resolveName","collectEffectiveWritableFieldNames","modelName","base","delete","allFields","hasWriteonly","baseBody","readFields","readBody","writeFields","writeBody","renderInputFields","fieldsToOmit","omitClause","camelToSnake","s","replace","c","toLowerCase","camelToPascal","charAt","toUpperCase","caseTransform","defaultMode","flatMap","renderField","pascalKey","expr","default","nullable","dv","escapeString","String","snakeKey","parseCaseTransform","kind","renderScalar","renderArray","renderTuple","renderRecord","renderEnum","renderLiteral","renderUnion","renderDiscriminatedUnion","renderIntersection","inner","renderInlineObject","renderRegexLiteral","source","regexHasAnchor","startsWith","endsWith","i","backslashes","e","min","max","len","regex","checks","scale","messageParts","fmt","format","validParts","validation","message","_exhaustive","Error","a","item","t","items","r","key","value","vals","v","u","members","discriminator","first","rest","every","member","fieldLines","o","snakeLines","joined","transformEntries","pascalLines","renderInputScalar","renderInputField","renderQueryType","renderQueryField","isValidIdentifier","test","typeNeedsDateTime","typeNeedsScalar","localNames","collectInputTypeRefs","out","forEach","deps","localDeps","inDegree","d","dep","remaining","queue","sorted","shift","other","rem","refName","refOutPath","modelOutPaths","fromDir","rel","moduleName","pascalToDotCase","resolveModifiers","resolveSecurity","SECURITY_NONE","classifyContentType","emittedResponses","basename","dirname","relative","bodyParserToken","contentType","classifyContentType","bodyTypesStructurallyEqual","a","b","kind","bb","name","min","max","len","scale","regex","format","item","items","length","every","x","i","key","value","values","v","members","m","discriminator","lazy","inner","mode","fields","f","g","optional","nullable","visibility","default","deprecated","type","generateOp","root","options","types","collectTypes","modelsWithInput","modelsWithOutput","services","collectServices","routerName","deriveRouterName","file","lines","push","relFile","outPath","relative","dirname","basename","includeInternal","route","routes","op","operations","resolveModifiers","includes","generateHandler","handlerBody","join","references","symbol","RegExp","test","helpers","DECIMAL_PRELUDE_LINES","needsZodJson","generated","uses","body","koaImports","filter","svc","modulePath","meta","deriveModulePath","servicePathTemplate","usedTypes","generateTypeImports","luxonImports","DECIMAL_IMPORT","allContent","needsZod","desc","description","l","escapeJsDocLines","loc","line","effectiveSecurity","resolveSecurity","SECURITY_NONE","mods","method","path","replace","bodies","request","hasBody","isSingleMultipart","middlewares","policy","args","undefined","parserTokens","Array","from","Set","map","tokensExpr","t","signature","sigArgs","signaturePolicy","escapeSingleQuoted","middlewareStr","generateParamValidation","params","paramsMode","query","queryMode","headers","headersMode","renderInputType","bodyType","annotation","emitted","emittedResponses","serviceParts","inferService","call","methodName","buildArgs","generateMultiStatusResult","className","generateSingleStatusResult","resp","respHeaders","hasRespHeaders","headersAnnotation","renderHeadersAnnotation","bodySchema","prelude","formatTypeAnnotation","responseBodySchema","rendered","renderResponseMembers","includeStatus","varPrefix","preludes","statusCode","responses","headerSetLines","responseBodyExpr","bodySchemas","Map","set","member","get","opts","leading","trailing","uniform","h","quoteKey","headerNameToProperty","renderOutputTsType","indent","accessor","JSON","stringify","service","cls","split","baseName","deriveBaseName","inferMethodName","hasParam","nodes","p","serverTsScalar","_exhaustive","Error","String","varName","has","schema","renderType","isRevalidatable","modelsWithTransform","rec","first","rest","usesExtendChain","preludeVar","validateResponses","source","ctxExpr","suffix","isQuery","typeName","lhs","modeToWrapper","param","isValidIdentifier","renderQueryType","node","opFile","modelOutPaths","byFile","unresolved","typeOutPath","group","fromDir","names","rel","startsWith","sort","moduleName","pascalToDotCase","typeImport","deriveTypeImportPath","typeImportPathTemplate","collectParamSourceRefs","collectParamSourceInputRefs","collectTypeNodeRefs","collectInputTypeNodeRefs","collectOutputTypeNodeRefs","out","add","forEach","inferredService","base","pop","s","charAt","toUpperCase","slice","serviceName","template","kebab","toLowerCase","module","runIncrementalCodegen","parseIncrementalManifest","emptyIncrementalManifest","serializeIncrementalManifest","hashFingerprint","collectTransitiveModelRefs","computeModelsWithCaseTransform","computeModelsWithDecimal","resolveModifiers","isJsonMime","classifyContentType","observableResponses","thrownResponses","basename","dirname","relative","jsonOrFormSerialize","varName","contentType","renderSerializeExpr","bodies","ctVar","arms","slice","last","length","expr","i","arm","classifyBodyStrategy","op","request","kind","body","every","b","bodyTypesStructurallyEqual","bodyType","some","hasPublicOperations","root","includeInternal","route","routes","operations","resolveModifiers","includes","generateSdk","options","lines","types","collectTypes","modelsWithInput","modelsWithOutput","clientClassName","deriveClientClassName","file","inlineRevivers","Map","classBody","mods","push","generateMethod","inlineReviverDecls","values","flat","decimalPrelude","decimalPreludeFor","generateTypeImports","usedRevivers","imports","sdkOptionsPath","outPath","rel","relative","dirname","replace","startsWith","jsonImport","sdkNeedsJson","valueImports","sdkNeedsBigIntReplacer","sdkNeedsBigIntReviver","sdkNeedsQueryString","sdkNeedsReadContentType","join","JSON_VALUE_TYPE_DECL","errorAliases","generateErrorBodyAliases","decls","decl","relFile","basename","generateClientMethods","methodNames","deriveMethodName","declLines","preludeLines","flatMap","needsDecimalImport","l","DECIMAL_IMPORT","DECIMAL_CONFIG_LINE","DECIMAL_COERCE_DECL","found","Set","m","matchAll","add","sort","revive","modelsWithDecimal","size","modelMap","nameHint","undefined","methodName","mRevive","hint","charAt","toUpperCase","httpMethod","method","params","buildMethodParams","paramStr","map","p","name","optional","type","observable","observableResponses","thrown","thrownResponses","isMultiStatus","primaryResponse","primaryBodies","isVoid","respHeaders","headers","hasRespHeaders","headersShape","renderSdkHeadersShape","returnMembers","returnType","r","sdkResponseMembers","dataType","sdkDataType","expectStatuses","filter","statusCode","desc","description","errorBodyName","errorBodyTypeName","tags","contentLines","t","escapeJsDocLines","member","urlExpr","buildUrlExpression","path","hasQuery","query","fetchUrl","strategy","hasBody","hasOpHeaders","defaultCt","nonMultipart","find","fetchArgs","cat","classifyContentType","lastHeaderIdx","findIndex","a","existing","inner","needsResult","resultPrefix","split","fallback","rest","resp","sdkReturnLines","headerEntries","sdkHeaderEntries","sdkReadExpr","category","renderOutputTsType","tsType","read","reviver","reviveExprFor","segment","ctx","opts","typeReachesDecimal","refName","pick","reviveFnName","has","direct","item","fnName","renderInlineReviver","set","fields","h","quoteKey","headerNameToProperty","includeStatus","leading","trailing","dataTypes","indent","cast","entries","first","fallbackFields","_","_match","nodes","renderInputTsType","typeName","node","ctUnion","sdk","nameToMethodName","inferMethodName","parts","Boolean","toLowerCase","segments","s","seg","paramName","segParts","sp","deriveBaseName","base","pop","deriveClientPropertyName","getAreaSubarea","area","meta","subarea","pascal","value","camel","deriveAreaClientClassName","deriveAreaPropertyName","deriveSubareaClientClassName","deriveSubareaPropertyName","publicOps","collectParamSourceRefs","collectParamSourceInputRefs","collectTypeNodeRefs","collectInputTypeNodeRefs","responses","collectOutputTypeNodeRefs","out","members","forEach","f","source","param","test","isJsonMime","check","src","typeNeedsScalar","items","key","opFile","revivers","modelOutPaths","byFile","unresolved","typeOutPath","get","group","fromDir","names","fromHere","reviverModelName","moduleName","pascalToDotCase","typeImport","deriveTypeImportPath","typeImportPathTemplate","namesInModule","stem","template","module","generateSdkOptions","SCAFFOLD_DEP_VERSIONS","zod","luxon","decimalJs","typesLuxon","typescript","generateSdkPackageJson","input","dependencies","deps","decimal","devDependencies","pkg","version","main","exports","import","files","scripts","build","Object","keys","JSON","stringify","generateSdkTsconfig","tsconfig","compilerOptions","target","moduleResolution","declaration","outDir","rootDir","strict","esModuleInterop","skipLibCheck","forceConsistentCasingInFileNames","include","exclude","generateAreaClient","inlineFiles","subareaClients","className","collectedMethodLines","collectedRevivePrelude","areaNeedsDecimalImport","reviversByImportPath","collectedErrorAliases","seenMethods","typesByImportPath","unresolvedTypes","needsJson","needsBigIntReplacer","needsBigIntReviver","needsQueryString","needsReadContentType","inline","codegenOptions","methodLines","Error","alias","modelOut","typesForFile","sdkOptionsRel","importedClients","sc","client","importPath","propertyName","fetchModifier","ln","generateSdkAggregator","sdkOptionsImportPath","sdkClassName","pushClientImport","c","areas","topLevelClients","relative","dirname","computeModelsWithOutput","collectExternalOutputRefs","generatePlainTypes","root","context","target","externalRefs","collectExternalRefs","lines","externalModelsWithInput","modelsWithInput","Set","localModelsWithInput","computeModelsWithInput","models","allModelsWithInput","externalModelsWithOutput","modelsWithOutput","localModelsWithOutput","computeModelsWithOutput","allModelsWithOutput","externalInputRefs","size","collectExternalInputRefs","externalOutputRefs","collectExternalOutputRefs","allExternalRefs","sort","needsDecimal","rootNeedsScalar","emitRevivers","modelsWithDecimal","some","m","has","name","push","DECIMAL_IMPORT","ref","importPath","resolveImportPath","reviveFnName","length","jsonValueImportPath","JSON_VALUE_TYPE_DECL","modelMap","Map","map","reviveOpts","undefined","bodyLines","model","topoSortModels","generateModel","currentOutPath","revivers","renderReviveFunctions","DECIMAL_CONFIG_LINE","l","includes","DECIMAL_COERCE_DECL","join","outPath","type","generateTypeAlias","needsInputSplit","fields","f","visibility","generateVisibilityModel","generateSimpleModel","generateOutputModel","collectInheritedFieldNames","bases","result","visit","get","add","b","computeOverrideNames","inherited","filter","override","generateComments","deprecated","description","escapeJsDocLines","relPath","relative","dirname","loc","file","line","renderTsType","renderInputTsType","renderOutputTsType","buildExtendsClause","overrideNames","baseNameResolver","omitKeys","n","wrapped","field","renderField","readFields","writeFields","inputResolver","renderInputField","withFieldJsDoc","jsdocParts","contentLines","body","opt","optional","default","typeStr","nullable","quoteKey","camelToSnake","s","replace","c","toLowerCase","camelToPascal","charAt","toUpperCase","slice","applyOutputCase","outputCase","baseExt","renderOutputField","key","resolveModifiers","emittedResponses","basename","dirname","relative","mcpConfig","op","mcp","undefined","hasMcpOperations","root","includeInternal","route","routes","operations","resolveModifiers","includes","toSnake","s","replace","toLowerCase","toPascal","split","filter","Boolean","map","p","charAt","toUpperCase","slice","join","inferToolName","method","path","parts","seg","startsWith","push","deriveToolName","cfg","name","sdk","deriveToolClassName","toolName","buildArgsProps","modelsWithInput","props","params","kind","node","nodes","key","expr","renderInputType","type","optional","refSchema","bodies","request","length","contentType","bodyType","query","paramSourceSchema","headers","has","src","fields","n","quoteKey","argsSchemaExpr","primaryResponseBody","resp","emittedResponses","outputSchemaExpr","body","renderType","HINT_KEYS","annotationsExpr","val","walkTypeRefs","ids","variant","add","item","items","forEach","t","value","members","f","inner","walkSourceRefs","collectSchemaIds","ops","Set","schemaImportLines","options","lines","modelOutPaths","outPath","size","byFile","Map","unresolved","id","get","group","set","fromDir","dirname","file","names","rel","relative","sort","pascalToDotCase","scalarHelperLines","DECIMAL_PRELUDE_LINES","planTools","plans","className","argsConstName","renderToolClass","plan","relFile","basename","loc","line","escapeSingleQuoted","title","desc","description","outExpr","annotations","service","inferService","destructure","callArgs","buildArgs","isVoid","structured","methodName","deriveMcpRegisterFnName","deriveBaseName","generateMcpFile","argsConsts","classes","registerFn","bodyCore","helperConsts","bodyWithHelpers","needsParseAndValidate","some","imports","luxon","test","DECIMAL_IMPORT","serviceModules","svc","services","meta","deriveModulePath","servicePathTemplate","mod","entries","a","b","localeCompare","header","generateMcpAggregator","sorted","e","importPath","generateMcpRouter","resolve","join","relative","dirname","isAbsolute","collectTypeRefs","collectPublicTypeNames","TEMPLATE_VAR_RE","assertWithinBase","baseOutDir","outPath","rel","relative","resolve","startsWith","isAbsolute","Error","resolveTemplate","template","vars","replace","_","key","includesFilename","p","last","split","pop","includes","commonDir","files","rootDir","length","parts","map","f","dirname","first","depth","i","slice","join","computeOpOutPath","filePath","baseDir","output","defaultSuffix","commonRoot","meta","baseName","relDir","filename","defaultName","test","resolved","dir","ext","computeContractOutPath","computeSdkOutPath","clientOutput","endsWith","defaultOutName","computeSdkAreaClientOutPath","area","fixHiddenSegment","path","segments","subarea","cleaned","computeSdkTypeOutPath","typeOutput","generateBarrelFiles","contractPaths","byDir","Map","group","get","push","set","results","exports","sort","content","computePubliclyReachableTypes","opAsts","contractAsts","modelsWithInput","modelsWithOutput","Set","reachable","opAst","name","collectPublicTypeNames","add","modelDeps","contractAst","model","models","deps","bases","b","type","collectTypeRefs","field","fields","frontier","dep","has","inputDep","outputDep","TYPESCRIPT_CODEGEN_VERSION","CACHE_MANIFEST_FILENAME","plugin","name","generateTargets","inputs","ctx","config","options","runTypescriptCodegen","rootDir","createTypescriptPlugin","assertValidConfig","server","validateResponses","zod","Error","manifestPath","resolve","cacheDir","prevManifest","cacheEnabled","readManifest","emptyIncrementalManifest","units","globalFiles","collectServerOutput","sdk","collectSdkOutput","collectZodOutput","types","collectTypesOutput","mcp","collectMcpOutput","result","runIncrementalCodegen","codegenVersion","fileExists","existsSync","deleteStalePaths","deletedPaths","relativePath","content","ifAbsent","filesToWrite","emitFile","undefined","writeManifest","manifest","buildModelMap","contractRoots","map","Map","root","model","models","set","collectContractRootRefs","modelMap","seeds","m","type","push","f","fields","bases","b","kind","collectTransitiveModelRefs","collectOpRootRefs","route","routes","params","paramSourceTypes","op","operations","query","headers","request","body","bodies","bodyType","resp","responses","h","src","out","n","nodes","node","sliceOutPathMap","refs","modelOutPaths","modelsWithInput","modelsWithOutput","slice","ref","sort","p","get","has","ip","sliceModelSet","ownNames","serverBase","baseDir","modelsWithTransform","computeModelsWithCaseTransform","flatMap","r","allFiles","file","opRoots","commonRoot","commonDir","subConfigKey","stableSubConfig","serverModelOutPaths","typeEntries","output","ast","typeOutPath","computeContractOutPath","meta","Set","fingerprint","hashFingerprint","v","outPath","outPathSlice","sub","key","render","renderCtx","currentOutPath","target","generateContract","generatePlainTypes","computeOpOutPath","servicePathTemplate","includeInternal","generateOp","sdkBase","sdkName","sdkOutput","sdkEntryPath","join","TEMPLATE_VAR_RE","test","resolveTemplate","sdkOptionsPath","dirname","modelsWithDecimal","computeModelsWithDecimal","ckCommonRoot","sdkModelOutPaths","sdkTypePaths","sdkClientInfos","sdkContractEntries","publicTypes","computePubliclyReachableTypes","computeSdkTypeOutPath","some","emitRevivers","rel","relative","replace","startsWith","jsonValueImportPath","areaBuckets","topLevelEntries","clients","sdkOutPath","computeSdkOutPath","hasPublicOperations","area","subarea","getAreaSubarea","bucket","leaves","inlineRoots","entries","leaf","className","deriveSubareaClientClassName","propertyName","deriveSubareaPropertyName","generateSdk","typeImportPathTemplate","clientClassName","deriveClientClassName","deriveClientPropertyName","generateSdkOptions","hasAnything","length","size","areaClientOutPaths","sdkEntryDir","sdkOptionsRel","sdkOptionsImportPath","sdkClassName","split","s","charAt","toUpperCase","toClientImport","sourceDir","info","importPath","topLevelClients","e","areaInfos","sortedAreas","a","localeCompare","areaClientOutPath","computeSdkAreaClientOutPath","areaClassName","deriveAreaClientClassName","areaPropertyName","deriveAreaPropertyName","subareaClients","l","client","allInlineRefs","add","inlineFilesForGen","codegenOptions","generateAreaClient","inlineFiles","generateSdkAggregator","areas","sdkSrcDir","sdkTypeBarrels","generateBarrelFiles","barrel","rootExports","basename","c","scaffold","coveredRoots","deps","luxon","rootNeedsScalar","decimal","generateSdkPackageJson","generateSdkTsconfig","zodBase","typesBase","resolveMcpModelOutPaths","base","template","suffix","fullConfig","mcpBase","hasMcpOperations","tools","generateMcpFile","registerFn","deriveMcpRegisterFnName","indexPath","index","aggregatorEntries","generateMcpAggregator","emitRouter","routerPath","router","generateMcpRouter","path","parseIncrementalManifest","readFileSync","mkdirSync","recursive","writeFileSync","serializeIncrementalManifest","absPaths","removedDirs","abs","rmSync","force","dir","current","readdirSync","rmdirSync","JSON","stringify"]}