@json-render/yaml 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -407,8 +407,11 @@ function formatZodType(schema) {
|
|
|
407
407
|
case "boolean":
|
|
408
408
|
return "boolean";
|
|
409
409
|
case "ZodLiteral":
|
|
410
|
-
case "literal":
|
|
411
|
-
|
|
410
|
+
case "literal": {
|
|
411
|
+
const litValues = def.values;
|
|
412
|
+
const litValue = litValues?.[0] ?? def.value;
|
|
413
|
+
return JSON.stringify(litValue);
|
|
414
|
+
}
|
|
412
415
|
case "ZodEnum":
|
|
413
416
|
case "enum": {
|
|
414
417
|
let values;
|
|
@@ -449,6 +452,19 @@ function formatZodType(schema) {
|
|
|
449
452
|
const options = def.options;
|
|
450
453
|
return options ? options.map((opt) => formatZodType(opt)).join(" | ") : "unknown";
|
|
451
454
|
}
|
|
455
|
+
case "ZodRecord":
|
|
456
|
+
case "record": {
|
|
457
|
+
const keyType = def.keyType ?? void 0;
|
|
458
|
+
const valueType = def.valueType ?? def.element ?? void 0;
|
|
459
|
+
const keyStr = keyType ? formatZodType(keyType) : "string";
|
|
460
|
+
const valueStr = valueType ? formatZodType(valueType) : "unknown";
|
|
461
|
+
return `Record<${keyStr}, ${valueStr}>`;
|
|
462
|
+
}
|
|
463
|
+
case "ZodDefault":
|
|
464
|
+
case "default": {
|
|
465
|
+
const inner = def.innerType ?? def.wrapped;
|
|
466
|
+
return inner ? formatZodType(inner) : "unknown";
|
|
467
|
+
}
|
|
452
468
|
default:
|
|
453
469
|
return "unknown";
|
|
454
470
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/diff.ts","../src/merge.ts","../src/parser.ts","../src/transform.ts","../src/prompt.ts"],"sourcesContent":["// Diff\nexport { diffToPatches } from \"./diff\";\n\n// Merge\nexport { deepMergeSpec } from \"./merge\";\n\n// Streaming YAML compiler\nexport type { YamlStreamCompiler } from \"./parser\";\nexport { createYamlStreamCompiler } from \"./parser\";\n\n// AI SDK transform\nexport {\n createYamlTransform,\n pipeYamlRender,\n YAML_SPEC_FENCE,\n YAML_EDIT_FENCE,\n YAML_PATCH_FENCE,\n DIFF_FENCE,\n FENCE_CLOSE,\n} from \"./transform\";\n\n// Prompt generation\nexport type { YamlPromptOptions } from \"./prompt\";\nexport { yamlPrompt } from \"./prompt\";\n","export { diffToPatches } from \"@json-render/core\";\n","export { deepMergeSpec } from \"@json-render/core\";\n","import { parse } from \"yaml\";\nimport type { JsonPatch } from \"@json-render/core\";\nimport { diffToPatches } from \"./diff\";\n\n/**\n * Streaming YAML compiler that incrementally parses YAML text and emits\n * JSON Patch operations for each change detected.\n *\n * Same interface shape as `SpecStreamCompiler` from `@json-render/core`.\n */\nexport interface YamlStreamCompiler<T> {\n /** Push a chunk of text. Returns the current result and any new patches. */\n push(chunk: string): { result: T; newPatches: JsonPatch[] };\n /** Flush remaining buffer and return the final result. */\n flush(): { result: T; newPatches: JsonPatch[] };\n /** Get the current compiled result. */\n getResult(): T;\n /** Get all patches that have been applied. */\n getPatches(): JsonPatch[];\n /** Reset the compiler to initial state. */\n reset(initial?: Partial<T>): void;\n}\n\n/**\n * Create a streaming YAML compiler.\n *\n * Incrementally parses YAML text as it arrives and emits JSON Patch\n * operations by diffing each successful parse against the previous snapshot.\n *\n * Uses `yaml.parse()` with YAML 1.2 defaults (the `yaml` v2 default).\n * YAML 1.2 does not coerce `yes`/`no`/`on`/`off` to booleans.\n *\n * @example\n * ```ts\n * const compiler = createYamlStreamCompiler<Spec>();\n * compiler.push(\"root: main\\n\");\n * compiler.push(\"elements:\\n main:\\n type: Card\\n\");\n * const { result } = compiler.flush();\n * ```\n */\nexport function createYamlStreamCompiler<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(initial?: Partial<T>): YamlStreamCompiler<T> {\n let accumulated = \"\";\n let snapshot: Record<string, unknown> = initial\n ? { ...initial }\n : ({} as Record<string, unknown>);\n let result: T = { ...snapshot } as T;\n const allPatches: JsonPatch[] = [];\n\n function tryParse(): { result: T; newPatches: JsonPatch[] } {\n const newPatches: JsonPatch[] = [];\n\n try {\n const parsed = parse(accumulated);\n\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const patches = diffToPatches(\n snapshot,\n parsed as Record<string, unknown>,\n );\n\n if (patches.length > 0) {\n snapshot = structuredClone(parsed as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.push(...patches);\n newPatches.push(...patches);\n }\n }\n } catch {\n // Incomplete YAML — wait for more data\n }\n\n return { result, newPatches };\n }\n\n return {\n push(chunk: string): { result: T; newPatches: JsonPatch[] } {\n accumulated += chunk;\n\n // Only attempt parse when we have a complete line\n if (chunk.includes(\"\\n\")) {\n return tryParse();\n }\n\n return { result, newPatches: [] };\n },\n\n flush(): { result: T; newPatches: JsonPatch[] } {\n return tryParse();\n },\n\n getResult(): T {\n return result;\n },\n\n getPatches(): JsonPatch[] {\n return [...allPatches];\n },\n\n reset(newInitial?: Partial<T>): void {\n accumulated = \"\";\n snapshot = newInitial\n ? { ...newInitial }\n : ({} as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.length = 0;\n },\n };\n}\n","import { parse, stringify } from \"yaml\";\nimport { applyPatch as applyUnifiedDiff } from \"diff\";\nimport {\n SPEC_DATA_PART_TYPE,\n deepMergeSpec,\n diffToPatches,\n type JsonPatch,\n type Spec,\n type StreamChunk,\n} from \"@json-render/core\";\nimport { createYamlStreamCompiler } from \"./parser\";\n\nexport const YAML_SPEC_FENCE = \"```yaml-spec\";\nexport const YAML_EDIT_FENCE = \"```yaml-edit\";\nexport const YAML_PATCH_FENCE = \"```yaml-patch\";\nexport const DIFF_FENCE = \"```diff\";\nexport const FENCE_CLOSE = \"```\";\n\nexport interface YamlTransformOptions {\n /** Seed with a previous spec for multi-turn edit support. */\n previousSpec?: Spec;\n}\n\n/**\n * Creates a `TransformStream` that intercepts AI SDK UI message stream chunks\n * and converts YAML spec/edit blocks into json-render patch data parts.\n *\n * Two fence types are recognised:\n *\n * 1. **`\\`\\`\\`yaml-spec`** — Full YAML spec. Parsed progressively, emitting\n * patches as each new property is detected.\n * 2. **`\\`\\`\\`yaml-edit`** — Partial YAML. Deep-merged with the current spec,\n * then diffed to produce patches. Only changed keys need to be included.\n *\n * Non-fenced text passes through unchanged as `text-delta` chunks, matching\n * the behaviour of `createJsonRenderTransform` from `@json-render/core`.\n */\nexport function createYamlTransform(\n options?: YamlTransformOptions,\n): TransformStream<StreamChunk, StreamChunk> {\n let currentTextId = \"\";\n let inTextBlock = false;\n let textIdCounter = 0;\n\n let lineBuffer = \"\";\n let buffering = false;\n\n // Fence state\n let fenceMode: \"yaml-spec\" | \"yaml-edit\" | \"yaml-patch\" | \"diff\" | null =\n null;\n let yamlAccumulated = \"\";\n let diffAccumulated = \"\";\n\n // Streaming compiler for yaml-spec progressive rendering\n let compiler = createYamlStreamCompiler<Record<string, unknown>>();\n\n // The \"current spec\" — built up during yaml-spec, used as base for yaml-edit\n let currentSpec: Record<string, unknown> = options?.previousSpec\n ? structuredClone(\n options.previousSpec as unknown as Record<string, unknown>,\n )\n : {};\n\n // ── Text block helpers (same pattern as createJsonRenderTransform) ──\n\n function closeTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n }\n\n function ensureTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!inTextBlock) {\n textIdCounter++;\n currentTextId = String(textIdCounter);\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n inTextBlock = true;\n }\n }\n\n function emitTextDelta(\n delta: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n ensureTextBlock(controller);\n controller.enqueue({ type: \"text-delta\", id: currentTextId, delta });\n }\n\n function emitPatch(\n patch: JsonPatch,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n closeTextBlock(controller);\n controller.enqueue({\n type: SPEC_DATA_PART_TYPE,\n data: { type: \"patch\", patch },\n });\n }\n\n function emitPatches(\n patches: JsonPatch[],\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const patch of patches) {\n emitPatch(patch, controller);\n }\n }\n\n // ── YAML fence processing ──\n\n /**\n * Feed a line of YAML to the streaming compiler (yaml-spec mode).\n * Emits patches for any newly detected properties.\n */\n function feedYamlSpec(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n yamlAccumulated += line + \"\\n\";\n const { newPatches } = compiler.push(line + \"\\n\");\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n }\n\n /**\n * Feed a line of YAML for edit mode. We accumulate all lines and process\n * on fence close since partial edits may not parse until complete.\n */\n function feedYamlEdit(line: string) {\n yamlAccumulated += line + \"\\n\";\n }\n\n /**\n * Finalise a yaml-edit block: parse the accumulated YAML, deep-merge\n * with the current spec, diff, and emit patches.\n */\n function finaliseYamlEdit(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const editObj = parse(yamlAccumulated);\n if (editObj && typeof editObj === \"object\" && !Array.isArray(editObj)) {\n const merged = deepMergeSpec(\n currentSpec,\n editObj as Record<string, unknown>,\n );\n const patches = diffToPatches(currentSpec, merged);\n if (patches.length > 0) {\n currentSpec = merged;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Invalid YAML edit block — silently drop\n }\n }\n\n /**\n * Finalise a yaml-spec block: flush the compiler for any remaining\n * partial data and update currentSpec.\n */\n function finaliseYamlSpec(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const { newPatches } = compiler.flush();\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n currentSpec = structuredClone(\n compiler.getResult() as Record<string, unknown>,\n );\n }\n\n /**\n * Finalise a yaml-patch block: parse each accumulated line as an\n * RFC 6902 JSON Patch operation and emit directly.\n */\n function finaliseYamlPatch(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const line of yamlAccumulated.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const patch = JSON.parse(trimmed) as JsonPatch;\n if (patch.op) {\n emitPatch(patch, controller);\n // Update currentSpec for subsequent edits\n if (patch.op === \"add\" || patch.op === \"replace\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) target[lastKey] = patch.value;\n } else if (patch.op === \"remove\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null)\n break;\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) delete target[lastKey];\n }\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n\n /**\n * Finalise a diff block: apply the unified diff to the YAML-serialized\n * current spec, reparse, diff against current, and emit patches.\n */\n function finaliseDiff(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const currentYaml = stringify(currentSpec, { indent: 2 });\n const patched = applyUnifiedDiff(currentYaml, diffAccumulated);\n if (patched === false) return;\n const newSpec = parse(patched);\n if (newSpec && typeof newSpec === \"object\" && !Array.isArray(newSpec)) {\n const patches = diffToPatches(\n currentSpec,\n newSpec as Record<string, unknown>,\n );\n if (patches.length > 0) {\n currentSpec = newSpec as Record<string, unknown>;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Diff apply or reparse failed\n }\n }\n\n // ── Line processing ──\n\n function processCompleteLine(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const trimmed = line.trim();\n\n // Fence open detection\n if (fenceMode === null) {\n if (trimmed.startsWith(YAML_SPEC_FENCE)) {\n fenceMode = \"yaml-spec\";\n yamlAccumulated = \"\";\n compiler.reset(currentSpec);\n return;\n }\n if (trimmed.startsWith(YAML_EDIT_FENCE)) {\n fenceMode = \"yaml-edit\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(YAML_PATCH_FENCE)) {\n fenceMode = \"yaml-patch\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(DIFF_FENCE)) {\n fenceMode = \"diff\";\n diffAccumulated = \"\";\n return;\n }\n }\n\n // Fence close detection\n if (fenceMode !== null && trimmed === FENCE_CLOSE) {\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n fenceMode = null;\n return;\n }\n\n // Inside a fence\n if (fenceMode === \"yaml-spec\") {\n feedYamlSpec(line, controller);\n return;\n }\n if (fenceMode === \"yaml-edit\") {\n feedYamlEdit(line);\n return;\n }\n if (fenceMode === \"yaml-patch\") {\n yamlAccumulated += line + \"\\n\";\n return;\n }\n if (fenceMode === \"diff\") {\n diffAccumulated += line + \"\\n\";\n return;\n }\n\n // Outside fence — pass through as text\n if (!trimmed) {\n emitTextDelta(\"\\n\", controller);\n return;\n }\n emitTextDelta(line + \"\\n\", controller);\n }\n\n function flushBuffer(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!lineBuffer) return;\n\n if (fenceMode !== null) {\n processCompleteLine(lineBuffer, controller);\n } else {\n emitTextDelta(lineBuffer, controller);\n }\n lineBuffer = \"\";\n buffering = false;\n }\n\n // ── TransformStream ──\n\n return new TransformStream<StreamChunk, StreamChunk>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-start\": {\n const id = (chunk as { id: string }).id;\n const idNum = parseInt(id, 10);\n if (!isNaN(idNum) && idNum >= textIdCounter) {\n textIdCounter = idNum;\n }\n currentTextId = id;\n inTextBlock = true;\n controller.enqueue(chunk);\n break;\n }\n\n case \"text-delta\": {\n const delta = chunk as { id: string; delta: string };\n const text = delta.delta;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n\n if (ch === \"\\n\") {\n if (buffering) {\n processCompleteLine(lineBuffer, controller);\n lineBuffer = \"\";\n buffering = false;\n } else if (fenceMode === null) {\n emitTextDelta(\"\\n\", controller);\n }\n } else if (lineBuffer.length === 0 && !buffering) {\n // Inside a fence, buffer everything. Outside, only buffer\n // potential fence-open lines (start with backtick).\n if (fenceMode !== null || ch === \"`\") {\n buffering = true;\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n } else if (buffering) {\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n }\n break;\n }\n\n case \"text-end\": {\n flushBuffer(controller);\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n break;\n }\n\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n\n flush(controller) {\n flushBuffer(controller);\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n closeTextBlock(controller);\n },\n });\n}\n\n/**\n * Convenience wrapper that pipes an AI SDK UI message stream through the\n * YAML transform, converting YAML spec/edit blocks into json-render patches.\n *\n * Drop-in replacement for `pipeJsonRender` from `@json-render/core`.\n *\n * @example\n * ```ts\n * import { pipeYamlRender } from \"@json-render/yaml\";\n *\n * const stream = createUIMessageStream({\n * execute: async ({ writer }) => {\n * writer.merge(pipeYamlRender(result.toUIMessageStream()));\n * },\n * });\n * return createUIMessageStreamResponse({ stream });\n * ```\n */\nexport function pipeYamlRender<T = StreamChunk>(\n stream: ReadableStream<T>,\n options?: YamlTransformOptions,\n): ReadableStream<T> {\n return stream.pipeThrough(\n createYamlTransform(options) as unknown as TransformStream<T, T>,\n );\n}\n","import { stringify } from \"yaml\";\nimport type { Catalog, EditMode, SchemaDefinition } from \"@json-render/core\";\nimport { buildEditInstructions } from \"@json-render/core\";\n\ninterface ZodLike {\n _def?: Record<string, unknown>;\n}\n\nexport interface YamlPromptOptions {\n /** Custom system message intro. */\n system?: string;\n /**\n * - `\"standalone\"` (default): LLM outputs only the YAML spec (no prose).\n * - `\"inline\"`: LLM responds conversationally, then wraps YAML in a fence.\n */\n mode?: \"standalone\" | \"inline\";\n /** Additional rules appended to the RULES section. */\n customRules?: string[];\n /** Edit modes to document. Default: `[\"merge\"]` (yaml-edit). */\n editModes?: EditMode[];\n}\n\ninterface CatalogComponentDef {\n props?: ZodLike;\n description?: string;\n slots?: string[];\n events?: string[];\n example?: Record<string, unknown>;\n}\n\n// ── Zod introspection (local, minimal) ──────────────────────────────────────\n\nfunction getZodTypeName(schema: ZodLike): string {\n if (!schema?._def) return \"\";\n const def = schema._def;\n return (\n (def.typeName as string | undefined) ??\n (typeof def.type === \"string\" ? (def.type as string) : \"\") ??\n \"\"\n );\n}\n\nfunction formatZodType(schema: ZodLike): string {\n if (!schema?._def) return \"unknown\";\n const def = schema._def;\n const typeName = getZodTypeName(schema);\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n return \"string\";\n case \"ZodNumber\":\n case \"number\":\n return \"number\";\n case \"ZodBoolean\":\n case \"boolean\":\n return \"boolean\";\n case \"ZodLiteral\":\n case \"literal\":\n return JSON.stringify(def.value);\n case \"ZodEnum\":\n case \"enum\": {\n let values: string[];\n if (Array.isArray(def.values)) {\n values = def.values as string[];\n } else if (def.entries && typeof def.entries === \"object\") {\n values = Object.values(def.entries as Record<string, string>);\n } else {\n return \"enum\";\n }\n return values.map((v) => `\"${v}\"`).join(\" | \");\n }\n case \"ZodArray\":\n case \"array\": {\n const inner = (\n typeof def.element === \"object\"\n ? def.element\n : typeof def.type === \"object\"\n ? def.type\n : undefined\n ) as ZodLike | undefined;\n return inner ? `Array<${formatZodType(inner)}>` : \"Array<unknown>\";\n }\n case \"ZodObject\":\n case \"object\": {\n const shape =\n typeof def.shape === \"function\"\n ? (def.shape as () => Record<string, ZodLike>)()\n : (def.shape as Record<string, ZodLike>);\n if (!shape) return \"object\";\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerTypeName = getZodTypeName(value);\n const isOptional =\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"nullable\";\n return `${key}${isOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n return `{ ${props} }`;\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options\n ? options.map((opt) => formatZodType(opt)).join(\" | \")\n : \"unknown\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction getExampleProps(def: CatalogComponentDef): Record<string, unknown> {\n if (def.example && Object.keys(def.example).length > 0) return def.example;\n if (!def.props?._def) return {};\n const zodDef = def.props._def;\n const typeName = getZodTypeName(def.props);\n if (typeName !== \"ZodObject\" && typeName !== \"object\") return {};\n const shape =\n typeof zodDef.shape === \"function\"\n ? (zodDef.shape as () => Record<string, ZodLike>)()\n : (zodDef.shape as Record<string, ZodLike>);\n if (!shape) return {};\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n const inner = getZodTypeName(value);\n if (\n inner === \"ZodOptional\" ||\n inner === \"optional\" ||\n inner === \"ZodNullable\" ||\n inner === \"nullable\"\n )\n continue;\n result[key] = exampleValue(value);\n }\n return result;\n}\n\nfunction exampleValue(schema: ZodLike): unknown {\n if (!schema?._def) return \"...\";\n const def = schema._def;\n const t = getZodTypeName(schema);\n switch (t) {\n case \"ZodString\":\n case \"string\":\n return \"example\";\n case \"ZodNumber\":\n case \"number\":\n return 0;\n case \"ZodBoolean\":\n case \"boolean\":\n return true;\n case \"ZodLiteral\":\n case \"literal\":\n return def.value;\n case \"ZodEnum\":\n case \"enum\": {\n if (Array.isArray(def.values) && (def.values as unknown[]).length > 0)\n return (def.values as unknown[])[0];\n if (def.entries && typeof def.entries === \"object\") {\n const vals = Object.values(def.entries as Record<string, string>);\n return vals.length > 0 ? vals[0] : \"example\";\n }\n return \"example\";\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\":\n case \"ZodDefault\":\n case \"default\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? exampleValue(inner) : null;\n }\n case \"ZodArray\":\n case \"array\":\n return [];\n case \"ZodObject\":\n case \"object\":\n return getExampleProps({ props: schema } as CatalogComponentDef);\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options && options.length > 0 ? exampleValue(options[0]!) : \"...\";\n }\n default:\n return \"...\";\n }\n}\n\n// ── YAML helper ──\n\n/** Render a value as an indented YAML string (2-space indent). */\nfunction toYaml(value: unknown): string {\n return stringify(value, { indent: 2 }).trimEnd();\n}\n\n// ── Prompt generation ──\n\n/**\n * Generate a YAML-format system prompt from any json-render catalog.\n *\n * Works with catalogs from any renderer (`@json-render/react`,\n * `@json-render/vue`, etc.) — it only reads the catalog metadata.\n *\n * @example\n * ```ts\n * import { yamlPrompt } from \"@json-render/yaml\";\n * const systemPrompt = yamlPrompt(catalog, { mode: \"inline\" });\n * ```\n */\nexport function yamlPrompt(\n catalog: Catalog<SchemaDefinition, unknown>,\n options?: YamlPromptOptions,\n): string {\n const {\n system = \"You are a UI generator that outputs YAML.\",\n mode = \"standalone\",\n customRules = [],\n editModes = [\"merge\"],\n } = options ?? {};\n\n const lines: string[] = [];\n lines.push(system);\n lines.push(\"\");\n\n // ── Output format ──\n\n if (mode === \"inline\") {\n lines.push(\"OUTPUT FORMAT (text + YAML):\");\n lines.push(\n \"You respond conversationally. When generating UI, first write a brief explanation (1-3 sentences), then output the YAML spec wrapped in a ```yaml-spec code fence.\",\n );\n lines.push(\n \"If the user's message does not require a UI (e.g. a greeting or clarifying question), respond with text only — no YAML.\",\n );\n } else {\n lines.push(\"OUTPUT FORMAT (YAML):\");\n lines.push(\n \"Output a YAML document that describes a UI tree. Wrap it in a ```yaml-spec code fence.\",\n );\n }\n lines.push(\"\");\n lines.push(\n \"The YAML document has three top-level keys: root, elements, and state (optional).\",\n );\n lines.push(\n \"Stream progressively — output elements one at a time so the UI fills in as you write.\",\n );\n lines.push(\"\");\n\n // ── Example ──\n\n const allComponents = (catalog.data as Record<string, unknown>).components as\n | Record<string, CatalogComponentDef>\n | undefined;\n const cn = catalog.componentNames;\n const comp1 = cn[0] || \"Component\";\n const comp2 = cn.length > 1 ? cn[1]! : comp1;\n const comp1Def = allComponents?.[comp1];\n const comp2Def = allComponents?.[comp2];\n const comp1Props = comp1Def ? getExampleProps(comp1Def) : {};\n const comp2Props = comp2Def ? getExampleProps(comp2Def) : {};\n\n const exampleSpec = {\n root: \"main\",\n elements: {\n main: {\n type: comp1,\n props: comp1Props,\n children: [\"child-1\", \"list\"],\n },\n \"child-1\": {\n type: comp2,\n props: comp2Props,\n children: [],\n },\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/items\", key: \"id\" },\n children: [\"item\"],\n },\n item: {\n type: comp2,\n props: { ...comp2Props },\n children: [],\n },\n },\n state: {\n items: [\n { id: \"1\", title: \"First Item\" },\n { id: \"2\", title: \"Second Item\" },\n ],\n },\n };\n\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\"```yaml-spec\");\n lines.push(toYaml(exampleSpec));\n lines.push(\"```\");\n lines.push(\"\");\n\n // ── Edit modes (dynamic based on config) ──\n\n lines.push(buildEditInstructions({ modes: editModes }, \"yaml\"));\n\n // ── Initial state ──\n\n lines.push(\"INITIAL STATE:\");\n lines.push(\n \"The spec includes a top-level `state` key to seed the state model. Components using $state, $bindState, $bindItem, $item, or $index read from this state.\",\n );\n lines.push(\n \"CRITICAL: You MUST include state whenever your UI displays data via these expressions or uses repeat to iterate over arrays.\",\n );\n lines.push(\n \"Include realistic sample data. For lists: 3-5 items with relevant fields. Never leave arrays empty.\",\n );\n lines.push(\n 'When content comes from the state model, use { \"$state\": \"/some/path\" } dynamic props instead of hardcoding values.',\n );\n lines.push(\n 'State paths use RFC 6901 JSON Pointer syntax (e.g. \"/todos/0/title\"). Do NOT use dot notation.',\n );\n lines.push(\"\");\n\n // ── Dynamic lists ──\n\n lines.push(\"DYNAMIC LISTS (repeat field):\");\n lines.push(\n \"Any element can have a top-level `repeat` field to render its children once per item in a state array.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/todos\", key: \"id\" },\n children: [\"todo-item\"],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Inside repeated children, use { \"$item\": \"field\" } for item data and { \"$index\": true } for the array index.',\n );\n lines.push(\n \"ALWAYS use repeat for lists backed by state arrays. NEVER hardcode individual elements per item.\",\n );\n lines.push(\n \"IMPORTANT: `repeat` is a top-level field on the element (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"\");\n\n // ── Array state actions ──\n\n lines.push(\"ARRAY STATE ACTIONS:\");\n lines.push(\n 'Use \"pushState\" to append items to arrays. Use \"removeState\" to remove items by index.',\n );\n lines.push('Use \"$id\" inside pushState values to auto-generate a unique ID.');\n lines.push(\"\");\n\n // ── Components ──\n\n if (allComponents) {\n lines.push(`AVAILABLE COMPONENTS (${catalog.componentNames.length}):`);\n lines.push(\"\");\n\n for (const [name, def] of Object.entries(allComponents)) {\n const propsStr = def.props ? formatZodType(def.props) : \"{}\";\n const hasChildren = def.slots && def.slots.length > 0;\n const childrenStr = hasChildren ? \" [accepts children]\" : \"\";\n const eventsStr =\n def.events && def.events.length > 0\n ? ` [events: ${def.events.join(\", \")}]`\n : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}${eventsStr}`);\n }\n lines.push(\"\");\n }\n\n // ── Actions ──\n\n const actions = (catalog.data as Record<string, unknown>).actions as\n | Record<string, { params?: ZodLike; description?: string }>\n | undefined;\n const builtInActions = catalog.schema.builtInActions ?? [];\n const hasCustomActions = actions && catalog.actionNames.length > 0;\n const hasBuiltInActions = builtInActions.length > 0;\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const action of builtInActions) {\n lines.push(`- ${action.name}: ${action.description} [built-in]`);\n }\n if (hasCustomActions) {\n for (const [name, def] of Object.entries(actions)) {\n lines.push(`- ${name}${def.description ? `: ${def.description}` : \"\"}`);\n }\n }\n lines.push(\"\");\n }\n\n // ── Events ──\n\n lines.push(\"EVENTS (the `on` field):\");\n lines.push(\n \"Elements can have an optional `on` field to bind events to actions. It is a top-level field (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n \"save-btn\": {\n type: comp1,\n props: comp1Props,\n on: {\n press: {\n action: \"setState\",\n params: { statePath: \"/saved\", value: true },\n },\n },\n children: [],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Action params can use dynamic references: { \"$state\": \"/statePath\" }.',\n );\n lines.push(\n \"IMPORTANT: Do NOT put action/actionParams inside props. Always use the `on` field.\",\n );\n lines.push(\"\");\n\n // ── Visibility ──\n\n lines.push(\"VISIBILITY CONDITIONS:\");\n lines.push(\n \"Elements can have an optional `visible` field to conditionally show/hide based on state. It is a top-level field (sibling of type/props/children).\",\n );\n lines.push(\"Conditions:\");\n lines.push('- { \"$state\": \"/path\" } — visible when truthy');\n lines.push('- { \"$state\": \"/path\", \"not\": true } — visible when falsy');\n lines.push('- { \"$state\": \"/path\", \"eq\": \"value\" } — visible when equal');\n lines.push(\n '- { \"$state\": \"/path\", \"neq\": \"value\" } — visible when not equal',\n );\n lines.push(\n '- { \"$state\": \"/path\", \"gt\": N } / gte / lt / lte — numeric comparisons',\n );\n lines.push(\"- Use ONE operator per condition. Do not combine multiple.\");\n lines.push('- Add \"not\": true to any condition to invert it.');\n lines.push(\"- [cond, cond] — implicit AND (all must be true)\");\n lines.push('- { \"$and\": [...] } — explicit AND');\n lines.push('- { \"$or\": [...] } — at least one must be true');\n lines.push(\"- true / false — always visible/hidden\");\n lines.push(\"\");\n\n // ── Dynamic props ──\n\n lines.push(\"DYNAMIC PROPS:\");\n lines.push(\"Any prop value can be a dynamic expression:\");\n lines.push(\n '1. Read-only: { \"$state\": \"/path\" } — resolves to the value at that state path.',\n );\n lines.push(\n '2. Two-way binding: { \"$bindState\": \"/path\" } — read + write. Use on form inputs.',\n );\n lines.push(\n ' Inside repeat scopes: { \"$bindItem\": \"field\" } for item-level binding.',\n );\n lines.push(\n '3. Conditional: { \"$cond\": <condition>, \"$then\": <val>, \"$else\": <val> }',\n );\n lines.push(\n '4. Template: { \"$template\": \"Hello, ${/name}!\" } — interpolates state references.',\n );\n lines.push(\"\");\n\n // ── $computed (only if catalog has functions) ──\n\n const catalogFunctions = (catalog.data as Record<string, unknown>).functions;\n if (catalogFunctions && Object.keys(catalogFunctions).length > 0) {\n lines.push(\n '5. Computed: { \"$computed\": \"<fn>\", \"args\": { \"key\": <expr> } }',\n );\n lines.push(\" Available functions:\");\n for (const name of Object.keys(\n catalogFunctions as Record<string, unknown>,\n )) {\n lines.push(` - ${name}`);\n }\n lines.push(\"\");\n }\n\n // ── Validation (only if components have checks) ──\n\n const hasChecks = allComponents\n ? Object.values(allComponents).some((def) => {\n if (!def.props) return false;\n return formatZodType(def.props).includes(\"checks\");\n })\n : false;\n\n if (hasChecks) {\n lines.push(\"VALIDATION:\");\n lines.push(\n \"Form components with a `checks` prop support client-side validation.\",\n );\n lines.push(\n \"Built-in types: required, email, minLength, maxLength, pattern, min, max, numeric, url, matches, equalTo, lessThan, greaterThan, requiredIf.\",\n );\n lines.push(\n \"IMPORTANT: Components with checks must also use $bindState or $bindItem for two-way binding.\",\n );\n lines.push(\"\");\n }\n\n // ── State watchers ──\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"STATE WATCHERS:\");\n lines.push(\n \"Elements can have an optional `watch` field to trigger actions when state changes. Top-level field, NOT inside props.\",\n );\n lines.push(\n \"Maps state paths to action bindings. Fires when the watched value changes (not on initial render).\",\n );\n lines.push(\"\");\n }\n\n // ── Rules ──\n\n lines.push(\"RULES:\");\n const baseRules =\n mode === \"inline\"\n ? [\n \"When generating UI, wrap the YAML in a ```yaml-spec code fence\",\n \"Write a brief conversational response before the YAML\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ]\n : [\n \"Output ONLY the YAML spec inside a ```yaml-spec fence — no prose, no extra markdown\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ];\n\n const schemaRules = catalog.schema.defaultRules ?? [];\n const allRules = [...baseRules, ...schemaRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["import_core","import_yaml","import_diff","import_core","applyUnifiedDiff","import_yaml","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/diff.ts","../src/merge.ts","../src/parser.ts","../src/transform.ts","../src/prompt.ts"],"sourcesContent":["// Diff\nexport { diffToPatches } from \"./diff\";\n\n// Merge\nexport { deepMergeSpec } from \"./merge\";\n\n// Streaming YAML compiler\nexport type { YamlStreamCompiler } from \"./parser\";\nexport { createYamlStreamCompiler } from \"./parser\";\n\n// AI SDK transform\nexport {\n createYamlTransform,\n pipeYamlRender,\n YAML_SPEC_FENCE,\n YAML_EDIT_FENCE,\n YAML_PATCH_FENCE,\n DIFF_FENCE,\n FENCE_CLOSE,\n} from \"./transform\";\n\n// Prompt generation\nexport type { YamlPromptOptions } from \"./prompt\";\nexport { yamlPrompt } from \"./prompt\";\n","export { diffToPatches } from \"@json-render/core\";\n","export { deepMergeSpec } from \"@json-render/core\";\n","import { parse } from \"yaml\";\nimport type { JsonPatch } from \"@json-render/core\";\nimport { diffToPatches } from \"./diff\";\n\n/**\n * Streaming YAML compiler that incrementally parses YAML text and emits\n * JSON Patch operations for each change detected.\n *\n * Same interface shape as `SpecStreamCompiler` from `@json-render/core`.\n */\nexport interface YamlStreamCompiler<T> {\n /** Push a chunk of text. Returns the current result and any new patches. */\n push(chunk: string): { result: T; newPatches: JsonPatch[] };\n /** Flush remaining buffer and return the final result. */\n flush(): { result: T; newPatches: JsonPatch[] };\n /** Get the current compiled result. */\n getResult(): T;\n /** Get all patches that have been applied. */\n getPatches(): JsonPatch[];\n /** Reset the compiler to initial state. */\n reset(initial?: Partial<T>): void;\n}\n\n/**\n * Create a streaming YAML compiler.\n *\n * Incrementally parses YAML text as it arrives and emits JSON Patch\n * operations by diffing each successful parse against the previous snapshot.\n *\n * Uses `yaml.parse()` with YAML 1.2 defaults (the `yaml` v2 default).\n * YAML 1.2 does not coerce `yes`/`no`/`on`/`off` to booleans.\n *\n * @example\n * ```ts\n * const compiler = createYamlStreamCompiler<Spec>();\n * compiler.push(\"root: main\\n\");\n * compiler.push(\"elements:\\n main:\\n type: Card\\n\");\n * const { result } = compiler.flush();\n * ```\n */\nexport function createYamlStreamCompiler<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(initial?: Partial<T>): YamlStreamCompiler<T> {\n let accumulated = \"\";\n let snapshot: Record<string, unknown> = initial\n ? { ...initial }\n : ({} as Record<string, unknown>);\n let result: T = { ...snapshot } as T;\n const allPatches: JsonPatch[] = [];\n\n function tryParse(): { result: T; newPatches: JsonPatch[] } {\n const newPatches: JsonPatch[] = [];\n\n try {\n const parsed = parse(accumulated);\n\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const patches = diffToPatches(\n snapshot,\n parsed as Record<string, unknown>,\n );\n\n if (patches.length > 0) {\n snapshot = structuredClone(parsed as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.push(...patches);\n newPatches.push(...patches);\n }\n }\n } catch {\n // Incomplete YAML — wait for more data\n }\n\n return { result, newPatches };\n }\n\n return {\n push(chunk: string): { result: T; newPatches: JsonPatch[] } {\n accumulated += chunk;\n\n // Only attempt parse when we have a complete line\n if (chunk.includes(\"\\n\")) {\n return tryParse();\n }\n\n return { result, newPatches: [] };\n },\n\n flush(): { result: T; newPatches: JsonPatch[] } {\n return tryParse();\n },\n\n getResult(): T {\n return result;\n },\n\n getPatches(): JsonPatch[] {\n return [...allPatches];\n },\n\n reset(newInitial?: Partial<T>): void {\n accumulated = \"\";\n snapshot = newInitial\n ? { ...newInitial }\n : ({} as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.length = 0;\n },\n };\n}\n","import { parse, stringify } from \"yaml\";\nimport { applyPatch as applyUnifiedDiff } from \"diff\";\nimport {\n SPEC_DATA_PART_TYPE,\n deepMergeSpec,\n diffToPatches,\n type JsonPatch,\n type Spec,\n type StreamChunk,\n} from \"@json-render/core\";\nimport { createYamlStreamCompiler } from \"./parser\";\n\nexport const YAML_SPEC_FENCE = \"```yaml-spec\";\nexport const YAML_EDIT_FENCE = \"```yaml-edit\";\nexport const YAML_PATCH_FENCE = \"```yaml-patch\";\nexport const DIFF_FENCE = \"```diff\";\nexport const FENCE_CLOSE = \"```\";\n\nexport interface YamlTransformOptions {\n /** Seed with a previous spec for multi-turn edit support. */\n previousSpec?: Spec;\n}\n\n/**\n * Creates a `TransformStream` that intercepts AI SDK UI message stream chunks\n * and converts YAML spec/edit blocks into json-render patch data parts.\n *\n * Two fence types are recognised:\n *\n * 1. **`\\`\\`\\`yaml-spec`** — Full YAML spec. Parsed progressively, emitting\n * patches as each new property is detected.\n * 2. **`\\`\\`\\`yaml-edit`** — Partial YAML. Deep-merged with the current spec,\n * then diffed to produce patches. Only changed keys need to be included.\n *\n * Non-fenced text passes through unchanged as `text-delta` chunks, matching\n * the behaviour of `createJsonRenderTransform` from `@json-render/core`.\n */\nexport function createYamlTransform(\n options?: YamlTransformOptions,\n): TransformStream<StreamChunk, StreamChunk> {\n let currentTextId = \"\";\n let inTextBlock = false;\n let textIdCounter = 0;\n\n let lineBuffer = \"\";\n let buffering = false;\n\n // Fence state\n let fenceMode: \"yaml-spec\" | \"yaml-edit\" | \"yaml-patch\" | \"diff\" | null =\n null;\n let yamlAccumulated = \"\";\n let diffAccumulated = \"\";\n\n // Streaming compiler for yaml-spec progressive rendering\n let compiler = createYamlStreamCompiler<Record<string, unknown>>();\n\n // The \"current spec\" — built up during yaml-spec, used as base for yaml-edit\n let currentSpec: Record<string, unknown> = options?.previousSpec\n ? structuredClone(\n options.previousSpec as unknown as Record<string, unknown>,\n )\n : {};\n\n // ── Text block helpers (same pattern as createJsonRenderTransform) ──\n\n function closeTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n }\n\n function ensureTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!inTextBlock) {\n textIdCounter++;\n currentTextId = String(textIdCounter);\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n inTextBlock = true;\n }\n }\n\n function emitTextDelta(\n delta: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n ensureTextBlock(controller);\n controller.enqueue({ type: \"text-delta\", id: currentTextId, delta });\n }\n\n function emitPatch(\n patch: JsonPatch,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n closeTextBlock(controller);\n controller.enqueue({\n type: SPEC_DATA_PART_TYPE,\n data: { type: \"patch\", patch },\n });\n }\n\n function emitPatches(\n patches: JsonPatch[],\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const patch of patches) {\n emitPatch(patch, controller);\n }\n }\n\n // ── YAML fence processing ──\n\n /**\n * Feed a line of YAML to the streaming compiler (yaml-spec mode).\n * Emits patches for any newly detected properties.\n */\n function feedYamlSpec(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n yamlAccumulated += line + \"\\n\";\n const { newPatches } = compiler.push(line + \"\\n\");\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n }\n\n /**\n * Feed a line of YAML for edit mode. We accumulate all lines and process\n * on fence close since partial edits may not parse until complete.\n */\n function feedYamlEdit(line: string) {\n yamlAccumulated += line + \"\\n\";\n }\n\n /**\n * Finalise a yaml-edit block: parse the accumulated YAML, deep-merge\n * with the current spec, diff, and emit patches.\n */\n function finaliseYamlEdit(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const editObj = parse(yamlAccumulated);\n if (editObj && typeof editObj === \"object\" && !Array.isArray(editObj)) {\n const merged = deepMergeSpec(\n currentSpec,\n editObj as Record<string, unknown>,\n );\n const patches = diffToPatches(currentSpec, merged);\n if (patches.length > 0) {\n currentSpec = merged;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Invalid YAML edit block — silently drop\n }\n }\n\n /**\n * Finalise a yaml-spec block: flush the compiler for any remaining\n * partial data and update currentSpec.\n */\n function finaliseYamlSpec(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const { newPatches } = compiler.flush();\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n currentSpec = structuredClone(\n compiler.getResult() as Record<string, unknown>,\n );\n }\n\n /**\n * Finalise a yaml-patch block: parse each accumulated line as an\n * RFC 6902 JSON Patch operation and emit directly.\n */\n function finaliseYamlPatch(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const line of yamlAccumulated.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const patch = JSON.parse(trimmed) as JsonPatch;\n if (patch.op) {\n emitPatch(patch, controller);\n // Update currentSpec for subsequent edits\n if (patch.op === \"add\" || patch.op === \"replace\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) target[lastKey] = patch.value;\n } else if (patch.op === \"remove\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null)\n break;\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) delete target[lastKey];\n }\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n\n /**\n * Finalise a diff block: apply the unified diff to the YAML-serialized\n * current spec, reparse, diff against current, and emit patches.\n */\n function finaliseDiff(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const currentYaml = stringify(currentSpec, { indent: 2 });\n const patched = applyUnifiedDiff(currentYaml, diffAccumulated);\n if (patched === false) return;\n const newSpec = parse(patched);\n if (newSpec && typeof newSpec === \"object\" && !Array.isArray(newSpec)) {\n const patches = diffToPatches(\n currentSpec,\n newSpec as Record<string, unknown>,\n );\n if (patches.length > 0) {\n currentSpec = newSpec as Record<string, unknown>;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Diff apply or reparse failed\n }\n }\n\n // ── Line processing ──\n\n function processCompleteLine(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const trimmed = line.trim();\n\n // Fence open detection\n if (fenceMode === null) {\n if (trimmed.startsWith(YAML_SPEC_FENCE)) {\n fenceMode = \"yaml-spec\";\n yamlAccumulated = \"\";\n compiler.reset(currentSpec);\n return;\n }\n if (trimmed.startsWith(YAML_EDIT_FENCE)) {\n fenceMode = \"yaml-edit\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(YAML_PATCH_FENCE)) {\n fenceMode = \"yaml-patch\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(DIFF_FENCE)) {\n fenceMode = \"diff\";\n diffAccumulated = \"\";\n return;\n }\n }\n\n // Fence close detection\n if (fenceMode !== null && trimmed === FENCE_CLOSE) {\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n fenceMode = null;\n return;\n }\n\n // Inside a fence\n if (fenceMode === \"yaml-spec\") {\n feedYamlSpec(line, controller);\n return;\n }\n if (fenceMode === \"yaml-edit\") {\n feedYamlEdit(line);\n return;\n }\n if (fenceMode === \"yaml-patch\") {\n yamlAccumulated += line + \"\\n\";\n return;\n }\n if (fenceMode === \"diff\") {\n diffAccumulated += line + \"\\n\";\n return;\n }\n\n // Outside fence — pass through as text\n if (!trimmed) {\n emitTextDelta(\"\\n\", controller);\n return;\n }\n emitTextDelta(line + \"\\n\", controller);\n }\n\n function flushBuffer(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!lineBuffer) return;\n\n if (fenceMode !== null) {\n processCompleteLine(lineBuffer, controller);\n } else {\n emitTextDelta(lineBuffer, controller);\n }\n lineBuffer = \"\";\n buffering = false;\n }\n\n // ── TransformStream ──\n\n return new TransformStream<StreamChunk, StreamChunk>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-start\": {\n const id = (chunk as { id: string }).id;\n const idNum = parseInt(id, 10);\n if (!isNaN(idNum) && idNum >= textIdCounter) {\n textIdCounter = idNum;\n }\n currentTextId = id;\n inTextBlock = true;\n controller.enqueue(chunk);\n break;\n }\n\n case \"text-delta\": {\n const delta = chunk as { id: string; delta: string };\n const text = delta.delta;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n\n if (ch === \"\\n\") {\n if (buffering) {\n processCompleteLine(lineBuffer, controller);\n lineBuffer = \"\";\n buffering = false;\n } else if (fenceMode === null) {\n emitTextDelta(\"\\n\", controller);\n }\n } else if (lineBuffer.length === 0 && !buffering) {\n // Inside a fence, buffer everything. Outside, only buffer\n // potential fence-open lines (start with backtick).\n if (fenceMode !== null || ch === \"`\") {\n buffering = true;\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n } else if (buffering) {\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n }\n break;\n }\n\n case \"text-end\": {\n flushBuffer(controller);\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n break;\n }\n\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n\n flush(controller) {\n flushBuffer(controller);\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n closeTextBlock(controller);\n },\n });\n}\n\n/**\n * Convenience wrapper that pipes an AI SDK UI message stream through the\n * YAML transform, converting YAML spec/edit blocks into json-render patches.\n *\n * Drop-in replacement for `pipeJsonRender` from `@json-render/core`.\n *\n * @example\n * ```ts\n * import { pipeYamlRender } from \"@json-render/yaml\";\n *\n * const stream = createUIMessageStream({\n * execute: async ({ writer }) => {\n * writer.merge(pipeYamlRender(result.toUIMessageStream()));\n * },\n * });\n * return createUIMessageStreamResponse({ stream });\n * ```\n */\nexport function pipeYamlRender<T = StreamChunk>(\n stream: ReadableStream<T>,\n options?: YamlTransformOptions,\n): ReadableStream<T> {\n return stream.pipeThrough(\n createYamlTransform(options) as unknown as TransformStream<T, T>,\n );\n}\n","import { stringify } from \"yaml\";\nimport type { Catalog, EditMode, SchemaDefinition } from \"@json-render/core\";\nimport { buildEditInstructions } from \"@json-render/core\";\n\ninterface ZodLike {\n _def?: Record<string, unknown>;\n}\n\nexport interface YamlPromptOptions {\n /** Custom system message intro. */\n system?: string;\n /**\n * - `\"standalone\"` (default): LLM outputs only the YAML spec (no prose).\n * - `\"inline\"`: LLM responds conversationally, then wraps YAML in a fence.\n */\n mode?: \"standalone\" | \"inline\";\n /** Additional rules appended to the RULES section. */\n customRules?: string[];\n /** Edit modes to document. Default: `[\"merge\"]` (yaml-edit). */\n editModes?: EditMode[];\n}\n\ninterface CatalogComponentDef {\n props?: ZodLike;\n description?: string;\n slots?: string[];\n events?: string[];\n example?: Record<string, unknown>;\n}\n\n// ── Zod introspection (local, minimal) ──────────────────────────────────────\n\nfunction getZodTypeName(schema: ZodLike): string {\n if (!schema?._def) return \"\";\n const def = schema._def;\n return (\n (def.typeName as string | undefined) ??\n (typeof def.type === \"string\" ? (def.type as string) : \"\") ??\n \"\"\n );\n}\n\nfunction formatZodType(schema: ZodLike): string {\n if (!schema?._def) return \"unknown\";\n const def = schema._def;\n const typeName = getZodTypeName(schema);\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n return \"string\";\n case \"ZodNumber\":\n case \"number\":\n return \"number\";\n case \"ZodBoolean\":\n case \"boolean\":\n return \"boolean\";\n case \"ZodLiteral\":\n case \"literal\": {\n // Zod 4 uses def.values (array), Zod 3 uses def.value\n const litValues = def.values as unknown[] | undefined;\n const litValue = litValues?.[0] ?? def.value;\n return JSON.stringify(litValue);\n }\n case \"ZodEnum\":\n case \"enum\": {\n let values: string[];\n if (Array.isArray(def.values)) {\n values = def.values as string[];\n } else if (def.entries && typeof def.entries === \"object\") {\n values = Object.values(def.entries as Record<string, string>);\n } else {\n return \"enum\";\n }\n return values.map((v) => `\"${v}\"`).join(\" | \");\n }\n case \"ZodArray\":\n case \"array\": {\n const inner = (\n typeof def.element === \"object\"\n ? def.element\n : typeof def.type === \"object\"\n ? def.type\n : undefined\n ) as ZodLike | undefined;\n return inner ? `Array<${formatZodType(inner)}>` : \"Array<unknown>\";\n }\n case \"ZodObject\":\n case \"object\": {\n const shape =\n typeof def.shape === \"function\"\n ? (def.shape as () => Record<string, ZodLike>)()\n : (def.shape as Record<string, ZodLike>);\n if (!shape) return \"object\";\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerTypeName = getZodTypeName(value);\n const isOptional =\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"nullable\";\n return `${key}${isOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n return `{ ${props} }`;\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options\n ? options.map((opt) => formatZodType(opt)).join(\" | \")\n : \"unknown\";\n }\n case \"ZodRecord\":\n case \"record\": {\n const keyType = (def.keyType as ZodLike) ?? undefined;\n const valueType =\n (def.valueType as ZodLike) ?? (def.element as ZodLike) ?? undefined;\n const keyStr = keyType ? formatZodType(keyType) : \"string\";\n const valueStr = valueType ? formatZodType(valueType) : \"unknown\";\n return `Record<${keyStr}, ${valueStr}>`;\n }\n case \"ZodDefault\":\n case \"default\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction getExampleProps(def: CatalogComponentDef): Record<string, unknown> {\n if (def.example && Object.keys(def.example).length > 0) return def.example;\n if (!def.props?._def) return {};\n const zodDef = def.props._def;\n const typeName = getZodTypeName(def.props);\n if (typeName !== \"ZodObject\" && typeName !== \"object\") return {};\n const shape =\n typeof zodDef.shape === \"function\"\n ? (zodDef.shape as () => Record<string, ZodLike>)()\n : (zodDef.shape as Record<string, ZodLike>);\n if (!shape) return {};\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n const inner = getZodTypeName(value);\n if (\n inner === \"ZodOptional\" ||\n inner === \"optional\" ||\n inner === \"ZodNullable\" ||\n inner === \"nullable\"\n )\n continue;\n result[key] = exampleValue(value);\n }\n return result;\n}\n\nfunction exampleValue(schema: ZodLike): unknown {\n if (!schema?._def) return \"...\";\n const def = schema._def;\n const t = getZodTypeName(schema);\n switch (t) {\n case \"ZodString\":\n case \"string\":\n return \"example\";\n case \"ZodNumber\":\n case \"number\":\n return 0;\n case \"ZodBoolean\":\n case \"boolean\":\n return true;\n case \"ZodLiteral\":\n case \"literal\":\n return def.value;\n case \"ZodEnum\":\n case \"enum\": {\n if (Array.isArray(def.values) && (def.values as unknown[]).length > 0)\n return (def.values as unknown[])[0];\n if (def.entries && typeof def.entries === \"object\") {\n const vals = Object.values(def.entries as Record<string, string>);\n return vals.length > 0 ? vals[0] : \"example\";\n }\n return \"example\";\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\":\n case \"ZodDefault\":\n case \"default\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? exampleValue(inner) : null;\n }\n case \"ZodArray\":\n case \"array\":\n return [];\n case \"ZodObject\":\n case \"object\":\n return getExampleProps({ props: schema } as CatalogComponentDef);\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options && options.length > 0 ? exampleValue(options[0]!) : \"...\";\n }\n default:\n return \"...\";\n }\n}\n\n// ── YAML helper ──\n\n/** Render a value as an indented YAML string (2-space indent). */\nfunction toYaml(value: unknown): string {\n return stringify(value, { indent: 2 }).trimEnd();\n}\n\n// ── Prompt generation ──\n\n/**\n * Generate a YAML-format system prompt from any json-render catalog.\n *\n * Works with catalogs from any renderer (`@json-render/react`,\n * `@json-render/vue`, etc.) — it only reads the catalog metadata.\n *\n * @example\n * ```ts\n * import { yamlPrompt } from \"@json-render/yaml\";\n * const systemPrompt = yamlPrompt(catalog, { mode: \"inline\" });\n * ```\n */\nexport function yamlPrompt(\n catalog: Catalog<SchemaDefinition, unknown>,\n options?: YamlPromptOptions,\n): string {\n const {\n system = \"You are a UI generator that outputs YAML.\",\n mode = \"standalone\",\n customRules = [],\n editModes = [\"merge\"],\n } = options ?? {};\n\n const lines: string[] = [];\n lines.push(system);\n lines.push(\"\");\n\n // ── Output format ──\n\n if (mode === \"inline\") {\n lines.push(\"OUTPUT FORMAT (text + YAML):\");\n lines.push(\n \"You respond conversationally. When generating UI, first write a brief explanation (1-3 sentences), then output the YAML spec wrapped in a ```yaml-spec code fence.\",\n );\n lines.push(\n \"If the user's message does not require a UI (e.g. a greeting or clarifying question), respond with text only — no YAML.\",\n );\n } else {\n lines.push(\"OUTPUT FORMAT (YAML):\");\n lines.push(\n \"Output a YAML document that describes a UI tree. Wrap it in a ```yaml-spec code fence.\",\n );\n }\n lines.push(\"\");\n lines.push(\n \"The YAML document has three top-level keys: root, elements, and state (optional).\",\n );\n lines.push(\n \"Stream progressively — output elements one at a time so the UI fills in as you write.\",\n );\n lines.push(\"\");\n\n // ── Example ──\n\n const allComponents = (catalog.data as Record<string, unknown>).components as\n | Record<string, CatalogComponentDef>\n | undefined;\n const cn = catalog.componentNames;\n const comp1 = cn[0] || \"Component\";\n const comp2 = cn.length > 1 ? cn[1]! : comp1;\n const comp1Def = allComponents?.[comp1];\n const comp2Def = allComponents?.[comp2];\n const comp1Props = comp1Def ? getExampleProps(comp1Def) : {};\n const comp2Props = comp2Def ? getExampleProps(comp2Def) : {};\n\n const exampleSpec = {\n root: \"main\",\n elements: {\n main: {\n type: comp1,\n props: comp1Props,\n children: [\"child-1\", \"list\"],\n },\n \"child-1\": {\n type: comp2,\n props: comp2Props,\n children: [],\n },\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/items\", key: \"id\" },\n children: [\"item\"],\n },\n item: {\n type: comp2,\n props: { ...comp2Props },\n children: [],\n },\n },\n state: {\n items: [\n { id: \"1\", title: \"First Item\" },\n { id: \"2\", title: \"Second Item\" },\n ],\n },\n };\n\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\"```yaml-spec\");\n lines.push(toYaml(exampleSpec));\n lines.push(\"```\");\n lines.push(\"\");\n\n // ── Edit modes (dynamic based on config) ──\n\n lines.push(buildEditInstructions({ modes: editModes }, \"yaml\"));\n\n // ── Initial state ──\n\n lines.push(\"INITIAL STATE:\");\n lines.push(\n \"The spec includes a top-level `state` key to seed the state model. Components using $state, $bindState, $bindItem, $item, or $index read from this state.\",\n );\n lines.push(\n \"CRITICAL: You MUST include state whenever your UI displays data via these expressions or uses repeat to iterate over arrays.\",\n );\n lines.push(\n \"Include realistic sample data. For lists: 3-5 items with relevant fields. Never leave arrays empty.\",\n );\n lines.push(\n 'When content comes from the state model, use { \"$state\": \"/some/path\" } dynamic props instead of hardcoding values.',\n );\n lines.push(\n 'State paths use RFC 6901 JSON Pointer syntax (e.g. \"/todos/0/title\"). Do NOT use dot notation.',\n );\n lines.push(\"\");\n\n // ── Dynamic lists ──\n\n lines.push(\"DYNAMIC LISTS (repeat field):\");\n lines.push(\n \"Any element can have a top-level `repeat` field to render its children once per item in a state array.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/todos\", key: \"id\" },\n children: [\"todo-item\"],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Inside repeated children, use { \"$item\": \"field\" } for item data and { \"$index\": true } for the array index.',\n );\n lines.push(\n \"ALWAYS use repeat for lists backed by state arrays. NEVER hardcode individual elements per item.\",\n );\n lines.push(\n \"IMPORTANT: `repeat` is a top-level field on the element (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"\");\n\n // ── Array state actions ──\n\n lines.push(\"ARRAY STATE ACTIONS:\");\n lines.push(\n 'Use \"pushState\" to append items to arrays. Use \"removeState\" to remove items by index.',\n );\n lines.push('Use \"$id\" inside pushState values to auto-generate a unique ID.');\n lines.push(\"\");\n\n // ── Components ──\n\n if (allComponents) {\n lines.push(`AVAILABLE COMPONENTS (${catalog.componentNames.length}):`);\n lines.push(\"\");\n\n for (const [name, def] of Object.entries(allComponents)) {\n const propsStr = def.props ? formatZodType(def.props) : \"{}\";\n const hasChildren = def.slots && def.slots.length > 0;\n const childrenStr = hasChildren ? \" [accepts children]\" : \"\";\n const eventsStr =\n def.events && def.events.length > 0\n ? ` [events: ${def.events.join(\", \")}]`\n : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}${eventsStr}`);\n }\n lines.push(\"\");\n }\n\n // ── Actions ──\n\n const actions = (catalog.data as Record<string, unknown>).actions as\n | Record<string, { params?: ZodLike; description?: string }>\n | undefined;\n const builtInActions = catalog.schema.builtInActions ?? [];\n const hasCustomActions = actions && catalog.actionNames.length > 0;\n const hasBuiltInActions = builtInActions.length > 0;\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const action of builtInActions) {\n lines.push(`- ${action.name}: ${action.description} [built-in]`);\n }\n if (hasCustomActions) {\n for (const [name, def] of Object.entries(actions)) {\n lines.push(`- ${name}${def.description ? `: ${def.description}` : \"\"}`);\n }\n }\n lines.push(\"\");\n }\n\n // ── Events ──\n\n lines.push(\"EVENTS (the `on` field):\");\n lines.push(\n \"Elements can have an optional `on` field to bind events to actions. It is a top-level field (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n \"save-btn\": {\n type: comp1,\n props: comp1Props,\n on: {\n press: {\n action: \"setState\",\n params: { statePath: \"/saved\", value: true },\n },\n },\n children: [],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Action params can use dynamic references: { \"$state\": \"/statePath\" }.',\n );\n lines.push(\n \"IMPORTANT: Do NOT put action/actionParams inside props. Always use the `on` field.\",\n );\n lines.push(\"\");\n\n // ── Visibility ──\n\n lines.push(\"VISIBILITY CONDITIONS:\");\n lines.push(\n \"Elements can have an optional `visible` field to conditionally show/hide based on state. It is a top-level field (sibling of type/props/children).\",\n );\n lines.push(\"Conditions:\");\n lines.push('- { \"$state\": \"/path\" } — visible when truthy');\n lines.push('- { \"$state\": \"/path\", \"not\": true } — visible when falsy');\n lines.push('- { \"$state\": \"/path\", \"eq\": \"value\" } — visible when equal');\n lines.push(\n '- { \"$state\": \"/path\", \"neq\": \"value\" } — visible when not equal',\n );\n lines.push(\n '- { \"$state\": \"/path\", \"gt\": N } / gte / lt / lte — numeric comparisons',\n );\n lines.push(\"- Use ONE operator per condition. Do not combine multiple.\");\n lines.push('- Add \"not\": true to any condition to invert it.');\n lines.push(\"- [cond, cond] — implicit AND (all must be true)\");\n lines.push('- { \"$and\": [...] } — explicit AND');\n lines.push('- { \"$or\": [...] } — at least one must be true');\n lines.push(\"- true / false — always visible/hidden\");\n lines.push(\"\");\n\n // ── Dynamic props ──\n\n lines.push(\"DYNAMIC PROPS:\");\n lines.push(\"Any prop value can be a dynamic expression:\");\n lines.push(\n '1. Read-only: { \"$state\": \"/path\" } — resolves to the value at that state path.',\n );\n lines.push(\n '2. Two-way binding: { \"$bindState\": \"/path\" } — read + write. Use on form inputs.',\n );\n lines.push(\n ' Inside repeat scopes: { \"$bindItem\": \"field\" } for item-level binding.',\n );\n lines.push(\n '3. Conditional: { \"$cond\": <condition>, \"$then\": <val>, \"$else\": <val> }',\n );\n lines.push(\n '4. Template: { \"$template\": \"Hello, ${/name}!\" } — interpolates state references.',\n );\n lines.push(\"\");\n\n // ── $computed (only if catalog has functions) ──\n\n const catalogFunctions = (catalog.data as Record<string, unknown>).functions;\n if (catalogFunctions && Object.keys(catalogFunctions).length > 0) {\n lines.push(\n '5. Computed: { \"$computed\": \"<fn>\", \"args\": { \"key\": <expr> } }',\n );\n lines.push(\" Available functions:\");\n for (const name of Object.keys(\n catalogFunctions as Record<string, unknown>,\n )) {\n lines.push(` - ${name}`);\n }\n lines.push(\"\");\n }\n\n // ── Validation (only if components have checks) ──\n\n const hasChecks = allComponents\n ? Object.values(allComponents).some((def) => {\n if (!def.props) return false;\n return formatZodType(def.props).includes(\"checks\");\n })\n : false;\n\n if (hasChecks) {\n lines.push(\"VALIDATION:\");\n lines.push(\n \"Form components with a `checks` prop support client-side validation.\",\n );\n lines.push(\n \"Built-in types: required, email, minLength, maxLength, pattern, min, max, numeric, url, matches, equalTo, lessThan, greaterThan, requiredIf.\",\n );\n lines.push(\n \"IMPORTANT: Components with checks must also use $bindState or $bindItem for two-way binding.\",\n );\n lines.push(\"\");\n }\n\n // ── State watchers ──\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"STATE WATCHERS:\");\n lines.push(\n \"Elements can have an optional `watch` field to trigger actions when state changes. Top-level field, NOT inside props.\",\n );\n lines.push(\n \"Maps state paths to action bindings. Fires when the watched value changes (not on initial render).\",\n );\n lines.push(\"\");\n }\n\n // ── Rules ──\n\n lines.push(\"RULES:\");\n const baseRules =\n mode === \"inline\"\n ? [\n \"When generating UI, wrap the YAML in a ```yaml-spec code fence\",\n \"Write a brief conversational response before the YAML\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ]\n : [\n \"Output ONLY the YAML spec inside a ```yaml-spec fence — no prose, no extra markdown\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ];\n\n const schemaRules = catalog.schema.defaultRules ?? [];\n const allRules = [...baseRules, ...schemaRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["import_core","import_yaml","import_diff","import_core","applyUnifiedDiff","import_yaml","import_core"]}
|
package/dist/index.mjs
CHANGED
|
@@ -375,8 +375,11 @@ function formatZodType(schema) {
|
|
|
375
375
|
case "boolean":
|
|
376
376
|
return "boolean";
|
|
377
377
|
case "ZodLiteral":
|
|
378
|
-
case "literal":
|
|
379
|
-
|
|
378
|
+
case "literal": {
|
|
379
|
+
const litValues = def.values;
|
|
380
|
+
const litValue = litValues?.[0] ?? def.value;
|
|
381
|
+
return JSON.stringify(litValue);
|
|
382
|
+
}
|
|
380
383
|
case "ZodEnum":
|
|
381
384
|
case "enum": {
|
|
382
385
|
let values;
|
|
@@ -417,6 +420,19 @@ function formatZodType(schema) {
|
|
|
417
420
|
const options = def.options;
|
|
418
421
|
return options ? options.map((opt) => formatZodType(opt)).join(" | ") : "unknown";
|
|
419
422
|
}
|
|
423
|
+
case "ZodRecord":
|
|
424
|
+
case "record": {
|
|
425
|
+
const keyType = def.keyType ?? void 0;
|
|
426
|
+
const valueType = def.valueType ?? def.element ?? void 0;
|
|
427
|
+
const keyStr = keyType ? formatZodType(keyType) : "string";
|
|
428
|
+
const valueStr = valueType ? formatZodType(valueType) : "unknown";
|
|
429
|
+
return `Record<${keyStr}, ${valueStr}>`;
|
|
430
|
+
}
|
|
431
|
+
case "ZodDefault":
|
|
432
|
+
case "default": {
|
|
433
|
+
const inner = def.innerType ?? def.wrapped;
|
|
434
|
+
return inner ? formatZodType(inner) : "unknown";
|
|
435
|
+
}
|
|
420
436
|
default:
|
|
421
437
|
return "unknown";
|
|
422
438
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diff.ts","../src/merge.ts","../src/parser.ts","../src/transform.ts","../src/prompt.ts"],"sourcesContent":["export { diffToPatches } from \"@json-render/core\";\n","export { deepMergeSpec } from \"@json-render/core\";\n","import { parse } from \"yaml\";\nimport type { JsonPatch } from \"@json-render/core\";\nimport { diffToPatches } from \"./diff\";\n\n/**\n * Streaming YAML compiler that incrementally parses YAML text and emits\n * JSON Patch operations for each change detected.\n *\n * Same interface shape as `SpecStreamCompiler` from `@json-render/core`.\n */\nexport interface YamlStreamCompiler<T> {\n /** Push a chunk of text. Returns the current result and any new patches. */\n push(chunk: string): { result: T; newPatches: JsonPatch[] };\n /** Flush remaining buffer and return the final result. */\n flush(): { result: T; newPatches: JsonPatch[] };\n /** Get the current compiled result. */\n getResult(): T;\n /** Get all patches that have been applied. */\n getPatches(): JsonPatch[];\n /** Reset the compiler to initial state. */\n reset(initial?: Partial<T>): void;\n}\n\n/**\n * Create a streaming YAML compiler.\n *\n * Incrementally parses YAML text as it arrives and emits JSON Patch\n * operations by diffing each successful parse against the previous snapshot.\n *\n * Uses `yaml.parse()` with YAML 1.2 defaults (the `yaml` v2 default).\n * YAML 1.2 does not coerce `yes`/`no`/`on`/`off` to booleans.\n *\n * @example\n * ```ts\n * const compiler = createYamlStreamCompiler<Spec>();\n * compiler.push(\"root: main\\n\");\n * compiler.push(\"elements:\\n main:\\n type: Card\\n\");\n * const { result } = compiler.flush();\n * ```\n */\nexport function createYamlStreamCompiler<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(initial?: Partial<T>): YamlStreamCompiler<T> {\n let accumulated = \"\";\n let snapshot: Record<string, unknown> = initial\n ? { ...initial }\n : ({} as Record<string, unknown>);\n let result: T = { ...snapshot } as T;\n const allPatches: JsonPatch[] = [];\n\n function tryParse(): { result: T; newPatches: JsonPatch[] } {\n const newPatches: JsonPatch[] = [];\n\n try {\n const parsed = parse(accumulated);\n\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const patches = diffToPatches(\n snapshot,\n parsed as Record<string, unknown>,\n );\n\n if (patches.length > 0) {\n snapshot = structuredClone(parsed as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.push(...patches);\n newPatches.push(...patches);\n }\n }\n } catch {\n // Incomplete YAML — wait for more data\n }\n\n return { result, newPatches };\n }\n\n return {\n push(chunk: string): { result: T; newPatches: JsonPatch[] } {\n accumulated += chunk;\n\n // Only attempt parse when we have a complete line\n if (chunk.includes(\"\\n\")) {\n return tryParse();\n }\n\n return { result, newPatches: [] };\n },\n\n flush(): { result: T; newPatches: JsonPatch[] } {\n return tryParse();\n },\n\n getResult(): T {\n return result;\n },\n\n getPatches(): JsonPatch[] {\n return [...allPatches];\n },\n\n reset(newInitial?: Partial<T>): void {\n accumulated = \"\";\n snapshot = newInitial\n ? { ...newInitial }\n : ({} as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.length = 0;\n },\n };\n}\n","import { parse, stringify } from \"yaml\";\nimport { applyPatch as applyUnifiedDiff } from \"diff\";\nimport {\n SPEC_DATA_PART_TYPE,\n deepMergeSpec,\n diffToPatches,\n type JsonPatch,\n type Spec,\n type StreamChunk,\n} from \"@json-render/core\";\nimport { createYamlStreamCompiler } from \"./parser\";\n\nexport const YAML_SPEC_FENCE = \"```yaml-spec\";\nexport const YAML_EDIT_FENCE = \"```yaml-edit\";\nexport const YAML_PATCH_FENCE = \"```yaml-patch\";\nexport const DIFF_FENCE = \"```diff\";\nexport const FENCE_CLOSE = \"```\";\n\nexport interface YamlTransformOptions {\n /** Seed with a previous spec for multi-turn edit support. */\n previousSpec?: Spec;\n}\n\n/**\n * Creates a `TransformStream` that intercepts AI SDK UI message stream chunks\n * and converts YAML spec/edit blocks into json-render patch data parts.\n *\n * Two fence types are recognised:\n *\n * 1. **`\\`\\`\\`yaml-spec`** — Full YAML spec. Parsed progressively, emitting\n * patches as each new property is detected.\n * 2. **`\\`\\`\\`yaml-edit`** — Partial YAML. Deep-merged with the current spec,\n * then diffed to produce patches. Only changed keys need to be included.\n *\n * Non-fenced text passes through unchanged as `text-delta` chunks, matching\n * the behaviour of `createJsonRenderTransform` from `@json-render/core`.\n */\nexport function createYamlTransform(\n options?: YamlTransformOptions,\n): TransformStream<StreamChunk, StreamChunk> {\n let currentTextId = \"\";\n let inTextBlock = false;\n let textIdCounter = 0;\n\n let lineBuffer = \"\";\n let buffering = false;\n\n // Fence state\n let fenceMode: \"yaml-spec\" | \"yaml-edit\" | \"yaml-patch\" | \"diff\" | null =\n null;\n let yamlAccumulated = \"\";\n let diffAccumulated = \"\";\n\n // Streaming compiler for yaml-spec progressive rendering\n let compiler = createYamlStreamCompiler<Record<string, unknown>>();\n\n // The \"current spec\" — built up during yaml-spec, used as base for yaml-edit\n let currentSpec: Record<string, unknown> = options?.previousSpec\n ? structuredClone(\n options.previousSpec as unknown as Record<string, unknown>,\n )\n : {};\n\n // ── Text block helpers (same pattern as createJsonRenderTransform) ──\n\n function closeTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n }\n\n function ensureTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!inTextBlock) {\n textIdCounter++;\n currentTextId = String(textIdCounter);\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n inTextBlock = true;\n }\n }\n\n function emitTextDelta(\n delta: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n ensureTextBlock(controller);\n controller.enqueue({ type: \"text-delta\", id: currentTextId, delta });\n }\n\n function emitPatch(\n patch: JsonPatch,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n closeTextBlock(controller);\n controller.enqueue({\n type: SPEC_DATA_PART_TYPE,\n data: { type: \"patch\", patch },\n });\n }\n\n function emitPatches(\n patches: JsonPatch[],\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const patch of patches) {\n emitPatch(patch, controller);\n }\n }\n\n // ── YAML fence processing ──\n\n /**\n * Feed a line of YAML to the streaming compiler (yaml-spec mode).\n * Emits patches for any newly detected properties.\n */\n function feedYamlSpec(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n yamlAccumulated += line + \"\\n\";\n const { newPatches } = compiler.push(line + \"\\n\");\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n }\n\n /**\n * Feed a line of YAML for edit mode. We accumulate all lines and process\n * on fence close since partial edits may not parse until complete.\n */\n function feedYamlEdit(line: string) {\n yamlAccumulated += line + \"\\n\";\n }\n\n /**\n * Finalise a yaml-edit block: parse the accumulated YAML, deep-merge\n * with the current spec, diff, and emit patches.\n */\n function finaliseYamlEdit(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const editObj = parse(yamlAccumulated);\n if (editObj && typeof editObj === \"object\" && !Array.isArray(editObj)) {\n const merged = deepMergeSpec(\n currentSpec,\n editObj as Record<string, unknown>,\n );\n const patches = diffToPatches(currentSpec, merged);\n if (patches.length > 0) {\n currentSpec = merged;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Invalid YAML edit block — silently drop\n }\n }\n\n /**\n * Finalise a yaml-spec block: flush the compiler for any remaining\n * partial data and update currentSpec.\n */\n function finaliseYamlSpec(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const { newPatches } = compiler.flush();\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n currentSpec = structuredClone(\n compiler.getResult() as Record<string, unknown>,\n );\n }\n\n /**\n * Finalise a yaml-patch block: parse each accumulated line as an\n * RFC 6902 JSON Patch operation and emit directly.\n */\n function finaliseYamlPatch(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const line of yamlAccumulated.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const patch = JSON.parse(trimmed) as JsonPatch;\n if (patch.op) {\n emitPatch(patch, controller);\n // Update currentSpec for subsequent edits\n if (patch.op === \"add\" || patch.op === \"replace\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) target[lastKey] = patch.value;\n } else if (patch.op === \"remove\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null)\n break;\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) delete target[lastKey];\n }\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n\n /**\n * Finalise a diff block: apply the unified diff to the YAML-serialized\n * current spec, reparse, diff against current, and emit patches.\n */\n function finaliseDiff(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const currentYaml = stringify(currentSpec, { indent: 2 });\n const patched = applyUnifiedDiff(currentYaml, diffAccumulated);\n if (patched === false) return;\n const newSpec = parse(patched);\n if (newSpec && typeof newSpec === \"object\" && !Array.isArray(newSpec)) {\n const patches = diffToPatches(\n currentSpec,\n newSpec as Record<string, unknown>,\n );\n if (patches.length > 0) {\n currentSpec = newSpec as Record<string, unknown>;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Diff apply or reparse failed\n }\n }\n\n // ── Line processing ──\n\n function processCompleteLine(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const trimmed = line.trim();\n\n // Fence open detection\n if (fenceMode === null) {\n if (trimmed.startsWith(YAML_SPEC_FENCE)) {\n fenceMode = \"yaml-spec\";\n yamlAccumulated = \"\";\n compiler.reset(currentSpec);\n return;\n }\n if (trimmed.startsWith(YAML_EDIT_FENCE)) {\n fenceMode = \"yaml-edit\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(YAML_PATCH_FENCE)) {\n fenceMode = \"yaml-patch\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(DIFF_FENCE)) {\n fenceMode = \"diff\";\n diffAccumulated = \"\";\n return;\n }\n }\n\n // Fence close detection\n if (fenceMode !== null && trimmed === FENCE_CLOSE) {\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n fenceMode = null;\n return;\n }\n\n // Inside a fence\n if (fenceMode === \"yaml-spec\") {\n feedYamlSpec(line, controller);\n return;\n }\n if (fenceMode === \"yaml-edit\") {\n feedYamlEdit(line);\n return;\n }\n if (fenceMode === \"yaml-patch\") {\n yamlAccumulated += line + \"\\n\";\n return;\n }\n if (fenceMode === \"diff\") {\n diffAccumulated += line + \"\\n\";\n return;\n }\n\n // Outside fence — pass through as text\n if (!trimmed) {\n emitTextDelta(\"\\n\", controller);\n return;\n }\n emitTextDelta(line + \"\\n\", controller);\n }\n\n function flushBuffer(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!lineBuffer) return;\n\n if (fenceMode !== null) {\n processCompleteLine(lineBuffer, controller);\n } else {\n emitTextDelta(lineBuffer, controller);\n }\n lineBuffer = \"\";\n buffering = false;\n }\n\n // ── TransformStream ──\n\n return new TransformStream<StreamChunk, StreamChunk>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-start\": {\n const id = (chunk as { id: string }).id;\n const idNum = parseInt(id, 10);\n if (!isNaN(idNum) && idNum >= textIdCounter) {\n textIdCounter = idNum;\n }\n currentTextId = id;\n inTextBlock = true;\n controller.enqueue(chunk);\n break;\n }\n\n case \"text-delta\": {\n const delta = chunk as { id: string; delta: string };\n const text = delta.delta;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n\n if (ch === \"\\n\") {\n if (buffering) {\n processCompleteLine(lineBuffer, controller);\n lineBuffer = \"\";\n buffering = false;\n } else if (fenceMode === null) {\n emitTextDelta(\"\\n\", controller);\n }\n } else if (lineBuffer.length === 0 && !buffering) {\n // Inside a fence, buffer everything. Outside, only buffer\n // potential fence-open lines (start with backtick).\n if (fenceMode !== null || ch === \"`\") {\n buffering = true;\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n } else if (buffering) {\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n }\n break;\n }\n\n case \"text-end\": {\n flushBuffer(controller);\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n break;\n }\n\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n\n flush(controller) {\n flushBuffer(controller);\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n closeTextBlock(controller);\n },\n });\n}\n\n/**\n * Convenience wrapper that pipes an AI SDK UI message stream through the\n * YAML transform, converting YAML spec/edit blocks into json-render patches.\n *\n * Drop-in replacement for `pipeJsonRender` from `@json-render/core`.\n *\n * @example\n * ```ts\n * import { pipeYamlRender } from \"@json-render/yaml\";\n *\n * const stream = createUIMessageStream({\n * execute: async ({ writer }) => {\n * writer.merge(pipeYamlRender(result.toUIMessageStream()));\n * },\n * });\n * return createUIMessageStreamResponse({ stream });\n * ```\n */\nexport function pipeYamlRender<T = StreamChunk>(\n stream: ReadableStream<T>,\n options?: YamlTransformOptions,\n): ReadableStream<T> {\n return stream.pipeThrough(\n createYamlTransform(options) as unknown as TransformStream<T, T>,\n );\n}\n","import { stringify } from \"yaml\";\nimport type { Catalog, EditMode, SchemaDefinition } from \"@json-render/core\";\nimport { buildEditInstructions } from \"@json-render/core\";\n\ninterface ZodLike {\n _def?: Record<string, unknown>;\n}\n\nexport interface YamlPromptOptions {\n /** Custom system message intro. */\n system?: string;\n /**\n * - `\"standalone\"` (default): LLM outputs only the YAML spec (no prose).\n * - `\"inline\"`: LLM responds conversationally, then wraps YAML in a fence.\n */\n mode?: \"standalone\" | \"inline\";\n /** Additional rules appended to the RULES section. */\n customRules?: string[];\n /** Edit modes to document. Default: `[\"merge\"]` (yaml-edit). */\n editModes?: EditMode[];\n}\n\ninterface CatalogComponentDef {\n props?: ZodLike;\n description?: string;\n slots?: string[];\n events?: string[];\n example?: Record<string, unknown>;\n}\n\n// ── Zod introspection (local, minimal) ──────────────────────────────────────\n\nfunction getZodTypeName(schema: ZodLike): string {\n if (!schema?._def) return \"\";\n const def = schema._def;\n return (\n (def.typeName as string | undefined) ??\n (typeof def.type === \"string\" ? (def.type as string) : \"\") ??\n \"\"\n );\n}\n\nfunction formatZodType(schema: ZodLike): string {\n if (!schema?._def) return \"unknown\";\n const def = schema._def;\n const typeName = getZodTypeName(schema);\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n return \"string\";\n case \"ZodNumber\":\n case \"number\":\n return \"number\";\n case \"ZodBoolean\":\n case \"boolean\":\n return \"boolean\";\n case \"ZodLiteral\":\n case \"literal\":\n return JSON.stringify(def.value);\n case \"ZodEnum\":\n case \"enum\": {\n let values: string[];\n if (Array.isArray(def.values)) {\n values = def.values as string[];\n } else if (def.entries && typeof def.entries === \"object\") {\n values = Object.values(def.entries as Record<string, string>);\n } else {\n return \"enum\";\n }\n return values.map((v) => `\"${v}\"`).join(\" | \");\n }\n case \"ZodArray\":\n case \"array\": {\n const inner = (\n typeof def.element === \"object\"\n ? def.element\n : typeof def.type === \"object\"\n ? def.type\n : undefined\n ) as ZodLike | undefined;\n return inner ? `Array<${formatZodType(inner)}>` : \"Array<unknown>\";\n }\n case \"ZodObject\":\n case \"object\": {\n const shape =\n typeof def.shape === \"function\"\n ? (def.shape as () => Record<string, ZodLike>)()\n : (def.shape as Record<string, ZodLike>);\n if (!shape) return \"object\";\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerTypeName = getZodTypeName(value);\n const isOptional =\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"nullable\";\n return `${key}${isOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n return `{ ${props} }`;\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options\n ? options.map((opt) => formatZodType(opt)).join(\" | \")\n : \"unknown\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction getExampleProps(def: CatalogComponentDef): Record<string, unknown> {\n if (def.example && Object.keys(def.example).length > 0) return def.example;\n if (!def.props?._def) return {};\n const zodDef = def.props._def;\n const typeName = getZodTypeName(def.props);\n if (typeName !== \"ZodObject\" && typeName !== \"object\") return {};\n const shape =\n typeof zodDef.shape === \"function\"\n ? (zodDef.shape as () => Record<string, ZodLike>)()\n : (zodDef.shape as Record<string, ZodLike>);\n if (!shape) return {};\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n const inner = getZodTypeName(value);\n if (\n inner === \"ZodOptional\" ||\n inner === \"optional\" ||\n inner === \"ZodNullable\" ||\n inner === \"nullable\"\n )\n continue;\n result[key] = exampleValue(value);\n }\n return result;\n}\n\nfunction exampleValue(schema: ZodLike): unknown {\n if (!schema?._def) return \"...\";\n const def = schema._def;\n const t = getZodTypeName(schema);\n switch (t) {\n case \"ZodString\":\n case \"string\":\n return \"example\";\n case \"ZodNumber\":\n case \"number\":\n return 0;\n case \"ZodBoolean\":\n case \"boolean\":\n return true;\n case \"ZodLiteral\":\n case \"literal\":\n return def.value;\n case \"ZodEnum\":\n case \"enum\": {\n if (Array.isArray(def.values) && (def.values as unknown[]).length > 0)\n return (def.values as unknown[])[0];\n if (def.entries && typeof def.entries === \"object\") {\n const vals = Object.values(def.entries as Record<string, string>);\n return vals.length > 0 ? vals[0] : \"example\";\n }\n return \"example\";\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\":\n case \"ZodDefault\":\n case \"default\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? exampleValue(inner) : null;\n }\n case \"ZodArray\":\n case \"array\":\n return [];\n case \"ZodObject\":\n case \"object\":\n return getExampleProps({ props: schema } as CatalogComponentDef);\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options && options.length > 0 ? exampleValue(options[0]!) : \"...\";\n }\n default:\n return \"...\";\n }\n}\n\n// ── YAML helper ──\n\n/** Render a value as an indented YAML string (2-space indent). */\nfunction toYaml(value: unknown): string {\n return stringify(value, { indent: 2 }).trimEnd();\n}\n\n// ── Prompt generation ──\n\n/**\n * Generate a YAML-format system prompt from any json-render catalog.\n *\n * Works with catalogs from any renderer (`@json-render/react`,\n * `@json-render/vue`, etc.) — it only reads the catalog metadata.\n *\n * @example\n * ```ts\n * import { yamlPrompt } from \"@json-render/yaml\";\n * const systemPrompt = yamlPrompt(catalog, { mode: \"inline\" });\n * ```\n */\nexport function yamlPrompt(\n catalog: Catalog<SchemaDefinition, unknown>,\n options?: YamlPromptOptions,\n): string {\n const {\n system = \"You are a UI generator that outputs YAML.\",\n mode = \"standalone\",\n customRules = [],\n editModes = [\"merge\"],\n } = options ?? {};\n\n const lines: string[] = [];\n lines.push(system);\n lines.push(\"\");\n\n // ── Output format ──\n\n if (mode === \"inline\") {\n lines.push(\"OUTPUT FORMAT (text + YAML):\");\n lines.push(\n \"You respond conversationally. When generating UI, first write a brief explanation (1-3 sentences), then output the YAML spec wrapped in a ```yaml-spec code fence.\",\n );\n lines.push(\n \"If the user's message does not require a UI (e.g. a greeting or clarifying question), respond with text only — no YAML.\",\n );\n } else {\n lines.push(\"OUTPUT FORMAT (YAML):\");\n lines.push(\n \"Output a YAML document that describes a UI tree. Wrap it in a ```yaml-spec code fence.\",\n );\n }\n lines.push(\"\");\n lines.push(\n \"The YAML document has three top-level keys: root, elements, and state (optional).\",\n );\n lines.push(\n \"Stream progressively — output elements one at a time so the UI fills in as you write.\",\n );\n lines.push(\"\");\n\n // ── Example ──\n\n const allComponents = (catalog.data as Record<string, unknown>).components as\n | Record<string, CatalogComponentDef>\n | undefined;\n const cn = catalog.componentNames;\n const comp1 = cn[0] || \"Component\";\n const comp2 = cn.length > 1 ? cn[1]! : comp1;\n const comp1Def = allComponents?.[comp1];\n const comp2Def = allComponents?.[comp2];\n const comp1Props = comp1Def ? getExampleProps(comp1Def) : {};\n const comp2Props = comp2Def ? getExampleProps(comp2Def) : {};\n\n const exampleSpec = {\n root: \"main\",\n elements: {\n main: {\n type: comp1,\n props: comp1Props,\n children: [\"child-1\", \"list\"],\n },\n \"child-1\": {\n type: comp2,\n props: comp2Props,\n children: [],\n },\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/items\", key: \"id\" },\n children: [\"item\"],\n },\n item: {\n type: comp2,\n props: { ...comp2Props },\n children: [],\n },\n },\n state: {\n items: [\n { id: \"1\", title: \"First Item\" },\n { id: \"2\", title: \"Second Item\" },\n ],\n },\n };\n\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\"```yaml-spec\");\n lines.push(toYaml(exampleSpec));\n lines.push(\"```\");\n lines.push(\"\");\n\n // ── Edit modes (dynamic based on config) ──\n\n lines.push(buildEditInstructions({ modes: editModes }, \"yaml\"));\n\n // ── Initial state ──\n\n lines.push(\"INITIAL STATE:\");\n lines.push(\n \"The spec includes a top-level `state` key to seed the state model. Components using $state, $bindState, $bindItem, $item, or $index read from this state.\",\n );\n lines.push(\n \"CRITICAL: You MUST include state whenever your UI displays data via these expressions or uses repeat to iterate over arrays.\",\n );\n lines.push(\n \"Include realistic sample data. For lists: 3-5 items with relevant fields. Never leave arrays empty.\",\n );\n lines.push(\n 'When content comes from the state model, use { \"$state\": \"/some/path\" } dynamic props instead of hardcoding values.',\n );\n lines.push(\n 'State paths use RFC 6901 JSON Pointer syntax (e.g. \"/todos/0/title\"). Do NOT use dot notation.',\n );\n lines.push(\"\");\n\n // ── Dynamic lists ──\n\n lines.push(\"DYNAMIC LISTS (repeat field):\");\n lines.push(\n \"Any element can have a top-level `repeat` field to render its children once per item in a state array.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/todos\", key: \"id\" },\n children: [\"todo-item\"],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Inside repeated children, use { \"$item\": \"field\" } for item data and { \"$index\": true } for the array index.',\n );\n lines.push(\n \"ALWAYS use repeat for lists backed by state arrays. NEVER hardcode individual elements per item.\",\n );\n lines.push(\n \"IMPORTANT: `repeat` is a top-level field on the element (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"\");\n\n // ── Array state actions ──\n\n lines.push(\"ARRAY STATE ACTIONS:\");\n lines.push(\n 'Use \"pushState\" to append items to arrays. Use \"removeState\" to remove items by index.',\n );\n lines.push('Use \"$id\" inside pushState values to auto-generate a unique ID.');\n lines.push(\"\");\n\n // ── Components ──\n\n if (allComponents) {\n lines.push(`AVAILABLE COMPONENTS (${catalog.componentNames.length}):`);\n lines.push(\"\");\n\n for (const [name, def] of Object.entries(allComponents)) {\n const propsStr = def.props ? formatZodType(def.props) : \"{}\";\n const hasChildren = def.slots && def.slots.length > 0;\n const childrenStr = hasChildren ? \" [accepts children]\" : \"\";\n const eventsStr =\n def.events && def.events.length > 0\n ? ` [events: ${def.events.join(\", \")}]`\n : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}${eventsStr}`);\n }\n lines.push(\"\");\n }\n\n // ── Actions ──\n\n const actions = (catalog.data as Record<string, unknown>).actions as\n | Record<string, { params?: ZodLike; description?: string }>\n | undefined;\n const builtInActions = catalog.schema.builtInActions ?? [];\n const hasCustomActions = actions && catalog.actionNames.length > 0;\n const hasBuiltInActions = builtInActions.length > 0;\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const action of builtInActions) {\n lines.push(`- ${action.name}: ${action.description} [built-in]`);\n }\n if (hasCustomActions) {\n for (const [name, def] of Object.entries(actions)) {\n lines.push(`- ${name}${def.description ? `: ${def.description}` : \"\"}`);\n }\n }\n lines.push(\"\");\n }\n\n // ── Events ──\n\n lines.push(\"EVENTS (the `on` field):\");\n lines.push(\n \"Elements can have an optional `on` field to bind events to actions. It is a top-level field (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n \"save-btn\": {\n type: comp1,\n props: comp1Props,\n on: {\n press: {\n action: \"setState\",\n params: { statePath: \"/saved\", value: true },\n },\n },\n children: [],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Action params can use dynamic references: { \"$state\": \"/statePath\" }.',\n );\n lines.push(\n \"IMPORTANT: Do NOT put action/actionParams inside props. Always use the `on` field.\",\n );\n lines.push(\"\");\n\n // ── Visibility ──\n\n lines.push(\"VISIBILITY CONDITIONS:\");\n lines.push(\n \"Elements can have an optional `visible` field to conditionally show/hide based on state. It is a top-level field (sibling of type/props/children).\",\n );\n lines.push(\"Conditions:\");\n lines.push('- { \"$state\": \"/path\" } — visible when truthy');\n lines.push('- { \"$state\": \"/path\", \"not\": true } — visible when falsy');\n lines.push('- { \"$state\": \"/path\", \"eq\": \"value\" } — visible when equal');\n lines.push(\n '- { \"$state\": \"/path\", \"neq\": \"value\" } — visible when not equal',\n );\n lines.push(\n '- { \"$state\": \"/path\", \"gt\": N } / gte / lt / lte — numeric comparisons',\n );\n lines.push(\"- Use ONE operator per condition. Do not combine multiple.\");\n lines.push('- Add \"not\": true to any condition to invert it.');\n lines.push(\"- [cond, cond] — implicit AND (all must be true)\");\n lines.push('- { \"$and\": [...] } — explicit AND');\n lines.push('- { \"$or\": [...] } — at least one must be true');\n lines.push(\"- true / false — always visible/hidden\");\n lines.push(\"\");\n\n // ── Dynamic props ──\n\n lines.push(\"DYNAMIC PROPS:\");\n lines.push(\"Any prop value can be a dynamic expression:\");\n lines.push(\n '1. Read-only: { \"$state\": \"/path\" } — resolves to the value at that state path.',\n );\n lines.push(\n '2. Two-way binding: { \"$bindState\": \"/path\" } — read + write. Use on form inputs.',\n );\n lines.push(\n ' Inside repeat scopes: { \"$bindItem\": \"field\" } for item-level binding.',\n );\n lines.push(\n '3. Conditional: { \"$cond\": <condition>, \"$then\": <val>, \"$else\": <val> }',\n );\n lines.push(\n '4. Template: { \"$template\": \"Hello, ${/name}!\" } — interpolates state references.',\n );\n lines.push(\"\");\n\n // ── $computed (only if catalog has functions) ──\n\n const catalogFunctions = (catalog.data as Record<string, unknown>).functions;\n if (catalogFunctions && Object.keys(catalogFunctions).length > 0) {\n lines.push(\n '5. Computed: { \"$computed\": \"<fn>\", \"args\": { \"key\": <expr> } }',\n );\n lines.push(\" Available functions:\");\n for (const name of Object.keys(\n catalogFunctions as Record<string, unknown>,\n )) {\n lines.push(` - ${name}`);\n }\n lines.push(\"\");\n }\n\n // ── Validation (only if components have checks) ──\n\n const hasChecks = allComponents\n ? Object.values(allComponents).some((def) => {\n if (!def.props) return false;\n return formatZodType(def.props).includes(\"checks\");\n })\n : false;\n\n if (hasChecks) {\n lines.push(\"VALIDATION:\");\n lines.push(\n \"Form components with a `checks` prop support client-side validation.\",\n );\n lines.push(\n \"Built-in types: required, email, minLength, maxLength, pattern, min, max, numeric, url, matches, equalTo, lessThan, greaterThan, requiredIf.\",\n );\n lines.push(\n \"IMPORTANT: Components with checks must also use $bindState or $bindItem for two-way binding.\",\n );\n lines.push(\"\");\n }\n\n // ── State watchers ──\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"STATE WATCHERS:\");\n lines.push(\n \"Elements can have an optional `watch` field to trigger actions when state changes. Top-level field, NOT inside props.\",\n );\n lines.push(\n \"Maps state paths to action bindings. Fires when the watched value changes (not on initial render).\",\n );\n lines.push(\"\");\n }\n\n // ── Rules ──\n\n lines.push(\"RULES:\");\n const baseRules =\n mode === \"inline\"\n ? [\n \"When generating UI, wrap the YAML in a ```yaml-spec code fence\",\n \"Write a brief conversational response before the YAML\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ]\n : [\n \"Output ONLY the YAML spec inside a ```yaml-spec fence — no prose, no extra markdown\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ];\n\n const schemaRules = catalog.schema.defaultRules ?? [];\n const allRules = [...baseRules, ...schemaRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["parse","deepMergeSpec","diffToPatches","parse","deepMergeSpec","diffToPatches","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../src/diff.ts","../src/merge.ts","../src/parser.ts","../src/transform.ts","../src/prompt.ts"],"sourcesContent":["export { diffToPatches } from \"@json-render/core\";\n","export { deepMergeSpec } from \"@json-render/core\";\n","import { parse } from \"yaml\";\nimport type { JsonPatch } from \"@json-render/core\";\nimport { diffToPatches } from \"./diff\";\n\n/**\n * Streaming YAML compiler that incrementally parses YAML text and emits\n * JSON Patch operations for each change detected.\n *\n * Same interface shape as `SpecStreamCompiler` from `@json-render/core`.\n */\nexport interface YamlStreamCompiler<T> {\n /** Push a chunk of text. Returns the current result and any new patches. */\n push(chunk: string): { result: T; newPatches: JsonPatch[] };\n /** Flush remaining buffer and return the final result. */\n flush(): { result: T; newPatches: JsonPatch[] };\n /** Get the current compiled result. */\n getResult(): T;\n /** Get all patches that have been applied. */\n getPatches(): JsonPatch[];\n /** Reset the compiler to initial state. */\n reset(initial?: Partial<T>): void;\n}\n\n/**\n * Create a streaming YAML compiler.\n *\n * Incrementally parses YAML text as it arrives and emits JSON Patch\n * operations by diffing each successful parse against the previous snapshot.\n *\n * Uses `yaml.parse()` with YAML 1.2 defaults (the `yaml` v2 default).\n * YAML 1.2 does not coerce `yes`/`no`/`on`/`off` to booleans.\n *\n * @example\n * ```ts\n * const compiler = createYamlStreamCompiler<Spec>();\n * compiler.push(\"root: main\\n\");\n * compiler.push(\"elements:\\n main:\\n type: Card\\n\");\n * const { result } = compiler.flush();\n * ```\n */\nexport function createYamlStreamCompiler<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(initial?: Partial<T>): YamlStreamCompiler<T> {\n let accumulated = \"\";\n let snapshot: Record<string, unknown> = initial\n ? { ...initial }\n : ({} as Record<string, unknown>);\n let result: T = { ...snapshot } as T;\n const allPatches: JsonPatch[] = [];\n\n function tryParse(): { result: T; newPatches: JsonPatch[] } {\n const newPatches: JsonPatch[] = [];\n\n try {\n const parsed = parse(accumulated);\n\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const patches = diffToPatches(\n snapshot,\n parsed as Record<string, unknown>,\n );\n\n if (patches.length > 0) {\n snapshot = structuredClone(parsed as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.push(...patches);\n newPatches.push(...patches);\n }\n }\n } catch {\n // Incomplete YAML — wait for more data\n }\n\n return { result, newPatches };\n }\n\n return {\n push(chunk: string): { result: T; newPatches: JsonPatch[] } {\n accumulated += chunk;\n\n // Only attempt parse when we have a complete line\n if (chunk.includes(\"\\n\")) {\n return tryParse();\n }\n\n return { result, newPatches: [] };\n },\n\n flush(): { result: T; newPatches: JsonPatch[] } {\n return tryParse();\n },\n\n getResult(): T {\n return result;\n },\n\n getPatches(): JsonPatch[] {\n return [...allPatches];\n },\n\n reset(newInitial?: Partial<T>): void {\n accumulated = \"\";\n snapshot = newInitial\n ? { ...newInitial }\n : ({} as Record<string, unknown>);\n result = { ...snapshot } as T;\n allPatches.length = 0;\n },\n };\n}\n","import { parse, stringify } from \"yaml\";\nimport { applyPatch as applyUnifiedDiff } from \"diff\";\nimport {\n SPEC_DATA_PART_TYPE,\n deepMergeSpec,\n diffToPatches,\n type JsonPatch,\n type Spec,\n type StreamChunk,\n} from \"@json-render/core\";\nimport { createYamlStreamCompiler } from \"./parser\";\n\nexport const YAML_SPEC_FENCE = \"```yaml-spec\";\nexport const YAML_EDIT_FENCE = \"```yaml-edit\";\nexport const YAML_PATCH_FENCE = \"```yaml-patch\";\nexport const DIFF_FENCE = \"```diff\";\nexport const FENCE_CLOSE = \"```\";\n\nexport interface YamlTransformOptions {\n /** Seed with a previous spec for multi-turn edit support. */\n previousSpec?: Spec;\n}\n\n/**\n * Creates a `TransformStream` that intercepts AI SDK UI message stream chunks\n * and converts YAML spec/edit blocks into json-render patch data parts.\n *\n * Two fence types are recognised:\n *\n * 1. **`\\`\\`\\`yaml-spec`** — Full YAML spec. Parsed progressively, emitting\n * patches as each new property is detected.\n * 2. **`\\`\\`\\`yaml-edit`** — Partial YAML. Deep-merged with the current spec,\n * then diffed to produce patches. Only changed keys need to be included.\n *\n * Non-fenced text passes through unchanged as `text-delta` chunks, matching\n * the behaviour of `createJsonRenderTransform` from `@json-render/core`.\n */\nexport function createYamlTransform(\n options?: YamlTransformOptions,\n): TransformStream<StreamChunk, StreamChunk> {\n let currentTextId = \"\";\n let inTextBlock = false;\n let textIdCounter = 0;\n\n let lineBuffer = \"\";\n let buffering = false;\n\n // Fence state\n let fenceMode: \"yaml-spec\" | \"yaml-edit\" | \"yaml-patch\" | \"diff\" | null =\n null;\n let yamlAccumulated = \"\";\n let diffAccumulated = \"\";\n\n // Streaming compiler for yaml-spec progressive rendering\n let compiler = createYamlStreamCompiler<Record<string, unknown>>();\n\n // The \"current spec\" — built up during yaml-spec, used as base for yaml-edit\n let currentSpec: Record<string, unknown> = options?.previousSpec\n ? structuredClone(\n options.previousSpec as unknown as Record<string, unknown>,\n )\n : {};\n\n // ── Text block helpers (same pattern as createJsonRenderTransform) ──\n\n function closeTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n }\n\n function ensureTextBlock(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!inTextBlock) {\n textIdCounter++;\n currentTextId = String(textIdCounter);\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n inTextBlock = true;\n }\n }\n\n function emitTextDelta(\n delta: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n ensureTextBlock(controller);\n controller.enqueue({ type: \"text-delta\", id: currentTextId, delta });\n }\n\n function emitPatch(\n patch: JsonPatch,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n closeTextBlock(controller);\n controller.enqueue({\n type: SPEC_DATA_PART_TYPE,\n data: { type: \"patch\", patch },\n });\n }\n\n function emitPatches(\n patches: JsonPatch[],\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const patch of patches) {\n emitPatch(patch, controller);\n }\n }\n\n // ── YAML fence processing ──\n\n /**\n * Feed a line of YAML to the streaming compiler (yaml-spec mode).\n * Emits patches for any newly detected properties.\n */\n function feedYamlSpec(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n yamlAccumulated += line + \"\\n\";\n const { newPatches } = compiler.push(line + \"\\n\");\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n }\n\n /**\n * Feed a line of YAML for edit mode. We accumulate all lines and process\n * on fence close since partial edits may not parse until complete.\n */\n function feedYamlEdit(line: string) {\n yamlAccumulated += line + \"\\n\";\n }\n\n /**\n * Finalise a yaml-edit block: parse the accumulated YAML, deep-merge\n * with the current spec, diff, and emit patches.\n */\n function finaliseYamlEdit(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const editObj = parse(yamlAccumulated);\n if (editObj && typeof editObj === \"object\" && !Array.isArray(editObj)) {\n const merged = deepMergeSpec(\n currentSpec,\n editObj as Record<string, unknown>,\n );\n const patches = diffToPatches(currentSpec, merged);\n if (patches.length > 0) {\n currentSpec = merged;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Invalid YAML edit block — silently drop\n }\n }\n\n /**\n * Finalise a yaml-spec block: flush the compiler for any remaining\n * partial data and update currentSpec.\n */\n function finaliseYamlSpec(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const { newPatches } = compiler.flush();\n if (newPatches.length > 0) {\n emitPatches(newPatches, controller);\n }\n currentSpec = structuredClone(\n compiler.getResult() as Record<string, unknown>,\n );\n }\n\n /**\n * Finalise a yaml-patch block: parse each accumulated line as an\n * RFC 6902 JSON Patch operation and emit directly.\n */\n function finaliseYamlPatch(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n for (const line of yamlAccumulated.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const patch = JSON.parse(trimmed) as JsonPatch;\n if (patch.op) {\n emitPatch(patch, controller);\n // Update currentSpec for subsequent edits\n if (patch.op === \"add\" || patch.op === \"replace\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) target[lastKey] = patch.value;\n } else if (patch.op === \"remove\") {\n const parts = patch.path.split(\"/\").filter(Boolean);\n let target: Record<string, unknown> = currentSpec;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null)\n break;\n target = target[key] as Record<string, unknown>;\n }\n const lastKey = parts[parts.length - 1];\n if (lastKey) delete target[lastKey];\n }\n }\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n\n /**\n * Finalise a diff block: apply the unified diff to the YAML-serialized\n * current spec, reparse, diff against current, and emit patches.\n */\n function finaliseDiff(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n try {\n const currentYaml = stringify(currentSpec, { indent: 2 });\n const patched = applyUnifiedDiff(currentYaml, diffAccumulated);\n if (patched === false) return;\n const newSpec = parse(patched);\n if (newSpec && typeof newSpec === \"object\" && !Array.isArray(newSpec)) {\n const patches = diffToPatches(\n currentSpec,\n newSpec as Record<string, unknown>,\n );\n if (patches.length > 0) {\n currentSpec = newSpec as Record<string, unknown>;\n emitPatches(patches, controller);\n }\n }\n } catch {\n // Diff apply or reparse failed\n }\n }\n\n // ── Line processing ──\n\n function processCompleteLine(\n line: string,\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n const trimmed = line.trim();\n\n // Fence open detection\n if (fenceMode === null) {\n if (trimmed.startsWith(YAML_SPEC_FENCE)) {\n fenceMode = \"yaml-spec\";\n yamlAccumulated = \"\";\n compiler.reset(currentSpec);\n return;\n }\n if (trimmed.startsWith(YAML_EDIT_FENCE)) {\n fenceMode = \"yaml-edit\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(YAML_PATCH_FENCE)) {\n fenceMode = \"yaml-patch\";\n yamlAccumulated = \"\";\n return;\n }\n if (trimmed.startsWith(DIFF_FENCE)) {\n fenceMode = \"diff\";\n diffAccumulated = \"\";\n return;\n }\n }\n\n // Fence close detection\n if (fenceMode !== null && trimmed === FENCE_CLOSE) {\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n fenceMode = null;\n return;\n }\n\n // Inside a fence\n if (fenceMode === \"yaml-spec\") {\n feedYamlSpec(line, controller);\n return;\n }\n if (fenceMode === \"yaml-edit\") {\n feedYamlEdit(line);\n return;\n }\n if (fenceMode === \"yaml-patch\") {\n yamlAccumulated += line + \"\\n\";\n return;\n }\n if (fenceMode === \"diff\") {\n diffAccumulated += line + \"\\n\";\n return;\n }\n\n // Outside fence — pass through as text\n if (!trimmed) {\n emitTextDelta(\"\\n\", controller);\n return;\n }\n emitTextDelta(line + \"\\n\", controller);\n }\n\n function flushBuffer(\n controller: TransformStreamDefaultController<StreamChunk>,\n ) {\n if (!lineBuffer) return;\n\n if (fenceMode !== null) {\n processCompleteLine(lineBuffer, controller);\n } else {\n emitTextDelta(lineBuffer, controller);\n }\n lineBuffer = \"\";\n buffering = false;\n }\n\n // ── TransformStream ──\n\n return new TransformStream<StreamChunk, StreamChunk>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-start\": {\n const id = (chunk as { id: string }).id;\n const idNum = parseInt(id, 10);\n if (!isNaN(idNum) && idNum >= textIdCounter) {\n textIdCounter = idNum;\n }\n currentTextId = id;\n inTextBlock = true;\n controller.enqueue(chunk);\n break;\n }\n\n case \"text-delta\": {\n const delta = chunk as { id: string; delta: string };\n const text = delta.delta;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n\n if (ch === \"\\n\") {\n if (buffering) {\n processCompleteLine(lineBuffer, controller);\n lineBuffer = \"\";\n buffering = false;\n } else if (fenceMode === null) {\n emitTextDelta(\"\\n\", controller);\n }\n } else if (lineBuffer.length === 0 && !buffering) {\n // Inside a fence, buffer everything. Outside, only buffer\n // potential fence-open lines (start with backtick).\n if (fenceMode !== null || ch === \"`\") {\n buffering = true;\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n } else if (buffering) {\n lineBuffer += ch;\n } else {\n emitTextDelta(ch, controller);\n }\n }\n break;\n }\n\n case \"text-end\": {\n flushBuffer(controller);\n if (inTextBlock) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n inTextBlock = false;\n }\n break;\n }\n\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n\n flush(controller) {\n flushBuffer(controller);\n if (fenceMode === \"yaml-spec\") {\n finaliseYamlSpec(controller);\n } else if (fenceMode === \"yaml-edit\") {\n finaliseYamlEdit(controller);\n } else if (fenceMode === \"yaml-patch\") {\n finaliseYamlPatch(controller);\n } else if (fenceMode === \"diff\") {\n finaliseDiff(controller);\n }\n closeTextBlock(controller);\n },\n });\n}\n\n/**\n * Convenience wrapper that pipes an AI SDK UI message stream through the\n * YAML transform, converting YAML spec/edit blocks into json-render patches.\n *\n * Drop-in replacement for `pipeJsonRender` from `@json-render/core`.\n *\n * @example\n * ```ts\n * import { pipeYamlRender } from \"@json-render/yaml\";\n *\n * const stream = createUIMessageStream({\n * execute: async ({ writer }) => {\n * writer.merge(pipeYamlRender(result.toUIMessageStream()));\n * },\n * });\n * return createUIMessageStreamResponse({ stream });\n * ```\n */\nexport function pipeYamlRender<T = StreamChunk>(\n stream: ReadableStream<T>,\n options?: YamlTransformOptions,\n): ReadableStream<T> {\n return stream.pipeThrough(\n createYamlTransform(options) as unknown as TransformStream<T, T>,\n );\n}\n","import { stringify } from \"yaml\";\nimport type { Catalog, EditMode, SchemaDefinition } from \"@json-render/core\";\nimport { buildEditInstructions } from \"@json-render/core\";\n\ninterface ZodLike {\n _def?: Record<string, unknown>;\n}\n\nexport interface YamlPromptOptions {\n /** Custom system message intro. */\n system?: string;\n /**\n * - `\"standalone\"` (default): LLM outputs only the YAML spec (no prose).\n * - `\"inline\"`: LLM responds conversationally, then wraps YAML in a fence.\n */\n mode?: \"standalone\" | \"inline\";\n /** Additional rules appended to the RULES section. */\n customRules?: string[];\n /** Edit modes to document. Default: `[\"merge\"]` (yaml-edit). */\n editModes?: EditMode[];\n}\n\ninterface CatalogComponentDef {\n props?: ZodLike;\n description?: string;\n slots?: string[];\n events?: string[];\n example?: Record<string, unknown>;\n}\n\n// ── Zod introspection (local, minimal) ──────────────────────────────────────\n\nfunction getZodTypeName(schema: ZodLike): string {\n if (!schema?._def) return \"\";\n const def = schema._def;\n return (\n (def.typeName as string | undefined) ??\n (typeof def.type === \"string\" ? (def.type as string) : \"\") ??\n \"\"\n );\n}\n\nfunction formatZodType(schema: ZodLike): string {\n if (!schema?._def) return \"unknown\";\n const def = schema._def;\n const typeName = getZodTypeName(schema);\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n return \"string\";\n case \"ZodNumber\":\n case \"number\":\n return \"number\";\n case \"ZodBoolean\":\n case \"boolean\":\n return \"boolean\";\n case \"ZodLiteral\":\n case \"literal\": {\n // Zod 4 uses def.values (array), Zod 3 uses def.value\n const litValues = def.values as unknown[] | undefined;\n const litValue = litValues?.[0] ?? def.value;\n return JSON.stringify(litValue);\n }\n case \"ZodEnum\":\n case \"enum\": {\n let values: string[];\n if (Array.isArray(def.values)) {\n values = def.values as string[];\n } else if (def.entries && typeof def.entries === \"object\") {\n values = Object.values(def.entries as Record<string, string>);\n } else {\n return \"enum\";\n }\n return values.map((v) => `\"${v}\"`).join(\" | \");\n }\n case \"ZodArray\":\n case \"array\": {\n const inner = (\n typeof def.element === \"object\"\n ? def.element\n : typeof def.type === \"object\"\n ? def.type\n : undefined\n ) as ZodLike | undefined;\n return inner ? `Array<${formatZodType(inner)}>` : \"Array<unknown>\";\n }\n case \"ZodObject\":\n case \"object\": {\n const shape =\n typeof def.shape === \"function\"\n ? (def.shape as () => Record<string, ZodLike>)()\n : (def.shape as Record<string, ZodLike>);\n if (!shape) return \"object\";\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerTypeName = getZodTypeName(value);\n const isOptional =\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"nullable\";\n return `${key}${isOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n return `{ ${props} }`;\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options\n ? options.map((opt) => formatZodType(opt)).join(\" | \")\n : \"unknown\";\n }\n case \"ZodRecord\":\n case \"record\": {\n const keyType = (def.keyType as ZodLike) ?? undefined;\n const valueType =\n (def.valueType as ZodLike) ?? (def.element as ZodLike) ?? undefined;\n const keyStr = keyType ? formatZodType(keyType) : \"string\";\n const valueStr = valueType ? formatZodType(valueType) : \"unknown\";\n return `Record<${keyStr}, ${valueStr}>`;\n }\n case \"ZodDefault\":\n case \"default\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction getExampleProps(def: CatalogComponentDef): Record<string, unknown> {\n if (def.example && Object.keys(def.example).length > 0) return def.example;\n if (!def.props?._def) return {};\n const zodDef = def.props._def;\n const typeName = getZodTypeName(def.props);\n if (typeName !== \"ZodObject\" && typeName !== \"object\") return {};\n const shape =\n typeof zodDef.shape === \"function\"\n ? (zodDef.shape as () => Record<string, ZodLike>)()\n : (zodDef.shape as Record<string, ZodLike>);\n if (!shape) return {};\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n const inner = getZodTypeName(value);\n if (\n inner === \"ZodOptional\" ||\n inner === \"optional\" ||\n inner === \"ZodNullable\" ||\n inner === \"nullable\"\n )\n continue;\n result[key] = exampleValue(value);\n }\n return result;\n}\n\nfunction exampleValue(schema: ZodLike): unknown {\n if (!schema?._def) return \"...\";\n const def = schema._def;\n const t = getZodTypeName(schema);\n switch (t) {\n case \"ZodString\":\n case \"string\":\n return \"example\";\n case \"ZodNumber\":\n case \"number\":\n return 0;\n case \"ZodBoolean\":\n case \"boolean\":\n return true;\n case \"ZodLiteral\":\n case \"literal\":\n return def.value;\n case \"ZodEnum\":\n case \"enum\": {\n if (Array.isArray(def.values) && (def.values as unknown[]).length > 0)\n return (def.values as unknown[])[0];\n if (def.entries && typeof def.entries === \"object\") {\n const vals = Object.values(def.entries as Record<string, string>);\n return vals.length > 0 ? vals[0] : \"example\";\n }\n return \"example\";\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\":\n case \"ZodDefault\":\n case \"default\": {\n const inner = (def.innerType as ZodLike) ?? (def.wrapped as ZodLike);\n return inner ? exampleValue(inner) : null;\n }\n case \"ZodArray\":\n case \"array\":\n return [];\n case \"ZodObject\":\n case \"object\":\n return getExampleProps({ props: schema } as CatalogComponentDef);\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as ZodLike[] | undefined;\n return options && options.length > 0 ? exampleValue(options[0]!) : \"...\";\n }\n default:\n return \"...\";\n }\n}\n\n// ── YAML helper ──\n\n/** Render a value as an indented YAML string (2-space indent). */\nfunction toYaml(value: unknown): string {\n return stringify(value, { indent: 2 }).trimEnd();\n}\n\n// ── Prompt generation ──\n\n/**\n * Generate a YAML-format system prompt from any json-render catalog.\n *\n * Works with catalogs from any renderer (`@json-render/react`,\n * `@json-render/vue`, etc.) — it only reads the catalog metadata.\n *\n * @example\n * ```ts\n * import { yamlPrompt } from \"@json-render/yaml\";\n * const systemPrompt = yamlPrompt(catalog, { mode: \"inline\" });\n * ```\n */\nexport function yamlPrompt(\n catalog: Catalog<SchemaDefinition, unknown>,\n options?: YamlPromptOptions,\n): string {\n const {\n system = \"You are a UI generator that outputs YAML.\",\n mode = \"standalone\",\n customRules = [],\n editModes = [\"merge\"],\n } = options ?? {};\n\n const lines: string[] = [];\n lines.push(system);\n lines.push(\"\");\n\n // ── Output format ──\n\n if (mode === \"inline\") {\n lines.push(\"OUTPUT FORMAT (text + YAML):\");\n lines.push(\n \"You respond conversationally. When generating UI, first write a brief explanation (1-3 sentences), then output the YAML spec wrapped in a ```yaml-spec code fence.\",\n );\n lines.push(\n \"If the user's message does not require a UI (e.g. a greeting or clarifying question), respond with text only — no YAML.\",\n );\n } else {\n lines.push(\"OUTPUT FORMAT (YAML):\");\n lines.push(\n \"Output a YAML document that describes a UI tree. Wrap it in a ```yaml-spec code fence.\",\n );\n }\n lines.push(\"\");\n lines.push(\n \"The YAML document has three top-level keys: root, elements, and state (optional).\",\n );\n lines.push(\n \"Stream progressively — output elements one at a time so the UI fills in as you write.\",\n );\n lines.push(\"\");\n\n // ── Example ──\n\n const allComponents = (catalog.data as Record<string, unknown>).components as\n | Record<string, CatalogComponentDef>\n | undefined;\n const cn = catalog.componentNames;\n const comp1 = cn[0] || \"Component\";\n const comp2 = cn.length > 1 ? cn[1]! : comp1;\n const comp1Def = allComponents?.[comp1];\n const comp2Def = allComponents?.[comp2];\n const comp1Props = comp1Def ? getExampleProps(comp1Def) : {};\n const comp2Props = comp2Def ? getExampleProps(comp2Def) : {};\n\n const exampleSpec = {\n root: \"main\",\n elements: {\n main: {\n type: comp1,\n props: comp1Props,\n children: [\"child-1\", \"list\"],\n },\n \"child-1\": {\n type: comp2,\n props: comp2Props,\n children: [],\n },\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/items\", key: \"id\" },\n children: [\"item\"],\n },\n item: {\n type: comp2,\n props: { ...comp2Props },\n children: [],\n },\n },\n state: {\n items: [\n { id: \"1\", title: \"First Item\" },\n { id: \"2\", title: \"Second Item\" },\n ],\n },\n };\n\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\"```yaml-spec\");\n lines.push(toYaml(exampleSpec));\n lines.push(\"```\");\n lines.push(\"\");\n\n // ── Edit modes (dynamic based on config) ──\n\n lines.push(buildEditInstructions({ modes: editModes }, \"yaml\"));\n\n // ── Initial state ──\n\n lines.push(\"INITIAL STATE:\");\n lines.push(\n \"The spec includes a top-level `state` key to seed the state model. Components using $state, $bindState, $bindItem, $item, or $index read from this state.\",\n );\n lines.push(\n \"CRITICAL: You MUST include state whenever your UI displays data via these expressions or uses repeat to iterate over arrays.\",\n );\n lines.push(\n \"Include realistic sample data. For lists: 3-5 items with relevant fields. Never leave arrays empty.\",\n );\n lines.push(\n 'When content comes from the state model, use { \"$state\": \"/some/path\" } dynamic props instead of hardcoding values.',\n );\n lines.push(\n 'State paths use RFC 6901 JSON Pointer syntax (e.g. \"/todos/0/title\"). Do NOT use dot notation.',\n );\n lines.push(\"\");\n\n // ── Dynamic lists ──\n\n lines.push(\"DYNAMIC LISTS (repeat field):\");\n lines.push(\n \"Any element can have a top-level `repeat` field to render its children once per item in a state array.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n list: {\n type: comp1,\n props: comp1Props,\n repeat: { statePath: \"/todos\", key: \"id\" },\n children: [\"todo-item\"],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Inside repeated children, use { \"$item\": \"field\" } for item data and { \"$index\": true } for the array index.',\n );\n lines.push(\n \"ALWAYS use repeat for lists backed by state arrays. NEVER hardcode individual elements per item.\",\n );\n lines.push(\n \"IMPORTANT: `repeat` is a top-level field on the element (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"\");\n\n // ── Array state actions ──\n\n lines.push(\"ARRAY STATE ACTIONS:\");\n lines.push(\n 'Use \"pushState\" to append items to arrays. Use \"removeState\" to remove items by index.',\n );\n lines.push('Use \"$id\" inside pushState values to auto-generate a unique ID.');\n lines.push(\"\");\n\n // ── Components ──\n\n if (allComponents) {\n lines.push(`AVAILABLE COMPONENTS (${catalog.componentNames.length}):`);\n lines.push(\"\");\n\n for (const [name, def] of Object.entries(allComponents)) {\n const propsStr = def.props ? formatZodType(def.props) : \"{}\";\n const hasChildren = def.slots && def.slots.length > 0;\n const childrenStr = hasChildren ? \" [accepts children]\" : \"\";\n const eventsStr =\n def.events && def.events.length > 0\n ? ` [events: ${def.events.join(\", \")}]`\n : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}${eventsStr}`);\n }\n lines.push(\"\");\n }\n\n // ── Actions ──\n\n const actions = (catalog.data as Record<string, unknown>).actions as\n | Record<string, { params?: ZodLike; description?: string }>\n | undefined;\n const builtInActions = catalog.schema.builtInActions ?? [];\n const hasCustomActions = actions && catalog.actionNames.length > 0;\n const hasBuiltInActions = builtInActions.length > 0;\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const action of builtInActions) {\n lines.push(`- ${action.name}: ${action.description} [built-in]`);\n }\n if (hasCustomActions) {\n for (const [name, def] of Object.entries(actions)) {\n lines.push(`- ${name}${def.description ? `: ${def.description}` : \"\"}`);\n }\n }\n lines.push(\"\");\n }\n\n // ── Events ──\n\n lines.push(\"EVENTS (the `on` field):\");\n lines.push(\n \"Elements can have an optional `on` field to bind events to actions. It is a top-level field (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\"Example:\");\n lines.push(\"\");\n lines.push(\n toYaml({\n \"save-btn\": {\n type: comp1,\n props: comp1Props,\n on: {\n press: {\n action: \"setState\",\n params: { statePath: \"/saved\", value: true },\n },\n },\n children: [],\n },\n }),\n );\n lines.push(\"\");\n lines.push(\n 'Action params can use dynamic references: { \"$state\": \"/statePath\" }.',\n );\n lines.push(\n \"IMPORTANT: Do NOT put action/actionParams inside props. Always use the `on` field.\",\n );\n lines.push(\"\");\n\n // ── Visibility ──\n\n lines.push(\"VISIBILITY CONDITIONS:\");\n lines.push(\n \"Elements can have an optional `visible` field to conditionally show/hide based on state. It is a top-level field (sibling of type/props/children).\",\n );\n lines.push(\"Conditions:\");\n lines.push('- { \"$state\": \"/path\" } — visible when truthy');\n lines.push('- { \"$state\": \"/path\", \"not\": true } — visible when falsy');\n lines.push('- { \"$state\": \"/path\", \"eq\": \"value\" } — visible when equal');\n lines.push(\n '- { \"$state\": \"/path\", \"neq\": \"value\" } — visible when not equal',\n );\n lines.push(\n '- { \"$state\": \"/path\", \"gt\": N } / gte / lt / lte — numeric comparisons',\n );\n lines.push(\"- Use ONE operator per condition. Do not combine multiple.\");\n lines.push('- Add \"not\": true to any condition to invert it.');\n lines.push(\"- [cond, cond] — implicit AND (all must be true)\");\n lines.push('- { \"$and\": [...] } — explicit AND');\n lines.push('- { \"$or\": [...] } — at least one must be true');\n lines.push(\"- true / false — always visible/hidden\");\n lines.push(\"\");\n\n // ── Dynamic props ──\n\n lines.push(\"DYNAMIC PROPS:\");\n lines.push(\"Any prop value can be a dynamic expression:\");\n lines.push(\n '1. Read-only: { \"$state\": \"/path\" } — resolves to the value at that state path.',\n );\n lines.push(\n '2. Two-way binding: { \"$bindState\": \"/path\" } — read + write. Use on form inputs.',\n );\n lines.push(\n ' Inside repeat scopes: { \"$bindItem\": \"field\" } for item-level binding.',\n );\n lines.push(\n '3. Conditional: { \"$cond\": <condition>, \"$then\": <val>, \"$else\": <val> }',\n );\n lines.push(\n '4. Template: { \"$template\": \"Hello, ${/name}!\" } — interpolates state references.',\n );\n lines.push(\"\");\n\n // ── $computed (only if catalog has functions) ──\n\n const catalogFunctions = (catalog.data as Record<string, unknown>).functions;\n if (catalogFunctions && Object.keys(catalogFunctions).length > 0) {\n lines.push(\n '5. Computed: { \"$computed\": \"<fn>\", \"args\": { \"key\": <expr> } }',\n );\n lines.push(\" Available functions:\");\n for (const name of Object.keys(\n catalogFunctions as Record<string, unknown>,\n )) {\n lines.push(` - ${name}`);\n }\n lines.push(\"\");\n }\n\n // ── Validation (only if components have checks) ──\n\n const hasChecks = allComponents\n ? Object.values(allComponents).some((def) => {\n if (!def.props) return false;\n return formatZodType(def.props).includes(\"checks\");\n })\n : false;\n\n if (hasChecks) {\n lines.push(\"VALIDATION:\");\n lines.push(\n \"Form components with a `checks` prop support client-side validation.\",\n );\n lines.push(\n \"Built-in types: required, email, minLength, maxLength, pattern, min, max, numeric, url, matches, equalTo, lessThan, greaterThan, requiredIf.\",\n );\n lines.push(\n \"IMPORTANT: Components with checks must also use $bindState or $bindItem for two-way binding.\",\n );\n lines.push(\"\");\n }\n\n // ── State watchers ──\n\n if (hasCustomActions || hasBuiltInActions) {\n lines.push(\"STATE WATCHERS:\");\n lines.push(\n \"Elements can have an optional `watch` field to trigger actions when state changes. Top-level field, NOT inside props.\",\n );\n lines.push(\n \"Maps state paths to action bindings. Fires when the watched value changes (not on initial render).\",\n );\n lines.push(\"\");\n }\n\n // ── Rules ──\n\n lines.push(\"RULES:\");\n const baseRules =\n mode === \"inline\"\n ? [\n \"When generating UI, wrap the YAML in a ```yaml-spec code fence\",\n \"Write a brief conversational response before the YAML\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ]\n : [\n \"Output ONLY the YAML spec inside a ```yaml-spec fence — no prose, no extra markdown\",\n \"When editing existing UI, use a ```yaml-edit fence with only the changed parts\",\n \"The document must have: root (string), elements (map of elements), and optionally state\",\n \"Each element must have: type, props, children (list of child keys)\",\n \"ONLY use components listed above\",\n \"Use unique, descriptive keys for elements (e.g. 'header', 'metric-1', 'chart-revenue')\",\n \"Include state whenever using $state, $bindState, $bindItem, $item, $index, or repeat\",\n ];\n\n const schemaRules = catalog.schema.defaultRules ?? [];\n const allRules = [...baseRules, ...schemaRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["parse","deepMergeSpec","diffToPatches","parse","deepMergeSpec","diffToPatches","stringify"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@json-render/yaml",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "YAML wire format for @json-render/core. Progressive rendering and surgical edits via streaming YAML.",
|
|
6
6
|
"keywords": [
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"diff": "^8.0.3",
|
|
43
43
|
"yaml": "^2.8.2",
|
|
44
|
-
"@json-render/core": "0.
|
|
44
|
+
"@json-render/core": "0.18.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"tsup": "^8.0.2",
|