@manifesto-ai/codegen 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,7 +23,7 @@ DomainSchema -> CODEGEN -> Generated Files
23
23
 
24
24
  | Responsibility | Description |
25
25
  |----------------|-------------|
26
- | Generate canonical domain facades | DomainSchema -> `<domain>.mel.ts` with `state` / `computed` / `actions` |
26
+ | Generate canonical domain facades | DomainSchema -> `<domain>.domain.ts` with `state` / `computed` / `actions` |
27
27
  | Generate legacy TS/Zod artifacts | Optional low-level `types.ts` / `base.ts` output |
28
28
  | Generate Zod schemas | DomainSchema types -> Zod validators with type annotations |
29
29
  | Plugin pipeline | Run plugins sequentially with shared artifacts |
@@ -71,11 +71,11 @@ const result = await generate({
71
71
  plugins: [createDomainPlugin()],
72
72
  });
73
73
 
74
- // result.files -> [{ path: "src/domain/hello.mel.ts", content: "..." }]
74
+ // result.files -> [{ path: "src/domain/hello.domain.ts", content: "..." }]
75
75
  // result.diagnostics -> [] (empty = no warnings or errors)
76
76
  ```
77
77
 
78
- For bundler-time emission, inject Codegen explicitly into the compiler plugin:
78
+ For compiler-driven emission during dev or build, inject Codegen explicitly into the compiler plugin:
79
79
 
80
80
  ```typescript
81
81
  import { defineConfig } from "vite";
@@ -85,7 +85,10 @@ import { createCompilerCodegen } from "@manifesto-ai/codegen";
85
85
  export default defineConfig({
86
86
  plugins: [
87
87
  melPlugin({
88
- codegen: createCompilerCodegen(),
88
+ codegen: {
89
+ emit: createCompilerCodegen(),
90
+ timing: "transform",
91
+ },
89
92
  }),
90
93
  ],
91
94
  });
@@ -93,7 +96,7 @@ export default defineConfig({
93
96
 
94
97
  This produces a canonical domain facade:
95
98
 
96
- **src/domain/hello.mel.ts**
99
+ **src/domain/hello.domain.ts**
97
100
  ```typescript
98
101
  export interface HelloDomain {
99
102
  readonly state: {
@@ -189,14 +192,14 @@ Same DomainSchema always produces byte-identical output files. Fields and types
189
192
  | Relationship | Package | How |
190
193
  |--------------|---------|-----|
191
194
  | Depends on | `@manifesto-ai/core` | Reads DomainSchema, TypeDefinition, TypeSpec |
192
- | Used by | Build scripts | Called during build to generate type-safe code |
195
+ | Used by | Build scripts / compiler plugin | Called during dev or build to generate type-safe code |
193
196
 
194
197
  ---
195
198
 
196
199
  ## When to Use Codegen
197
200
 
198
201
  Use Codegen when:
199
- - You want a canonical `<domain>.mel.ts` facade for `createManifesto<T>()`
202
+ - You want a canonical `<domain>.domain.ts` facade for `createManifesto<T>()`
200
203
  - You want type-safe TypeScript interfaces from your DomainSchema
201
204
  - You want Zod runtime validators that match your schema types
202
205
  - You need deterministic, reproducible code generation in CI
package/dist/index.js CHANGED
@@ -954,10 +954,11 @@ function deriveInterfaceName(ctx) {
954
954
  }
955
955
  function deriveFileName(sourceId) {
956
956
  if (!sourceId) {
957
- return "domain.ts";
957
+ return "domain.domain.ts";
958
958
  }
959
959
  const normalized = sourceId.replace(/\\/g, "/");
960
- return `${normalized}.ts`;
960
+ const stem = normalized.replace(/\.[^.]+$/, "");
961
+ return `${stem}.domain.ts`;
961
962
  }
962
963
  function basenameWithoutExtension(sourceId) {
963
964
  if (!sourceId) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runner.ts","../src/virtual-fs.ts","../src/path-safety.ts","../src/stable-hash.ts","../src/header.ts","../src/plugins/domain-type-model.ts","../src/plugins/domain-type-inference.ts","../src/plugins/domain-plugin.ts","../src/compiler-codegen.ts","../src/plugins/ts-plugin.ts","../src/plugins/zod-plugin.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as nodePath from \"node:path\";\n\nimport type {\n CodegenContext,\n CodegenPlugin,\n Diagnostic,\n GenerateOptions,\n GenerateResult,\n} from \"./types.js\";\nimport { VirtualFS } from \"./virtual-fs.js\";\nimport { validatePath } from \"./path-safety.js\";\nimport { stableHash } from \"./stable-hash.js\";\nimport { generateHeader } from \"./header.js\";\n\n/**\n * Generate typed artifacts from a DomainSchema using plugins.\n *\n * This is the sole entry point for codegen. It orchestrates:\n * - Plugin name uniqueness validation (GEN-2)\n * - Sequential plugin execution (GEN-3, GEN-7)\n * - FilePatch composition with collision detection\n * - Error gating (GEN-5, GEN-8)\n * - Optional outDir clean + file flush\n */\nexport async function generate(opts: GenerateOptions): Promise<GenerateResult> {\n const diagnostics: Diagnostic[] = [];\n const allArtifacts: Record<string, unknown> = {};\n const vfs = new VirtualFS();\n\n // GEN-2: Validate plugin name uniqueness\n const nameError = validatePluginNames(opts.plugins);\n if (nameError) {\n return {\n files: [],\n artifacts: {},\n diagnostics: [nameError],\n };\n }\n\n // GEN-3, GEN-7: Execute plugins sequentially in array order\n for (const plugin of opts.plugins) {\n const ctx: CodegenContext = {\n schema: opts.schema,\n sourceId: opts.sourceId,\n outDir: opts.outDir,\n artifacts: Object.freeze({ ...allArtifacts }), // PLG-9: frozen snapshot\n helpers: { stableHash },\n };\n\n let output;\n try {\n output = await plugin.generate(ctx);\n } catch (err) {\n // Convert plugin exceptions to error diagnostics (errors as values)\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Plugin threw: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n\n // GEN-4: Merge plugin diagnostics\n if (output.diagnostics) {\n diagnostics.push(...output.diagnostics);\n }\n\n // Validate and apply patches\n for (const patch of output.patches) {\n const validation = validatePath(patch.path);\n if (!validation.valid) {\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Invalid path \"${patch.path}\": ${validation.reason}`,\n });\n continue;\n }\n\n // Apply with normalized path\n const normalizedPatch =\n patch.op === \"set\"\n ? { op: \"set\" as const, path: validation.normalized, content: patch.content }\n : { op: \"delete\" as const, path: validation.normalized };\n\n const collision = vfs.applyPatch(normalizedPatch, plugin.name);\n if (collision) {\n diagnostics.push(collision);\n }\n }\n\n // PLG-8: Store artifacts at allArtifacts[plugin.name]\n if (output.artifacts) {\n allArtifacts[plugin.name] = output.artifacts;\n }\n }\n\n // Collect files from VFS\n const files = vfs.getFiles();\n\n // GEN-5, GEN-8: Error gate — no disk mutation on error\n const hasErrors = diagnostics.some((d) => d.level === \"error\");\n if (hasErrors) {\n return { files, artifacts: allArtifacts, diagnostics };\n }\n\n if (opts.cleanOutDir) {\n await fs.rm(opts.outDir, { recursive: true, force: true });\n }\n\n // Build header\n const header = generateHeader({\n sourceId: opts.sourceId,\n schemaHash: opts.schema.hash,\n stamp: opts.stamp,\n });\n\n // Flush files to disk (GEN-6: OS path conversion only at write time)\n for (const file of files) {\n const absPath = nodePath.join(opts.outDir, ...file.path.split(\"/\"));\n const dir = nodePath.dirname(absPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(absPath, header + file.content, \"utf-8\");\n }\n\n return { files, artifacts: allArtifacts, diagnostics };\n}\n\nfunction validatePluginNames(\n plugins: readonly CodegenPlugin[]\n): Diagnostic | undefined {\n const seen = new Set<string>();\n for (const plugin of plugins) {\n if (!plugin.name) {\n return {\n level: \"error\",\n plugin: \"\",\n message: \"Plugin name must not be empty (PLG-1)\",\n };\n }\n if (seen.has(plugin.name)) {\n return {\n level: \"error\",\n plugin: plugin.name,\n message: `Duplicate plugin name \"${plugin.name}\" (GEN-2)`,\n };\n }\n seen.add(plugin.name);\n }\n return undefined;\n}\n","import type { Diagnostic, FilePatch } from \"./types.js\";\n\ntype FileEntry = {\n content: string;\n source: string; // plugin name that set the file\n};\n\n/**\n * Virtual filesystem for composing FilePatch operations.\n *\n * Maintains an in-memory FS and detects collisions per FP-5, FP-6, FP-7.\n * Paths are assumed to be already validated/normalized.\n */\nexport class VirtualFS {\n private readonly files = new Map<string, FileEntry>();\n private readonly deleted = new Set<string>();\n\n /**\n * Apply a FilePatch to the virtual FS.\n * Returns a Diagnostic if a collision/warning condition is detected.\n */\n applyPatch(patch: FilePatch, pluginName: string): Diagnostic | undefined {\n if (patch.op === \"set\") {\n return this.applySet(patch.path, patch.content, pluginName);\n }\n return this.applyDelete(patch.path, pluginName);\n }\n\n private applySet(path: string, content: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (existing) {\n // FP-5: Duplicate set on same path -> error\n const samePlugin = existing.source === pluginName;\n return {\n level: \"error\",\n plugin: pluginName,\n message: samePlugin\n ? `Duplicate set on \"${path}\" within plugin \"${pluginName}\"`\n : `File \"${path}\" already set by plugin \"${existing.source}\", cannot be set again by \"${pluginName}\"`,\n };\n }\n\n // delete-then-set is allowed (intentional regeneration)\n this.deleted.delete(path);\n this.files.set(path, { content, source: pluginName });\n return undefined;\n }\n\n private applyDelete(path: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (!existing && !this.deleted.has(path)) {\n // FP-7: Delete on nonexistent path -> warn\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `Delete on nonexistent path \"${path}\"`,\n };\n }\n\n if (existing) {\n // FP-6: set-then-delete -> allowed with warning\n this.files.delete(path);\n this.deleted.add(path);\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `File \"${path}\" set by plugin \"${existing.source}\" is being deleted by \"${pluginName}\". Prior work is voided.`,\n };\n }\n\n // Already deleted - just track it\n this.deleted.add(path);\n return undefined;\n }\n\n /**\n * Get all files in deterministic (lexicographic) order (DET-5).\n */\n getFiles(): Array<{ path: string; content: string }> {\n const entries = Array.from(this.files.entries());\n entries.sort(([a], [b]) => a.localeCompare(b));\n return entries.map(([path, { content }]) => ({ path, content }));\n }\n\n has(path: string): boolean {\n return this.files.has(path);\n }\n}\n","export type PathValidationResult =\n | { valid: true; normalized: string }\n | { valid: false; reason: string };\n\n/**\n * Validate and normalize a file path per FP-1, FP-2, GEN-6.\n *\n * - MUST be a POSIX relative path\n * - MUST NOT contain `..`, absolute prefixes, drive letters, or null bytes\n * - Normalizes backslashes, multiple slashes, and leading `./`\n */\nexport function validatePath(path: string): PathValidationResult {\n if (!path) {\n return { valid: false, reason: \"Path must not be empty\" };\n }\n\n if (path.includes(\"\\0\")) {\n return { valid: false, reason: \"Path must not contain null bytes\" };\n }\n\n // Normalize backslashes to forward slashes (GEN-6)\n let normalized = path.replace(/\\\\/g, \"/\");\n\n // Check for drive letters (e.g., C:/)\n if (/^[a-zA-Z]:/.test(normalized)) {\n return { valid: false, reason: \"Path must not contain drive letters\" };\n }\n\n // Check for absolute path\n if (normalized.startsWith(\"/\")) {\n return { valid: false, reason: \"Path must be relative, not absolute\" };\n }\n\n // Collapse multiple slashes\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // Remove leading ./\n if (normalized.startsWith(\"./\")) {\n normalized = normalized.slice(2);\n }\n\n // Remove trailing slash\n if (normalized.endsWith(\"/\") && normalized.length > 1) {\n normalized = normalized.slice(0, -1);\n }\n\n // Check for .. traversal (after normalization)\n const segments = normalized.split(\"/\");\n for (const segment of segments) {\n if (segment === \"..\") {\n return { valid: false, reason: \"Path must not contain '..' traversal\" };\n }\n }\n\n if (!normalized) {\n return { valid: false, reason: \"Path resolves to empty after normalization\" };\n }\n\n return { valid: true, normalized };\n}\n","import { toCanonical, sha256Sync } from \"@manifesto-ai/core\";\n\n/**\n * Deterministic hash function (DET-1).\n * Same input always produces the same output.\n * Uses Core's canonical form (sorted keys, no undefined) + SHA-256.\n */\nexport function stableHash(input: unknown): string {\n const canonical = toCanonical(input);\n return sha256Sync(canonical);\n}\n","export interface HeaderOptions {\n readonly sourceId?: string;\n readonly schemaHash: string;\n readonly stamp?: boolean;\n}\n\n/**\n * Generate the @generated file header (DET-2, DET-3, DET-4).\n *\n * Default mode: no timestamp (deterministic).\n * With stamp=true: appends ISO 8601 timestamp line.\n */\nexport function generateHeader(options: HeaderOptions): string {\n const source = options.sourceId ?? \"unknown\";\n const lines = [\n \"// @generated by @manifesto-ai/codegen \\u2014 DO NOT EDIT\",\n `// Source: ${source} | Schema hash: ${options.schemaHash}`,\n ];\n\n if (options.stamp) {\n lines.push(`// Generated at: ${new Date().toISOString()}`);\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { FieldSpec } from \"@manifesto-ai/core\";\n\nexport type DomainPrimitive = \"string\" | \"number\" | \"boolean\" | \"null\";\n\nexport type DomainTypeField = {\n readonly type: DomainType;\n readonly optional: boolean;\n};\n\nexport type DomainType =\n | { readonly kind: \"unknown\" }\n | { readonly kind: \"primitive\"; readonly type: DomainPrimitive }\n | { readonly kind: \"literal\"; readonly value: string | number | boolean | null }\n | { readonly kind: \"array\"; readonly element: DomainType }\n | { readonly kind: \"tuple\"; readonly elements: readonly DomainType[] }\n | { readonly kind: \"object\"; readonly fields: Readonly<Record<string, DomainTypeField>> }\n | { readonly kind: \"record\"; readonly key: DomainType; readonly value: DomainType }\n | { readonly kind: \"union\"; readonly types: readonly DomainType[] };\n\nconst UNKNOWN_TYPE: DomainType = { kind: \"unknown\" };\nconst NULL_TYPE: DomainType = { kind: \"primitive\", type: \"null\" };\n\nexport function unknownType(): DomainType {\n return UNKNOWN_TYPE;\n}\n\nexport function primitiveType(type: DomainPrimitive): DomainType {\n return type === \"null\" ? NULL_TYPE : { kind: \"primitive\", type };\n}\n\nexport function literalType(\n value: string | number | boolean | null\n): DomainType {\n return value === null ? NULL_TYPE : { kind: \"literal\", value };\n}\n\nexport function arrayType(element: DomainType): DomainType {\n return { kind: \"array\", element };\n}\n\nexport function tupleType(elements: readonly DomainType[]): DomainType {\n return { kind: \"tuple\", elements };\n}\n\nexport function objectType(fields: Record<string, DomainTypeField>): DomainType {\n return { kind: \"object\", fields };\n}\n\nexport function recordType(key: DomainType, value: DomainType): DomainType {\n return { kind: \"record\", key, value };\n}\n\nexport function fieldSpecToDomainField(spec: FieldSpec): DomainTypeField {\n return {\n type: fieldSpecToDomainType(spec),\n optional: !spec.required,\n };\n}\n\nexport function fieldSpecToDomainType(spec: FieldSpec): DomainType {\n let base: DomainType;\n\n if (typeof spec.type === \"object\" && \"enum\" in spec.type) {\n base = unionOf(\n spec.type.enum.map((value) => literalValueToType(value))\n );\n } else {\n switch (spec.type) {\n case \"string\":\n base = primitiveType(\"string\");\n break;\n case \"number\":\n base = primitiveType(\"number\");\n break;\n case \"boolean\":\n base = primitiveType(\"boolean\");\n break;\n case \"null\":\n base = NULL_TYPE;\n break;\n case \"object\":\n if (spec.fields) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(spec.fields)) {\n fields[name] = fieldSpecToDomainField(spec.fields[name]);\n }\n base = objectType(fields);\n break;\n }\n base = recordType(primitiveType(\"string\"), unknownType());\n break;\n case \"array\":\n base = arrayType(\n spec.items ? fieldSpecToDomainType(spec.items) : unknownType()\n );\n break;\n default:\n base = unknownType();\n break;\n }\n }\n\n return spec.required ? base : unionOf([base, NULL_TYPE]);\n}\n\nexport function literalValueToType(value: unknown): DomainType {\n if (value === null) {\n return NULL_TYPE;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return literalType(value);\n }\n\n if (Array.isArray(value)) {\n return arrayType(\n value.length === 0\n ? unknownType()\n : unionOf(value.map((item) => literalValueToType(item)))\n );\n }\n\n if (isPlainObject(value)) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(value)) {\n fields[name] = {\n type: literalValueToType(value[name]),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n return unknownType();\n}\n\nexport function unionOf(types: readonly DomainType[]): DomainType {\n const flattened: DomainType[] = [];\n\n for (const type of types) {\n if (type.kind === \"unknown\") {\n return type;\n }\n if (type.kind === \"union\") {\n flattened.push(...type.types);\n continue;\n }\n flattened.push(type);\n }\n\n const unique = new Map<string, DomainType>();\n for (const type of flattened) {\n unique.set(stableTypeKey(type), type);\n }\n\n const deduped = Array.from(unique.values());\n if (deduped.length === 0) {\n return unknownType();\n }\n if (deduped.length === 1) {\n return deduped[0];\n }\n return { kind: \"union\", types: deduped };\n}\n\nexport function removeNullType(type: DomainType): DomainType[] {\n switch (type.kind) {\n case \"primitive\":\n return type.type === \"null\" ? [] : [type];\n case \"literal\":\n return type.value === null ? [] : [type];\n case \"union\":\n return type.types.flatMap((member) => removeNullType(member));\n default:\n return [type];\n }\n}\n\nexport function renderDomainType(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return type.type;\n case \"literal\":\n return renderLiteral(type.value);\n case \"array\":\n return `${wrapArrayElement(renderDomainType(type.element), type.element)}[]`;\n case \"tuple\":\n return `[${type.elements.map((element) => renderDomainType(element)).join(\", \")}]`;\n case \"object\": {\n const fieldNames = Object.keys(type.fields).sort();\n if (fieldNames.length === 0) {\n return \"{}\";\n }\n const parts = fieldNames.map((name) => {\n const field = type.fields[name];\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n return `{ ${parts.join(\"; \")} }`;\n }\n case \"record\":\n return `Record<${renderDomainType(type.key)}, ${renderDomainType(type.value)}>`;\n case \"union\":\n return type.types.map((member) => renderDomainType(member)).join(\" | \");\n }\n}\n\nfunction wrapArrayElement(rendered: string, type: DomainType): string {\n if (type.kind === \"union\") {\n return `(${rendered})`;\n }\n return rendered;\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction stableTypeKey(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return `primitive:${type.type}`;\n case \"literal\":\n return `literal:${JSON.stringify(type.value)}`;\n case \"array\":\n return `array:${stableTypeKey(type.element)}`;\n case \"tuple\":\n return `tuple:${type.elements.map((element) => stableTypeKey(element)).join(\",\")}`;\n case \"object\": {\n const keys = Object.keys(type.fields).sort();\n const fields = keys.map((name) => {\n const field = type.fields[name];\n return `${name}:${field.optional ? \"?\" : \"\"}${stableTypeKey(field.type)}`;\n });\n return `object:${fields.join(\",\")}`;\n }\n case \"record\":\n return `record:${stableTypeKey(type.key)}:${stableTypeKey(type.value)}`;\n case \"union\":\n return `union:${type.types.map((member) => stableTypeKey(member)).sort().join(\"|\")}`;\n }\n}\n\nfunction isPlainObject(\n value: unknown\n): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { DomainSchema, ExprNode } from \"@manifesto-ai/core\";\nimport type { Diagnostic } from \"../types.js\";\nimport {\n arrayType,\n fieldSpecToDomainType,\n literalValueToType,\n objectType,\n primitiveType,\n recordType,\n removeNullType,\n tupleType,\n type DomainType,\n type DomainTypeField,\n unionOf,\n unknownType,\n} from \"./domain-type-model.js\";\n\ntype InferenceEnv = ReadonlyMap<string, DomainType>;\n\ntype InferenceContext = {\n readonly schema: DomainSchema;\n readonly pluginName: string;\n readonly diagnostics: Diagnostic[];\n readonly warnedMessages: Set<string>;\n readonly computedCache: Map<string, DomainType>;\n readonly computedInFlight: Set<string>;\n};\n\nconst META_TYPE = objectType({\n actionName: { type: primitiveType(\"string\"), optional: false },\n intentId: { type: primitiveType(\"string\"), optional: false },\n timestamp: { type: primitiveType(\"number\"), optional: false },\n});\n\nexport function createInferenceContext(\n schema: DomainSchema,\n diagnostics: Diagnostic[],\n pluginName: string\n): InferenceContext {\n return {\n schema,\n pluginName,\n diagnostics,\n warnedMessages: new Set(),\n computedCache: new Map(),\n computedInFlight: new Set(),\n };\n}\n\nexport function inferComputedType(\n name: string,\n ctx: InferenceContext\n): DomainType {\n if (ctx.computedCache.has(name)) {\n return ctx.computedCache.get(name) ?? unknownType();\n }\n\n const spec = ctx.schema.computed.fields[name];\n if (!spec) {\n warn(ctx, `Unknown computed field \"${name}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n if (ctx.computedInFlight.has(name)) {\n warn(ctx, `Recursive computed field \"${name}\" could not be inferred. Emitting \"unknown\".`);\n return unknownType();\n }\n\n ctx.computedInFlight.add(name);\n const inferred = inferExprType(spec.expr, ctx, new Map());\n ctx.computedInFlight.delete(name);\n ctx.computedCache.set(name, inferred);\n return inferred;\n}\n\nexport function inferExprType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv = new Map()\n): DomainType {\n switch (expr.kind) {\n case \"lit\":\n return literalValueToType(expr.value);\n\n case \"get\":\n return inferPathType(expr.path, ctx, env);\n\n case \"eq\":\n case \"neq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"and\":\n case \"or\":\n case \"not\":\n case \"startsWith\":\n case \"endsWith\":\n case \"strIncludes\":\n case \"includes\":\n case \"every\":\n case \"some\":\n case \"hasKey\":\n case \"isNull\":\n case \"toBoolean\":\n return primitiveType(\"boolean\");\n\n case \"add\":\n case \"sub\":\n case \"mul\":\n case \"div\":\n case \"mod\":\n case \"min\":\n case \"max\":\n case \"abs\":\n case \"neg\":\n case \"floor\":\n case \"ceil\":\n case \"round\":\n case \"sqrt\":\n case \"pow\":\n case \"sumArray\":\n case \"strLen\":\n case \"len\":\n case \"indexOf\":\n case \"toNumber\":\n return primitiveType(\"number\");\n\n case \"concat\":\n case \"substring\":\n case \"trim\":\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"replace\":\n case \"typeof\":\n case \"toString\":\n return primitiveType(\"string\");\n\n case \"if\":\n return unionOf([\n inferExprType(expr.then, ctx, env),\n inferExprType(expr.else, ctx, env),\n ]);\n\n case \"split\":\n return arrayType(primitiveType(\"string\"));\n\n case \"at\":\n return unionOf([inferIndexedAccessType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"first\":\n case \"last\":\n case \"minArray\":\n case \"maxArray\":\n return unionOf([inferCollectionElementType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"slice\":\n case \"reverse\":\n case \"unique\":\n return inferArrayLikeType(expr.array, ctx, env);\n\n case \"filter\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return arrayType(elementType);\n }\n\n case \"map\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n return arrayType(inferExprType(expr.mapper, ctx, nextEnv));\n }\n\n case \"find\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return unionOf([elementType, primitiveType(\"null\")]);\n }\n\n case \"append\": {\n const baseArray = inferArrayLikeType(expr.array, ctx, env);\n const baseElement = getArrayElementType(baseArray);\n const itemTypes = expr.items.map((item) => inferExprType(item, ctx, env));\n return arrayType(unionOf([baseElement, ...itemTypes]));\n }\n\n case \"flat\":\n return inferFlatType(expr.array, ctx, env);\n\n case \"object\": {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(expr.fields)) {\n fields[name] = {\n type: inferExprType(expr.fields[name], ctx, env),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n case \"field\":\n return inferFieldType(inferExprType(expr.object, ctx, env), expr.property);\n\n case \"keys\":\n return arrayType(primitiveType(\"string\"));\n\n case \"values\":\n return arrayType(inferObjectValueType(inferExprType(expr.obj, ctx, env)));\n\n case \"entries\":\n return arrayType(\n tupleType([\n primitiveType(\"string\"),\n inferObjectValueType(inferExprType(expr.obj, ctx, env)),\n ])\n );\n\n case \"merge\":\n return inferMergeType(\n expr.objects.map((objectExpr) => inferExprType(objectExpr, ctx, env))\n );\n\n case \"pick\":\n return inferPickLikeType(expr.obj, expr.keys, false, ctx, env);\n\n case \"omit\":\n return inferPickLikeType(expr.obj, expr.keys, true, ctx, env);\n\n case \"fromEntries\":\n return inferFromEntriesType(expr.entries, ctx, env);\n\n case \"coalesce\": {\n const members = expr.args.flatMap((arg) =>\n removeNullType(inferExprType(arg, ctx, env))\n );\n return members.length === 0 ? primitiveType(\"null\") : unionOf(members);\n }\n\n default:\n warn(ctx, `Unsupported expression kind \"${(expr as { kind: string }).kind}\". Emitting \"unknown\".`);\n return unknownType();\n }\n}\n\nfunction inferPathType(\n path: string,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const [head, ...tail] = path.split(\".\");\n if (!head) {\n warn(ctx, `Empty get() path encountered. Emitting \"unknown\".`);\n return unknownType();\n }\n\n let base: DomainType | undefined = env.get(head);\n\n if (!base) {\n if (head === \"meta\") {\n base = META_TYPE;\n } else if (Object.hasOwn(ctx.schema.state.fields, head)) {\n base = fieldSpecToDomainType(ctx.schema.state.fields[head]);\n } else if (Object.hasOwn(ctx.schema.computed.fields, head)) {\n base = inferComputedType(head, ctx);\n }\n }\n\n if (!base) {\n warn(ctx, `Unknown get() path \"${path}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n return walkPathType(base, tail);\n}\n\nfunction walkPathType(base: DomainType, segments: readonly string[]): DomainType {\n let current = base;\n for (const segment of segments) {\n current = accessSegmentType(current, segment);\n }\n return current;\n}\n\nfunction accessSegmentType(\n base: DomainType,\n segment: string\n): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, segment)\n ? base.fields[segment].type\n : unknownType();\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"array\":\n return isNumericSegment(segment)\n ? unionOf([base.element, primitiveType(\"null\")])\n : unknownType();\n case \"tuple\":\n return isNumericSegment(segment)\n ? base.elements[Number(segment)] ?? unknownType()\n : unknownType();\n case \"union\":\n return unionIgnoringUnknown(\n base.types.map((member) => accessSegmentType(member, segment))\n );\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(expr, ctx, env);\n switch (base.kind) {\n case \"array\":\n return base.element;\n case \"tuple\":\n return unionOf(base.elements);\n case \"record\":\n return base.value;\n case \"union\":\n return unionOf(base.types.map((member) => inferIndexedAccessFromType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"record\":\n return type.value;\n default:\n return unknownType();\n }\n}\n\nfunction inferCollectionElementType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n return getArrayElementType(inferExprType(expr, ctx, env));\n}\n\nfunction getArrayElementType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"union\":\n return unionOf(type.types.map((member) => getArrayElementType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferArrayLikeType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const inferred = inferExprType(expr, ctx, env);\n switch (inferred.kind) {\n case \"array\":\n return inferred;\n case \"tuple\":\n return arrayType(unionOf(inferred.elements));\n case \"union\": {\n const arrays = inferred.types\n .map((member) => inferArrayLikeFromType(member))\n .filter((member): member is DomainType => member.kind !== \"unknown\");\n return arrays.length === 0 ? arrayType(unknownType()) : unionOf(arrays);\n }\n default:\n return arrayType(unknownType());\n }\n}\n\nfunction inferArrayLikeFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type;\n case \"tuple\":\n return arrayType(unionOf(type.elements));\n default:\n return unknownType();\n }\n}\n\nfunction inferFlatType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const outer = inferArrayLikeType(expr, ctx, env);\n const outerElement = getArrayElementType(outer);\n\n switch (outerElement.kind) {\n case \"array\":\n return arrayType(outerElement.element);\n case \"tuple\":\n return arrayType(unionOf(outerElement.elements));\n case \"union\": {\n const flatMembers: DomainType[] = [];\n for (const member of outerElement.types) {\n if (member.kind === \"array\") {\n flatMembers.push(member.element);\n continue;\n }\n if (member.kind === \"tuple\") {\n flatMembers.push(unionOf(member.elements));\n continue;\n }\n flatMembers.push(member);\n }\n return arrayType(unionOf(flatMembers));\n }\n default:\n return arrayType(outerElement);\n }\n}\n\nfunction inferFieldType(base: DomainType, property: string): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, property)\n ? base.fields[property].type\n : primitiveType(\"null\");\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"union\":\n return unionOf(base.types.map((member) => inferFieldType(member, property)));\n default:\n return primitiveType(\"null\");\n }\n}\n\nfunction inferObjectValueType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"object\": {\n const values = Object.keys(type.fields).map((name) => type.fields[name].type);\n return values.length === 0 ? unknownType() : unionOf(values);\n }\n case \"record\":\n return type.value;\n case \"union\":\n return unionOf(type.types.map((member) => inferObjectValueType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferMergeType(types: readonly DomainType[]): DomainType {\n const fields: Record<string, DomainTypeField> = {};\n let sawObject = false;\n\n for (const type of types) {\n if (type.kind !== \"object\") {\n continue;\n }\n sawObject = true;\n for (const name of Object.keys(type.fields)) {\n fields[name] = type.fields[name];\n }\n }\n\n return sawObject ? objectType(fields) : objectType({});\n}\n\nfunction inferPickLikeType(\n objectExpr: ExprNode,\n keysExpr: ExprNode,\n omit: boolean,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(objectExpr, ctx, env);\n if (base.kind !== \"object\") {\n return objectType({});\n }\n\n const keys = readStringArrayLiteral(keysExpr);\n if (!keys) {\n return base;\n }\n\n const selected = new Set(keys);\n const fields: Record<string, DomainTypeField> = {};\n\n for (const name of Object.keys(base.fields)) {\n const shouldInclude = omit ? !selected.has(name) : selected.has(name);\n if (shouldInclude) {\n fields[name] = base.fields[name];\n }\n }\n\n return objectType(fields);\n}\n\nfunction inferFromEntriesType(\n entriesExpr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const literalEntries = readLiteralEntries(entriesExpr);\n if (literalEntries) {\n const valueTypes = literalEntries.map(([, value]) => literalValueToType(value));\n return recordType(primitiveType(\"string\"), unionOf(valueTypes));\n }\n\n const entriesType = inferExprType(entriesExpr, ctx, env);\n const elementType = getArrayElementType(entriesType);\n\n if (elementType.kind === \"tuple\" && elementType.elements.length >= 2) {\n return recordType(primitiveType(\"string\"), elementType.elements[1]);\n }\n\n return recordType(primitiveType(\"string\"), unknownType());\n}\n\nfunction withCollectionEnv(\n env: InferenceEnv,\n itemType: DomainType\n): Map<string, DomainType> {\n const next = new Map(env);\n next.set(\"$index\", primitiveType(\"number\"));\n next.set(\"$item\", itemType);\n return next;\n}\n\nfunction readStringArrayLiteral(expr: ExprNode): string[] | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const values: string[] = [];\n for (const item of expr.value) {\n if (typeof item !== \"string\") {\n return null;\n }\n values.push(item);\n }\n return values;\n}\n\nfunction readLiteralEntries(\n expr: ExprNode\n): Array<[string, unknown]> | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const entries: Array<[string, unknown]> = [];\n for (const item of expr.value) {\n if (!Array.isArray(item) || item.length !== 2 || typeof item[0] !== \"string\") {\n return null;\n }\n entries.push([item[0], item[1]]);\n }\n return entries;\n}\n\nfunction unionIgnoringUnknown(types: readonly DomainType[]): DomainType {\n const filtered = types.filter((type) => type.kind !== \"unknown\");\n return filtered.length === 0 ? unknownType() : unionOf(filtered);\n}\n\nfunction isNumericSegment(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nfunction warn(ctx: InferenceContext, message: string): void {\n if (ctx.warnedMessages.has(message)) {\n return;\n }\n ctx.warnedMessages.add(message);\n ctx.diagnostics.push({\n level: \"warn\",\n plugin: ctx.pluginName,\n message,\n });\n}\n","import type { CodegenContext, CodegenOutput, CodegenPlugin, Diagnostic } from \"../types.js\";\nimport type { FieldSpec } from \"@manifesto-ai/core\";\nimport { createInferenceContext, inferComputedType } from \"./domain-type-inference.js\";\nimport {\n fieldSpecToDomainField,\n fieldSpecToDomainType,\n renderDomainType,\n type DomainTypeField,\n} from \"./domain-type-model.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-domain\";\n\nexport interface DomainPluginOptions {\n readonly fileName?: string;\n readonly interfaceName?: string;\n readonly includeReservedState?: boolean;\n}\n\nexport function createDomainPlugin(options?: DomainPluginOptions): CodegenPlugin {\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const inference = createInferenceContext(ctx.schema, diagnostics, PLUGIN_NAME);\n\n const interfaceName = options?.interfaceName\n ?? deriveInterfaceName(ctx)\n ?? \"Domain\";\n const fileName = options?.fileName ?? deriveFileName(ctx.sourceId);\n\n const stateFields = renderFieldBlock(\n ctx.schema.state.fields,\n { includeReservedState: options?.includeReservedState ?? false },\n (_name, spec) => fieldSpecToDomainField(spec)\n );\n\n const computedFields = renderFieldBlock(\n ctx.schema.computed.fields,\n { includeReservedState: true },\n (name) => ({\n type: inferComputedType(name, inference),\n optional: false,\n })\n );\n\n const actionNames = Object.keys(ctx.schema.actions).sort();\n const actionLines = actionNames.map((name) => {\n const action = ctx.schema.actions[name];\n return ` ${name}: ${renderActionSignature(action.input)}`;\n });\n\n const sections = [\n \"export interface \" + interfaceName + \" {\",\n \" readonly state: {\",\n stateFields,\n \" }\",\n \" readonly computed: {\",\n computedFields,\n \" }\",\n \" readonly actions: {\",\n actionLines.join(\"\\n\"),\n \" }\",\n \"}\",\n ];\n\n return {\n patches: [{ op: \"set\", path: fileName, content: sections.join(\"\\n\") + \"\\n\" }],\n diagnostics,\n };\n },\n };\n}\n\nfunction renderFieldBlock<T>(\n source: Record<string, T>,\n options: { includeReservedState: boolean },\n mapField: (name: string, value: T) => DomainTypeField\n): string {\n const names = Object.keys(source)\n .filter((name) => options.includeReservedState || !name.startsWith(\"$\"))\n .sort();\n\n if (names.length === 0) {\n return \"\";\n }\n\n return names\n .map((name) => {\n const field = mapField(name, source[name]);\n const optional = field.optional ? \"?\" : \"\";\n return ` ${name}${optional}: ${renderDomainType(field.type)}`;\n })\n .join(\"\\n\");\n}\n\nfunction renderActionSignature(input: FieldSpec | undefined): string {\n if (!input || typeof input !== \"object\" || !(\"type\" in input)) {\n return \"() => void\";\n }\n\n if (input.type !== \"object\" || !input.fields) {\n return `(input: ${renderDomainType(fieldSpecToDomainType(input))}) => void`;\n }\n\n const names = Object.keys(input.fields);\n if (names.length === 0) {\n return \"() => void\";\n }\n\n const params = names.map((name) => {\n const field = fieldSpecToDomainField(input.fields![name]);\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n\n return `(${params.join(\", \")}) => void`;\n}\n\nfunction deriveInterfaceName(ctx: CodegenContext): string | null {\n const metaName = ctx.schema.meta?.name?.trim();\n if (metaName) {\n return metaName;\n }\n\n const basename = basenameWithoutExtension(ctx.sourceId);\n if (!basename) {\n return null;\n }\n\n const candidate = pascalCase(basename);\n return candidate.endsWith(\"Domain\") ? candidate : `${candidate}Domain`;\n}\n\nfunction deriveFileName(sourceId?: string): string {\n if (!sourceId) {\n return \"domain.ts\";\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n return `${normalized}.ts`;\n}\n\nfunction basenameWithoutExtension(sourceId?: string): string | null {\n if (!sourceId) {\n return null;\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n const basename = normalized.split(\"/\").pop() ?? \"\";\n if (!basename) {\n return null;\n }\n\n return basename.replace(/\\.[^.]+$/, \"\");\n}\n\nfunction pascalCase(value: string): string {\n return value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\");\n}\n","import type { DomainSchema } from \"@manifesto-ai/core\";\n\nimport { createDomainPlugin } from \"./plugins/domain-plugin.js\";\nimport { generate } from \"./runner.js\";\nimport type { CodegenPlugin, GenerateResult } from \"./types.js\";\n\nexport interface CompilerCodegenInput {\n readonly schema: DomainSchema;\n readonly sourceId: string;\n}\n\nexport interface CompilerCodegenOptions {\n readonly outDir?: string;\n readonly plugins?: readonly CodegenPlugin[];\n readonly stamp?: boolean;\n}\n\nexport interface CompilerCodegenEmitter {\n (input: CompilerCodegenInput): Promise<GenerateResult>;\n}\n\nexport function createCompilerCodegen(\n options: CompilerCodegenOptions = {}\n): CompilerCodegenEmitter {\n const outDir = options.outDir ?? \".\";\n const plugins = options.plugins ?? [createDomainPlugin()];\n\n return async (input: CompilerCodegenInput) => {\n const result = await generate({\n schema: input.schema,\n sourceId: input.sourceId,\n outDir,\n plugins,\n stamp: options.stamp,\n });\n\n const errors = result.diagnostics.filter((diagnostic) => diagnostic.level === \"error\");\n if (errors.length > 0) {\n const details = errors\n .map((diagnostic) => `[${diagnostic.plugin}] ${diagnostic.message}`)\n .join(\"\\n\");\n throw new Error(`Codegen failed for ${input.sourceId}\\n${details}`);\n }\n\n return result;\n };\n}\n","import type {\n TypeDefinition,\n TypeSpec,\n ActionSpec,\n FieldSpec,\n FieldType,\n} from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface TsPluginOptions {\n readonly typesFile?: string;\n readonly actionsFile?: string;\n}\n\nexport interface TsPluginArtifacts {\n readonly typeNames: string[];\n readonly typeImportPath: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createTsPlugin(options?: TsPluginOptions): CodegenPlugin {\n const typesFile = options?.typesFile ?? \"types.ts\";\n const actionsFile = options?.actionsFile ?? \"actions.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const typeNames: string[] = [];\n\n // Generate types from schema.types (GEN-10, TS-6: lexicographic order)\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const typeDecls: string[] = [];\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n typeNames.push(name);\n typeDecls.push(renderNamedType(name, spec, diagnostics));\n }\n\n const typesContent = typeDecls.join(\"\\n\\n\") + \"\\n\";\n\n // Generate action input types\n const sortedActionNames = Object.keys(ctx.schema.actions).sort();\n const actionDecls: string[] = [];\n\n for (const actionName of sortedActionNames) {\n const spec = ctx.schema.actions[actionName];\n if (spec.input) {\n const typeName = pascalCase(actionName) + \"Input\";\n actionDecls.push(renderActionInputType(typeName, spec, diagnostics));\n }\n }\n\n const patches = [\n { op: \"set\" as const, path: typesFile, content: typesContent },\n ];\n\n if (actionDecls.length > 0) {\n const actionsContent = actionDecls.join(\"\\n\\n\") + \"\\n\";\n patches.push({ op: \"set\" as const, path: actionsFile, content: actionsContent });\n }\n\n const artifacts: TsPluginArtifacts = {\n typeNames,\n typeImportPath: `./${typesFile.replace(/\\.ts$/, \"\")}`,\n };\n\n return { patches, artifacts: artifacts as unknown as Record<string, unknown>, diagnostics };\n },\n };\n}\n\n// --- Type rendering ---\n\nfunction renderNamedType(\n name: string,\n spec: TypeSpec,\n diagnostics: Diagnostic[]\n): string {\n const def = spec.definition;\n\n // TS-3: top-level named object -> export interface\n if (def.kind === \"object\") {\n return renderInterface(name, def.fields, diagnostics);\n }\n\n // TS-3: all other named types -> export type\n const tsType = mapTypeDefinition(def, diagnostics);\n return `export type ${name} = ${tsType};`;\n}\n\nfunction renderInterface(\n name: string,\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const lines: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n // TS-5: optional -> ?\n const opt = field.optional ? \"?\" : \"\";\n lines.push(` ${fieldName}${opt}: ${tsType};`);\n }\n\n return `export interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitive(def.type);\n\n case \"literal\":\n return renderLiteral(def.value);\n\n case \"array\":\n return `${wrapComplex(mapTypeDefinition(def.element, diagnostics), def.element)}[]`;\n\n case \"record\":\n return `Record<${mapTypeDefinition(def.key, diagnostics)}, ${mapTypeDefinition(def.value, diagnostics)}>`;\n\n case \"object\": {\n const sortedFields = Object.keys(def.fields).sort();\n const parts: string[] = [];\n for (const fieldName of sortedFields) {\n const field = def.fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n const opt = field.optional ? \"?\" : \"\";\n parts.push(`${fieldName}${opt}: ${tsType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n\n case \"union\":\n // TS-2: nullable uses T | null\n return def.types.map((t) => mapTypeDefinition(t, diagnostics)).join(\" | \");\n\n case \"ref\":\n return def.name;\n\n default: {\n // PLG-3, TS-1: unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"unknown\".`,\n });\n return \"unknown\";\n }\n }\n}\n\nfunction mapPrimitive(type: string): string {\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n default:\n return \"unknown\";\n }\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/** Wrap union types in parens when used as array element */\nfunction wrapComplex(tsType: string, def: TypeDefinition): string {\n if (def.kind === \"union\") {\n return `(${tsType})`;\n }\n return tsType;\n}\n\n// --- Action input rendering ---\n\nfunction renderActionInputType(\n typeName: string,\n spec: ActionSpec,\n diagnostics: Diagnostic[]\n): string {\n if (!spec.input) {\n return \"\";\n }\n const tsType = mapFieldSpec(spec.input, diagnostics);\n return `export type ${typeName} = ${tsType};`;\n}\n\nfunction mapFieldSpec(\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n const baseType = mapFieldType(spec.type, spec, diagnostics);\n\n // GEN-12: degrade for unknown structures\n if (!spec.required && baseType !== \"unknown\") {\n return `${baseType} | null`;\n }\n return baseType;\n}\n\nfunction mapFieldType(\n type: FieldType,\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n if (typeof type === \"object\" && \"enum\" in type) {\n // Enum -> union of literals\n return type.enum.map((v) => renderLiteral(v as string | number | boolean | null)).join(\" | \");\n }\n\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\": {\n if (spec.fields) {\n const sortedFields = Object.keys(spec.fields).sort();\n const parts: string[] = [];\n for (const name of sortedFields) {\n const field = spec.fields[name];\n const fieldType = mapFieldSpec(field, diagnostics);\n const opt = field.required ? \"\" : \"?\";\n parts.push(`${name}${opt}: ${fieldType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n // GEN-12: unstructured object -> unknown\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Object field without fields spec, degrading to Record<string, unknown>\",\n });\n return \"Record<string, unknown>\";\n }\n case \"array\": {\n if (spec.items) {\n return `${mapFieldSpec(spec.items, diagnostics)}[]`;\n }\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Array field without items spec, degrading to unknown[]\",\n });\n return \"unknown[]\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction pascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n}\n","import type { TypeDefinition, TypeSpec } from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\nimport type { TsPluginArtifacts } from \"./ts-plugin.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-zod\";\nconst TS_PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface ZodPluginOptions {\n readonly schemasFile?: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createZodPlugin(options?: ZodPluginOptions): CodegenPlugin {\n const schemasFile = options?.schemasFile ?? \"base.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n\n // PLG-11: Optional TS artifacts dependency\n const tsArtifacts = ctx.artifacts[TS_PLUGIN_NAME] as TsPluginArtifacts | undefined;\n\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const schemaDecls: string[] = [];\n\n // Collect all type names for forward declarations with z.lazy\n const allTypeNames = new Set(sortedTypeNames);\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n schemaDecls.push(renderNamedSchema(name, spec, allTypeNames, tsArtifacts, diagnostics));\n }\n\n // Build imports\n const imports: string[] = ['import { z } from \"zod\";'];\n\n // ZOD-4: Import TS types for annotations when available\n if (tsArtifacts && tsArtifacts.typeNames.length > 0) {\n const typeImports = sortedTypeNames\n .filter((n) => tsArtifacts.typeNames.includes(n))\n .join(\", \");\n if (typeImports) {\n imports.push(`import type { ${typeImports} } from \"${tsArtifacts.typeImportPath}\";`);\n }\n }\n\n const content = imports.join(\"\\n\") + \"\\n\\n\" + schemaDecls.join(\"\\n\\n\") + \"\\n\";\n\n return {\n patches: [{ op: \"set\", path: schemasFile, content }],\n diagnostics,\n };\n },\n };\n}\n\n// --- Schema rendering ---\n\nfunction renderNamedSchema(\n name: string,\n spec: TypeSpec,\n allTypeNames: Set<string>,\n tsArtifacts: TsPluginArtifacts | undefined,\n diagnostics: Diagnostic[]\n): string {\n const schemaName = `${name}Schema`;\n const zodExpr = mapTypeDefinition(spec.definition, allTypeNames, diagnostics);\n\n // ZOD-4/ZOD-5: Type annotation when TS artifacts available\n const hasTypeAnnotation = tsArtifacts && tsArtifacts.typeNames.includes(name);\n const annotation = hasTypeAnnotation ? `: z.ZodType<${name}>` : \"\";\n\n return `export const ${schemaName}${annotation} = ${zodExpr};`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitiveZod(def.type);\n\n case \"literal\":\n return `z.literal(${renderLiteralValue(def.value)})`;\n\n case \"array\":\n return `z.array(${mapTypeDefinition(def.element, allTypeNames, diagnostics)})`;\n\n case \"record\":\n return handleRecord(def, allTypeNames, diagnostics);\n\n case \"object\":\n return renderZodObject(def.fields, allTypeNames, diagnostics);\n\n case \"union\":\n return handleUnion(def.types, allTypeNames, diagnostics);\n\n case \"ref\":\n // ZOD-2: Always z.lazy for circular reference support\n return `z.lazy(() => ${def.name}Schema)`;\n\n default: {\n // ZOD-1: Unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"z.unknown()\".`,\n });\n return \"z.unknown()\";\n }\n }\n}\n\nfunction mapPrimitiveZod(type: string): string {\n switch (type) {\n case \"string\":\n return \"z.string()\";\n case \"number\":\n return \"z.number()\";\n case \"boolean\":\n return \"z.boolean()\";\n case \"null\":\n return \"z.null()\";\n default:\n return \"z.unknown()\";\n }\n}\n\nfunction renderLiteralValue(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (value === null) {\n return \"null\";\n }\n return String(value);\n}\n\nfunction handleRecord(\n def: Extract<TypeDefinition, { kind: \"record\" }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const valueSchema = mapTypeDefinition(def.value, allTypeNames, diagnostics);\n\n // ZOD-7: Non-string record key -> degrade to z.record(z.string(), ...)\n if (def.key.kind !== \"primitive\" || def.key.type !== \"string\") {\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Record key type is not string (got ${JSON.stringify(def.key)}). Degrading to z.record(z.string(), ...).`,\n });\n return `z.record(z.string(), ${valueSchema})`;\n }\n\n return `z.record(z.string(), ${valueSchema})`;\n}\n\nfunction renderZodObject(\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const parts: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n let zodType = mapTypeDefinition(field.type, allTypeNames, diagnostics);\n\n // ZOD-6: optional -> .optional()\n if (field.optional) {\n zodType += \".optional()\";\n }\n\n parts.push(` ${fieldName}: ${zodType},`);\n }\n\n return `z.object({\\n${parts.join(\"\\n\")}\\n})`;\n}\n\nfunction handleUnion(\n types: TypeDefinition[],\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n // ZOD-3: 2-variant union with null -> z.nullable(T)\n if (types.length === 2) {\n const nullIdx = types.findIndex(\n (t) => t.kind === \"primitive\" && t.type === \"null\"\n );\n if (nullIdx !== -1) {\n const otherIdx = nullIdx === 0 ? 1 : 0;\n const otherSchema = mapTypeDefinition(types[otherIdx], allTypeNames, diagnostics);\n return `z.nullable(${otherSchema})`;\n }\n }\n\n const schemas = types.map((t) => mapTypeDefinition(t, allTypeNames, diagnostics));\n return `z.union([${schemas.join(\", \")}])`;\n}\n"],"mappings":"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","names":["PLUGIN_NAME","pascalCase","renderLiteral","PLUGIN_NAME","mapTypeDefinition"]}
1
+ {"version":3,"sources":["../src/runner.ts","../src/virtual-fs.ts","../src/path-safety.ts","../src/stable-hash.ts","../src/header.ts","../src/plugins/domain-type-model.ts","../src/plugins/domain-type-inference.ts","../src/plugins/domain-plugin.ts","../src/compiler-codegen.ts","../src/plugins/ts-plugin.ts","../src/plugins/zod-plugin.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as nodePath from \"node:path\";\n\nimport type {\n CodegenContext,\n CodegenPlugin,\n Diagnostic,\n GenerateOptions,\n GenerateResult,\n} from \"./types.js\";\nimport { VirtualFS } from \"./virtual-fs.js\";\nimport { validatePath } from \"./path-safety.js\";\nimport { stableHash } from \"./stable-hash.js\";\nimport { generateHeader } from \"./header.js\";\n\n/**\n * Generate typed artifacts from a DomainSchema using plugins.\n *\n * This is the sole entry point for codegen. It orchestrates:\n * - Plugin name uniqueness validation (GEN-2)\n * - Sequential plugin execution (GEN-3, GEN-7)\n * - FilePatch composition with collision detection\n * - Error gating (GEN-5, GEN-8)\n * - Optional outDir clean + file flush\n */\nexport async function generate(opts: GenerateOptions): Promise<GenerateResult> {\n const diagnostics: Diagnostic[] = [];\n const allArtifacts: Record<string, unknown> = {};\n const vfs = new VirtualFS();\n\n // GEN-2: Validate plugin name uniqueness\n const nameError = validatePluginNames(opts.plugins);\n if (nameError) {\n return {\n files: [],\n artifacts: {},\n diagnostics: [nameError],\n };\n }\n\n // GEN-3, GEN-7: Execute plugins sequentially in array order\n for (const plugin of opts.plugins) {\n const ctx: CodegenContext = {\n schema: opts.schema,\n sourceId: opts.sourceId,\n outDir: opts.outDir,\n artifacts: Object.freeze({ ...allArtifacts }), // PLG-9: frozen snapshot\n helpers: { stableHash },\n };\n\n let output;\n try {\n output = await plugin.generate(ctx);\n } catch (err) {\n // Convert plugin exceptions to error diagnostics (errors as values)\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Plugin threw: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n\n // GEN-4: Merge plugin diagnostics\n if (output.diagnostics) {\n diagnostics.push(...output.diagnostics);\n }\n\n // Validate and apply patches\n for (const patch of output.patches) {\n const validation = validatePath(patch.path);\n if (!validation.valid) {\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Invalid path \"${patch.path}\": ${validation.reason}`,\n });\n continue;\n }\n\n // Apply with normalized path\n const normalizedPatch =\n patch.op === \"set\"\n ? { op: \"set\" as const, path: validation.normalized, content: patch.content }\n : { op: \"delete\" as const, path: validation.normalized };\n\n const collision = vfs.applyPatch(normalizedPatch, plugin.name);\n if (collision) {\n diagnostics.push(collision);\n }\n }\n\n // PLG-8: Store artifacts at allArtifacts[plugin.name]\n if (output.artifacts) {\n allArtifacts[plugin.name] = output.artifacts;\n }\n }\n\n // Collect files from VFS\n const files = vfs.getFiles();\n\n // GEN-5, GEN-8: Error gate — no disk mutation on error\n const hasErrors = diagnostics.some((d) => d.level === \"error\");\n if (hasErrors) {\n return { files, artifacts: allArtifacts, diagnostics };\n }\n\n if (opts.cleanOutDir) {\n await fs.rm(opts.outDir, { recursive: true, force: true });\n }\n\n // Build header\n const header = generateHeader({\n sourceId: opts.sourceId,\n schemaHash: opts.schema.hash,\n stamp: opts.stamp,\n });\n\n // Flush files to disk (GEN-6: OS path conversion only at write time)\n for (const file of files) {\n const absPath = nodePath.join(opts.outDir, ...file.path.split(\"/\"));\n const dir = nodePath.dirname(absPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(absPath, header + file.content, \"utf-8\");\n }\n\n return { files, artifacts: allArtifacts, diagnostics };\n}\n\nfunction validatePluginNames(\n plugins: readonly CodegenPlugin[]\n): Diagnostic | undefined {\n const seen = new Set<string>();\n for (const plugin of plugins) {\n if (!plugin.name) {\n return {\n level: \"error\",\n plugin: \"\",\n message: \"Plugin name must not be empty (PLG-1)\",\n };\n }\n if (seen.has(plugin.name)) {\n return {\n level: \"error\",\n plugin: plugin.name,\n message: `Duplicate plugin name \"${plugin.name}\" (GEN-2)`,\n };\n }\n seen.add(plugin.name);\n }\n return undefined;\n}\n","import type { Diagnostic, FilePatch } from \"./types.js\";\n\ntype FileEntry = {\n content: string;\n source: string; // plugin name that set the file\n};\n\n/**\n * Virtual filesystem for composing FilePatch operations.\n *\n * Maintains an in-memory FS and detects collisions per FP-5, FP-6, FP-7.\n * Paths are assumed to be already validated/normalized.\n */\nexport class VirtualFS {\n private readonly files = new Map<string, FileEntry>();\n private readonly deleted = new Set<string>();\n\n /**\n * Apply a FilePatch to the virtual FS.\n * Returns a Diagnostic if a collision/warning condition is detected.\n */\n applyPatch(patch: FilePatch, pluginName: string): Diagnostic | undefined {\n if (patch.op === \"set\") {\n return this.applySet(patch.path, patch.content, pluginName);\n }\n return this.applyDelete(patch.path, pluginName);\n }\n\n private applySet(path: string, content: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (existing) {\n // FP-5: Duplicate set on same path -> error\n const samePlugin = existing.source === pluginName;\n return {\n level: \"error\",\n plugin: pluginName,\n message: samePlugin\n ? `Duplicate set on \"${path}\" within plugin \"${pluginName}\"`\n : `File \"${path}\" already set by plugin \"${existing.source}\", cannot be set again by \"${pluginName}\"`,\n };\n }\n\n // delete-then-set is allowed (intentional regeneration)\n this.deleted.delete(path);\n this.files.set(path, { content, source: pluginName });\n return undefined;\n }\n\n private applyDelete(path: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (!existing && !this.deleted.has(path)) {\n // FP-7: Delete on nonexistent path -> warn\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `Delete on nonexistent path \"${path}\"`,\n };\n }\n\n if (existing) {\n // FP-6: set-then-delete -> allowed with warning\n this.files.delete(path);\n this.deleted.add(path);\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `File \"${path}\" set by plugin \"${existing.source}\" is being deleted by \"${pluginName}\". Prior work is voided.`,\n };\n }\n\n // Already deleted - just track it\n this.deleted.add(path);\n return undefined;\n }\n\n /**\n * Get all files in deterministic (lexicographic) order (DET-5).\n */\n getFiles(): Array<{ path: string; content: string }> {\n const entries = Array.from(this.files.entries());\n entries.sort(([a], [b]) => a.localeCompare(b));\n return entries.map(([path, { content }]) => ({ path, content }));\n }\n\n has(path: string): boolean {\n return this.files.has(path);\n }\n}\n","export type PathValidationResult =\n | { valid: true; normalized: string }\n | { valid: false; reason: string };\n\n/**\n * Validate and normalize a file path per FP-1, FP-2, GEN-6.\n *\n * - MUST be a POSIX relative path\n * - MUST NOT contain `..`, absolute prefixes, drive letters, or null bytes\n * - Normalizes backslashes, multiple slashes, and leading `./`\n */\nexport function validatePath(path: string): PathValidationResult {\n if (!path) {\n return { valid: false, reason: \"Path must not be empty\" };\n }\n\n if (path.includes(\"\\0\")) {\n return { valid: false, reason: \"Path must not contain null bytes\" };\n }\n\n // Normalize backslashes to forward slashes (GEN-6)\n let normalized = path.replace(/\\\\/g, \"/\");\n\n // Check for drive letters (e.g., C:/)\n if (/^[a-zA-Z]:/.test(normalized)) {\n return { valid: false, reason: \"Path must not contain drive letters\" };\n }\n\n // Check for absolute path\n if (normalized.startsWith(\"/\")) {\n return { valid: false, reason: \"Path must be relative, not absolute\" };\n }\n\n // Collapse multiple slashes\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // Remove leading ./\n if (normalized.startsWith(\"./\")) {\n normalized = normalized.slice(2);\n }\n\n // Remove trailing slash\n if (normalized.endsWith(\"/\") && normalized.length > 1) {\n normalized = normalized.slice(0, -1);\n }\n\n // Check for .. traversal (after normalization)\n const segments = normalized.split(\"/\");\n for (const segment of segments) {\n if (segment === \"..\") {\n return { valid: false, reason: \"Path must not contain '..' traversal\" };\n }\n }\n\n if (!normalized) {\n return { valid: false, reason: \"Path resolves to empty after normalization\" };\n }\n\n return { valid: true, normalized };\n}\n","import { toCanonical, sha256Sync } from \"@manifesto-ai/core\";\n\n/**\n * Deterministic hash function (DET-1).\n * Same input always produces the same output.\n * Uses Core's canonical form (sorted keys, no undefined) + SHA-256.\n */\nexport function stableHash(input: unknown): string {\n const canonical = toCanonical(input);\n return sha256Sync(canonical);\n}\n","export interface HeaderOptions {\n readonly sourceId?: string;\n readonly schemaHash: string;\n readonly stamp?: boolean;\n}\n\n/**\n * Generate the @generated file header (DET-2, DET-3, DET-4).\n *\n * Default mode: no timestamp (deterministic).\n * With stamp=true: appends ISO 8601 timestamp line.\n */\nexport function generateHeader(options: HeaderOptions): string {\n const source = options.sourceId ?? \"unknown\";\n const lines = [\n \"// @generated by @manifesto-ai/codegen \\u2014 DO NOT EDIT\",\n `// Source: ${source} | Schema hash: ${options.schemaHash}`,\n ];\n\n if (options.stamp) {\n lines.push(`// Generated at: ${new Date().toISOString()}`);\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { FieldSpec } from \"@manifesto-ai/core\";\n\nexport type DomainPrimitive = \"string\" | \"number\" | \"boolean\" | \"null\";\n\nexport type DomainTypeField = {\n readonly type: DomainType;\n readonly optional: boolean;\n};\n\nexport type DomainType =\n | { readonly kind: \"unknown\" }\n | { readonly kind: \"primitive\"; readonly type: DomainPrimitive }\n | { readonly kind: \"literal\"; readonly value: string | number | boolean | null }\n | { readonly kind: \"array\"; readonly element: DomainType }\n | { readonly kind: \"tuple\"; readonly elements: readonly DomainType[] }\n | { readonly kind: \"object\"; readonly fields: Readonly<Record<string, DomainTypeField>> }\n | { readonly kind: \"record\"; readonly key: DomainType; readonly value: DomainType }\n | { readonly kind: \"union\"; readonly types: readonly DomainType[] };\n\nconst UNKNOWN_TYPE: DomainType = { kind: \"unknown\" };\nconst NULL_TYPE: DomainType = { kind: \"primitive\", type: \"null\" };\n\nexport function unknownType(): DomainType {\n return UNKNOWN_TYPE;\n}\n\nexport function primitiveType(type: DomainPrimitive): DomainType {\n return type === \"null\" ? NULL_TYPE : { kind: \"primitive\", type };\n}\n\nexport function literalType(\n value: string | number | boolean | null\n): DomainType {\n return value === null ? NULL_TYPE : { kind: \"literal\", value };\n}\n\nexport function arrayType(element: DomainType): DomainType {\n return { kind: \"array\", element };\n}\n\nexport function tupleType(elements: readonly DomainType[]): DomainType {\n return { kind: \"tuple\", elements };\n}\n\nexport function objectType(fields: Record<string, DomainTypeField>): DomainType {\n return { kind: \"object\", fields };\n}\n\nexport function recordType(key: DomainType, value: DomainType): DomainType {\n return { kind: \"record\", key, value };\n}\n\nexport function fieldSpecToDomainField(spec: FieldSpec): DomainTypeField {\n return {\n type: fieldSpecToDomainType(spec),\n optional: !spec.required,\n };\n}\n\nexport function fieldSpecToDomainType(spec: FieldSpec): DomainType {\n let base: DomainType;\n\n if (typeof spec.type === \"object\" && \"enum\" in spec.type) {\n base = unionOf(\n spec.type.enum.map((value) => literalValueToType(value))\n );\n } else {\n switch (spec.type) {\n case \"string\":\n base = primitiveType(\"string\");\n break;\n case \"number\":\n base = primitiveType(\"number\");\n break;\n case \"boolean\":\n base = primitiveType(\"boolean\");\n break;\n case \"null\":\n base = NULL_TYPE;\n break;\n case \"object\":\n if (spec.fields) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(spec.fields)) {\n fields[name] = fieldSpecToDomainField(spec.fields[name]);\n }\n base = objectType(fields);\n break;\n }\n base = recordType(primitiveType(\"string\"), unknownType());\n break;\n case \"array\":\n base = arrayType(\n spec.items ? fieldSpecToDomainType(spec.items) : unknownType()\n );\n break;\n default:\n base = unknownType();\n break;\n }\n }\n\n return spec.required ? base : unionOf([base, NULL_TYPE]);\n}\n\nexport function literalValueToType(value: unknown): DomainType {\n if (value === null) {\n return NULL_TYPE;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return literalType(value);\n }\n\n if (Array.isArray(value)) {\n return arrayType(\n value.length === 0\n ? unknownType()\n : unionOf(value.map((item) => literalValueToType(item)))\n );\n }\n\n if (isPlainObject(value)) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(value)) {\n fields[name] = {\n type: literalValueToType(value[name]),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n return unknownType();\n}\n\nexport function unionOf(types: readonly DomainType[]): DomainType {\n const flattened: DomainType[] = [];\n\n for (const type of types) {\n if (type.kind === \"unknown\") {\n return type;\n }\n if (type.kind === \"union\") {\n flattened.push(...type.types);\n continue;\n }\n flattened.push(type);\n }\n\n const unique = new Map<string, DomainType>();\n for (const type of flattened) {\n unique.set(stableTypeKey(type), type);\n }\n\n const deduped = Array.from(unique.values());\n if (deduped.length === 0) {\n return unknownType();\n }\n if (deduped.length === 1) {\n return deduped[0];\n }\n return { kind: \"union\", types: deduped };\n}\n\nexport function removeNullType(type: DomainType): DomainType[] {\n switch (type.kind) {\n case \"primitive\":\n return type.type === \"null\" ? [] : [type];\n case \"literal\":\n return type.value === null ? [] : [type];\n case \"union\":\n return type.types.flatMap((member) => removeNullType(member));\n default:\n return [type];\n }\n}\n\nexport function renderDomainType(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return type.type;\n case \"literal\":\n return renderLiteral(type.value);\n case \"array\":\n return `${wrapArrayElement(renderDomainType(type.element), type.element)}[]`;\n case \"tuple\":\n return `[${type.elements.map((element) => renderDomainType(element)).join(\", \")}]`;\n case \"object\": {\n const fieldNames = Object.keys(type.fields).sort();\n if (fieldNames.length === 0) {\n return \"{}\";\n }\n const parts = fieldNames.map((name) => {\n const field = type.fields[name];\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n return `{ ${parts.join(\"; \")} }`;\n }\n case \"record\":\n return `Record<${renderDomainType(type.key)}, ${renderDomainType(type.value)}>`;\n case \"union\":\n return type.types.map((member) => renderDomainType(member)).join(\" | \");\n }\n}\n\nfunction wrapArrayElement(rendered: string, type: DomainType): string {\n if (type.kind === \"union\") {\n return `(${rendered})`;\n }\n return rendered;\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction stableTypeKey(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return `primitive:${type.type}`;\n case \"literal\":\n return `literal:${JSON.stringify(type.value)}`;\n case \"array\":\n return `array:${stableTypeKey(type.element)}`;\n case \"tuple\":\n return `tuple:${type.elements.map((element) => stableTypeKey(element)).join(\",\")}`;\n case \"object\": {\n const keys = Object.keys(type.fields).sort();\n const fields = keys.map((name) => {\n const field = type.fields[name];\n return `${name}:${field.optional ? \"?\" : \"\"}${stableTypeKey(field.type)}`;\n });\n return `object:${fields.join(\",\")}`;\n }\n case \"record\":\n return `record:${stableTypeKey(type.key)}:${stableTypeKey(type.value)}`;\n case \"union\":\n return `union:${type.types.map((member) => stableTypeKey(member)).sort().join(\"|\")}`;\n }\n}\n\nfunction isPlainObject(\n value: unknown\n): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { DomainSchema, ExprNode } from \"@manifesto-ai/core\";\nimport type { Diagnostic } from \"../types.js\";\nimport {\n arrayType,\n fieldSpecToDomainType,\n literalValueToType,\n objectType,\n primitiveType,\n recordType,\n removeNullType,\n tupleType,\n type DomainType,\n type DomainTypeField,\n unionOf,\n unknownType,\n} from \"./domain-type-model.js\";\n\ntype InferenceEnv = ReadonlyMap<string, DomainType>;\n\ntype InferenceContext = {\n readonly schema: DomainSchema;\n readonly pluginName: string;\n readonly diagnostics: Diagnostic[];\n readonly warnedMessages: Set<string>;\n readonly computedCache: Map<string, DomainType>;\n readonly computedInFlight: Set<string>;\n};\n\nconst META_TYPE = objectType({\n actionName: { type: primitiveType(\"string\"), optional: false },\n intentId: { type: primitiveType(\"string\"), optional: false },\n timestamp: { type: primitiveType(\"number\"), optional: false },\n});\n\nexport function createInferenceContext(\n schema: DomainSchema,\n diagnostics: Diagnostic[],\n pluginName: string\n): InferenceContext {\n return {\n schema,\n pluginName,\n diagnostics,\n warnedMessages: new Set(),\n computedCache: new Map(),\n computedInFlight: new Set(),\n };\n}\n\nexport function inferComputedType(\n name: string,\n ctx: InferenceContext\n): DomainType {\n if (ctx.computedCache.has(name)) {\n return ctx.computedCache.get(name) ?? unknownType();\n }\n\n const spec = ctx.schema.computed.fields[name];\n if (!spec) {\n warn(ctx, `Unknown computed field \"${name}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n if (ctx.computedInFlight.has(name)) {\n warn(ctx, `Recursive computed field \"${name}\" could not be inferred. Emitting \"unknown\".`);\n return unknownType();\n }\n\n ctx.computedInFlight.add(name);\n const inferred = inferExprType(spec.expr, ctx, new Map());\n ctx.computedInFlight.delete(name);\n ctx.computedCache.set(name, inferred);\n return inferred;\n}\n\nexport function inferExprType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv = new Map()\n): DomainType {\n switch (expr.kind) {\n case \"lit\":\n return literalValueToType(expr.value);\n\n case \"get\":\n return inferPathType(expr.path, ctx, env);\n\n case \"eq\":\n case \"neq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"and\":\n case \"or\":\n case \"not\":\n case \"startsWith\":\n case \"endsWith\":\n case \"strIncludes\":\n case \"includes\":\n case \"every\":\n case \"some\":\n case \"hasKey\":\n case \"isNull\":\n case \"toBoolean\":\n return primitiveType(\"boolean\");\n\n case \"add\":\n case \"sub\":\n case \"mul\":\n case \"div\":\n case \"mod\":\n case \"min\":\n case \"max\":\n case \"abs\":\n case \"neg\":\n case \"floor\":\n case \"ceil\":\n case \"round\":\n case \"sqrt\":\n case \"pow\":\n case \"sumArray\":\n case \"strLen\":\n case \"len\":\n case \"indexOf\":\n case \"toNumber\":\n return primitiveType(\"number\");\n\n case \"concat\":\n case \"substring\":\n case \"trim\":\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"replace\":\n case \"typeof\":\n case \"toString\":\n return primitiveType(\"string\");\n\n case \"if\":\n return unionOf([\n inferExprType(expr.then, ctx, env),\n inferExprType(expr.else, ctx, env),\n ]);\n\n case \"split\":\n return arrayType(primitiveType(\"string\"));\n\n case \"at\":\n return unionOf([inferIndexedAccessType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"first\":\n case \"last\":\n case \"minArray\":\n case \"maxArray\":\n return unionOf([inferCollectionElementType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"slice\":\n case \"reverse\":\n case \"unique\":\n return inferArrayLikeType(expr.array, ctx, env);\n\n case \"filter\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return arrayType(elementType);\n }\n\n case \"map\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n return arrayType(inferExprType(expr.mapper, ctx, nextEnv));\n }\n\n case \"find\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return unionOf([elementType, primitiveType(\"null\")]);\n }\n\n case \"append\": {\n const baseArray = inferArrayLikeType(expr.array, ctx, env);\n const baseElement = getArrayElementType(baseArray);\n const itemTypes = expr.items.map((item) => inferExprType(item, ctx, env));\n return arrayType(unionOf([baseElement, ...itemTypes]));\n }\n\n case \"flat\":\n return inferFlatType(expr.array, ctx, env);\n\n case \"object\": {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(expr.fields)) {\n fields[name] = {\n type: inferExprType(expr.fields[name], ctx, env),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n case \"field\":\n return inferFieldType(inferExprType(expr.object, ctx, env), expr.property);\n\n case \"keys\":\n return arrayType(primitiveType(\"string\"));\n\n case \"values\":\n return arrayType(inferObjectValueType(inferExprType(expr.obj, ctx, env)));\n\n case \"entries\":\n return arrayType(\n tupleType([\n primitiveType(\"string\"),\n inferObjectValueType(inferExprType(expr.obj, ctx, env)),\n ])\n );\n\n case \"merge\":\n return inferMergeType(\n expr.objects.map((objectExpr) => inferExprType(objectExpr, ctx, env))\n );\n\n case \"pick\":\n return inferPickLikeType(expr.obj, expr.keys, false, ctx, env);\n\n case \"omit\":\n return inferPickLikeType(expr.obj, expr.keys, true, ctx, env);\n\n case \"fromEntries\":\n return inferFromEntriesType(expr.entries, ctx, env);\n\n case \"coalesce\": {\n const members = expr.args.flatMap((arg) =>\n removeNullType(inferExprType(arg, ctx, env))\n );\n return members.length === 0 ? primitiveType(\"null\") : unionOf(members);\n }\n\n default:\n warn(ctx, `Unsupported expression kind \"${(expr as { kind: string }).kind}\". Emitting \"unknown\".`);\n return unknownType();\n }\n}\n\nfunction inferPathType(\n path: string,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const [head, ...tail] = path.split(\".\");\n if (!head) {\n warn(ctx, `Empty get() path encountered. Emitting \"unknown\".`);\n return unknownType();\n }\n\n let base: DomainType | undefined = env.get(head);\n\n if (!base) {\n if (head === \"meta\") {\n base = META_TYPE;\n } else if (Object.hasOwn(ctx.schema.state.fields, head)) {\n base = fieldSpecToDomainType(ctx.schema.state.fields[head]);\n } else if (Object.hasOwn(ctx.schema.computed.fields, head)) {\n base = inferComputedType(head, ctx);\n }\n }\n\n if (!base) {\n warn(ctx, `Unknown get() path \"${path}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n return walkPathType(base, tail);\n}\n\nfunction walkPathType(base: DomainType, segments: readonly string[]): DomainType {\n let current = base;\n for (const segment of segments) {\n current = accessSegmentType(current, segment);\n }\n return current;\n}\n\nfunction accessSegmentType(\n base: DomainType,\n segment: string\n): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, segment)\n ? base.fields[segment].type\n : unknownType();\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"array\":\n return isNumericSegment(segment)\n ? unionOf([base.element, primitiveType(\"null\")])\n : unknownType();\n case \"tuple\":\n return isNumericSegment(segment)\n ? base.elements[Number(segment)] ?? unknownType()\n : unknownType();\n case \"union\":\n return unionIgnoringUnknown(\n base.types.map((member) => accessSegmentType(member, segment))\n );\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(expr, ctx, env);\n switch (base.kind) {\n case \"array\":\n return base.element;\n case \"tuple\":\n return unionOf(base.elements);\n case \"record\":\n return base.value;\n case \"union\":\n return unionOf(base.types.map((member) => inferIndexedAccessFromType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"record\":\n return type.value;\n default:\n return unknownType();\n }\n}\n\nfunction inferCollectionElementType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n return getArrayElementType(inferExprType(expr, ctx, env));\n}\n\nfunction getArrayElementType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"union\":\n return unionOf(type.types.map((member) => getArrayElementType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferArrayLikeType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const inferred = inferExprType(expr, ctx, env);\n switch (inferred.kind) {\n case \"array\":\n return inferred;\n case \"tuple\":\n return arrayType(unionOf(inferred.elements));\n case \"union\": {\n const arrays = inferred.types\n .map((member) => inferArrayLikeFromType(member))\n .filter((member): member is DomainType => member.kind !== \"unknown\");\n return arrays.length === 0 ? arrayType(unknownType()) : unionOf(arrays);\n }\n default:\n return arrayType(unknownType());\n }\n}\n\nfunction inferArrayLikeFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type;\n case \"tuple\":\n return arrayType(unionOf(type.elements));\n default:\n return unknownType();\n }\n}\n\nfunction inferFlatType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const outer = inferArrayLikeType(expr, ctx, env);\n const outerElement = getArrayElementType(outer);\n\n switch (outerElement.kind) {\n case \"array\":\n return arrayType(outerElement.element);\n case \"tuple\":\n return arrayType(unionOf(outerElement.elements));\n case \"union\": {\n const flatMembers: DomainType[] = [];\n for (const member of outerElement.types) {\n if (member.kind === \"array\") {\n flatMembers.push(member.element);\n continue;\n }\n if (member.kind === \"tuple\") {\n flatMembers.push(unionOf(member.elements));\n continue;\n }\n flatMembers.push(member);\n }\n return arrayType(unionOf(flatMembers));\n }\n default:\n return arrayType(outerElement);\n }\n}\n\nfunction inferFieldType(base: DomainType, property: string): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, property)\n ? base.fields[property].type\n : primitiveType(\"null\");\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"union\":\n return unionOf(base.types.map((member) => inferFieldType(member, property)));\n default:\n return primitiveType(\"null\");\n }\n}\n\nfunction inferObjectValueType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"object\": {\n const values = Object.keys(type.fields).map((name) => type.fields[name].type);\n return values.length === 0 ? unknownType() : unionOf(values);\n }\n case \"record\":\n return type.value;\n case \"union\":\n return unionOf(type.types.map((member) => inferObjectValueType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferMergeType(types: readonly DomainType[]): DomainType {\n const fields: Record<string, DomainTypeField> = {};\n let sawObject = false;\n\n for (const type of types) {\n if (type.kind !== \"object\") {\n continue;\n }\n sawObject = true;\n for (const name of Object.keys(type.fields)) {\n fields[name] = type.fields[name];\n }\n }\n\n return sawObject ? objectType(fields) : objectType({});\n}\n\nfunction inferPickLikeType(\n objectExpr: ExprNode,\n keysExpr: ExprNode,\n omit: boolean,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(objectExpr, ctx, env);\n if (base.kind !== \"object\") {\n return objectType({});\n }\n\n const keys = readStringArrayLiteral(keysExpr);\n if (!keys) {\n return base;\n }\n\n const selected = new Set(keys);\n const fields: Record<string, DomainTypeField> = {};\n\n for (const name of Object.keys(base.fields)) {\n const shouldInclude = omit ? !selected.has(name) : selected.has(name);\n if (shouldInclude) {\n fields[name] = base.fields[name];\n }\n }\n\n return objectType(fields);\n}\n\nfunction inferFromEntriesType(\n entriesExpr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const literalEntries = readLiteralEntries(entriesExpr);\n if (literalEntries) {\n const valueTypes = literalEntries.map(([, value]) => literalValueToType(value));\n return recordType(primitiveType(\"string\"), unionOf(valueTypes));\n }\n\n const entriesType = inferExprType(entriesExpr, ctx, env);\n const elementType = getArrayElementType(entriesType);\n\n if (elementType.kind === \"tuple\" && elementType.elements.length >= 2) {\n return recordType(primitiveType(\"string\"), elementType.elements[1]);\n }\n\n return recordType(primitiveType(\"string\"), unknownType());\n}\n\nfunction withCollectionEnv(\n env: InferenceEnv,\n itemType: DomainType\n): Map<string, DomainType> {\n const next = new Map(env);\n next.set(\"$index\", primitiveType(\"number\"));\n next.set(\"$item\", itemType);\n return next;\n}\n\nfunction readStringArrayLiteral(expr: ExprNode): string[] | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const values: string[] = [];\n for (const item of expr.value) {\n if (typeof item !== \"string\") {\n return null;\n }\n values.push(item);\n }\n return values;\n}\n\nfunction readLiteralEntries(\n expr: ExprNode\n): Array<[string, unknown]> | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const entries: Array<[string, unknown]> = [];\n for (const item of expr.value) {\n if (!Array.isArray(item) || item.length !== 2 || typeof item[0] !== \"string\") {\n return null;\n }\n entries.push([item[0], item[1]]);\n }\n return entries;\n}\n\nfunction unionIgnoringUnknown(types: readonly DomainType[]): DomainType {\n const filtered = types.filter((type) => type.kind !== \"unknown\");\n return filtered.length === 0 ? unknownType() : unionOf(filtered);\n}\n\nfunction isNumericSegment(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nfunction warn(ctx: InferenceContext, message: string): void {\n if (ctx.warnedMessages.has(message)) {\n return;\n }\n ctx.warnedMessages.add(message);\n ctx.diagnostics.push({\n level: \"warn\",\n plugin: ctx.pluginName,\n message,\n });\n}\n","import type { CodegenContext, CodegenOutput, CodegenPlugin, Diagnostic } from \"../types.js\";\nimport type { FieldSpec } from \"@manifesto-ai/core\";\nimport { createInferenceContext, inferComputedType } from \"./domain-type-inference.js\";\nimport {\n fieldSpecToDomainField,\n fieldSpecToDomainType,\n renderDomainType,\n type DomainTypeField,\n} from \"./domain-type-model.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-domain\";\n\nexport interface DomainPluginOptions {\n readonly fileName?: string;\n readonly interfaceName?: string;\n readonly includeReservedState?: boolean;\n}\n\nexport function createDomainPlugin(options?: DomainPluginOptions): CodegenPlugin {\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const inference = createInferenceContext(ctx.schema, diagnostics, PLUGIN_NAME);\n\n const interfaceName = options?.interfaceName\n ?? deriveInterfaceName(ctx)\n ?? \"Domain\";\n const fileName = options?.fileName ?? deriveFileName(ctx.sourceId);\n\n const stateFields = renderFieldBlock(\n ctx.schema.state.fields,\n { includeReservedState: options?.includeReservedState ?? false },\n (_name, spec) => fieldSpecToDomainField(spec)\n );\n\n const computedFields = renderFieldBlock(\n ctx.schema.computed.fields,\n { includeReservedState: true },\n (name) => ({\n type: inferComputedType(name, inference),\n optional: false,\n })\n );\n\n const actionNames = Object.keys(ctx.schema.actions).sort();\n const actionLines = actionNames.map((name) => {\n const action = ctx.schema.actions[name];\n return ` ${name}: ${renderActionSignature(action.input)}`;\n });\n\n const sections = [\n \"export interface \" + interfaceName + \" {\",\n \" readonly state: {\",\n stateFields,\n \" }\",\n \" readonly computed: {\",\n computedFields,\n \" }\",\n \" readonly actions: {\",\n actionLines.join(\"\\n\"),\n \" }\",\n \"}\",\n ];\n\n return {\n patches: [{ op: \"set\", path: fileName, content: sections.join(\"\\n\") + \"\\n\" }],\n diagnostics,\n };\n },\n };\n}\n\nfunction renderFieldBlock<T>(\n source: Record<string, T>,\n options: { includeReservedState: boolean },\n mapField: (name: string, value: T) => DomainTypeField\n): string {\n const names = Object.keys(source)\n .filter((name) => options.includeReservedState || !name.startsWith(\"$\"))\n .sort();\n\n if (names.length === 0) {\n return \"\";\n }\n\n return names\n .map((name) => {\n const field = mapField(name, source[name]);\n const optional = field.optional ? \"?\" : \"\";\n return ` ${name}${optional}: ${renderDomainType(field.type)}`;\n })\n .join(\"\\n\");\n}\n\nfunction renderActionSignature(input: FieldSpec | undefined): string {\n if (!input || typeof input !== \"object\" || !(\"type\" in input)) {\n return \"() => void\";\n }\n\n if (input.type !== \"object\" || !input.fields) {\n return `(input: ${renderDomainType(fieldSpecToDomainType(input))}) => void`;\n }\n\n const names = Object.keys(input.fields);\n if (names.length === 0) {\n return \"() => void\";\n }\n\n const params = names.map((name) => {\n const field = fieldSpecToDomainField(input.fields![name]);\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n\n return `(${params.join(\", \")}) => void`;\n}\n\nfunction deriveInterfaceName(ctx: CodegenContext): string | null {\n const metaName = ctx.schema.meta?.name?.trim();\n if (metaName) {\n return metaName;\n }\n\n const basename = basenameWithoutExtension(ctx.sourceId);\n if (!basename) {\n return null;\n }\n\n const candidate = pascalCase(basename);\n return candidate.endsWith(\"Domain\") ? candidate : `${candidate}Domain`;\n}\n\nfunction deriveFileName(sourceId?: string): string {\n if (!sourceId) {\n return \"domain.domain.ts\";\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n const stem = normalized.replace(/\\.[^.]+$/, \"\");\n return `${stem}.domain.ts`;\n}\n\nfunction basenameWithoutExtension(sourceId?: string): string | null {\n if (!sourceId) {\n return null;\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n const basename = normalized.split(\"/\").pop() ?? \"\";\n if (!basename) {\n return null;\n }\n\n return basename.replace(/\\.[^.]+$/, \"\");\n}\n\nfunction pascalCase(value: string): string {\n return value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\");\n}\n","import type { DomainSchema } from \"@manifesto-ai/core\";\n\nimport { createDomainPlugin } from \"./plugins/domain-plugin.js\";\nimport { generate } from \"./runner.js\";\nimport type { CodegenPlugin, GenerateResult } from \"./types.js\";\n\nexport interface CompilerCodegenInput {\n readonly schema: DomainSchema;\n readonly sourceId: string;\n}\n\nexport interface CompilerCodegenOptions {\n readonly outDir?: string;\n readonly plugins?: readonly CodegenPlugin[];\n readonly stamp?: boolean;\n}\n\nexport interface CompilerCodegenEmitter {\n (input: CompilerCodegenInput): Promise<GenerateResult>;\n}\n\nexport function createCompilerCodegen(\n options: CompilerCodegenOptions = {}\n): CompilerCodegenEmitter {\n const outDir = options.outDir ?? \".\";\n const plugins = options.plugins ?? [createDomainPlugin()];\n\n return async (input: CompilerCodegenInput) => {\n const result = await generate({\n schema: input.schema,\n sourceId: input.sourceId,\n outDir,\n plugins,\n stamp: options.stamp,\n });\n\n const errors = result.diagnostics.filter((diagnostic) => diagnostic.level === \"error\");\n if (errors.length > 0) {\n const details = errors\n .map((diagnostic) => `[${diagnostic.plugin}] ${diagnostic.message}`)\n .join(\"\\n\");\n throw new Error(`Codegen failed for ${input.sourceId}\\n${details}`);\n }\n\n return result;\n };\n}\n","import type {\n TypeDefinition,\n TypeSpec,\n ActionSpec,\n FieldSpec,\n FieldType,\n} from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface TsPluginOptions {\n readonly typesFile?: string;\n readonly actionsFile?: string;\n}\n\nexport interface TsPluginArtifacts {\n readonly typeNames: string[];\n readonly typeImportPath: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createTsPlugin(options?: TsPluginOptions): CodegenPlugin {\n const typesFile = options?.typesFile ?? \"types.ts\";\n const actionsFile = options?.actionsFile ?? \"actions.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const typeNames: string[] = [];\n\n // Generate types from schema.types (GEN-10, TS-6: lexicographic order)\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const typeDecls: string[] = [];\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n typeNames.push(name);\n typeDecls.push(renderNamedType(name, spec, diagnostics));\n }\n\n const typesContent = typeDecls.join(\"\\n\\n\") + \"\\n\";\n\n // Generate action input types\n const sortedActionNames = Object.keys(ctx.schema.actions).sort();\n const actionDecls: string[] = [];\n\n for (const actionName of sortedActionNames) {\n const spec = ctx.schema.actions[actionName];\n if (spec.input) {\n const typeName = pascalCase(actionName) + \"Input\";\n actionDecls.push(renderActionInputType(typeName, spec, diagnostics));\n }\n }\n\n const patches = [\n { op: \"set\" as const, path: typesFile, content: typesContent },\n ];\n\n if (actionDecls.length > 0) {\n const actionsContent = actionDecls.join(\"\\n\\n\") + \"\\n\";\n patches.push({ op: \"set\" as const, path: actionsFile, content: actionsContent });\n }\n\n const artifacts: TsPluginArtifacts = {\n typeNames,\n typeImportPath: `./${typesFile.replace(/\\.ts$/, \"\")}`,\n };\n\n return { patches, artifacts: artifacts as unknown as Record<string, unknown>, diagnostics };\n },\n };\n}\n\n// --- Type rendering ---\n\nfunction renderNamedType(\n name: string,\n spec: TypeSpec,\n diagnostics: Diagnostic[]\n): string {\n const def = spec.definition;\n\n // TS-3: top-level named object -> export interface\n if (def.kind === \"object\") {\n return renderInterface(name, def.fields, diagnostics);\n }\n\n // TS-3: all other named types -> export type\n const tsType = mapTypeDefinition(def, diagnostics);\n return `export type ${name} = ${tsType};`;\n}\n\nfunction renderInterface(\n name: string,\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const lines: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n // TS-5: optional -> ?\n const opt = field.optional ? \"?\" : \"\";\n lines.push(` ${fieldName}${opt}: ${tsType};`);\n }\n\n return `export interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitive(def.type);\n\n case \"literal\":\n return renderLiteral(def.value);\n\n case \"array\":\n return `${wrapComplex(mapTypeDefinition(def.element, diagnostics), def.element)}[]`;\n\n case \"record\":\n return `Record<${mapTypeDefinition(def.key, diagnostics)}, ${mapTypeDefinition(def.value, diagnostics)}>`;\n\n case \"object\": {\n const sortedFields = Object.keys(def.fields).sort();\n const parts: string[] = [];\n for (const fieldName of sortedFields) {\n const field = def.fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n const opt = field.optional ? \"?\" : \"\";\n parts.push(`${fieldName}${opt}: ${tsType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n\n case \"union\":\n // TS-2: nullable uses T | null\n return def.types.map((t) => mapTypeDefinition(t, diagnostics)).join(\" | \");\n\n case \"ref\":\n return def.name;\n\n default: {\n // PLG-3, TS-1: unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"unknown\".`,\n });\n return \"unknown\";\n }\n }\n}\n\nfunction mapPrimitive(type: string): string {\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n default:\n return \"unknown\";\n }\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/** Wrap union types in parens when used as array element */\nfunction wrapComplex(tsType: string, def: TypeDefinition): string {\n if (def.kind === \"union\") {\n return `(${tsType})`;\n }\n return tsType;\n}\n\n// --- Action input rendering ---\n\nfunction renderActionInputType(\n typeName: string,\n spec: ActionSpec,\n diagnostics: Diagnostic[]\n): string {\n if (!spec.input) {\n return \"\";\n }\n const tsType = mapFieldSpec(spec.input, diagnostics);\n return `export type ${typeName} = ${tsType};`;\n}\n\nfunction mapFieldSpec(\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n const baseType = mapFieldType(spec.type, spec, diagnostics);\n\n // GEN-12: degrade for unknown structures\n if (!spec.required && baseType !== \"unknown\") {\n return `${baseType} | null`;\n }\n return baseType;\n}\n\nfunction mapFieldType(\n type: FieldType,\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n if (typeof type === \"object\" && \"enum\" in type) {\n // Enum -> union of literals\n return type.enum.map((v) => renderLiteral(v as string | number | boolean | null)).join(\" | \");\n }\n\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\": {\n if (spec.fields) {\n const sortedFields = Object.keys(spec.fields).sort();\n const parts: string[] = [];\n for (const name of sortedFields) {\n const field = spec.fields[name];\n const fieldType = mapFieldSpec(field, diagnostics);\n const opt = field.required ? \"\" : \"?\";\n parts.push(`${name}${opt}: ${fieldType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n // GEN-12: unstructured object -> unknown\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Object field without fields spec, degrading to Record<string, unknown>\",\n });\n return \"Record<string, unknown>\";\n }\n case \"array\": {\n if (spec.items) {\n return `${mapFieldSpec(spec.items, diagnostics)}[]`;\n }\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Array field without items spec, degrading to unknown[]\",\n });\n return \"unknown[]\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction pascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n}\n","import type { TypeDefinition, TypeSpec } from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\nimport type { TsPluginArtifacts } from \"./ts-plugin.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-zod\";\nconst TS_PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface ZodPluginOptions {\n readonly schemasFile?: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createZodPlugin(options?: ZodPluginOptions): CodegenPlugin {\n const schemasFile = options?.schemasFile ?? \"base.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n\n // PLG-11: Optional TS artifacts dependency\n const tsArtifacts = ctx.artifacts[TS_PLUGIN_NAME] as TsPluginArtifacts | undefined;\n\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const schemaDecls: string[] = [];\n\n // Collect all type names for forward declarations with z.lazy\n const allTypeNames = new Set(sortedTypeNames);\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n schemaDecls.push(renderNamedSchema(name, spec, allTypeNames, tsArtifacts, diagnostics));\n }\n\n // Build imports\n const imports: string[] = ['import { z } from \"zod\";'];\n\n // ZOD-4: Import TS types for annotations when available\n if (tsArtifacts && tsArtifacts.typeNames.length > 0) {\n const typeImports = sortedTypeNames\n .filter((n) => tsArtifacts.typeNames.includes(n))\n .join(\", \");\n if (typeImports) {\n imports.push(`import type { ${typeImports} } from \"${tsArtifacts.typeImportPath}\";`);\n }\n }\n\n const content = imports.join(\"\\n\") + \"\\n\\n\" + schemaDecls.join(\"\\n\\n\") + \"\\n\";\n\n return {\n patches: [{ op: \"set\", path: schemasFile, content }],\n diagnostics,\n };\n },\n };\n}\n\n// --- Schema rendering ---\n\nfunction renderNamedSchema(\n name: string,\n spec: TypeSpec,\n allTypeNames: Set<string>,\n tsArtifacts: TsPluginArtifacts | undefined,\n diagnostics: Diagnostic[]\n): string {\n const schemaName = `${name}Schema`;\n const zodExpr = mapTypeDefinition(spec.definition, allTypeNames, diagnostics);\n\n // ZOD-4/ZOD-5: Type annotation when TS artifacts available\n const hasTypeAnnotation = tsArtifacts && tsArtifacts.typeNames.includes(name);\n const annotation = hasTypeAnnotation ? `: z.ZodType<${name}>` : \"\";\n\n return `export const ${schemaName}${annotation} = ${zodExpr};`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitiveZod(def.type);\n\n case \"literal\":\n return `z.literal(${renderLiteralValue(def.value)})`;\n\n case \"array\":\n return `z.array(${mapTypeDefinition(def.element, allTypeNames, diagnostics)})`;\n\n case \"record\":\n return handleRecord(def, allTypeNames, diagnostics);\n\n case \"object\":\n return renderZodObject(def.fields, allTypeNames, diagnostics);\n\n case \"union\":\n return handleUnion(def.types, allTypeNames, diagnostics);\n\n case \"ref\":\n // ZOD-2: Always z.lazy for circular reference support\n return `z.lazy(() => ${def.name}Schema)`;\n\n default: {\n // ZOD-1: Unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"z.unknown()\".`,\n });\n return \"z.unknown()\";\n }\n }\n}\n\nfunction mapPrimitiveZod(type: string): string {\n switch (type) {\n case \"string\":\n return \"z.string()\";\n case \"number\":\n return \"z.number()\";\n case \"boolean\":\n return \"z.boolean()\";\n case \"null\":\n return \"z.null()\";\n default:\n return \"z.unknown()\";\n }\n}\n\nfunction renderLiteralValue(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (value === null) {\n return \"null\";\n }\n return String(value);\n}\n\nfunction handleRecord(\n def: Extract<TypeDefinition, { kind: \"record\" }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const valueSchema = mapTypeDefinition(def.value, allTypeNames, diagnostics);\n\n // ZOD-7: Non-string record key -> degrade to z.record(z.string(), ...)\n if (def.key.kind !== \"primitive\" || def.key.type !== \"string\") {\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Record key type is not string (got ${JSON.stringify(def.key)}). Degrading to z.record(z.string(), ...).`,\n });\n return `z.record(z.string(), ${valueSchema})`;\n }\n\n return `z.record(z.string(), ${valueSchema})`;\n}\n\nfunction renderZodObject(\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const parts: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n let zodType = mapTypeDefinition(field.type, allTypeNames, diagnostics);\n\n // ZOD-6: optional -> .optional()\n if (field.optional) {\n zodType += \".optional()\";\n }\n\n parts.push(` ${fieldName}: ${zodType},`);\n }\n\n return `z.object({\\n${parts.join(\"\\n\")}\\n})`;\n}\n\nfunction handleUnion(\n types: TypeDefinition[],\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n // ZOD-3: 2-variant union with null -> z.nullable(T)\n if (types.length === 2) {\n const nullIdx = types.findIndex(\n (t) => t.kind === \"primitive\" && t.type === \"null\"\n );\n if (nullIdx !== -1) {\n const otherIdx = nullIdx === 0 ? 1 : 0;\n const otherSchema = mapTypeDefinition(types[otherIdx], allTypeNames, diagnostics);\n return `z.nullable(${otherSchema})`;\n }\n }\n\n const schemas = types.map((t) => mapTypeDefinition(t, allTypeNames, diagnostics));\n return `z.union([${schemas.join(\", \")}])`;\n}\n"],"mappings":"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","names":["PLUGIN_NAME","pascalCase","renderLiteral","PLUGIN_NAME","mapTypeDefinition"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manifesto-ai/codegen",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Manifesto Codegen - Plugin-based code generation from DomainSchema",
5
5
  "author": "eggplantiny <eggplantiny@gmail.com>",
6
6
  "license": "MIT",