ngx-json-render 0.2.1 → 0.3.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/README.md +338 -12
- package/fesm2022/ngx-json-render-testing.mjs +389 -0
- package/fesm2022/ngx-json-render-testing.mjs.map +1 -0
- package/fesm2022/ngx-json-render.mjs +491 -94
- package/fesm2022/ngx-json-render.mjs.map +1 -1
- package/package.json +5 -1
- package/types/ngx-json-render-testing.d.ts +197 -0
- package/types/ngx-json-render.d.ts +244 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-json-render.mjs","sources":["../../../projects/ngx-json-render/src/lib/root-context.ts","../../../projects/ngx-json-render/src/lib/state.service.ts","../../../projects/ngx-json-render/src/lib/validation.service.ts","../../../projects/ngx-json-render/src/lib/actions.service.ts","../../../projects/ngx-json-render/src/lib/confirm-dialog.component.ts","../../../projects/ngx-json-render/src/lib/devtools.ts","../../../projects/ngx-json-render/src/lib/tokens.ts","../../../projects/ngx-json-render/src/lib/element.component.ts","../../../projects/ngx-json-render/src/lib/renderer.component.ts","../../../projects/ngx-json-render/src/lib/repeat-scope.component.ts","../../../projects/ngx-json-render/src/lib/children.component.ts","../../../projects/ngx-json-render/src/lib/registry.ts","../../../projects/ngx-json-render/src/lib/streaming/patch.ts","../../../projects/ngx-json-render/src/lib/streaming/parts.ts","../../../projects/ngx-json-render/src/lib/streaming/transport.ts","../../../projects/ngx-json-render/src/lib/streaming/ui-stream.ts","../../../projects/ngx-json-render/src/lib/streaming/chat-ui.ts","../../../projects/ngx-json-render/src/lib/streaming/index.ts","../../../projects/ngx-json-render/src/lib/schema.ts","../../../projects/ngx-json-render/src/public-api.ts","../../../projects/ngx-json-render/src/ngx-json-render.ts"],"sourcesContent":["import { Injectable, type Signal, type Type, signal } from '@angular/core';\nimport type {\n ActionHandler,\n ComputedFunction,\n DirectiveRegistry,\n Spec,\n StateModel,\n StateStore,\n ValidationFunction,\n} from '@json-render/core';\nimport type { ComponentRegistry, RegistryEntry, StateChange } from './types';\n\nconst EMPTY = signal(undefined);\n\n/**\n * Internal bridge between the `<json-render>` component's inputs and the\n * renderer services / element tree. The renderer component replaces these\n * signal references with its own input signals at construction time.\n *\n * @internal\n */\n@Injectable()\nexport class JsonRenderRootContext {\n spec: Signal<Spec | null | undefined> = EMPTY;\n registry: Signal<ComponentRegistry | undefined> = EMPTY;\n loading: Signal<boolean> = signal(false);\n fallback: Signal<Type<unknown> | RegistryEntry | null | undefined> = EMPTY;\n\n /** External store (controlled mode). */\n store: Signal<StateStore | null | undefined> = EMPTY;\n /** Initial state (uncontrolled mode); falls back to `spec.state`. */\n initialState: Signal<StateModel> = signal({});\n\n handlers: Signal<Record<string, ActionHandler> | undefined> = EMPTY;\n onAction: Signal<\n | ((name: string, params?: Record<string, unknown>) => unknown)\n | null\n | undefined\n > = EMPTY;\n navigate: Signal<((path: string) => void) | null | undefined> = EMPTY;\n\n validationFunctions: Signal<Record<string, ValidationFunction> | undefined> =\n EMPTY;\n functions: Signal<Record<string, ComputedFunction> | undefined> = EMPTY;\n directiveRegistry: Signal<DirectiveRegistry | undefined> = EMPTY;\n\n /** Emits uncontrolled-mode state changes to the renderer output. */\n emitStateChange: (changes: StateChange[]) => void = () => {};\n\n /** Resolve a registry entry (component + slot metadata) for a type. */\n resolveEntry(type: string): RegistryEntry | undefined {\n const raw = this.registry()?.[type] ?? this.fallback() ?? undefined;\n if (!raw) return undefined;\n return typeof raw === 'function' ? { component: raw } : raw;\n }\n}\n","import {\n Injectable,\n type Signal,\n computed,\n effect,\n inject,\n isDevMode,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n type StateModel,\n type StateStore,\n createStateStore,\n getByPath,\n} from '@json-render/core';\nimport { flattenToPointers } from '@json-render/core/store-utils';\nimport { JsonRenderRootContext } from './root-context';\nimport type { StateChange } from './types';\n\n/**\n * The state store of a `<json-render>` subtree.\n *\n * Wraps a core {@link StateStore} (either the internal in-memory store in\n * uncontrolled mode, or an external store passed via the `store` input) and\n * exposes the current state model as a signal.\n *\n * Inject it from catalog components or action handlers via\n * {@link injectStateStore}.\n */\n@Injectable()\nexport class JsonRenderStateService {\n private readonly root = inject(JsonRenderRootContext);\n private readonly internalStore = createStateStore({});\n\n private readonly changeListeners = new Set<\n (changes: StateChange[]) => void\n >();\n\n private readonly _state = signal<StateModel>(\n {},\n // External stores may mutate snapshots in place — always propagate.\n { equal: () => false },\n );\n\n /** The current state model as a signal. */\n readonly state: Signal<StateModel> = this._state.asReadonly();\n\n private readonly currentStore = computed<StateStore>(\n () => this.root.store() ?? this.internalStore,\n );\n\n constructor() {\n const initialMode =\n untracked(this.currentStore) === this.internalStore\n ? 'uncontrolled'\n : 'controlled';\n let modeWarned = false;\n\n // Keep the state signal in sync with whichever store is active.\n effect((onCleanup) => {\n const store = this.currentStore();\n\n if (isDevMode() && !modeWarned) {\n const mode =\n store === this.internalStore ? 'uncontrolled' : 'controlled';\n if (mode !== initialMode) {\n modeWarned = true;\n console.warn(\n `[ngx-json-render] switching from ${initialMode} to ${mode} mode is not supported.`,\n );\n }\n }\n\n untracked(() => this._state.set(store.getSnapshot()));\n const unsubscribe = store.subscribe(() => {\n this._state.set(store.getSnapshot());\n });\n onCleanup(unsubscribe);\n });\n\n // Uncontrolled mode: when the (resolved) initial state changes — e.g.\n // `spec.state` grows while streaming — diff it against the previous\n // initial state and apply only the changed leaves to the store.\n let prevFlat: Record<string, unknown> = {};\n effect(() => {\n if (this.root.store()) return;\n const initialState = this.root.initialState() ?? {};\n const nextFlat =\n Object.keys(initialState).length > 0\n ? flattenToPointers(initialState)\n : {};\n const allKeys = new Set([\n ...Object.keys(prevFlat),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlat[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : undefined;\n }\n }\n prevFlat = nextFlat;\n if (Object.keys(updates).length > 0) {\n untracked(() => this.internalStore.update(updates));\n }\n });\n }\n\n /** Read a value by JSON Pointer path from the current state. */\n get(path: string): unknown {\n return untracked(this.currentStore).get(path);\n }\n\n /** Write a value by JSON Pointer path and notify subscribers. */\n set(path: string, value: unknown): void {\n const store = untracked(this.currentStore);\n const prev = store.getSnapshot();\n const prevValue = getByPath(prev, path);\n store.set(path, value);\n if (prevValue !== value) {\n const changes: StateChange[] = [{ path, value }];\n this.notifyChanges(changes);\n if (!untracked(this.root.store) && store.getSnapshot() !== prev) {\n this.root.emitStateChange(changes);\n }\n }\n }\n\n /** Write multiple values at once (single notification). */\n update(updates: Record<string, unknown>): void {\n const store = untracked(this.currentStore);\n const prev = store.getSnapshot();\n store.update(updates);\n const changes: StateChange[] = [];\n for (const [path, value] of Object.entries(updates)) {\n if (getByPath(prev, path) !== value) {\n changes.push({ path, value });\n }\n }\n if (changes.length > 0) {\n this.notifyChanges(changes);\n if (!untracked(this.root.store) && store.getSnapshot() !== prev) {\n this.root.emitStateChange(changes);\n }\n }\n }\n\n /** Return the full state object (non-reactive read). */\n getSnapshot(): StateModel {\n return untracked(this.currentStore).getSnapshot();\n }\n\n /**\n * Register a listener called with the list of changed paths whenever state\n * is written through this service (element `watch` fields rely on this).\n * Returns an unsubscribe function.\n */\n subscribeChanges(listener: (changes: StateChange[]) => void): () => void {\n this.changeListeners.add(listener);\n return () => {\n this.changeListeners.delete(listener);\n };\n }\n\n private notifyChanges(changes: StateChange[]): void {\n for (const listener of this.changeListeners) {\n listener(changes);\n }\n }\n}\n\n/**\n * Inject the state store of the nearest `<json-render>` renderer.\n * Must be called from within the renderer's subtree (e.g. a catalog\n * component) or a component that provides {@link JsonRenderStateService}.\n */\nexport function injectStateStore(): JsonRenderStateService {\n return inject(JsonRenderStateService);\n}\n\n/** Reactive read of a state value by JSON Pointer path. */\nexport function injectStateValue<T>(\n path: string | (() => string),\n): Signal<T | undefined> {\n const store = injectStateStore();\n const getPath = typeof path === 'function' ? path : () => path;\n return computed(() => getByPath(store.state(), getPath()) as T | undefined);\n}\n\n/**\n * Reactive two-way binding to a state path: a value signal plus a setter\n * that writes back to the same path.\n */\nexport function injectStateBinding<T>(path: string | (() => string)): {\n value: Signal<T | undefined>;\n set: (value: T) => void;\n} {\n const store = injectStateStore();\n const getPath = typeof path === 'function' ? path : () => path;\n return {\n value: computed(() => getByPath(store.state(), getPath()) as T | undefined),\n set: (value: T) => store.set(getPath(), value),\n };\n}\n\n/**\n * Two-way bound prop helper for catalog components, mirroring `useBoundProp`\n * from the other renderers: the value comes from the already-resolved prop,\n * and the setter writes back to the bound state path (no-op if not bound).\n *\n * @example\n * ```ts\n * const ctx = injectRenderContext<{ value?: string }>();\n * const bound = injectBoundProp<string>(\n * () => ctx.props().value,\n * () => ctx.bindings()?.['value'],\n * );\n * // template: <input [value]=\"bound.value() ?? ''\" (input)=\"bound.set($any($event.target).value)\" />\n * ```\n */\nexport function injectBoundProp<T>(\n propValue: () => T | undefined,\n bindingPath: () => string | undefined,\n): { value: Signal<T | undefined>; set: (value: T) => void } {\n const store = injectStateStore();\n return {\n value: computed(propValue),\n set: (value: T) => {\n const path = bindingPath();\n if (path) store.set(path, value);\n },\n };\n}\n","import {\n Injectable,\n type Signal,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n runValidation,\n} from '@json-render/core';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\n\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (\n typeof va === 'object' &&\n va !== null &&\n typeof vb === 'object' &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>)['$state'];\n const sb = (vb as Record<string, unknown>)['$state'];\n if (typeof sa === 'string' && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n\n if (a.validateOn !== b.validateOn) return false;\n\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\n/**\n * Form validation state of a `<json-render>` subtree. Fields register their\n * {@link ValidationConfig}; the built-in `validateForm` action validates all\n * registered fields and writes the result to state.\n */\n@Injectable()\nexport class JsonRenderValidationService {\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n\n private readonly _fieldStates = signal<Record<string, FieldValidationState>>(\n {},\n );\n private readonly _fieldConfigs = signal<Record<string, ValidationConfig>>({});\n\n /** Validation state per registered field path. */\n readonly fieldStates: Signal<Record<string, FieldValidationState>> =\n this._fieldStates.asReadonly();\n\n get customFunctions(): Record<string, ValidationFunction> {\n return untracked(this.root.validationFunctions) ?? {};\n }\n\n /** Register (or update) a field's validation config. */\n registerField(path: string, config: ValidationConfig): void {\n const prev = untracked(this._fieldConfigs);\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) return;\n this._fieldConfigs.set({ ...prev, [path]: config });\n }\n\n /** Validate a single field and record the result. */\n validate(path: string, config: ValidationConfig): ValidationResult {\n const currentState = this.state.getSnapshot();\n const segments = path.split('/').filter(Boolean);\n let value: unknown = currentState;\n for (const seg of segments) {\n if (value != null && typeof value === 'object') {\n value = (value as Record<string, unknown>)[seg];\n } else {\n value = undefined;\n break;\n }\n }\n const result = runValidation(config, {\n value,\n stateModel: currentState,\n customFunctions: this.customFunctions,\n });\n\n const prev = untracked(this._fieldStates);\n this._fieldStates.set({\n ...prev,\n [path]: {\n touched: prev[path]?.touched ?? true,\n validated: true,\n result,\n },\n });\n\n return result;\n }\n\n /** Mark a field as touched. */\n touch(path: string): void {\n const prev = untracked(this._fieldStates);\n this._fieldStates.set({\n ...prev,\n [path]: {\n ...prev[path],\n touched: true,\n validated: prev[path]?.validated ?? false,\n result: prev[path]?.result ?? null,\n },\n });\n }\n\n /** Clear a field's validation state. */\n clear(path: string): void {\n const { [path]: _, ...rest } = untracked(this._fieldStates);\n this._fieldStates.set(rest);\n }\n\n /** Validate all registered fields. Returns whether all are valid. */\n validateAll(): boolean {\n let allValid = true;\n for (const [path, config] of Object.entries(\n untracked(this._fieldConfigs),\n )) {\n const result = this.validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n }\n}\n\n/** Inject the validation service of the nearest `<json-render>` renderer. */\nexport function injectValidation(): JsonRenderValidationService {\n return inject(JsonRenderValidationService);\n}\n\n/**\n * Field-level validation helper for catalog input components: registers the\n * config and exposes the field's validation state as signals.\n */\nexport function injectFieldValidation(\n path: string | (() => string),\n config?: ValidationConfig | (() => ValidationConfig | undefined),\n): {\n state: Signal<FieldValidationState>;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: Signal<string[]>;\n isValid: Signal<boolean>;\n} {\n const validation = injectValidation();\n const getPath = typeof path === 'function' ? path : () => path;\n const getConfig = typeof config === 'function' ? config : () => config;\n\n effect(() => {\n const p = getPath();\n const c = getConfig();\n if (p && c) {\n validation.registerField(p, c);\n }\n });\n\n const state = computed<FieldValidationState>(() => {\n const current = validation.fieldStates()[getPath()];\n return current ?? { touched: false, validated: false, result: null };\n });\n\n return {\n state,\n validate: () =>\n validation.validate(getPath(), getConfig() ?? { checks: [] }),\n touch: () => validation.touch(getPath()),\n clear: () => validation.clear(getPath()),\n errors: computed(() => state().result?.errors ?? []),\n isValid: computed(() => state().result?.valid ?? true),\n };\n}\n","import {\n Injectable,\n type Signal,\n computed,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n type ActionBinding,\n type ActionHandler,\n type ResolvedAction,\n executeAction,\n nextActionDispatchId,\n notifyActionDispatch,\n notifyActionSettle,\n resolveAction,\n} from '@json-render/core';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\nimport { JsonRenderValidationService } from './validation.service';\n\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n if (value === '$id') {\n return generateUniqueId();\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n if (keys.length === 1 && typeof obj['$state'] === 'string') {\n return get(obj['$state'] as string);\n }\n\n if (keys.length === 1 && '$id' in obj) {\n return generateUniqueId();\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n if (typeof value === 'object') {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\n/**\n * Rejection produced when the user dismisses an action's confirmation dialog.\n * Carries a stable `name` so callers can tell a cancellation apart from a\n * handler failure without matching on the message.\n *\n * @internal Not part of the public API; check `error.name` instead.\n */\nexport class ActionCancelledError extends Error {\n constructor() {\n super('Action cancelled');\n this.name = 'ActionCancelledError';\n }\n}\n\n/** True for the rejection produced by cancelling a confirmation dialog. */\nexport function isActionCancelled(error: unknown): boolean {\n return error instanceof Error && error.name === 'ActionCancelledError';\n}\n\n/**\n * Action dispatcher of a `<json-render>` subtree.\n *\n * Executes {@link ActionBinding}s: built-in actions (`setState`, `pushState`,\n * `removeState`, `push`, `pop`, `validateForm`) are handled internally;\n * everything else is routed to the host-provided `handlers` (or the\n * `onAction` catch-all), honoring `confirm`, `onSuccess`, and `onError`.\n */\n@Injectable()\nexport class JsonRenderActionsService {\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n private readonly validation = inject(JsonRenderValidationService, {\n optional: true,\n });\n\n private readonly extraHandlers = signal<Record<string, ActionHandler>>({});\n private readonly _loadingActions = signal<ReadonlySet<string>>(new Set());\n private readonly _pendingConfirmation = signal<PendingConfirmation | null>(\n null,\n );\n\n /** Names of actions currently executing. */\n readonly loadingActions: Signal<ReadonlySet<string>> =\n this._loadingActions.asReadonly();\n\n /** The confirmation currently awaiting user input, if any. */\n readonly pendingConfirmation: Signal<PendingConfirmation | null> =\n this._pendingConfirmation.asReadonly();\n\n /** All registered handlers (host handlers + runtime registrations). */\n get handlers(): Record<string, ActionHandler> {\n return {\n ...(untracked(this.root.handlers) ?? {}),\n ...untracked(this.extraHandlers),\n };\n }\n\n /** Register an additional action handler at runtime. */\n registerHandler(name: string, handler: ActionHandler): void {\n this.extraHandlers.set({\n ...untracked(this.extraHandlers),\n [name]: handler,\n });\n }\n\n /** Execute an action binding. */\n async execute(binding: ActionBinding): Promise<void> {\n const resolved = resolveAction(binding, this.state.getSnapshot());\n const get = (path: string) => this.state.get(path);\n const set = (path: string, value: unknown) => this.state.set(path, value);\n\n // --- devtools / observer hooks ---\n const dispatchId = nextActionDispatchId();\n const dispatchedAt = Date.now();\n notifyActionDispatch({\n id: dispatchId,\n name: resolved.action,\n params: resolved.params,\n at: dispatchedAt,\n });\n let ok = true;\n let error: unknown = undefined;\n\n try {\n if (resolved.action === 'setState' && resolved.params) {\n const statePath = resolved.params['statePath'] as string;\n const value = resolved.params['value'];\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n if (resolved.action === 'pushState' && resolved.params) {\n const statePath = resolved.params['statePath'] as string;\n const rawValue = resolved.params['value'];\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params['clearStatePath'] as\n string | undefined;\n if (clearStatePath) {\n set(clearStatePath, '');\n }\n }\n return;\n }\n\n if (resolved.action === 'removeState' && resolved.params) {\n const statePath = resolved.params['statePath'] as string;\n const index = resolved.params['index'] as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n if (resolved.action === 'push' && resolved.params) {\n const screen = resolved.params['screen'] as string;\n if (screen) {\n const currentScreen = get('/currentScreen') as string | undefined;\n const navStack = (get('/navStack') as string[] | undefined) ?? [];\n if (currentScreen) {\n set('/navStack', [...navStack, currentScreen]);\n } else {\n set('/navStack', [...navStack, '']);\n }\n set('/currentScreen', screen);\n }\n return;\n }\n\n if (resolved.action === 'pop') {\n const navStack = (get('/navStack') as string[] | undefined) ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set('/navStack', navStack.slice(0, -1));\n if (previousScreen) {\n set('/currentScreen', previousScreen);\n } else {\n set('/currentScreen', undefined);\n }\n }\n return;\n }\n\n if (resolved.action === 'validateForm') {\n if (!this.validation) {\n console.warn(\n 'validateForm action was dispatched but no JsonRenderValidationService is available.',\n );\n return;\n }\n const valid = this.validation.validateAll();\n const errors: Record<string, string[]> = {};\n for (const [path, fs] of Object.entries(\n untracked(this.validation.fieldStates),\n )) {\n if (fs.result && !fs.result.valid) {\n errors[path] = fs.result.errors;\n }\n }\n const statePath =\n (resolved.params?.['statePath'] as string) || '/formValidation';\n set(statePath, { valid, errors });\n return;\n }\n\n const handler = this.lookupHandler(resolved.action);\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n if (resolved.confirm) {\n // Awaited, not returned: a returned promise would let the `finally`\n // below settle the observers before the user has even answered.\n await new Promise<void>((resolve, reject) => {\n this._pendingConfirmation.set({\n action: resolved,\n handler,\n resolve: () => {\n this._pendingConfirmation.set(null);\n resolve();\n },\n reject: () => {\n this._pendingConfirmation.set(null);\n reject(new ActionCancelledError());\n },\n });\n });\n }\n\n await this.runHandler(resolved, handler);\n } catch (err) {\n ok = false;\n error = err;\n throw err;\n } finally {\n const now = Date.now();\n notifyActionSettle({\n id: dispatchId,\n name: resolved.action,\n ok,\n at: now,\n durationMs: now - dispatchedAt,\n error,\n });\n }\n }\n\n /** Confirm the pending confirmation dialog. */\n confirm(): void {\n untracked(this._pendingConfirmation)?.resolve();\n }\n\n /** Cancel the pending confirmation dialog. */\n cancel(): void {\n untracked(this._pendingConfirmation)?.reject();\n }\n\n private lookupHandler(name: string): ActionHandler | undefined {\n const direct = this.handlers[name];\n if (direct) return direct;\n // Catch-all: route unknown actions to the `onAction` input when provided.\n const onAction = untracked(this.root.onAction);\n if (onAction) {\n return (params) => onAction(name, params);\n }\n return undefined;\n }\n\n private async runHandler(\n resolved: ResolvedAction,\n handler: ActionHandler,\n ): Promise<void> {\n this._loadingActions.set(\n new Set(untracked(this._loadingActions)).add(resolved.action),\n );\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: (path, value) => this.state.set(path, value),\n navigate: untracked(this.root.navigate) ?? undefined,\n executeAction: async (binding) => {\n await this.execute(binding);\n },\n });\n } finally {\n const next = new Set(untracked(this._loadingActions));\n next.delete(resolved.action);\n this._loadingActions.set(next);\n }\n }\n}\n\n/** Inject the actions service of the nearest `<json-render>` renderer. */\nexport function injectActions(): JsonRenderActionsService {\n return inject(JsonRenderActionsService);\n}\n\n/**\n * Convenience helper for executing a fixed action binding, mirroring\n * `useAction` from the other renderers.\n */\nexport function injectAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: Signal<boolean>;\n} {\n const actions = injectActions();\n return {\n execute: () => actions.execute(binding),\n isLoading: computed(() => actions.loadingActions().has(binding.action)),\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport type { ActionConfirm } from '@json-render/core';\n\n/**\n * Default confirmation dialog shown for action bindings with a `confirm`\n * field. Rendered automatically by `<json-render>`; can also be used\n * standalone with a custom action flow.\n */\n@Component({\n selector: 'jr-confirm-dialog',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n style=\"position: fixed; inset: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 50\"\n (click)=\"cancelled.emit()\"\n >\n <div\n style=\"background-color: white; border-radius: 8px; padding: 24px; max-width: 400px; width: 100%; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1)\"\n (click)=\"$event.stopPropagation()\"\n >\n <h3 style=\"margin: 0 0 8px 0; font-size: 18px; font-weight: 600\">\n {{ config().title }}\n </h3>\n <p style=\"margin: 0 0 24px 0; color: #6b7280\">{{ config().message }}</p>\n <div style=\"display: flex; gap: 12px; justify-content: flex-end\">\n <button\n type=\"button\"\n (click)=\"cancelled.emit()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #d1d5db; background-color: white; cursor: pointer\"\n >\n {{ config().cancelLabel ?? 'Cancel' }}\n </button>\n <button\n type=\"button\"\n (click)=\"confirmed.emit()\"\n [style.background-color]=\"isDanger() ? '#dc2626' : '#3b82f6'\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; color: white; cursor: pointer\"\n >\n {{ config().confirmLabel ?? 'Confirm' }}\n </button>\n </div>\n </div>\n </div>\n `,\n})\nexport class JrConfirmDialog {\n readonly config = input.required<ActionConfirm>();\n readonly confirmed = output<void>();\n readonly cancelled = output<void>();\n\n protected readonly isDanger = computed(\n () => this.config().variant === 'danger',\n );\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\nimport { isDevtoolsActive, subscribeDevtoolsActive } from '@json-render/core';\n\n/**\n * Reactive mirror of the json-render devtools-active flag. When active, the\n * renderer wraps each element with a `data-jr-key` attribute for the picker.\n */\nexport function injectDevtoolsActive(): Signal<boolean> {\n const active = signal(isDevtoolsActive());\n const unsubscribe = subscribeDevtoolsActive(() =>\n active.set(isDevtoolsActive()),\n );\n inject(DestroyRef).onDestroy(unsubscribe);\n return active.asReadonly();\n}\n","import { InjectionToken, inject } from '@angular/core';\nimport type { RenderContext, RepeatScope } from './types';\n\n/**\n * The render context of the element currently being rendered.\n * Provided by the renderer for every catalog component instance.\n */\nexport const RENDER_CONTEXT = new InjectionToken<RenderContext>(\n 'ngx-json-render RENDER_CONTEXT',\n);\n\n/**\n * The current repeat scope. Present only for elements rendered inside a\n * `repeat` block.\n */\nexport const REPEAT_SCOPE = new InjectionToken<RepeatScope>(\n 'ngx-json-render REPEAT_SCOPE',\n);\n\n/**\n * Inject the render context inside a catalog component.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'app-button',\n * template: `<button (click)=\"ctx.emit('press')\">{{ ctx.props().label }}</button>`,\n * })\n * export class ButtonComponent {\n * readonly ctx = injectRenderContext<{ label: string }>();\n * }\n * ```\n */\nexport function injectRenderContext<\n P = Record<string, unknown>,\n>(): RenderContext<P> {\n const ctx = inject(RENDER_CONTEXT, { optional: true });\n if (!ctx) {\n throw new Error(\n 'injectRenderContext() must be used inside a component rendered by <json-render>',\n );\n }\n return ctx as RenderContext<P>;\n}\n\n/**\n * Inject the current repeat scope, or `null` when the component is not\n * rendered inside a `repeat` block.\n */\nexport function injectRepeatScope(): RepeatScope | null {\n return inject(REPEAT_SCOPE, { optional: true });\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Injector,\n type Signal,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n untracked,\n} from '@angular/core';\nimport type { PropResolutionContext, UIElement } from '@json-render/core';\nimport {\n evaluateVisibility,\n resolveActionParam,\n resolveBindings,\n resolveElementProps,\n} from '@json-render/core';\nimport { JsonRenderActionsService, isActionCancelled } from './actions.service';\nimport { injectDevtoolsActive } from './devtools';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\nimport { REPEAT_SCOPE, RENDER_CONTEXT } from './tokens';\nimport type { EventHandle, RenderContext } from './types';\n\nconst warnedSlots = new Set<string>();\n\n/**\n * Report a failure from a fire-and-forget action dispatch. Cancelling a\n * confirmation dialog is a normal outcome, not an error, so it stays silent.\n */\nfunction reportActionError(error: unknown): void {\n if (isActionCancelled(error)) return;\n console.error(error);\n}\n\n/**\n * Renders a single spec element: evaluates visibility, resolves prop\n * expressions against the state model, wires event/watch bindings, and\n * instantiates the catalog component with a {@link RenderContext} injector.\n *\n * @internal Used by `<json-render>` and `<jr-children>`.\n */\n@Component({\n selector: 'jr-element',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgComponentOutlet],\n styles: `:host { display: contents; }`,\n template: `\n @if (rawElement() && visible() && component()) {\n @if (devtoolsKey(); as dk) {\n <span [attr.data-jr-key]=\"dk\" style=\"display: contents\">\n <ng-container *ngComponentOutlet=\"component(); injector: outletInjector\" />\n </span>\n } @else {\n <ng-container *ngComponentOutlet=\"component(); injector: outletInjector\" />\n }\n }\n `,\n})\nexport class JrElement {\n readonly elementKey = input.required<string>();\n\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n private readonly actions = inject(JsonRenderActionsService);\n private readonly repeatScope = inject(REPEAT_SCOPE, { optional: true });\n private readonly devtoolsActive = injectDevtoolsActive();\n\n /** The raw (unresolved) element from the spec. */\n readonly rawElement = computed<UIElement | undefined>(\n () => this.root.spec()?.elements?.[this.elementKey()],\n );\n\n /** Prop/visibility resolution context (state + repeat scope + extensions). */\n private readonly resolutionCtx = computed<PropResolutionContext>(() => {\n const scope = this.repeatScope;\n return {\n stateModel: this.state.state(),\n ...(scope\n ? {\n repeatItem: scope.item(),\n repeatIndex: scope.index(),\n repeatBasePath: scope.basePath(),\n }\n : {}),\n functions: this.root.functions() ?? {},\n directives: this.root.directiveRegistry(),\n };\n });\n\n protected readonly visible = computed(() => {\n const el = this.rawElement();\n if (!el || el.visible === undefined) return true;\n return evaluateVisibility(el.visible, this.resolutionCtx());\n });\n\n /** The element with all prop expressions resolved. */\n readonly resolvedElement = computed<UIElement | undefined>(() => {\n const el = this.rawElement();\n if (!el) return undefined;\n return {\n ...el,\n props: resolveElementProps(el.props ?? {}, this.resolutionCtx()),\n };\n });\n\n /** Two-way binding paths ($bindState / $bindItem) by prop name. */\n readonly bindings = computed<Record<string, string> | undefined>(() => {\n const el = this.rawElement();\n return el\n ? resolveBindings(el.props ?? {}, this.resolutionCtx())\n : undefined;\n });\n\n private readonly entry = computed(() => {\n const el = this.rawElement();\n return el ? this.root.resolveEntry(el.type) : undefined;\n });\n\n protected readonly component = computed(\n () => this.entry()?.component ?? null,\n );\n\n protected readonly devtoolsKey = computed(() =>\n this.devtoolsActive() ? this.elementKey() : null,\n );\n\n private readonly renderCtx: RenderContext = {\n element: this.resolvedElement as Signal<UIElement>,\n props: computed(() => this.resolvedElement()?.props ?? {}),\n emit: (event) => this.fireEvent(event),\n on: (event) => this.eventHandle(event),\n bindings: this.bindings,\n loading: computed(() => this.root.loading()),\n setBound: (prop, value) => {\n const path = untracked(this.bindings)?.[prop];\n if (path) {\n this.state.set(path, value);\n } else if (isDevMode()) {\n console.warn(\n `[ngx-json-render] setBound(\"${prop}\"): prop has no $bindState/$bindItem binding`,\n );\n }\n },\n };\n\n protected readonly outletInjector = Injector.create({\n providers: [{ provide: RENDER_CONTEXT, useValue: this.renderCtx }],\n parent: inject(Injector),\n });\n\n constructor() {\n // Warn (once per type) about unknown component types.\n const warnedTypes = new Set<string>();\n effect(() => {\n const el = this.rawElement();\n if (!el || this.entry() || warnedTypes.has(el.type)) return;\n warnedTypes.add(el.type);\n console.warn(`No renderer for component type: ${el.type}`);\n });\n\n // Warn about unknown / default slots when the registry carries metadata.\n effect(() => {\n const el = this.rawElement();\n const meta = this.entry();\n if (!el?.slots || !meta?.slots) return;\n const available = new Set(meta.slots);\n for (const slotName of Object.keys(el.slots)) {\n const warnKey = `${el.type}:${slotName}`;\n if (warnedSlots.has(warnKey)) continue;\n if (slotName === 'default') {\n warnedSlots.add(warnKey);\n console.warn(\n `[json-render] Component \"${el.type}\" uses slots.default. Use \"children\" for default slot content.`,\n );\n } else if (!available.has(slotName)) {\n warnedSlots.add(warnKey);\n console.warn(\n `[json-render] Unknown slot \"${slotName}\" on component \"${el.type}\". Available slots: ${meta.slots.join(', ')}`,\n );\n }\n }\n });\n\n // Watch effect: fire actions when watched state paths change.\n effect((onCleanup) => {\n const watchConfig = this.rawElement()?.watch;\n if (!watchConfig) return;\n const paths = Object.keys(watchConfig);\n if (paths.length === 0) return;\n\n const unsubscribe = this.state.subscribeChanges((changes) => {\n const changedPaths = new Set(changes.map((change) => change.path));\n\n void (async () => {\n for (const path of paths) {\n if (!changedPaths.has(path)) continue;\n\n const binding = watchConfig[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n\n for (const b of bindings) {\n if (!b.params) {\n await this.actions.execute(b);\n continue;\n }\n const liveCtx = this.liveResolutionCtx();\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await this.actions.execute({ ...b, params: resolved });\n }\n }\n })().catch(reportActionError);\n });\n\n onCleanup(unsubscribe);\n });\n }\n\n /**\n * Resolution context with a live state snapshot, so `$state` references in\n * later actions of a chain see mutations from earlier ones.\n */\n private liveResolutionCtx(): PropResolutionContext {\n return {\n ...untracked(this.resolutionCtx),\n stateModel: this.state.getSnapshot(),\n };\n }\n\n /**\n * Fire-and-forget entry point for event emission: dispatching is async, but\n * a template listener has nowhere to await it, so the failure must be\n * handled here rather than escaping as an unhandled rejection.\n */\n private fireEvent(eventName: string): void {\n this.emitEvent(eventName).catch(reportActionError);\n }\n\n private async emitEvent(eventName: string): Promise<void> {\n const el = untracked(this.rawElement);\n const binding = el?.on?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await this.actions.execute(b);\n continue;\n }\n const liveCtx = this.liveResolutionCtx();\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await this.actions.execute({ ...b, params: resolved });\n }\n }\n\n private eventHandle(eventName: string): EventHandle {\n const el = this.rawElement();\n const binding = el?.on?.[eventName];\n if (!binding) {\n return { emit: () => {}, shouldPreventDefault: false, bound: false };\n }\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n return {\n emit: () => this.fireEvent(eventName),\n shouldPreventDefault: actionBindings.some((b) => b.preventDefault),\n bound: true,\n };\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n type Type,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport type {\n ActionHandler,\n ComputedFunction,\n DirectiveDefinition,\n Spec,\n StateModel,\n StateStore,\n ValidationFunction,\n} from '@json-render/core';\nimport { createDirectiveRegistry } from '@json-render/core';\nimport { JsonRenderActionsService } from './actions.service';\nimport { JrConfirmDialog } from './confirm-dialog.component';\nimport { JrElement } from './element.component';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\nimport type { ComponentRegistry, RegistryEntry, StateChange } from './types';\nimport { JsonRenderValidationService } from './validation.service';\n\n/**\n * Renders a json-render {@link Spec} using a registry of Angular components.\n *\n * The renderer owns the state store, action dispatcher, and validation state\n * of its subtree (all injectable from catalog components). Pass an external\n * {@link StateStore} via `store` for controlled mode or to share state across\n * renderers.\n *\n * @example\n * ```html\n * <json-render\n * [spec]=\"spec()\"\n * [registry]=\"registry\"\n * [handlers]=\"handlers\"\n * [loading]=\"isStreaming()\"\n * (stateChange)=\"onStateChange($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'json-render',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [JrElement, JrConfirmDialog],\n providers: [\n JsonRenderRootContext,\n JsonRenderStateService,\n JsonRenderValidationService,\n JsonRenderActionsService,\n ],\n styles: `:host { display: contents; }`,\n template: `\n @if (rootKey(); as key) {\n <jr-element [elementKey]=\"key\" />\n }\n @if (pendingConfirm(); as confirm) {\n <jr-confirm-dialog\n [config]=\"confirm\"\n (confirmed)=\"actions.confirm()\"\n (cancelled)=\"actions.cancel()\"\n />\n }\n `,\n})\nexport class JsonRenderer {\n /** The UI spec to render (may be partial while streaming). */\n readonly spec = input.required<Spec | null>();\n /** Component registry mapping catalog type names to Angular components. */\n readonly registry = input.required<ComponentRegistry>();\n /** Whether the spec is currently loading/streaming. */\n readonly loading = input(false);\n /** Fallback component for unknown types. */\n readonly fallback = input<Type<unknown> | RegistryEntry | null>(null);\n\n /**\n * Initial state model (uncontrolled mode). Defaults to `spec.state`.\n * Ignored when `store` is provided.\n */\n readonly state = input<StateModel | undefined>(undefined);\n /** External state store (controlled mode). */\n readonly store = input<StateStore | null>(null);\n\n /** Action handlers by action name. */\n readonly handlers = input<Record<string, ActionHandler> | undefined>(\n undefined,\n );\n /** Catch-all action handler for actions without a dedicated handler. */\n readonly onAction = input<\n ((name: string, params?: Record<string, unknown>) => unknown) | null\n >(null);\n /** Navigation function used by `onSuccess: { navigate }` handlers. */\n readonly navigate = input<((path: string) => void) | null>(null);\n\n /** Custom validation functions. */\n readonly validationFunctions = input<\n Record<string, ValidationFunction> | undefined\n >(undefined);\n /** Named functions for `$computed` expressions in props. */\n readonly functions = input<Record<string, ComputedFunction> | undefined>(\n undefined,\n );\n /** Custom directives for user-defined `$`-prefixed dynamic values. */\n readonly directives = input<DirectiveDefinition[] | undefined>(undefined);\n\n /** Emits state changes in uncontrolled mode. */\n readonly stateChange = output<StateChange[]>();\n\n /** The state store of this renderer (also injectable in the subtree). */\n readonly stateStore: JsonRenderStateService;\n /** The action dispatcher of this renderer. */\n protected readonly actions: JsonRenderActionsService;\n\n constructor() {\n const root = inject(JsonRenderRootContext);\n root.spec = this.spec;\n root.registry = this.registry;\n root.loading = this.loading;\n root.fallback = this.fallback;\n root.store = this.store;\n root.initialState = computed(\n () => this.state() ?? this.spec()?.state ?? {},\n );\n root.handlers = this.handlers;\n root.onAction = this.onAction;\n root.navigate = this.navigate;\n root.validationFunctions = this.validationFunctions;\n root.functions = this.functions;\n root.directiveRegistry = computed(() => {\n const definitions = this.directives();\n return definitions ? createDirectiveRegistry(definitions) : undefined;\n });\n root.emitStateChange = (changes) => this.stateChange.emit(changes);\n\n // Instantiate the subtree services now that the root context is wired.\n this.stateStore = inject(JsonRenderStateService);\n inject(JsonRenderValidationService);\n this.actions = inject(JsonRenderActionsService);\n }\n\n protected readonly rootKey = computed(() => {\n const spec = this.spec();\n return spec?.root && spec.elements?.[spec.root] ? spec.root : null;\n });\n\n protected readonly pendingConfirm = computed(\n () => this.actions.pendingConfirmation()?.action.confirm ?? null,\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n forwardRef,\n input,\n} from '@angular/core';\nimport { REPEAT_SCOPE } from './tokens';\nimport type { RepeatScope } from './types';\n\n/**\n * Provides the repeat scope (item, index, absolute base path) to the elements\n * rendered inside a `repeat` block.\n *\n * @internal Used by `<jr-children>`; not intended for direct use.\n */\n@Component({\n selector: 'jr-repeat-scope',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: REPEAT_SCOPE, useExisting: forwardRef(() => JrRepeatScope) },\n ],\n styles: `:host { display: contents; }`,\n template: '<ng-content />',\n})\nexport class JrRepeatScope implements RepeatScope {\n readonly item = input.required<unknown>();\n readonly index = input.required<number>();\n readonly basePath = input.required<string>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport {\n getByPath,\n resolveRepeatItemStatePath,\n resolveRepeatStatePath,\n} from '@json-render/core';\nimport { JrElement } from './element.component';\nimport { JrRepeatScope } from './repeat-scope.component';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\nimport { REPEAT_SCOPE, injectRenderContext } from './tokens';\n\n/**\n * Renders the children of the current element. Place it inside a catalog\n * component's template where nested content should appear — like a\n * `<router-outlet>` for the spec tree.\n *\n * - Default (no `slot`): renders `element.children`, honoring the element's\n * `repeat` field (one pass per item of the referenced state array, with the\n * proper repeat scope for `$item` / `$index` / `$bindItem` expressions).\n * - With `slot`: renders the element keys of `element.slots[slot]`.\n *\n * @example\n * ```html\n * <div class=\"card\">\n * <h3>{{ ctx.props().title }}</h3>\n * <jr-children />\n * </div>\n * ```\n */\n@Component({\n selector: 'jr-children',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [JrElement, JrRepeatScope],\n styles: `:host { display: contents; }`,\n template: `\n @if (repeat()) {\n @for (item of repeatItems(); track trackItem($index, item)) {\n <jr-repeat-scope\n [item]=\"item\"\n [index]=\"$index\"\n [basePath]=\"itemPath($index)\"\n >\n @for (key of childKeys(); track key) {\n <jr-element [elementKey]=\"key\" />\n }\n </jr-repeat-scope>\n }\n } @else {\n @for (key of childKeys(); track key) {\n <jr-element [elementKey]=\"key\" />\n }\n }\n `,\n})\nexport class JrChildren {\n /** Named slot to render instead of the default children. */\n readonly slot = input<string | null>(null);\n\n private readonly ctx = injectRenderContext();\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n // The repeat scope enclosing the host element (scopes created by this\n // element's own repeat live below, in the template).\n private readonly parentScope = inject(REPEAT_SCOPE, { optional: true });\n\n protected readonly childKeys = computed<string[]>(() => {\n const el = this.ctx.element();\n if (!el) return [];\n const slot = this.slot();\n if (slot) return el.slots?.[slot] ?? [];\n return el.children ?? [];\n });\n\n protected readonly repeat = computed(() => {\n if (this.slot()) return undefined;\n return this.ctx.element()?.repeat;\n });\n\n private readonly repeatBasePath = computed<string | undefined>(() => {\n const rep = this.repeat();\n if (!rep) return undefined;\n const resolved = resolveRepeatStatePath(\n rep.statePath,\n this.parentScope?.basePath(),\n );\n if (resolved === undefined) {\n console.warn(\n '[ngx-json-render] $item in repeat.statePath used outside of a repeat scope',\n );\n }\n return resolved;\n });\n\n protected readonly repeatItems = computed<unknown[]>(() => {\n const basePath = this.repeatBasePath();\n if (basePath === undefined) return [];\n return (\n (getByPath(this.state.state(), basePath) as unknown[] | undefined) ?? []\n );\n });\n\n constructor() {\n // Warn (once per key) about children referencing missing elements.\n const warned = new Set<string>();\n effect(() => {\n if (this.root.loading()) return;\n const spec = this.root.spec();\n if (!spec) return;\n for (const key of this.childKeys()) {\n if (!spec.elements?.[key] && !warned.has(key)) {\n warned.add(key);\n console.warn(\n `[json-render] Missing element \"${key}\" referenced as child of \"${untracked(this.ctx.element)?.type}\". This element will not render.`,\n );\n }\n }\n });\n }\n\n protected itemPath(index: number): string {\n return resolveRepeatItemStatePath(this.repeatBasePath()!, index);\n }\n\n protected trackItem(index: number, item: unknown): unknown {\n const rep = untracked(this.repeat);\n if (rep?.key && typeof item === 'object' && item !== null) {\n return (item as Record<string, unknown>)[rep.key] ?? index;\n }\n return index;\n }\n}\n","import type { Type } from '@angular/core';\nimport type { Catalog, StateStore } from '@json-render/core';\nimport { flattenToPointers } from '@json-render/core/store-utils';\nimport type {\n Actions,\n CatalogHasActions,\n ComponentRegistry,\n Components,\n RegistryEntry,\n SetState,\n StateModel,\n} from './types';\n\n/**\n * Result returned by {@link defineRegistry}.\n */\nexport interface DefineRegistryResult {\n /** Component registry for `<json-render [registry]=\"...\">`. */\n registry: ComponentRegistry;\n /**\n * Create renderer-compatible handlers from the catalog actions.\n * Accepts getter functions so handlers always read the latest\n * state/setState.\n */\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n /**\n * Execute an action by name imperatively\n * (for use outside the renderer tree, e.g. initial state loading).\n */\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\n/**\n * Options for defineRegistry.\n *\n * When the catalog declares actions, the `actions` field is required.\n * When the catalog has no actions (or `actions: {}`), the field is optional.\n */\ntype DefineRegistryOptions<C extends Catalog> = {\n components?: Components<C>;\n} & (CatalogHasActions<C> extends true\n ? { actions: Actions<C> }\n : { actions?: Actions<C> });\n\n/** @internal */\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * Component keys are type-checked against the catalog, and slot metadata from\n * the catalog is carried into the registry for dev-mode slot warnings.\n *\n * @example\n * ```ts\n * const { registry, handlers } = defineRegistry(catalog, {\n * components: { Card: CardComponent, Button: ButtonComponent },\n * actions: {\n * refresh: async (params, setState) => {\n * setState((prev) => ({ ...prev, refreshedAt: Date.now() }));\n * },\n * },\n * });\n * ```\n */\nexport function defineRegistry<C extends Catalog>(\n catalog: C,\n options: DefineRegistryOptions<C>,\n): DefineRegistryResult {\n const catalogComponents = (\n catalog as unknown as {\n data?: { components?: Record<string, { slots?: string[] }> };\n }\n ).data?.components;\n\n // Build the component registry, attaching slot metadata from the catalog.\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, component] of Object.entries(options.components) as Array<\n [string, Type<unknown>]\n >) {\n const entry: RegistryEntry = { component };\n const slots = catalogComponents?.[name]?.slots;\n if (slots) entry.slots = slots;\n registry[name] = entry;\n }\n }\n\n // Build action helpers.\n const actionMap = options.actions\n ? (Object.entries(options.actions) as Array<\n [string, DefineRegistryActionFn]\n >)\n : [];\n\n const handlers = (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n const result: Record<\n string,\n (params: Record<string, unknown>) => Promise<void>\n > = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n\n const executeAction = async (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel = {},\n ): Promise<void> => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n\n return { registry, handlers, executeAction };\n}\n\n/**\n * Build a {@link SetState} (whole-state updater) on top of a path-based\n * store. The updater's result is diffed against the previous state and only\n * changed leaves are written, preserving fine-grained reactivity.\n *\n * Works with both a core {@link StateStore} and the renderer's injected\n * `JsonRenderStateService`.\n */\nexport function createStoreSetState(\n store: Pick<StateStore, 'getSnapshot' | 'update'>,\n): SetState {\n return (updater) => {\n const prev = store.getSnapshot();\n const next = updater(prev);\n if (next === prev) return;\n const prevFlat = flattenToPointers(prev);\n const nextFlat = flattenToPointers(next);\n const allKeys = new Set([\n ...Object.keys(prevFlat),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlat[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : undefined;\n }\n }\n if (Object.keys(updates).length > 0) {\n store.update(updates);\n }\n };\n}\n","import type { JsonPatch, Spec, UIElement } from '@json-render/core';\nimport {\n addByPath,\n getByPath,\n removeByPath,\n setByPath,\n} from '@json-render/core';\n\n/**\n * Writes a value at a path inside an already-private object. `addByPath` and\n * `setByPath` differ only on arrays — RFC 6902 `add` splices, `replace`\n * overwrites — which is why the op picks the writer rather than the path\n * routing below.\n */\ntype PathWriter = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n) => void;\n\n/**\n * Split a JSON Pointer into its segments, undoing RFC 6901's escapes.\n *\n * `@json-render/core` parses pointers the same way for `setByPath` and\n * friends but does not export the helper, so {@link copyAlongPath} carries\n * its own copy. The two must agree on where a path descends, or a write would\n * land on a node that was never copied.\n */\nfunction parseJsonPointer(path: string): string[] {\n const raw = path.startsWith('/') ? path.slice(1).split('/') : path.split('/');\n return raw.map((token) => token.replace(/~1/g, '/').replace(/~0/g, '~'));\n}\n\n/**\n * Replace every node `path` descends through with a shallow copy of itself.\n *\n * `root` must already be private to the caller. Afterwards a mutating write\n * along that same path — `setByPath`, `addByPath`, `removeByPath` — only ever\n * touches nodes nobody else is holding, while everything off the path stays\n * shared. That keeps a patch proportional to the depth of its path rather than\n * to the size of the spec, which matters when a stream applies hundreds of\n * them.\n *\n * Descent stops at anything that is not an object: the writers overwrite such\n * a node outright, and one that does not exist yet is created fresh, so in\n * neither case is there anything of the caller's left to protect.\n */\nfunction copyAlongPath(root: Record<string, unknown>, path: string): void {\n const segments = parseJsonPointer(path);\n let current = root;\n\n // The final segment is written, not descended into, so it needs no copy.\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i];\n const child = current[segment];\n if (child === null || typeof child !== 'object') return;\n\n const copy = Array.isArray(child)\n ? [...child]\n : { ...(child as Record<string, unknown>) };\n current[segment] = copy;\n current = copy as unknown as Record<string, unknown>;\n }\n}\n\n/**\n * Write a value at a spec path, copying every node on the way so the caller's\n * previous spec keeps its own contents.\n */\nfunction writeSpecValue(\n newSpec: Spec,\n path: string,\n value: unknown,\n write: PathWriter,\n): void {\n if (path === '/root') {\n newSpec.root = value as string;\n return;\n }\n\n if (path === '/state') {\n newSpec.state = value as Record<string, unknown>;\n return;\n }\n\n if (path.startsWith('/state/')) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice('/state'.length); // e.g. \"/posts\"\n const state = newSpec.state as Record<string, unknown>;\n copyAlongPath(state, statePath);\n write(state, statePath, value);\n return;\n }\n\n if (path.startsWith('/elements/')) {\n const pathParts = path.slice('/elements/'.length).split('/');\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value as UIElement;\n return;\n }\n\n // A prop path whose element is not there is dropped rather than\n // auto-created: the generic writers would happily conjure an element with\n // props and no `type`, which renders as nothing and warns about an unknown\n // component. A malformed patch should lose its own write, not add a broken\n // element to the tree.\n const element = newSpec.elements[elementKey];\n if (!element) return;\n\n const propPath = '/' + pathParts.slice(1).join('/');\n const newElement = { ...element } as unknown as Record<string, unknown>;\n copyAlongPath(newElement, propPath);\n write(newElement, propPath, value);\n newSpec.elements[elementKey] = newElement as unknown as UIElement;\n return;\n }\n\n // Any other top-level path is applied verbatim. The spec grammar is\n // upstream's and grows without this renderer: dropping what we do not\n // recognise would silently discard a field a newer `@json-render/core`\n // understands.\n const root = newSpec as unknown as Record<string, unknown>;\n copyAlongPath(root, path);\n write(root, path, value);\n}\n\n/** Remove the value at a spec path, with the same copy-on-write discipline. */\nfunction removeSpecValue(newSpec: Spec, path: string): void {\n if (path === '/state') {\n delete newSpec.state;\n return;\n }\n\n if (path.startsWith('/state/') && newSpec.state) {\n const statePath = path.slice('/state'.length);\n const state = newSpec.state as Record<string, unknown>;\n copyAlongPath(state, statePath);\n removeByPath(state, statePath);\n return;\n }\n\n if (path.startsWith('/elements/')) {\n const pathParts = path.slice('/elements/'.length).split('/');\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n const { [elementKey]: _removed, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n return;\n }\n\n const element = newSpec.elements[elementKey];\n if (!element) return;\n\n const propPath = '/' + pathParts.slice(1).join('/');\n const newElement = { ...element } as unknown as Record<string, unknown>;\n copyAlongPath(newElement, propPath);\n removeByPath(newElement, propPath);\n newSpec.elements[elementKey] = newElement as unknown as UIElement;\n return;\n }\n\n const root = newSpec as unknown as Record<string, unknown>;\n copyAlongPath(root, path);\n removeByPath(root, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to a spec, returning a new spec object and\n * sharing every subtree the patch did not touch.\n *\n * This is the only patch engine in the package: `injectUIStream`,\n * `injectChatUI` and `buildSpecFromParts` all route through it, so the same\n * stream produces the same spec whichever one an app reached for. The write\n * primitives come from `@json-render/core`, so `add` splices into an array\n * where `replace` overwrites, exactly as the other renderers do.\n *\n * One deliberate deviation from RFC 6902: a failing `test` op is a no-op\n * rather than an abort. These patches come off a model's output, where the\n * established behaviour — see the line parser — is to drop what does not make\n * sense and keep rendering rather than kill a generation mid-flight.\n */\nexport function applyPatch(spec: Spec, patch: JsonPatch): Spec {\n const newSpec = {\n ...spec,\n elements: { ...spec.elements },\n ...(spec.state ? { state: { ...spec.state } } : {}),\n };\n\n switch (patch.op) {\n case 'add': {\n writeSpecValue(newSpec, patch.path, patch.value, addByPath);\n break;\n }\n case 'replace': {\n writeSpecValue(newSpec, patch.path, patch.value, setByPath);\n break;\n }\n case 'remove': {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case 'move': {\n if (!patch.from) break;\n const moveValue = getByPath(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n writeSpecValue(newSpec, patch.path, moveValue, addByPath);\n break;\n }\n case 'copy': {\n if (!patch.from) break;\n // RFC 6902 copies the *value*. Handing over the live reference instead\n // aliases source and target, and a `path` that descends into its own\n // `from` then makes the spec self-referential — which the next request\n // discovers when it tries to serialise it into the body.\n const copyValue = structuredClone(getByPath(newSpec, patch.from));\n writeSpecValue(newSpec, patch.path, copyValue, addByPath);\n break;\n }\n case 'test': {\n break;\n }\n }\n\n return newSpec;\n}\n","import { type Signal, computed } from '@angular/core';\nimport type {\n FlatElement,\n Spec,\n SpecDataPart,\n UIElement,\n} from '@json-render/core';\nimport { SPEC_DATA_PART_TYPE, nestedToFlat } from '@json-render/core';\nimport { applyPatch } from './patch';\n\n/**\n * Convert a flat element list to a Spec.\n * Input elements use key/parentKey to establish identity and relationships.\n * Output spec uses the map-based format where key is the map entry key\n * and parent-child relationships are expressed through children arrays.\n */\nexport function flatToTree(elements: FlatElement[]): Spec {\n // The map is what gives every element its children array, so the second\n // pass can push into one without checking for it.\n const elementMap: Record<string, UIElement & { children: string[] }> = {};\n let root = '';\n\n // First pass: add all elements to map\n for (const element of elements) {\n elementMap[element.key] = {\n type: element.type,\n props: element.props,\n children: [],\n visible: element.visible,\n };\n }\n\n // Second pass: build parent-child relationships\n for (const element of elements) {\n if (element.parentKey) {\n const parent = elementMap[element.parentKey];\n if (parent) {\n parent.children.push(element.key);\n }\n } else {\n root = element.key;\n }\n }\n\n return { root, elements: elementMap };\n}\n\n/**\n * A single part from the AI SDK's `message.parts` array. This is a minimal\n * structural type so that library helpers do not depend on the AI SDK.\n */\nexport interface DataPart {\n type: string;\n text?: string;\n data?: unknown;\n}\n\n/**\n * Type guard that validates a data part payload looks like a valid\n * {@link SpecDataPart} before we cast it.\n */\nfunction isSpecDataPart(data: unknown): data is SpecDataPart {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n switch (obj['type']) {\n case 'patch':\n return typeof obj['patch'] === 'object' && obj['patch'] !== null;\n case 'flat':\n case 'nested':\n return typeof obj['spec'] === 'object' && obj['spec'] !== null;\n default:\n return false;\n }\n}\n\n/**\n * Build a `Spec` by replaying all spec data parts from a message's\n * parts array (AI SDK `UIMessage.parts`). Returns `null` if no spec data\n * parts are present.\n */\nexport function buildSpecFromParts(parts: DataPart[]): Spec | null {\n let spec: Spec = { root: '', elements: {} };\n let hasSpec = false;\n\n for (const part of parts) {\n if (part.type === SPEC_DATA_PART_TYPE) {\n if (!isSpecDataPart(part.data)) continue;\n const payload = part.data;\n if (payload.type === 'patch') {\n hasSpec = true;\n spec = applyPatch(spec, payload.patch);\n } else if (payload.type === 'flat') {\n hasSpec = true;\n spec = { ...spec, ...payload.spec };\n } else if (payload.type === 'nested') {\n hasSpec = true;\n spec = { ...spec, ...nestedToFlat(payload.spec) };\n }\n }\n }\n\n return hasSpec ? spec : null;\n}\n\n/**\n * Extract and join all text content from a message's parts array.\n */\nexport function getTextFromParts(parts: DataPart[]): string {\n return parts\n .filter(\n (p): p is DataPart & { text: string } =>\n p.type === 'text' && typeof p.text === 'string',\n )\n .map((p) => p.text.trim())\n .filter(Boolean)\n .join('\\n\\n');\n}\n\n/**\n * Extract both the json-render spec and the text content from a message's\n * parts array, as memoized signals. Angular counterpart of\n * `useJsonRenderMessage` from the other renderers.\n *\n * @example\n * ```ts\n * readonly msg = jsonRenderMessage(() => this.message().parts);\n * // template: @if (msg.hasSpec()) { <json-render [spec]=\"msg.spec()\" ... /> }\n * ```\n */\nexport function jsonRenderMessage(\n parts: Signal<DataPart[]> | (() => DataPart[]),\n): {\n spec: Signal<Spec | null>;\n text: Signal<string>;\n hasSpec: Signal<boolean>;\n} {\n const result = computed(() => {\n const p = parts();\n return {\n spec: buildSpecFromParts(p),\n text: getTextFromParts(p),\n };\n });\n\n return {\n spec: computed(() => result().spec),\n text: computed(() => result().text),\n hasSpec: computed(() => {\n const s = result().spec;\n return s !== null && Object.keys(s.elements || {}).length > 0;\n }),\n };\n}\n","/**\n * Sink for the decoded text of a streamed response. `@json-render/core`'s\n * mixed-stream parser already has this shape, so a hook can hand its own\n * consumer or the core one to {@link streamRequest} unchanged.\n */\nexport interface StreamConsumer {\n push(text: string): void;\n flush(): void;\n}\n\n/** One streamed POST: where to send it, what to send, and how to cancel it. */\nexport interface StreamRequest {\n api: string;\n body: unknown;\n fetch?: typeof globalThis.fetch;\n signal: AbortSignal;\n}\n\n/**\n * The write permit of a single request.\n *\n * A hook's signals are shared by every request it ever makes, so a request\n * that has been superseded must not write to them on its way out — its stale\n * spec would flash over the fresh one, and its `finally` would clear\n * `isStreaming` while its replacement is still streaming. Routing every write\n * and callback through {@link commit} makes that structural: a superseded\n * request has no way to reach the signals, rather than each write site being\n * individually responsible for remembering to check.\n */\nexport interface RequestGate {\n readonly signal: AbortSignal;\n /** Whether this request is still the session's current one. */\n isCurrent(): boolean;\n /** Run `write` only while this request is still the current one. */\n commit(write: () => void): void;\n}\n\n/**\n * Tracks which request owns a hook's signals. Each {@link begin} supersedes\n * the one before it.\n */\nexport interface StreamSession {\n begin(): RequestGate;\n /** Abort the in-flight request, leaving no request current. */\n cancel(): void;\n}\n\nexport function createStreamSession(): StreamSession {\n let current: AbortController | null = null;\n\n return {\n begin(): RequestGate {\n current?.abort();\n const controller = new AbortController();\n current = controller;\n const isCurrent = () => current === controller;\n return {\n signal: controller.signal,\n isCurrent,\n commit(write) {\n if (isCurrent()) write();\n },\n };\n },\n cancel() {\n current?.abort();\n // Cleared, not just aborted: with no current controller the in-flight\n // request's gate closes too, so a stop() cannot be undone a moment later\n // by the request it just cancelled.\n current = null;\n },\n };\n}\n\n/** True for the rejection `fetch` and a stream reader raise on abort. */\nexport function isAbortError(error: unknown): boolean {\n return (error as Error | undefined)?.name === 'AbortError';\n}\n\n/**\n * Buffer decoded text and hand back whole lines, dropping blank ones. What is\n * left when the stream ends is flushed as a final line, since a model's last\n * line often arrives without its newline.\n */\nexport function createLineConsumer(\n onLine: (line: string) => void,\n): StreamConsumer {\n let buffer = '';\n return {\n push(text) {\n buffer += text;\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) onLine(trimmed);\n }\n },\n flush() {\n const trimmed = buffer.trim();\n buffer = '';\n if (trimmed) onLine(trimmed);\n },\n };\n}\n\n/**\n * Mine an error response for something better to show than its status code.\n */\nasync function readErrorMessage(response: Response): Promise<string> {\n try {\n const body = await response.json();\n if (body.message) return String(body.message);\n if (body.error) return String(body.error);\n } catch {\n // A non-JSON error body is ordinary; the status line still says enough.\n }\n return `HTTP error: ${response.status}`;\n}\n\n/**\n * POST `body` and feed the streamed response to `consumer` until it ends.\n *\n * Both hooks share this so the request lifecycle — error mining, the reader\n * loop, the decoder's final flush — has one implementation to get right\n * rather than one per hook that has to be fixed twice.\n */\nexport async function streamRequest(\n request: StreamRequest,\n consumer: StreamConsumer,\n): Promise<void> {\n // Bound, because a bare `globalThis.fetch` called as a plain function is\n // an illegal invocation in the browser.\n const doFetch = request.fetch ?? globalThis.fetch.bind(globalThis);\n\n const response = await doFetch(request.api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request.body),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw new Error(await readErrorMessage(response));\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n consumer.push(decoder.decode(value, { stream: true }));\n }\n\n // Without the final, non-streaming decode a multi-byte character split\n // across the last chunk is dropped instead of surfacing.\n const tail = decoder.decode();\n if (tail) consumer.push(tail);\n\n consumer.flush();\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\nimport type { JsonPatch, Spec } from '@json-render/core';\nimport { applyPatch } from './patch';\nimport {\n createLineConsumer,\n createStreamSession,\n isAbortError,\n streamRequest,\n} from './transport';\n\n/**\n * Token usage metadata from AI generation.\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n/**\n * Parse result for a single line — either a patch or usage metadata.\n */\ntype ParsedLine =\n | { type: 'patch'; patch: JsonPatch }\n | { type: 'usage'; usage: TokenUsage }\n | null;\n\n/**\n * Parse a single JSON line (patch or metadata). Anything that is not one of\n * the two is dropped: half-written lines and stray prose are ordinary in a\n * model's output, and aborting the generation over one would lose the UI\n * built so far.\n */\nfunction parseLine(line: string): ParsedLine {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//')) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n\n // Check for usage metadata\n if (parsed.__meta === 'usage') {\n return {\n type: 'usage',\n usage: {\n promptTokens: parsed.promptTokens ?? 0,\n completionTokens: parsed.completionTokens ?? 0,\n totalTokens: parsed.totalTokens ?? 0,\n },\n };\n }\n\n // Parseable JSON is not yet a patch: without this, a stray object would be\n // recorded as a raw line and handed to the engine as an opless patch.\n if (typeof parsed?.op !== 'string' || typeof parsed?.path !== 'string') {\n return null;\n }\n\n return { type: 'patch', patch: parsed as JsonPatch };\n } catch {\n return null;\n }\n}\n\n/**\n * Per-call options for {@link UIStreamReturn.send}.\n */\nexport interface UIStreamSendOptions {\n /** Arbitrary context forwarded to the endpoint as `context`. */\n context?: Record<string, unknown>;\n /**\n * Spec to refine instead of starting from an empty one. It is sent to the\n * endpoint as `currentSpec` and the streamed patches apply on top of it.\n */\n previousSpec?: Spec;\n}\n\n/**\n * Options for {@link injectUIStream}.\n */\nexport interface UIStreamOptions {\n /** API endpoint */\n api: string;\n /** Callback when complete */\n onComplete?: (spec: Spec) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /**\n * Transport, defaulting to the global `fetch`.\n *\n * Anything with fetch's shape works, so a test, a demo replaying a recorded\n * generation, or an app that has to add auth headers or route through its\n * own HTTP layer can supply one instead of patching the global. It is called\n * with the endpoint and a request carrying the JSON body and the abort\n * signal, and must resolve to a `Response` whose `body` is a readable\n * stream of the JSONL patches.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Return type for {@link injectUIStream}.\n */\nexport interface UIStreamReturn {\n /** Current UI spec */\n readonly spec: Signal<Spec | null>;\n /** Whether currently streaming */\n readonly isStreaming: Signal<boolean>;\n /** Error if any */\n readonly error: Signal<Error | null>;\n /** Token usage from the last generation */\n readonly usage: Signal<TokenUsage | null>;\n /** Raw JSONL lines received from the stream (JSON patch lines) */\n readonly rawLines: Signal<string[]>;\n /** Send a prompt to generate UI */\n send: (prompt: string, options?: UIStreamSendOptions) => Promise<void>;\n /**\n * Stop the in-flight generation, keeping whatever has rendered so far.\n * A no-op when nothing is streaming.\n */\n stop: () => void;\n /** Stop any generation and clear the spec, error, usage and raw lines. */\n clear: () => void;\n}\n\n/**\n * Streaming UI generation. POSTs `{ prompt, context, currentSpec }` to the\n * endpoint and progressively applies the returned JSONL patch stream to the\n * `spec` signal, so partial UIs render as they arrive.\n *\n * Must be called in an injection context (aborts in-flight requests on\n * destroy).\n *\n * @example\n * ```ts\n * export class GeneratePage {\n * readonly ui = injectUIStream({ api: '/api/generate' });\n * }\n * // template:\n * // <json-render [spec]=\"ui.spec()\" [registry]=\"registry\" [loading]=\"ui.isStreaming()\" />\n * ```\n */\nexport function injectUIStream(options: UIStreamOptions): UIStreamReturn {\n const spec = signal<Spec | null>(null);\n const isStreaming = signal(false);\n const error = signal<Error | null>(null);\n const usage = signal<TokenUsage | null>(null);\n const rawLines = signal<string[]>([]);\n const session = createStreamSession();\n\n inject(DestroyRef).onDestroy(() => session.cancel());\n\n const stop = () => {\n session.cancel();\n isStreaming.set(false);\n };\n\n const clear = () => {\n // Aborting first is what makes this true: without it the in-flight\n // request puts its spec straight back on the next patch it applies.\n stop();\n spec.set(null);\n error.set(null);\n usage.set(null);\n rawLines.set([]);\n };\n\n const send = async (prompt: string, sendOptions?: UIStreamSendOptions) => {\n const gate = session.begin();\n\n isStreaming.set(true);\n error.set(null);\n usage.set(null);\n rawLines.set([]);\n\n const previousSpec = sendOptions?.previousSpec;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: '', elements: {} };\n spec.set(currentSpec);\n\n const handleLine = (line: string) => {\n const parsed = parseLine(line);\n if (!parsed) return;\n gate.commit(() => {\n if (parsed.type === 'usage') {\n usage.set(parsed.usage);\n return;\n }\n rawLines.update((prev) => [...prev, line]);\n currentSpec = applyPatch(currentSpec, parsed.patch);\n spec.set(currentSpec);\n });\n };\n\n try {\n await streamRequest(\n {\n api: options.api,\n body: {\n prompt,\n context: sendOptions?.context,\n currentSpec,\n },\n fetch: options.fetch,\n signal: gate.signal,\n },\n createLineConsumer(handleLine),\n );\n\n gate.commit(() => options.onComplete?.(currentSpec));\n } catch (err) {\n if (isAbortError(err)) return;\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n gate.commit(() => {\n error.set(resolvedError);\n options.onError?.(resolvedError);\n });\n } finally {\n gate.commit(() => isStreaming.set(false));\n }\n };\n\n return {\n spec: spec.asReadonly(),\n isStreaming: isStreaming.asReadonly(),\n error: error.asReadonly(),\n usage: usage.asReadonly(),\n rawLines: rawLines.asReadonly(),\n send,\n stop,\n clear,\n };\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\nimport type { Spec } from '@json-render/core';\nimport { createMixedStreamParser } from '@json-render/core';\nimport { applyPatch } from './patch';\nimport { createStreamSession, isAbortError, streamRequest } from './transport';\n\n/**\n * A single message in the chat, which may contain text, a rendered UI spec,\n * or both.\n */\nexport interface ChatMessage {\n /** Unique message ID */\n id: string;\n /** Who sent this message */\n role: 'user' | 'assistant';\n /** Text content (conversational prose) */\n text: string;\n /** json-render Spec built from JSONL patches (null if no UI was generated) */\n spec: Spec | null;\n}\n\n/**\n * Options for {@link injectChatUI}.\n */\nexport interface ChatUIOptions {\n /** API endpoint that accepts `{ messages: Array<{ role, content }> }` and returns a text stream */\n api: string;\n /** Callback when streaming completes for a message */\n onComplete?: (message: ChatMessage) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /**\n * Transport, defaulting to the global `fetch`. Same contract as\n * `UIStreamOptions.fetch`: it receives the endpoint and a request\n * carrying the JSON body and the abort signal, and must resolve to a\n * `Response` whose `body` streams the reply.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Return type for {@link injectChatUI}.\n */\nexport interface ChatUIReturn {\n /** All messages in the conversation */\n readonly messages: Signal<ChatMessage[]>;\n /** Whether currently streaming an assistant response */\n readonly isStreaming: Signal<boolean>;\n /** Error from the last request, if any */\n readonly error: Signal<Error | null>;\n /** Send a user message */\n send: (text: string) => Promise<void>;\n /**\n * Stop the in-flight reply, keeping whatever the assistant has said so far.\n * A no-op when nothing is streaming.\n */\n stop: () => void;\n /** Stop any reply and clear all messages and the error. */\n clear: () => void;\n}\n\nlet chatMessageIdCounter = 0;\nfunction generateChatId(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n chatMessageIdCounter += 1;\n return `msg-${Date.now()}-${chatMessageIdCounter}`;\n}\n\n/**\n * Chat + GenUI: manages a multi-turn conversation where each assistant\n * message can contain both conversational text and a json-render UI spec.\n * The full message history is sent to the endpoint and the streamed response\n * is split into text lines and JSONL patch lines.\n *\n * Must be called in an injection context.\n */\nexport function injectChatUI(options: ChatUIOptions): ChatUIReturn {\n const messages = signal<ChatMessage[]>([]);\n const isStreaming = signal(false);\n const error = signal<Error | null>(null);\n const session = createStreamSession();\n\n inject(DestroyRef).onDestroy(() => session.cancel());\n\n const stop = () => {\n session.cancel();\n isStreaming.set(false);\n };\n\n const clear = () => {\n stop();\n messages.set([]);\n error.set(null);\n };\n\n const send = async (text: string) => {\n if (!text.trim()) return;\n\n const gate = session.begin();\n\n const userMessage: ChatMessage = {\n id: generateChatId(),\n role: 'user',\n text: text.trim(),\n spec: null,\n };\n\n const assistantId = generateChatId();\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n text: '',\n spec: null,\n };\n\n /**\n * Drop this turn's assistant bubble if it never got any text.\n *\n * Deliberately outside the gate: the edit is scoped to this request's own\n * message id, so it is safe even once a newer request has appended its\n * turn — and a superseded request is exactly when it is needed, since an\n * empty bubble left behind renders as a blank reply and is serialised\n * into every later turn's history.\n */\n const dropEmptyPlaceholder = () => {\n messages.update((prev) =>\n prev.filter((m) => m.id !== assistantId || m.text.length > 0),\n );\n };\n\n // Built before the new turn is appended, so it carries the conversation so\n // far. Assistant turns with no text are left out: they say nothing to the\n // model, some providers reject empty content outright, and a turn being\n // superseded right now may still have its placeholder in the list.\n const historyForApi = [\n ...messages()\n .filter((m) => m.role !== 'assistant' || m.text.length > 0)\n .map((m) => ({\n role: m.role,\n content: m.text,\n })),\n { role: 'user' as const, content: text.trim() },\n ];\n\n // Append user message and empty assistant placeholder\n messages.update((prev) => [...prev, userMessage, assistantMessage]);\n isStreaming.set(true);\n error.set(null);\n\n // Mutable state for accumulating the assistant response\n let accumulatedText = '';\n let currentSpec: Spec = { root: '', elements: {} };\n let hasSpec = false;\n\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n // applyPatch returns a fresh spec that shares what the patch did not\n // touch, so the message can hold it directly — no snapshot copy.\n currentSpec = applyPatch(currentSpec, patch);\n const snapshot = currentSpec;\n gate.commit(() =>\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, spec: snapshot } : m,\n ),\n ),\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? '\\n' : '') + line;\n const snapshot = accumulatedText;\n gate.commit(() =>\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, text: snapshot } : m,\n ),\n ),\n );\n },\n });\n\n try {\n await streamRequest(\n {\n api: options.api,\n body: { messages: historyForApi },\n fetch: options.fetch,\n signal: gate.signal,\n },\n parser,\n );\n\n const finalMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n text: accumulatedText,\n spec: hasSpec ? currentSpec : null,\n };\n gate.commit(() => options.onComplete?.(finalMessage));\n } catch (err) {\n // Unconditional: however this turn ended, its own bubble goes with it if\n // nothing was ever said into it. A superseded request usually unwinds by\n // abort, but one whose stream failed for its own reason after being\n // replaced would otherwise leave the placeholder behind.\n dropEmptyPlaceholder();\n if (isAbortError(err)) return;\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n gate.commit(() => {\n error.set(resolvedError);\n options.onError?.(resolvedError);\n });\n } finally {\n gate.commit(() => isStreaming.set(false));\n }\n };\n\n return {\n messages: messages.asReadonly(),\n isStreaming: isStreaming.asReadonly(),\n error: error.asReadonly(),\n send,\n stop,\n clear,\n };\n}\n","/**\n * Streaming: applying a model's output to a spec as it arrives.\n *\n * - `patch` — the immutable RFC 6902 engine every entry point applies through.\n * - `transport` — one streamed request lifecycle, shared by both hooks.\n * - `parts` — adapters for the AI SDK's message parts.\n * - `ui-stream` / `chat-ui` — the two hooks, composed from the above.\n */\nexport { applyPatch } from './patch';\nexport {\n buildSpecFromParts,\n flatToTree,\n getTextFromParts,\n jsonRenderMessage,\n type DataPart,\n} from './parts';\nexport {\n injectUIStream,\n type TokenUsage,\n type UIStreamOptions,\n type UIStreamReturn,\n type UIStreamSendOptions,\n} from './ui-stream';\nexport {\n injectChatUI,\n type ChatMessage,\n type ChatUIOptions,\n type ChatUIReturn,\n} from './chat-ui';\n","import { defineSchema } from '@json-render/core';\n\n/**\n * The schema for ngx-json-render.\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas, and optional actions\n *\n * This is the same spec grammar the other json-render renderers use, so\n * catalogs and specs are portable across frameworks.\n */\nexport const schema = defineSchema(\n (s) => ({\n // What the AI-generated SPEC looks like\n spec: s.object({\n /** Root element key */\n root: s.string(),\n /** Flat map of elements by key */\n elements: s.record(\n s.object({\n /** Component type from catalog */\n type: s.ref('catalog.components'),\n /** Component props */\n props: s.propsOf('catalog.components'),\n /** Child element keys (flat reference) */\n children: s.array(s.string()),\n /** Visibility condition */\n visible: { ...s.any(), ...s.optional() },\n /** Repeat children from a state array */\n repeat: { ...s.any(), ...s.optional() },\n }),\n ),\n }),\n\n // What the CATALOG must provide\n catalog: s.object({\n /** Component definitions */\n components: s.map({\n /** Zod schema for component props */\n props: s.zod(),\n /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */\n slots: s.array(s.string()),\n /** Description for AI generation hints */\n description: s.string(),\n /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example: s.any(),\n }),\n /** Action definitions (optional) */\n actions: s.map({\n /** Zod schema for action params */\n params: s.zod(),\n /** Description for AI generation hints */\n description: s.string(),\n }),\n }),\n }),\n {\n builtInActions: [\n {\n name: 'setState',\n description:\n 'Update a value in the state model at the given statePath. Params: { statePath: string, value: any }',\n },\n {\n name: 'pushState',\n description:\n 'Append an item to an array in state. Params: { statePath: string, value: any, clearStatePath?: string }. Value can contain {\"$state\":\"/path\"} refs and \"$id\" for auto IDs.',\n },\n {\n name: 'removeState',\n description:\n 'Remove an item from an array in state by index. Params: { statePath: string, index: number }',\n },\n {\n name: 'validateForm',\n description:\n 'Validate all registered form fields and write the result to state. Params: { statePath?: string }. Defaults to /formValidation. Result: { valid: boolean, errors: Record<string, string[]> }.',\n },\n ],\n defaultRules: [\n // Element integrity\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist. A missing child element causes that entire branch of the UI to be invisible.\",\n 'SELF-CHECK: After generating all elements, mentally walk the tree from root. Every key in every children array must resolve to a defined element. If you find a gap, output the missing element immediately.',\n 'REQUIRED FIELDS: Every element MUST include a \"children\" array. Leaf elements (text, badges, inputs, images) use an empty array: \"children\": []. Omitting \"children\" fails validation.',\n\n // Field placement\n 'CRITICAL: The \"visible\" field goes on the ELEMENT object, NOT inside \"props\". Correct: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{\"$state\":\"/tab\",\"eq\":\"home\"},\"children\":[...]}.',\n 'CRITICAL: The \"on\" field goes on the ELEMENT object, NOT inside \"props\". Use on.press, on.change, on.submit etc. NEVER put action/actionParams inside props.',\n\n // State and data\n 'When the user asks for a UI that displays data (e.g. blog posts, products, users), ALWAYS include a state field with realistic sample data. The state field is a top-level field on the spec (sibling of root/elements).',\n 'When building repeating content backed by a state array (e.g. posts, products, items), use the \"repeat\" field on a container element. Example: { \"type\": \"<ContainerComponent>\", \"props\": {}, \"repeat\": { \"statePath\": \"/posts\", \"key\": \"id\" }, \"children\": [\"post-card\"] }. For a nested list stored on the enclosing item, use \"repeat\": { \"statePath\": { \"$item\": \"comments\" }, \"key\": \"id\" }. The $item statePath form is valid only inside another repeat. Inside repeated children, use { \"$item\": \"field\" } to read a field from the current item, and { \"$index\": true } for the current array index. For two-way binding to an item field use { \"$bindItem\": \"completed\" }. Do NOT hardcode individual elements for each array item.',\n\n // Design quality\n 'Design with visual hierarchy: use container components to group content, heading components for section titles, proper spacing, and status indicators. ONLY use components from the AVAILABLE COMPONENTS list.',\n 'For data-rich UIs, use multi-column layout components if available. For forms and single-column content, use vertical layout components. ONLY use components from the AVAILABLE COMPONENTS list.',\n 'Always include realistic, professional-looking sample data. For blogs include 3-4 posts with varied titles, authors, dates, categories. For products include names, prices, images. Never leave data empty.',\n ],\n },\n);\n\n/**\n * Type for the Angular schema\n */\nexport type AngularSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type AngularSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n","/*\n * Public API Surface of ngx-json-render\n */\n\n// Renderer components\nexport { JsonRenderer } from './lib/renderer.component';\nexport { JrChildren } from './lib/children.component';\nexport { JrElement } from './lib/element.component';\nexport { JrRepeatScope } from './lib/repeat-scope.component';\nexport { JrConfirmDialog } from './lib/confirm-dialog.component';\n\n// Render context / DI\nexport {\n RENDER_CONTEXT,\n REPEAT_SCOPE,\n injectRenderContext,\n injectRepeatScope,\n} from './lib/tokens';\nexport { JsonRenderRootContext } from './lib/root-context';\n\n// State\nexport {\n JsonRenderStateService,\n injectStateStore,\n injectStateValue,\n injectStateBinding,\n injectBoundProp,\n} from './lib/state.service';\n\n// Actions\nexport {\n JsonRenderActionsService,\n injectActions,\n injectAction,\n type PendingConfirmation,\n} from './lib/actions.service';\n\n// Validation\nexport {\n JsonRenderValidationService,\n injectValidation,\n injectFieldValidation,\n type FieldValidationState,\n} from './lib/validation.service';\n\n// Registry\nexport {\n defineRegistry,\n createStoreSetState,\n type DefineRegistryResult,\n} from './lib/registry';\n\n// Types\nexport type {\n Actions,\n ActionFn,\n CatalogHasActions,\n ComponentRegistry,\n Components,\n EventHandle,\n RegistryEntry,\n RenderContext,\n RepeatScope,\n SetState,\n StateChange,\n StateModel,\n} from './lib/types';\n\n// Streaming / AI helpers\nexport {\n applyPatch,\n buildSpecFromParts,\n flatToTree,\n getTextFromParts,\n injectChatUI,\n injectUIStream,\n jsonRenderMessage,\n type ChatMessage,\n type ChatUIOptions,\n type ChatUIReturn,\n type DataPart,\n type TokenUsage,\n type UIStreamOptions,\n type UIStreamReturn,\n type UIStreamSendOptions,\n} from './lib/streaming';\n\n// Schema (spec format + prompt rules)\nexport { schema, type AngularSchema, type AngularSpec } from './lib/schema';\n\n// Devtools\nexport { injectDevtoolsActive } from './lib/devtools';\n\n// Core re-exports (for convenience)\nexport type {\n ActionBinding,\n ActionHandler,\n JsonPatch,\n Spec,\n StateStore,\n UIElement,\n VisibilityCondition,\n} from '@json-render/core';\nexport { createStateStore, nestedToFlat } from '@json-render/core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-json-render.mjs","sources":["../../../projects/ngx-json-render/src/lib/root-context.ts","../../../projects/ngx-json-render/src/lib/state.service.ts","../../../projects/ngx-json-render/src/lib/validation.service.ts","../../../projects/ngx-json-render/src/lib/actions.service.ts","../../../projects/ngx-json-render/src/lib/confirm-tokens.ts","../../../projects/ngx-json-render/src/lib/confirm-dialog.component.ts","../../../projects/ngx-json-render/src/lib/devtools.ts","../../../projects/ngx-json-render/src/lib/tokens.ts","../../../projects/ngx-json-render/src/lib/element.component.ts","../../../projects/ngx-json-render/src/lib/spec-validation.ts","../../../projects/ngx-json-render/src/lib/renderer.component.ts","../../../projects/ngx-json-render/src/lib/repeat-scope.component.ts","../../../projects/ngx-json-render/src/lib/children.component.ts","../../../projects/ngx-json-render/src/lib/registry.ts","../../../projects/ngx-json-render/src/lib/streaming/patch.ts","../../../projects/ngx-json-render/src/lib/streaming/parts.ts","../../../projects/ngx-json-render/src/lib/streaming/transport.ts","../../../projects/ngx-json-render/src/lib/streaming/ui-stream.ts","../../../projects/ngx-json-render/src/lib/streaming/chat-ui.ts","../../../projects/ngx-json-render/src/lib/streaming/index.ts","../../../projects/ngx-json-render/src/lib/schema.ts","../../../projects/ngx-json-render/src/public-api.ts","../../../projects/ngx-json-render/src/ngx-json-render.ts"],"sourcesContent":["import { Injectable, type Signal, type Type, signal } from '@angular/core';\nimport type {\n ActionHandler,\n ComputedFunction,\n DirectiveRegistry,\n Spec,\n StateModel,\n StateStore,\n ValidationFunction,\n} from '@json-render/core';\nimport type { ComponentRegistry, RegistryEntry, StateChange } from './types';\n\nconst EMPTY = signal(undefined);\n\n/**\n * Internal bridge between the `<json-render>` component's inputs and the\n * renderer services / element tree. The renderer component replaces these\n * signal references with its own input signals at construction time.\n *\n * @internal\n */\n@Injectable()\nexport class JsonRenderRootContext {\n spec: Signal<Spec | null | undefined> = EMPTY;\n registry: Signal<ComponentRegistry | undefined> = EMPTY;\n loading: Signal<boolean> = signal(false);\n fallback: Signal<Type<unknown> | RegistryEntry | null | undefined> = EMPTY;\n\n /** External store (controlled mode). */\n store: Signal<StateStore | null | undefined> = EMPTY;\n /** Initial state (uncontrolled mode); falls back to `spec.state`. */\n initialState: Signal<StateModel> = signal({});\n\n handlers: Signal<Record<string, ActionHandler> | undefined> = EMPTY;\n onAction: Signal<\n | ((name: string, params?: Record<string, unknown>) => unknown)\n | null\n | undefined\n > = EMPTY;\n navigate: Signal<((path: string) => void) | null | undefined> = EMPTY;\n\n validationFunctions: Signal<Record<string, ValidationFunction> | undefined> =\n EMPTY;\n functions: Signal<Record<string, ComputedFunction> | undefined> = EMPTY;\n directiveRegistry: Signal<DirectiveRegistry | undefined> = EMPTY;\n\n /** Emits uncontrolled-mode state changes to the renderer output. */\n emitStateChange: (changes: StateChange[]) => void = () => {};\n\n /** Resolve a registry entry (component + slot metadata) for a type. */\n resolveEntry(type: string): RegistryEntry | undefined {\n const raw = this.registry()?.[type] ?? this.fallback() ?? undefined;\n if (!raw) return undefined;\n return typeof raw === 'function' ? { component: raw } : raw;\n }\n}\n","import {\n Injectable,\n type Signal,\n computed,\n effect,\n inject,\n isDevMode,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n type StateModel,\n type StateStore,\n createStateStore,\n getByPath,\n} from '@json-render/core';\nimport { flattenToPointers } from '@json-render/core/store-utils';\nimport { JsonRenderRootContext } from './root-context';\nimport type { StateChange } from './types';\n\n/**\n * The state store of a `<json-render>` subtree.\n *\n * Wraps a core {@link StateStore} (either the internal in-memory store in\n * uncontrolled mode, or an external store passed via the `store` input) and\n * exposes the current state model as a signal.\n *\n * Inject it from catalog components or action handlers via\n * {@link injectStateStore}.\n */\n@Injectable()\nexport class JsonRenderStateService {\n private readonly root = inject(JsonRenderRootContext);\n private readonly internalStore = createStateStore({});\n\n private readonly changeListeners = new Set<\n (changes: StateChange[]) => void\n >();\n\n private readonly _state = signal<StateModel>(\n {},\n // External stores may mutate snapshots in place — always propagate.\n { equal: () => false },\n );\n\n /** The current state model as a signal. */\n readonly state: Signal<StateModel> = this._state.asReadonly();\n\n private readonly currentStore = computed<StateStore>(\n () => this.root.store() ?? this.internalStore,\n );\n\n constructor() {\n const initialMode =\n untracked(this.currentStore) === this.internalStore\n ? 'uncontrolled'\n : 'controlled';\n let modeWarned = false;\n\n // Keep the state signal in sync with whichever store is active.\n effect((onCleanup) => {\n const store = this.currentStore();\n\n if (isDevMode() && !modeWarned) {\n const mode =\n store === this.internalStore ? 'uncontrolled' : 'controlled';\n if (mode !== initialMode) {\n modeWarned = true;\n console.warn(\n `[ngx-json-render] switching from ${initialMode} to ${mode} mode is not supported.`,\n );\n }\n }\n\n untracked(() => this._state.set(store.getSnapshot()));\n const unsubscribe = store.subscribe(() => {\n this._state.set(store.getSnapshot());\n });\n onCleanup(unsubscribe);\n });\n\n // Uncontrolled mode: when the (resolved) initial state changes — e.g.\n // `spec.state` grows while streaming — diff it against the previous\n // initial state and apply only the changed leaves to the store.\n let prevFlat: Record<string, unknown> = {};\n effect(() => {\n if (this.root.store()) return;\n const initialState = this.root.initialState() ?? {};\n const nextFlat =\n Object.keys(initialState).length > 0\n ? flattenToPointers(initialState)\n : {};\n const allKeys = new Set([\n ...Object.keys(prevFlat),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlat[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : undefined;\n }\n }\n prevFlat = nextFlat;\n if (Object.keys(updates).length > 0) {\n untracked(() => this.internalStore.update(updates));\n }\n });\n }\n\n /** Read a value by JSON Pointer path from the current state. */\n get(path: string): unknown {\n return untracked(this.currentStore).get(path);\n }\n\n /** Write a value by JSON Pointer path and notify subscribers. */\n set(path: string, value: unknown): void {\n const store = untracked(this.currentStore);\n const prev = store.getSnapshot();\n const prevValue = getByPath(prev, path);\n store.set(path, value);\n if (prevValue !== value) {\n const changes: StateChange[] = [{ path, value }];\n this.notifyChanges(changes);\n if (!untracked(this.root.store) && store.getSnapshot() !== prev) {\n this.root.emitStateChange(changes);\n }\n }\n }\n\n /** Write multiple values at once (single notification). */\n update(updates: Record<string, unknown>): void {\n const store = untracked(this.currentStore);\n const prev = store.getSnapshot();\n store.update(updates);\n const changes: StateChange[] = [];\n for (const [path, value] of Object.entries(updates)) {\n if (getByPath(prev, path) !== value) {\n changes.push({ path, value });\n }\n }\n if (changes.length > 0) {\n this.notifyChanges(changes);\n if (!untracked(this.root.store) && store.getSnapshot() !== prev) {\n this.root.emitStateChange(changes);\n }\n }\n }\n\n /** Return the full state object (non-reactive read). */\n getSnapshot(): StateModel {\n return untracked(this.currentStore).getSnapshot();\n }\n\n /**\n * Register a listener called with the list of changed paths whenever state\n * is written through this service (element `watch` fields rely on this).\n * Returns an unsubscribe function.\n */\n subscribeChanges(listener: (changes: StateChange[]) => void): () => void {\n this.changeListeners.add(listener);\n return () => {\n this.changeListeners.delete(listener);\n };\n }\n\n private notifyChanges(changes: StateChange[]): void {\n for (const listener of this.changeListeners) {\n listener(changes);\n }\n }\n}\n\n/**\n * Inject the state store of the nearest `<json-render>` renderer.\n * Must be called from within the renderer's subtree (e.g. a catalog\n * component) or a component that provides {@link JsonRenderStateService}.\n */\nexport function injectStateStore(): JsonRenderStateService {\n return inject(JsonRenderStateService);\n}\n\n/** Reactive read of a state value by JSON Pointer path. */\nexport function injectStateValue<T>(\n path: string | (() => string),\n): Signal<T | undefined> {\n const store = injectStateStore();\n const getPath = typeof path === 'function' ? path : () => path;\n return computed(() => getByPath(store.state(), getPath()) as T | undefined);\n}\n\n/**\n * Reactive two-way binding to a state path: a value signal plus a setter\n * that writes back to the same path.\n */\nexport function injectStateBinding<T>(path: string | (() => string)): {\n value: Signal<T | undefined>;\n set: (value: T) => void;\n} {\n const store = injectStateStore();\n const getPath = typeof path === 'function' ? path : () => path;\n return {\n value: computed(() => getByPath(store.state(), getPath()) as T | undefined),\n set: (value: T) => store.set(getPath(), value),\n };\n}\n\n/**\n * Two-way bound prop helper for catalog components, mirroring `useBoundProp`\n * from the other renderers: the value comes from the already-resolved prop,\n * and the setter writes back to the bound state path (no-op if not bound).\n *\n * @example\n * ```ts\n * const ctx = injectRenderContext<{ value?: string }>();\n * const bound = injectBoundProp<string>(\n * () => ctx.props().value,\n * () => ctx.bindings()?.['value'],\n * );\n * // template: <input [value]=\"bound.value() ?? ''\" (input)=\"bound.set($any($event.target).value)\" />\n * ```\n */\nexport function injectBoundProp<T>(\n propValue: () => T | undefined,\n bindingPath: () => string | undefined,\n): { value: Signal<T | undefined>; set: (value: T) => void } {\n const store = injectStateStore();\n return {\n value: computed(propValue),\n set: (value: T) => {\n const path = bindingPath();\n if (path) store.set(path, value);\n },\n };\n}\n","import {\n DestroyRef,\n Injectable,\n type Signal,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n runValidation,\n} from '@json-render/core';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\n\nexport interface FieldValidationState {\n touched: boolean;\n validated: boolean;\n result: ValidationResult | null;\n}\n\nfunction dynamicArgsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (\n typeof va === 'object' &&\n va !== null &&\n typeof vb === 'object' &&\n vb !== null\n ) {\n const sa = (va as Record<string, unknown>)['$state'];\n const sb = (vb as Record<string, unknown>)['$state'];\n if (typeof sa === 'string' && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\n\nfunction validationConfigEqual(\n a: ValidationConfig,\n b: ValidationConfig,\n): boolean {\n if (a === b) return true;\n\n if (a.validateOn !== b.validateOn) return false;\n\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i]!;\n const cb = bc[i]!;\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n\n return true;\n}\n\n/**\n * Owner of a registration made through the service's own API rather than by\n * a field component. Manual registrations release together, which is the\n * behaviour a caller of `registerField(path, config)` would expect.\n */\nconst MANUAL_OWNER: object = { manual: true };\n\n/**\n * Form validation state of a `<json-render>` subtree. Fields register their\n * {@link ValidationConfig}; the built-in `validateForm` action validates all\n * registered fields and writes the result to state.\n *\n * Registrations are owner-scoped: a path stays registered while at least one\n * owner holds it, and its config and state are dropped when the last one\n * releases. A spec that swaps screens or hides fields therefore stops\n * validating what is no longer on screen.\n */\n@Injectable()\nexport class JsonRenderValidationService {\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n\n private readonly _fieldStates = signal<Record<string, FieldValidationState>>(\n {},\n );\n private readonly _fieldConfigs = signal<Record<string, ValidationConfig>>({});\n /** Live owners per path — the reference count behind a registration. */\n private readonly fieldOwners = new Map<string, Set<object>>();\n\n /** Validation state per registered field path. */\n readonly fieldStates: Signal<Record<string, FieldValidationState>> =\n this._fieldStates.asReadonly();\n\n get customFunctions(): Record<string, ValidationFunction> {\n return untracked(this.root.validationFunctions) ?? {};\n }\n\n /**\n * Register (or update) a field's validation config.\n *\n * @param owner Identity holding the registration — pass the same value to\n * {@link unregisterField} to release it. Field components pass themselves,\n * so two components bound to one path each hold their own claim.\n */\n registerField(\n path: string,\n config: ValidationConfig,\n owner: object = MANUAL_OWNER,\n ): void {\n const owners = this.fieldOwners.get(path);\n if (owners) owners.add(owner);\n else this.fieldOwners.set(path, new Set([owner]));\n\n const prev = untracked(this._fieldConfigs);\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) return;\n this._fieldConfigs.set({ ...prev, [path]: config });\n }\n\n /**\n * Release one owner's registration of a field. The config and validation\n * state survive while another owner still holds the path; once the last\n * one lets go, `validateAll` stops seeing the field.\n */\n unregisterField(path: string, owner: object = MANUAL_OWNER): void {\n const owners = this.fieldOwners.get(path);\n if (!owners) return;\n owners.delete(owner);\n if (owners.size > 0) return;\n\n this.fieldOwners.delete(path);\n const prev = untracked(this._fieldConfigs);\n if (path in prev) {\n const { [path]: _removed, ...rest } = prev;\n this._fieldConfigs.set(rest);\n }\n this.clear(path);\n }\n\n /** Validate a single field and record the result. */\n validate(path: string, config: ValidationConfig): ValidationResult {\n const currentState = this.state.getSnapshot();\n const segments = path.split('/').filter(Boolean);\n let value: unknown = currentState;\n for (const seg of segments) {\n if (value != null && typeof value === 'object') {\n value = (value as Record<string, unknown>)[seg];\n } else {\n value = undefined;\n break;\n }\n }\n const result = runValidation(config, {\n value,\n stateModel: currentState,\n customFunctions: this.customFunctions,\n });\n\n const prev = untracked(this._fieldStates);\n this._fieldStates.set({\n ...prev,\n [path]: {\n touched: prev[path]?.touched ?? true,\n validated: true,\n result,\n },\n });\n\n return result;\n }\n\n /** Mark a field as touched. */\n touch(path: string): void {\n const prev = untracked(this._fieldStates);\n this._fieldStates.set({\n ...prev,\n [path]: {\n ...prev[path],\n touched: true,\n validated: prev[path]?.validated ?? false,\n result: prev[path]?.result ?? null,\n },\n });\n }\n\n /** Clear a field's validation state. */\n clear(path: string): void {\n const { [path]: _, ...rest } = untracked(this._fieldStates);\n this._fieldStates.set(rest);\n }\n\n /** Validate all registered fields. Returns whether all are valid. */\n validateAll(): boolean {\n let allValid = true;\n for (const [path, config] of Object.entries(\n untracked(this._fieldConfigs),\n )) {\n const result = this.validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n }\n}\n\n/** Inject the validation service of the nearest `<json-render>` renderer. */\nexport function injectValidation(): JsonRenderValidationService {\n return inject(JsonRenderValidationService);\n}\n\n/**\n * Field-level validation helper for catalog input components: registers the\n * config and exposes the field's validation state as signals.\n *\n * The registration follows the component: it moves when the bound path\n * changes and is released when the component is destroyed, so a field that\n * has left the screen no longer takes part in `validateForm`.\n */\nexport function injectFieldValidation(\n path: string | (() => string),\n config?: ValidationConfig | (() => ValidationConfig | undefined),\n): {\n state: Signal<FieldValidationState>;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: Signal<string[]>;\n isValid: Signal<boolean>;\n} {\n const validation = injectValidation();\n const getPath = typeof path === 'function' ? path : () => path;\n const getConfig = typeof config === 'function' ? config : () => config;\n\n // Identity of this field's claim on a path. Two components bound to the\n // same path hold separate claims, so one being destroyed does not\n // deregister the other.\n const owner: object = {};\n let registeredPath: string | null = null;\n\n effect(() => {\n const p = getPath();\n const c = getConfig();\n const next = p && c ? p : null;\n if (registeredPath !== null && registeredPath !== next) {\n validation.unregisterField(registeredPath, owner);\n registeredPath = null;\n }\n if (next && c) {\n validation.registerField(next, c, owner);\n registeredPath = next;\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n if (registeredPath === null) return;\n validation.unregisterField(registeredPath, owner);\n registeredPath = null;\n });\n\n const state = computed<FieldValidationState>(() => {\n const current = validation.fieldStates()[getPath()];\n return current ?? { touched: false, validated: false, result: null };\n });\n\n return {\n state,\n validate: () =>\n validation.validate(getPath(), getConfig() ?? { checks: [] }),\n touch: () => validation.touch(getPath()),\n clear: () => validation.clear(getPath()),\n errors: computed(() => state().result?.errors ?? []),\n isValid: computed(() => state().result?.valid ?? true),\n };\n}\n","import {\n Injectable,\n type Signal,\n computed,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n type ActionBinding,\n type ActionHandler,\n type ResolvedAction,\n executeAction,\n nextActionDispatchId,\n notifyActionDispatch,\n notifyActionSettle,\n resolveAction,\n} from '@json-render/core';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\nimport { JsonRenderValidationService } from './validation.service';\n\nlet idCounter = 0;\nfunction generateUniqueId(): string {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\n\nfunction deepResolveValue(\n value: unknown,\n get: (path: string) => unknown,\n): unknown {\n if (value === null || value === undefined) return value;\n\n if (value === '$id') {\n return generateUniqueId();\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n if (keys.length === 1 && typeof obj['$state'] === 'string') {\n return get(obj['$state'] as string);\n }\n\n if (keys.length === 1 && '$id' in obj) {\n return generateUniqueId();\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n\n if (typeof value === 'object') {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n\n return value;\n}\n\nexport interface PendingConfirmation {\n action: ResolvedAction;\n handler: ActionHandler;\n resolve: () => void;\n reject: () => void;\n}\n\n/**\n * Rejection produced when the user dismisses an action's confirmation dialog.\n * Carries a stable `name` so callers can tell a cancellation apart from a\n * handler failure without matching on the message.\n *\n * @internal Not part of the public API; use {@link isActionCancelled}.\n */\nexport class ActionCancelledError extends Error {\n constructor() {\n super('Action cancelled');\n this.name = 'ActionCancelledError';\n }\n}\n\n/** True for the rejection produced by cancelling a confirmation dialog. */\nexport function isActionCancelled(error: unknown): boolean {\n return error instanceof Error && error.name === 'ActionCancelledError';\n}\n\n/**\n * Action dispatcher of a `<json-render>` subtree.\n *\n * Executes {@link ActionBinding}s: built-in actions (`setState`, `pushState`,\n * `removeState`, `push`, `pop`, `validateForm`, `submitForm`) are handled\n * internally; everything else is routed to the host-provided `handlers` (or\n * the `onAction` catch-all), honoring `confirm`, `onSuccess`, and `onError`.\n */\n@Injectable()\nexport class JsonRenderActionsService {\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n private readonly validation = inject(JsonRenderValidationService, {\n optional: true,\n });\n\n private readonly extraHandlers = signal<Record<string, ActionHandler>>({});\n private readonly _loadingActions = signal<ReadonlySet<string>>(new Set());\n private readonly _pendingConfirmation = signal<PendingConfirmation | null>(\n null,\n );\n\n /** Names of actions currently executing. */\n readonly loadingActions: Signal<ReadonlySet<string>> =\n this._loadingActions.asReadonly();\n\n /** The confirmation currently awaiting user input, if any. */\n readonly pendingConfirmation: Signal<PendingConfirmation | null> =\n this._pendingConfirmation.asReadonly();\n\n /** All registered handlers (host handlers + runtime registrations). */\n get handlers(): Record<string, ActionHandler> {\n return {\n ...(untracked(this.root.handlers) ?? {}),\n ...untracked(this.extraHandlers),\n };\n }\n\n /** Register an additional action handler at runtime. */\n registerHandler(name: string, handler: ActionHandler): void {\n this.extraHandlers.set({\n ...untracked(this.extraHandlers),\n [name]: handler,\n });\n }\n\n /** Execute an action binding. */\n async execute(binding: ActionBinding): Promise<void> {\n const resolved = resolveAction(binding, this.state.getSnapshot());\n const get = (path: string) => this.state.get(path);\n const set = (path: string, value: unknown) => this.state.set(path, value);\n\n // --- devtools / observer hooks ---\n const dispatchId = nextActionDispatchId();\n const dispatchedAt = Date.now();\n notifyActionDispatch({\n id: dispatchId,\n name: resolved.action,\n params: resolved.params,\n at: dispatchedAt,\n });\n let ok = true;\n let error: unknown = undefined;\n\n try {\n if (resolved.action === 'setState' && resolved.params) {\n const statePath = resolved.params['statePath'] as string;\n const value = resolved.params['value'];\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n\n if (resolved.action === 'pushState' && resolved.params) {\n const statePath = resolved.params['statePath'] as string;\n const rawValue = resolved.params['value'];\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params['clearStatePath'] as\n string | undefined;\n if (clearStatePath) {\n set(clearStatePath, '');\n }\n }\n return;\n }\n\n if (resolved.action === 'removeState' && resolved.params) {\n const statePath = resolved.params['statePath'] as string;\n const index = resolved.params['index'] as number;\n if (statePath !== undefined && index !== undefined) {\n const arr = (get(statePath) as unknown[] | undefined) ?? [];\n set(\n statePath,\n arr.filter((_, i) => i !== index),\n );\n }\n return;\n }\n\n if (resolved.action === 'push' && resolved.params) {\n const screen = resolved.params['screen'] as string;\n if (screen) {\n const currentScreen = get('/currentScreen') as string | undefined;\n const navStack = (get('/navStack') as string[] | undefined) ?? [];\n if (currentScreen) {\n set('/navStack', [...navStack, currentScreen]);\n } else {\n set('/navStack', [...navStack, '']);\n }\n set('/currentScreen', screen);\n }\n return;\n }\n\n if (resolved.action === 'pop') {\n const navStack = (get('/navStack') as string[] | undefined) ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set('/navStack', navStack.slice(0, -1));\n if (previousScreen) {\n set('/currentScreen', previousScreen);\n } else {\n set('/currentScreen', undefined);\n }\n }\n return;\n }\n\n if (resolved.action === 'validateForm') {\n if (this.checkForm(resolved) === null) {\n console.warn(\n 'validateForm action was dispatched but no JsonRenderValidationService is available.',\n );\n }\n return;\n }\n\n if (resolved.action === 'submitForm') {\n const valid = this.checkForm(resolved);\n if (valid === null) {\n console.warn(\n 'submitForm action was dispatched but no JsonRenderValidationService is available; nothing was submitted.',\n );\n return;\n }\n // An invalid form stops here, with the errors already written to\n // state and every field marked validated, so they are on screen.\n if (!valid) return;\n\n const target = resolved.params?.['action'];\n if (typeof target !== 'string' || !target) {\n console.warn(\n 'submitForm needs the action to submit to: { \"action\": \"submitForm\", \"params\": { \"action\": \"saveUser\" } }.',\n );\n return;\n }\n\n // Dispatched, not called directly, so the submitted action goes\n // through the same lookup, confirmation, loading state and observers\n // as any other — submitForm gates it, it does not replace it.\n await this.execute({\n action: target,\n params: deepResolveValue(resolved.params?.['params'], get) as\n Record<string, unknown> | undefined,\n confirm: resolved.confirm,\n onSuccess: resolved.onSuccess,\n onError: resolved.onError,\n });\n return;\n }\n\n const handler = this.lookupHandler(resolved.action);\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n\n if (resolved.confirm) {\n // Awaited, not returned: a returned promise would let the `finally`\n // below settle the observers before the user has even answered.\n await new Promise<void>((resolve, reject) => {\n this._pendingConfirmation.set({\n action: resolved,\n handler,\n resolve: () => {\n this._pendingConfirmation.set(null);\n resolve();\n },\n reject: () => {\n this._pendingConfirmation.set(null);\n reject(new ActionCancelledError());\n },\n });\n });\n }\n\n await this.runHandler(resolved, handler);\n } catch (err) {\n ok = false;\n error = err;\n throw err;\n } finally {\n const now = Date.now();\n notifyActionSettle({\n id: dispatchId,\n name: resolved.action,\n ok,\n at: now,\n durationMs: now - dispatchedAt,\n error,\n });\n }\n }\n\n /** Confirm the pending confirmation dialog. */\n confirm(): void {\n untracked(this._pendingConfirmation)?.resolve();\n }\n\n /** Cancel the pending confirmation dialog. */\n cancel(): void {\n untracked(this._pendingConfirmation)?.reject();\n }\n\n /**\n * Validate every registered field and write `{ valid, errors }` to the\n * action's `statePath` (default `/formValidation`). Returns null when there\n * is no validation service to ask.\n *\n * Shared by `validateForm` and `submitForm`: the two must report the same\n * thing about the same form, and one implementation is how that stays true.\n */\n private checkForm(resolved: ResolvedAction): boolean | null {\n if (!this.validation) return null;\n\n const valid = this.validation.validateAll();\n const errors: Record<string, string[]> = {};\n for (const [path, fieldState] of Object.entries(\n untracked(this.validation.fieldStates),\n )) {\n if (fieldState.result && !fieldState.result.valid) {\n errors[path] = fieldState.result.errors;\n }\n }\n const statePath =\n (resolved.params?.['statePath'] as string) || '/formValidation';\n this.state.set(statePath, { valid, errors });\n return valid;\n }\n\n private lookupHandler(name: string): ActionHandler | undefined {\n const direct = this.handlers[name];\n if (direct) return direct;\n // Catch-all: route unknown actions to the `onAction` input when provided.\n const onAction = untracked(this.root.onAction);\n if (onAction) {\n return (params) => onAction(name, params);\n }\n return undefined;\n }\n\n private async runHandler(\n resolved: ResolvedAction,\n handler: ActionHandler,\n ): Promise<void> {\n this._loadingActions.set(\n new Set(untracked(this._loadingActions)).add(resolved.action),\n );\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: (path, value) => this.state.set(path, value),\n navigate: untracked(this.root.navigate) ?? undefined,\n executeAction: async (binding) => {\n await this.execute(binding);\n },\n });\n } finally {\n const next = new Set(untracked(this._loadingActions));\n next.delete(resolved.action);\n this._loadingActions.set(next);\n }\n }\n}\n\n/** Inject the actions service of the nearest `<json-render>` renderer. */\nexport function injectActions(): JsonRenderActionsService {\n return inject(JsonRenderActionsService);\n}\n\n/**\n * Convenience helper for executing a fixed action binding, mirroring\n * `useAction` from the other renderers.\n */\nexport function injectAction(binding: ActionBinding): {\n execute: () => Promise<void>;\n isLoading: Signal<boolean>;\n} {\n const actions = injectActions();\n return {\n execute: () => actions.execute(binding),\n isLoading: computed(() => actions.loadingActions().has(binding.action)),\n };\n}\n","import { InjectionToken, type Type, inject } from '@angular/core';\nimport type { ActionConfirm } from '@json-render/core';\n\n/** The two words the confirmation dialog says on its own. */\nexport interface ConfirmLabels {\n confirm: string;\n cancel: string;\n}\n\n/**\n * Labels for the default confirmation dialog's buttons, when the spec does not\n * supply `confirmLabel` / `cancelLabel` of its own.\n *\n * They are the only strings this package puts on screen, and they were English\n * with no way to change them. Override once, in an app's providers:\n *\n * ```ts\n * { provide: JR_CONFIRM_LABELS, useValue: { confirm: 'Подтвердить', cancel: 'Отмена' } }\n * ```\n */\nexport const JR_CONFIRM_LABELS = new InjectionToken<ConfirmLabels>(\n 'ngx-json-render JR_CONFIRM_LABELS',\n {\n providedIn: 'root',\n factory: () => ({ confirm: 'Confirm', cancel: 'Cancel' }),\n },\n);\n\n/**\n * Everything a replacement confirmation dialog is given: the config the spec\n * asked for, and the two ways to answer it. Inject it with\n * {@link injectConfirmContext}.\n */\nexport interface ConfirmContext {\n /** Title, message, labels and variant, straight from the action binding. */\n readonly config: ActionConfirm;\n /** Let the action proceed. */\n readonly confirm: () => void;\n /** Dismiss it — a normal answer, not a failure. */\n readonly cancel: () => void;\n}\n\n/** The confirmation a replacement dialog component is rendered for. */\nexport const CONFIRM_CONTEXT = new InjectionToken<ConfirmContext>(\n 'ngx-json-render CONFIRM_CONTEXT',\n);\n\n/**\n * The component `<json-render>` should render for a `confirm` on an action.\n * Unset means the packaged {@link JrConfirmDialog}.\n *\n * The component is rendered with a {@link CONFIRM_CONTEXT} in its injector, so\n * it takes no inputs and emits no outputs:\n *\n * ```ts\n * @Component({ template: `<my-modal (ok)=\"ctx.confirm()\" (dismiss)=\"ctx.cancel()\">…` })\n * export class AppConfirm {\n * readonly ctx = injectConfirmContext();\n * }\n * // providers: [{ provide: JR_CONFIRM_DIALOG, useValue: AppConfirm }]\n * ```\n */\nexport const JR_CONFIRM_DIALOG = new InjectionToken<Type<unknown>>(\n 'ngx-json-render JR_CONFIRM_DIALOG',\n);\n\n/** Inject the confirmation a replacement dialog component is rendering for. */\nexport function injectConfirmContext(): ConfirmContext {\n const ctx = inject(CONFIRM_CONTEXT, { optional: true });\n if (!ctx) {\n throw new Error(\n 'injectConfirmContext() must be used inside a component provided through JR_CONFIRM_DIALOG',\n );\n }\n return ctx;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n type ElementRef,\n afterNextRender,\n computed,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport type { ActionConfirm } from '@json-render/core';\nimport { JR_CONFIRM_LABELS } from './confirm-tokens';\n\nlet dialogIdCounter = 0;\n\n/**\n * Default confirmation dialog shown for action bindings with a `confirm`\n * field. Rendered automatically by `<json-render>`; can also be used\n * standalone with a custom action flow.\n *\n * It is a real dialog: `role=\"dialog\"` with `aria-modal`, labelled by its own\n * title and described by its message, focus moved in on open and returned to\n * wherever it came from on close, Tab kept inside it and Escape cancelling.\n * A generated UI can ask for confirmation of something destructive, so a\n * keyboard or screen-reader user has to be able to answer it.\n *\n * Colours come from CSS custom properties with light and dark defaults, so an\n * app can theme it — `--jr-confirm-surface`, `--jr-confirm-ink`,\n * `--jr-confirm-muted`, `--jr-confirm-border`, `--jr-confirm-scrim`,\n * `--jr-confirm-accent`, `--jr-confirm-danger`, `--jr-confirm-on-accent`,\n * `--jr-confirm-radius` — and replace it outright through\n * {@link JR_CONFIRM_DIALOG} when that is not enough.\n */\n@Component({\n selector: 'jr-confirm-dialog',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(keydown.escape)': 'cancelled.emit()',\n },\n template: `\n <div class=\"jr-confirm-scrim\" (click)=\"cancelled.emit()\">\n <div\n class=\"jr-confirm-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"messageId\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onKeydown($event)\"\n >\n <h3 class=\"jr-confirm-title\" [id]=\"titleId\">{{ config().title }}</h3>\n <p class=\"jr-confirm-message\" [id]=\"messageId\">{{ config().message }}</p>\n <div class=\"jr-confirm-actions\">\n <button #cancel type=\"button\" class=\"jr-confirm-cancel\" (click)=\"cancelled.emit()\">\n {{ config().cancelLabel ?? labels.cancel }}\n </button>\n <button\n #confirm\n type=\"button\"\n class=\"jr-confirm-confirm\"\n [class.jr-confirm-danger]=\"isDanger()\"\n (click)=\"confirmed.emit()\"\n >\n {{ config().confirmLabel ?? labels.confirm }}\n </button>\n </div>\n </div>\n </div>\n `,\n styles: `\n :host {\n --jr-confirm-scrim-default: rgba(0, 0, 0, 0.5);\n --jr-confirm-surface-default: #ffffff;\n --jr-confirm-ink-default: #111827;\n --jr-confirm-muted-default: #6b7280;\n --jr-confirm-border-default: #d1d5db;\n --jr-confirm-accent-default: #3b82f6;\n --jr-confirm-danger-default: #dc2626;\n --jr-confirm-on-accent-default: #ffffff;\n }\n\n @media (prefers-color-scheme: dark) {\n :host {\n --jr-confirm-scrim-default: rgba(0, 0, 0, 0.65);\n --jr-confirm-surface-default: #1f2937;\n --jr-confirm-ink-default: #f3f4f6;\n --jr-confirm-muted-default: #9ca3af;\n --jr-confirm-border-default: #4b5563;\n --jr-confirm-accent-default: #60a5fa;\n --jr-confirm-danger-default: #f87171;\n --jr-confirm-on-accent-default: #111827;\n }\n }\n\n .jr-confirm-scrim {\n position: fixed;\n inset: 0;\n z-index: 50;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--jr-confirm-scrim, var(--jr-confirm-scrim-default));\n }\n\n .jr-confirm-panel {\n width: 100%;\n max-width: 400px;\n padding: 24px;\n border-radius: var(--jr-confirm-radius, 8px);\n background-color: var(--jr-confirm-surface, var(--jr-confirm-surface-default));\n color: var(--jr-confirm-ink, var(--jr-confirm-ink-default));\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.25);\n }\n\n .jr-confirm-title {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .jr-confirm-message {\n margin: 0 0 24px 0;\n color: var(--jr-confirm-muted, var(--jr-confirm-muted-default));\n }\n\n .jr-confirm-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n }\n\n .jr-confirm-actions button {\n padding: 8px 16px;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n }\n\n .jr-confirm-cancel {\n border: 1px solid var(--jr-confirm-border, var(--jr-confirm-border-default));\n background-color: transparent;\n color: inherit;\n }\n\n .jr-confirm-confirm {\n border: none;\n background-color: var(--jr-confirm-accent, var(--jr-confirm-accent-default));\n color: var(--jr-confirm-on-accent, var(--jr-confirm-on-accent-default));\n }\n\n .jr-confirm-confirm.jr-confirm-danger {\n background-color: var(--jr-confirm-danger, var(--jr-confirm-danger-default));\n }\n `,\n})\nexport class JrConfirmDialog {\n readonly config = input.required<ActionConfirm>();\n readonly confirmed = output<void>();\n readonly cancelled = output<void>();\n\n protected readonly labels = inject(JR_CONFIRM_LABELS);\n\n private readonly id = dialogIdCounter++;\n protected readonly titleId = `jr-confirm-title-${this.id}`;\n protected readonly messageId = `jr-confirm-message-${this.id}`;\n\n private readonly cancelButton =\n viewChild<ElementRef<HTMLButtonElement>>('cancel');\n private readonly confirmButton =\n viewChild<ElementRef<HTMLButtonElement>>('confirm');\n\n protected readonly isDanger = computed(\n () => this.config().variant === 'danger',\n );\n\n constructor() {\n // Whatever was focused when the action fired — usually the control that\n // dispatched it, which is still in the document behind the dialog.\n const previous =\n typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null;\n\n // Cancel takes focus rather than confirm: a dialog exists to interrupt,\n // and landing on the destructive answer makes a stray Enter destructive.\n afterNextRender(() => this.cancelButton()?.nativeElement.focus());\n\n inject(DestroyRef).onDestroy(() => previous?.focus?.());\n }\n\n /**\n * Keep Tab inside the dialog. With exactly two buttons the whole trap is\n * wrapping the ends; a modal that lets focus wander behind it is a modal\n * only for people using a mouse.\n */\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab') return;\n const cancel = this.cancelButton()?.nativeElement;\n const confirm = this.confirmButton()?.nativeElement;\n if (!cancel || !confirm) return;\n\n const active = event.target;\n if (event.shiftKey && active === cancel) {\n event.preventDefault();\n confirm.focus();\n } else if (!event.shiftKey && active === confirm) {\n event.preventDefault();\n cancel.focus();\n }\n }\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\nimport { isDevtoolsActive, subscribeDevtoolsActive } from '@json-render/core';\n\n/**\n * Reactive mirror of the json-render devtools-active flag. When active, the\n * renderer wraps each element with a `data-jr-key` attribute for the picker.\n */\nexport function injectDevtoolsActive(): Signal<boolean> {\n const active = signal(isDevtoolsActive());\n const unsubscribe = subscribeDevtoolsActive(() =>\n active.set(isDevtoolsActive()),\n );\n inject(DestroyRef).onDestroy(unsubscribe);\n return active.asReadonly();\n}\n","import { InjectionToken, type Signal, inject } from '@angular/core';\nimport type { RenderContext, RepeatScope } from './types';\n\n/**\n * The render context of the element currently being rendered.\n * Provided by the renderer for every catalog component instance.\n */\nexport const RENDER_CONTEXT = new InjectionToken<RenderContext>(\n 'ngx-json-render RENDER_CONTEXT',\n);\n\n/**\n * The spec key of the element currently being rendered. Provided alongside\n * {@link RENDER_CONTEXT} for every catalog component instance.\n */\nexport const ELEMENT_KEY = new InjectionToken<Signal<string>>(\n 'ngx-json-render ELEMENT_KEY',\n);\n\n/**\n * The current repeat scope. Present only for elements rendered inside a\n * `repeat` block.\n */\nexport const REPEAT_SCOPE = new InjectionToken<RepeatScope>(\n 'ngx-json-render REPEAT_SCOPE',\n);\n\n/**\n * Inject the render context inside a catalog component.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'app-button',\n * template: `<button (click)=\"ctx.emit('press')\">{{ ctx.props().label }}</button>`,\n * })\n * export class ButtonComponent {\n * readonly ctx = injectRenderContext<{ label: string }>();\n * }\n * ```\n */\nexport function injectRenderContext<\n P = Record<string, unknown>,\n>(): RenderContext<P> {\n const ctx = inject(RENDER_CONTEXT, { optional: true });\n if (!ctx) {\n throw new Error(\n 'injectRenderContext() must be used inside a component rendered by <json-render>',\n );\n }\n return ctx as RenderContext<P>;\n}\n\n/**\n * Inject the spec key of the element this component renders.\n *\n * Catalog components that collect their children — a tab group discovering\n * its tabs, for instance — need it to order registrations by the spec's\n * `children` array rather than by the order the children happened to\n * announce themselves in.\n *\n * @example\n * ```ts\n * const key = injectElementKey();\n * const index = computed(() => parent.element().children?.indexOf(key()) ?? -1);\n * ```\n */\nexport function injectElementKey(): Signal<string> {\n const key = inject(ELEMENT_KEY, { optional: true });\n if (!key) {\n throw new Error(\n 'injectElementKey() must be used inside a component rendered by <json-render>',\n );\n }\n return key;\n}\n\n/**\n * Inject the current repeat scope, or `null` when the component is not\n * rendered inside a `repeat` block.\n */\nexport function injectRepeatScope(): RepeatScope | null {\n return inject(REPEAT_SCOPE, { optional: true });\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Injector,\n type Signal,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n untracked,\n} from '@angular/core';\nimport type { PropResolutionContext, UIElement } from '@json-render/core';\nimport {\n evaluateVisibility,\n resolveActionParam,\n resolveBindings,\n resolveElementProps,\n} from '@json-render/core';\nimport { JsonRenderActionsService, isActionCancelled } from './actions.service';\nimport { injectDevtoolsActive } from './devtools';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\nimport { ELEMENT_KEY, REPEAT_SCOPE, RENDER_CONTEXT } from './tokens';\nimport type { EventHandle, RenderContext } from './types';\n\nconst warnedSlots = new Set<string>();\n\n/**\n * Report a failure from a fire-and-forget action dispatch. Cancelling a\n * confirmation dialog is a normal outcome, not an error, so it stays silent.\n */\nfunction reportActionError(error: unknown): void {\n if (isActionCancelled(error)) return;\n console.error(error);\n}\n\n/**\n * Renders a single spec element: evaluates visibility, resolves prop\n * expressions against the state model, wires event/watch bindings, and\n * instantiates the catalog component with a {@link RenderContext} injector.\n *\n * @internal Used by `<json-render>` and `<jr-children>`.\n */\n@Component({\n selector: 'jr-element',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgComponentOutlet],\n styles: `:host { display: contents; }`,\n template: `\n @if (rawElement() && visible() && component()) {\n @if (devtoolsKey(); as dk) {\n <span [attr.data-jr-key]=\"dk\" style=\"display: contents\">\n <ng-container *ngComponentOutlet=\"component(); injector: outletInjector\" />\n </span>\n } @else {\n <ng-container *ngComponentOutlet=\"component(); injector: outletInjector\" />\n }\n }\n `,\n})\nexport class JrElement {\n readonly elementKey = input.required<string>();\n\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n private readonly actions = inject(JsonRenderActionsService);\n private readonly repeatScope = inject(REPEAT_SCOPE, { optional: true });\n private readonly devtoolsActive = injectDevtoolsActive();\n\n /** The raw (unresolved) element from the spec. */\n readonly rawElement = computed<UIElement | undefined>(\n () => this.root.spec()?.elements?.[this.elementKey()],\n );\n\n /** Prop/visibility resolution context (state + repeat scope + extensions). */\n private readonly resolutionCtx = computed<PropResolutionContext>(() => {\n const scope = this.repeatScope;\n return {\n stateModel: this.state.state(),\n ...(scope\n ? {\n repeatItem: scope.item(),\n repeatIndex: scope.index(),\n repeatBasePath: scope.basePath(),\n }\n : {}),\n functions: this.root.functions() ?? {},\n directives: this.root.directiveRegistry(),\n };\n });\n\n protected readonly visible = computed(() => {\n const el = this.rawElement();\n if (!el || el.visible === undefined) return true;\n return evaluateVisibility(el.visible, this.resolutionCtx());\n });\n\n /** The element with all prop expressions resolved. */\n readonly resolvedElement = computed<UIElement | undefined>(() => {\n const el = this.rawElement();\n if (!el) return undefined;\n return {\n ...el,\n props: resolveElementProps(el.props ?? {}, this.resolutionCtx()),\n };\n });\n\n /** Two-way binding paths ($bindState / $bindItem) by prop name. */\n readonly bindings = computed<Record<string, string> | undefined>(() => {\n const el = this.rawElement();\n return el\n ? resolveBindings(el.props ?? {}, this.resolutionCtx())\n : undefined;\n });\n\n private readonly entry = computed(() => {\n const el = this.rawElement();\n return el ? this.root.resolveEntry(el.type) : undefined;\n });\n\n protected readonly component = computed(\n () => this.entry()?.component ?? null,\n );\n\n protected readonly devtoolsKey = computed(() =>\n this.devtoolsActive() ? this.elementKey() : null,\n );\n\n private readonly renderCtx: RenderContext = {\n element: this.resolvedElement as Signal<UIElement>,\n props: computed(() => this.resolvedElement()?.props ?? {}),\n emit: (event) => this.fireEvent(event),\n on: (event) => this.eventHandle(event),\n bindings: this.bindings,\n loading: computed(() => this.root.loading()),\n setBound: (prop, value) => {\n const path = untracked(this.bindings)?.[prop];\n if (path) {\n this.state.set(path, value);\n } else if (isDevMode()) {\n console.warn(\n `[ngx-json-render] setBound(\"${prop}\"): prop has no $bindState/$bindItem binding`,\n );\n }\n },\n };\n\n protected readonly outletInjector = Injector.create({\n providers: [\n { provide: RENDER_CONTEXT, useValue: this.renderCtx },\n { provide: ELEMENT_KEY, useValue: this.elementKey },\n ],\n parent: inject(Injector),\n });\n\n constructor() {\n // Warn (once per type) about unknown component types.\n const warnedTypes = new Set<string>();\n effect(() => {\n const el = this.rawElement();\n if (!el || this.entry() || warnedTypes.has(el.type)) return;\n warnedTypes.add(el.type);\n console.warn(`No renderer for component type: ${el.type}`);\n });\n\n // Warn about unknown / default slots when the registry carries metadata.\n effect(() => {\n const el = this.rawElement();\n const meta = this.entry();\n if (!el?.slots || !meta?.slots) return;\n const available = new Set(meta.slots);\n for (const slotName of Object.keys(el.slots)) {\n const warnKey = `${el.type}:${slotName}`;\n if (warnedSlots.has(warnKey)) continue;\n if (slotName === 'default') {\n warnedSlots.add(warnKey);\n console.warn(\n `[json-render] Component \"${el.type}\" uses slots.default. Use \"children\" for default slot content.`,\n );\n } else if (!available.has(slotName)) {\n warnedSlots.add(warnKey);\n console.warn(\n `[json-render] Unknown slot \"${slotName}\" on component \"${el.type}\". Available slots: ${meta.slots.join(', ')}`,\n );\n }\n }\n });\n\n // Watch effect: fire actions when watched state paths change.\n effect((onCleanup) => {\n const watchConfig = this.rawElement()?.watch;\n if (!watchConfig) return;\n const paths = Object.keys(watchConfig);\n if (paths.length === 0) return;\n\n const unsubscribe = this.state.subscribeChanges((changes) => {\n const changedPaths = new Set(changes.map((change) => change.path));\n\n void (async () => {\n for (const path of paths) {\n if (!changedPaths.has(path)) continue;\n\n const binding = watchConfig[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n\n for (const b of bindings) {\n if (!b.params) {\n await this.actions.execute(b);\n continue;\n }\n const liveCtx = this.liveResolutionCtx();\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await this.actions.execute({ ...b, params: resolved });\n }\n }\n })().catch(reportActionError);\n });\n\n onCleanup(unsubscribe);\n });\n }\n\n /**\n * Resolution context with a live state snapshot, so `$state` references in\n * later actions of a chain see mutations from earlier ones.\n */\n private liveResolutionCtx(): PropResolutionContext {\n return {\n ...untracked(this.resolutionCtx),\n stateModel: this.state.getSnapshot(),\n };\n }\n\n /**\n * Fire-and-forget entry point for event emission: dispatching is async, but\n * a template listener has nowhere to await it, so the failure must be\n * handled here rather than escaping as an unhandled rejection.\n */\n private fireEvent(eventName: string): void {\n this.emitEvent(eventName).catch(reportActionError);\n }\n\n private async emitEvent(eventName: string): Promise<void> {\n const el = untracked(this.rawElement);\n const binding = el?.on?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await this.actions.execute(b);\n continue;\n }\n const liveCtx = this.liveResolutionCtx();\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await this.actions.execute({ ...b, params: resolved });\n }\n }\n\n private eventHandle(eventName: string): EventHandle {\n const el = this.rawElement();\n const binding = el?.on?.[eventName];\n if (!binding) {\n return { emit: () => {}, shouldPreventDefault: false, bound: false };\n }\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n return {\n emit: () => this.fireEvent(eventName),\n shouldPreventDefault: actionBindings.some((b) => b.preventDefault),\n bound: true,\n };\n }\n}\n","import type { Spec, SpecIssue } from '@json-render/core';\nimport { autoFixSpec, formatSpecIssues, validateSpec } from '@json-render/core';\n\n/**\n * How much a spec has to be trusted.\n *\n * - `off` — render whatever arrives. The default, and what every version\n * before this one did.\n * - `warn` — check the spec, apply the lossless fixes, report what is left,\n * render it anyway.\n * - `strict` — the same check, but an error means the spec does not render.\n */\nexport type SpecValidationMode = 'off' | 'warn' | 'strict';\n\n/** What {@link checkSpec} found, and the spec that should render. */\nexport interface SpecCheck {\n /**\n * The spec to render: the input with lossless fixes applied, or the input\n * untouched when validation is off.\n */\n readonly spec: Spec | null;\n /** Structural issues left after the fixes. */\n readonly issues: readonly SpecIssue[];\n /** Descriptions of the fixes that were applied. */\n readonly fixes: readonly string[];\n /** Whether an issue of `error` severity survived. */\n readonly hasErrors: boolean;\n}\n\nconst CLEAN: SpecCheck = {\n spec: null,\n issues: [],\n fixes: [],\n hasErrors: false,\n};\n\n/**\n * Check a spec the way `validate` asks for.\n *\n * Only lossless fixes are applied — `visible`, `on` and `repeat` that a model\n * put inside `props`, which the renderer would otherwise ignore, moved back\n * where they belong. The lossy ones prune content, and core's own guidance is\n * to re-prompt rather than accept that; a renderer that silently deleted\n * elements would be the worse failure.\n */\nexport function checkSpec(\n spec: Spec | null,\n mode: SpecValidationMode,\n): SpecCheck {\n if (!spec) return CLEAN;\n if (mode === 'off') {\n return { spec, issues: [], fixes: [], hasErrors: false };\n }\n\n const fixed = autoFixSpec(spec, { lossy: false });\n const { issues } = validateSpec(fixed.spec);\n return {\n spec: fixed.spec,\n issues,\n fixes: fixed.fixes,\n hasErrors: issues.some((issue) => issue.severity === 'error'),\n };\n}\n\n/**\n * Report a check to the console: fixes as information, issues at the severity\n * the mode gives them. `strict` refuses to render, so its errors are reported\n * as errors; under `warn` the spec still renders and the same finding is a\n * warning.\n */\nexport function reportSpecCheck(\n check: SpecCheck,\n mode: SpecValidationMode,\n): void {\n if (mode === 'off') return;\n\n if (check.fixes.length > 0) {\n console.info(\n `[ngx-json-render] Fixed ${check.fixes.length} spec issue(s) before rendering:\\n` +\n check.fixes.map((fix) => ` - ${fix}`).join('\\n'),\n );\n }\n\n if (check.issues.length === 0) return;\n\n const report = `[ngx-json-render] Spec validation:\\n${formatSpecIssues([...check.issues])}`;\n if (mode === 'strict' && check.hasErrors) {\n console.error(`${report}\\nNothing is rendered: validate=\"strict\".`);\n } else {\n console.warn(report);\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Injector,\n type Type,\n computed,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport type {\n ActionHandler,\n ComputedFunction,\n DirectiveDefinition,\n Spec,\n StateModel,\n StateStore,\n ValidationFunction,\n} from '@json-render/core';\nimport { createDirectiveRegistry } from '@json-render/core';\nimport { JsonRenderActionsService } from './actions.service';\nimport { JrConfirmDialog } from './confirm-dialog.component';\nimport {\n CONFIRM_CONTEXT,\n type ConfirmContext,\n JR_CONFIRM_DIALOG,\n} from './confirm-tokens';\nimport { JrElement } from './element.component';\nimport { JsonRenderRootContext } from './root-context';\nimport {\n type SpecValidationMode,\n checkSpec,\n reportSpecCheck,\n} from './spec-validation';\nimport { JsonRenderStateService } from './state.service';\nimport type { ComponentRegistry, RegistryEntry, StateChange } from './types';\nimport { JsonRenderValidationService } from './validation.service';\n\n/**\n * Renders a json-render {@link Spec} using a registry of Angular components.\n *\n * The renderer owns the state store, action dispatcher, and validation state\n * of its subtree (all injectable from catalog components). Pass an external\n * {@link StateStore} via `store` for controlled mode or to share state across\n * renderers.\n *\n * @example\n * ```html\n * <json-render\n * [spec]=\"spec()\"\n * [registry]=\"registry\"\n * [handlers]=\"handlers\"\n * [loading]=\"isStreaming()\"\n * (stateChange)=\"onStateChange($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'json-render',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [JrElement, JrConfirmDialog, NgComponentOutlet],\n providers: [\n JsonRenderRootContext,\n JsonRenderStateService,\n JsonRenderValidationService,\n JsonRenderActionsService,\n ],\n styles: `:host { display: contents; }`,\n template: `\n @if (rootKey(); as key) {\n <jr-element [elementKey]=\"key\" />\n }\n @if (pendingConfirm(); as confirm) {\n @if (customDialog; as dialog) {\n <ng-container\n *ngComponentOutlet=\"dialog; injector: confirmInjector() ?? undefined\"\n />\n } @else {\n <jr-confirm-dialog\n [config]=\"confirm\"\n (confirmed)=\"actions.confirm()\"\n (cancelled)=\"actions.cancel()\"\n />\n }\n }\n `,\n})\nexport class JsonRenderer {\n /** The UI spec to render (may be partial while streaming). */\n readonly spec = input.required<Spec | null>();\n /** Component registry mapping catalog type names to Angular components. */\n readonly registry = input.required<ComponentRegistry>();\n /** Whether the spec is currently loading/streaming. */\n readonly loading = input(false);\n /** Fallback component for unknown types. */\n readonly fallback = input<Type<unknown> | RegistryEntry | null>(null);\n /**\n * Whether to check the spec's structure before rendering it, and what to do\n * about what turns up. Off by default.\n *\n * `'warn'` reports the issues and renders anyway; `'strict'` renders nothing\n * when the spec has errors. Both first apply the lossless fixes — `visible`,\n * `on` and `repeat` misplaced inside `props` are moved back to the element,\n * where they take effect instead of being ignored.\n *\n * The check is skipped while `loading` is true: a spec that is still\n * arriving is expected to reference children that have not streamed in yet.\n */\n readonly validate = input<SpecValidationMode>('off');\n\n /**\n * Initial state model (uncontrolled mode). Defaults to `spec.state`.\n * Ignored when `store` is provided.\n */\n readonly state = input<StateModel | undefined>(undefined);\n /** External state store (controlled mode). */\n readonly store = input<StateStore | null>(null);\n\n /** Action handlers by action name. */\n readonly handlers = input<Record<string, ActionHandler> | undefined>(\n undefined,\n );\n /** Catch-all action handler for actions without a dedicated handler. */\n readonly onAction = input<\n ((name: string, params?: Record<string, unknown>) => unknown) | null\n >(null);\n /** Navigation function used by `onSuccess: { navigate }` handlers. */\n readonly navigate = input<((path: string) => void) | null>(null);\n\n /** Custom validation functions. */\n readonly validationFunctions = input<\n Record<string, ValidationFunction> | undefined\n >(undefined);\n /** Named functions for `$computed` expressions in props. */\n readonly functions = input<Record<string, ComputedFunction> | undefined>(\n undefined,\n );\n /** Custom directives for user-defined `$`-prefixed dynamic values. */\n readonly directives = input<DirectiveDefinition[] | undefined>(undefined);\n\n /** Emits state changes in uncontrolled mode. */\n readonly stateChange = output<StateChange[]>();\n\n /** The state store of this renderer (also injectable in the subtree). */\n readonly stateStore: JsonRenderStateService;\n /** The action dispatcher of this renderer. */\n protected readonly actions: JsonRenderActionsService;\n\n /**\n * The spec as checked, and what the check found. While `loading`, the mode\n * is forced off: the spec is still arriving, and the missing children it\n * refers to are the normal state of a stream, not a defect.\n */\n private readonly checked = computed(() =>\n checkSpec(this.spec(), this.loading() ? 'off' : this.validate()),\n );\n\n constructor() {\n const root = inject(JsonRenderRootContext);\n // The fixed spec, not the input: a `visible` the check moved out of\n // `props` has to be the one the tree renders, or the fix is cosmetic.\n root.spec = computed(() => this.checked().spec);\n root.registry = this.registry;\n root.loading = this.loading;\n root.fallback = this.fallback;\n root.store = this.store;\n root.initialState = computed(\n () => this.state() ?? this.spec()?.state ?? {},\n );\n root.handlers = this.handlers;\n root.onAction = this.onAction;\n root.navigate = this.navigate;\n root.validationFunctions = this.validationFunctions;\n root.functions = this.functions;\n root.directiveRegistry = computed(() => {\n const definitions = this.directives();\n return definitions ? createDirectiveRegistry(definitions) : undefined;\n });\n root.emitStateChange = (changes) => this.stateChange.emit(changes);\n\n // Instantiate the subtree services now that the root context is wired.\n this.stateStore = inject(JsonRenderStateService);\n inject(JsonRenderValidationService);\n this.actions = inject(JsonRenderActionsService);\n\n // Reports once per distinct check rather than once per render: `checked`\n // only recomputes when the spec, the mode or the loading flag change.\n effect(() => reportSpecCheck(this.checked(), this.validate()));\n }\n\n protected readonly rootKey = computed(() => {\n const checked = this.checked();\n // A spec whose errors survived the fixes does not render under `strict`.\n // Reporting it and drawing half of it anyway is the behaviour the mode\n // exists to refuse.\n if (this.validate() === 'strict' && checked.hasErrors) return null;\n const spec = checked.spec;\n return spec?.root && spec.elements?.[spec.root] ? spec.root : null;\n });\n\n protected readonly pendingConfirm = computed(\n () => this.actions.pendingConfirmation()?.action.confirm ?? null,\n );\n\n /**\n * The app's own dialog, if it provided one. Read once: which component\n * answers a confirmation is an application decision, not something that\n * changes between two confirmations.\n */\n protected readonly customDialog = inject(JR_CONFIRM_DIALOG, {\n optional: true,\n });\n private readonly injector = inject(Injector);\n\n /**\n * A replacement dialog takes no inputs and emits no outputs — it injects\n * everything it needs, the way catalog components do. That keeps the seam\n * one token wide instead of a component contract the renderer would have to\n * bind to.\n */\n protected readonly confirmInjector = computed(() => {\n const config = this.pendingConfirm();\n if (!config) return null;\n const context: ConfirmContext = {\n config,\n confirm: () => this.actions.confirm(),\n cancel: () => this.actions.cancel(),\n };\n return Injector.create({\n providers: [{ provide: CONFIRM_CONTEXT, useValue: context }],\n parent: this.injector,\n });\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n forwardRef,\n input,\n} from '@angular/core';\nimport { REPEAT_SCOPE } from './tokens';\nimport type { RepeatScope } from './types';\n\n/**\n * Provides the repeat scope (item, index, absolute base path) to the elements\n * rendered inside a `repeat` block.\n *\n * @internal Used by `<jr-children>`; not intended for direct use.\n */\n@Component({\n selector: 'jr-repeat-scope',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: REPEAT_SCOPE, useExisting: forwardRef(() => JrRepeatScope) },\n ],\n styles: `:host { display: contents; }`,\n template: '<ng-content />',\n})\nexport class JrRepeatScope implements RepeatScope {\n readonly item = input.required<unknown>();\n readonly index = input.required<number>();\n readonly basePath = input.required<string>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport {\n getByPath,\n resolveRepeatItemStatePath,\n resolveRepeatStatePath,\n} from '@json-render/core';\nimport { JrElement } from './element.component';\nimport { JrRepeatScope } from './repeat-scope.component';\nimport { JsonRenderRootContext } from './root-context';\nimport { JsonRenderStateService } from './state.service';\nimport { REPEAT_SCOPE, injectRenderContext } from './tokens';\n\n/**\n * Renders the children of the current element. Place it inside a catalog\n * component's template where nested content should appear — like a\n * `<router-outlet>` for the spec tree.\n *\n * - Default (no `slot`): renders `element.children`, honoring the element's\n * `repeat` field (one pass per item of the referenced state array, with the\n * proper repeat scope for `$item` / `$index` / `$bindItem` expressions).\n * - With `slot`: renders the element keys of `element.slots[slot]`.\n *\n * @example\n * ```html\n * <div class=\"card\">\n * <h3>{{ ctx.props().title }}</h3>\n * <jr-children />\n * </div>\n * ```\n */\n@Component({\n selector: 'jr-children',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [JrElement, JrRepeatScope],\n styles: `:host { display: contents; }`,\n template: `\n @if (repeat()) {\n @for (item of repeatItems(); track trackItem($index, item)) {\n <jr-repeat-scope\n [item]=\"item\"\n [index]=\"$index\"\n [basePath]=\"itemPath($index)\"\n >\n @for (key of childKeys(); track key) {\n <jr-element [elementKey]=\"key\" />\n }\n </jr-repeat-scope>\n }\n } @else {\n @for (key of childKeys(); track key) {\n <jr-element [elementKey]=\"key\" />\n }\n }\n `,\n})\nexport class JrChildren {\n /** Named slot to render instead of the default children. */\n readonly slot = input<string | null>(null);\n\n private readonly ctx = injectRenderContext();\n private readonly root = inject(JsonRenderRootContext);\n private readonly state = inject(JsonRenderStateService);\n // The repeat scope enclosing the host element (scopes created by this\n // element's own repeat live below, in the template).\n private readonly parentScope = inject(REPEAT_SCOPE, { optional: true });\n\n protected readonly childKeys = computed<string[]>(() => {\n const el = this.ctx.element();\n if (!el) return [];\n const slot = this.slot();\n if (slot) return el.slots?.[slot] ?? [];\n return el.children ?? [];\n });\n\n protected readonly repeat = computed(() => {\n if (this.slot()) return undefined;\n return this.ctx.element()?.repeat;\n });\n\n private readonly repeatBasePath = computed<string | undefined>(() => {\n const rep = this.repeat();\n if (!rep) return undefined;\n const resolved = resolveRepeatStatePath(\n rep.statePath,\n this.parentScope?.basePath(),\n );\n if (resolved === undefined) {\n console.warn(\n '[ngx-json-render] $item in repeat.statePath used outside of a repeat scope',\n );\n }\n return resolved;\n });\n\n protected readonly repeatItems = computed<unknown[]>(() => {\n const basePath = this.repeatBasePath();\n if (basePath === undefined) return [];\n return (\n (getByPath(this.state.state(), basePath) as unknown[] | undefined) ?? []\n );\n });\n\n constructor() {\n // Warn (once per key) about children referencing missing elements.\n const warned = new Set<string>();\n effect(() => {\n if (this.root.loading()) return;\n const spec = this.root.spec();\n if (!spec) return;\n for (const key of this.childKeys()) {\n if (!spec.elements?.[key] && !warned.has(key)) {\n warned.add(key);\n console.warn(\n `[json-render] Missing element \"${key}\" referenced as child of \"${untracked(this.ctx.element)?.type}\". This element will not render.`,\n );\n }\n }\n });\n }\n\n protected itemPath(index: number): string {\n return resolveRepeatItemStatePath(this.repeatBasePath()!, index);\n }\n\n protected trackItem(index: number, item: unknown): unknown {\n const rep = untracked(this.repeat);\n if (rep?.key && typeof item === 'object' && item !== null) {\n return (item as Record<string, unknown>)[rep.key] ?? index;\n }\n return index;\n }\n}\n","import type { Type } from '@angular/core';\nimport type { Catalog, StateStore } from '@json-render/core';\nimport { flattenToPointers } from '@json-render/core/store-utils';\nimport type {\n Actions,\n CatalogHasActions,\n ComponentRegistry,\n Components,\n RegistryEntry,\n SetState,\n StateModel,\n} from './types';\n\n/**\n * Result returned by {@link defineRegistry}.\n */\nexport interface DefineRegistryResult {\n /** Component registry for `<json-render [registry]=\"...\">`. */\n registry: ComponentRegistry;\n /**\n * Create renderer-compatible handlers from the catalog actions.\n * Accepts getter functions so handlers always read the latest\n * state/setState.\n */\n handlers: (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ) => Record<string, (params: Record<string, unknown>) => Promise<void>>;\n /**\n * Execute an action by name imperatively\n * (for use outside the renderer tree, e.g. initial state loading).\n */\n executeAction: (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state?: StateModel,\n ) => Promise<void>;\n}\n\n/**\n * Options for defineRegistry.\n *\n * When the catalog declares actions, the `actions` field is required.\n * When the catalog has no actions (or `actions: {}`), the field is optional.\n */\ntype DefineRegistryOptions<C extends Catalog> = {\n components?: Components<C>;\n} & (CatalogHasActions<C> extends true\n ? { actions: Actions<C> }\n : { actions?: Actions<C> });\n\n/** @internal */\ntype DefineRegistryActionFn = (\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel,\n) => Promise<void>;\n\n/**\n * Create a registry from a catalog with components and/or actions.\n *\n * Component keys are type-checked against the catalog, and slot metadata from\n * the catalog is carried into the registry for dev-mode slot warnings.\n *\n * @example\n * ```ts\n * const { registry, handlers } = defineRegistry(catalog, {\n * components: { Card: CardComponent, Button: ButtonComponent },\n * actions: {\n * refresh: async (params, setState) => {\n * setState((prev) => ({ ...prev, refreshedAt: Date.now() }));\n * },\n * },\n * });\n * ```\n */\nexport function defineRegistry<C extends Catalog>(\n catalog: C,\n options: DefineRegistryOptions<C>,\n): DefineRegistryResult {\n const catalogComponents = (\n catalog as unknown as {\n data?: { components?: Record<string, { slots?: string[] }> };\n }\n ).data?.components;\n\n // Build the component registry, attaching slot metadata from the catalog.\n const registry: ComponentRegistry = {};\n if (options.components) {\n for (const [name, component] of Object.entries(options.components) as Array<\n [string, Type<unknown>]\n >) {\n const entry: RegistryEntry = { component };\n const slots = catalogComponents?.[name]?.slots;\n if (slots) entry.slots = slots;\n registry[name] = entry;\n }\n }\n\n // Build action helpers.\n const actionMap = options.actions\n ? (Object.entries(options.actions) as Array<\n [string, DefineRegistryActionFn]\n >)\n : [];\n\n const handlers = (\n getSetState: () => SetState | undefined,\n getState: () => StateModel,\n ): Record<string, (params: Record<string, unknown>) => Promise<void>> => {\n const result: Record<\n string,\n (params: Record<string, unknown>) => Promise<void>\n > = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n\n const executeAction = async (\n actionName: string,\n params: Record<string, unknown> | undefined,\n setState: SetState,\n state: StateModel = {},\n ): Promise<void> => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n\n return { registry, handlers, executeAction };\n}\n\n/**\n * Build a {@link SetState} (whole-state updater) on top of a path-based\n * store. The updater's result is diffed against the previous state and only\n * changed leaves are written, preserving fine-grained reactivity.\n *\n * Works with both a core {@link StateStore} and the renderer's injected\n * `JsonRenderStateService`.\n */\nexport function createStoreSetState(\n store: Pick<StateStore, 'getSnapshot' | 'update'>,\n): SetState {\n return (updater) => {\n const prev = store.getSnapshot();\n const next = updater(prev);\n if (next === prev) return;\n const prevFlat = flattenToPointers(prev);\n const nextFlat = flattenToPointers(next);\n const allKeys = new Set([\n ...Object.keys(prevFlat),\n ...Object.keys(nextFlat),\n ]);\n const updates: Record<string, unknown> = {};\n for (const key of allKeys) {\n if (prevFlat[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : undefined;\n }\n }\n if (Object.keys(updates).length > 0) {\n store.update(updates);\n }\n };\n}\n","import type { JsonPatch, Spec, UIElement } from '@json-render/core';\nimport {\n addByPath,\n getByPath,\n removeByPath,\n setByPath,\n} from '@json-render/core';\n\n/**\n * Writes a value at a path inside an already-private object. `addByPath` and\n * `setByPath` differ only on arrays — RFC 6902 `add` splices, `replace`\n * overwrites — which is why the op picks the writer rather than the path\n * routing below.\n */\ntype PathWriter = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n) => void;\n\n/**\n * Split a JSON Pointer into its segments, undoing RFC 6901's escapes.\n *\n * `@json-render/core` parses pointers the same way for `setByPath` and\n * friends but does not export the helper, so {@link copyAlongPath} carries\n * its own copy. The two must agree on where a path descends, or a write would\n * land on a node that was never copied.\n */\nfunction parseJsonPointer(path: string): string[] {\n const raw = path.startsWith('/') ? path.slice(1).split('/') : path.split('/');\n return raw.map((token) => token.replace(/~1/g, '/').replace(/~0/g, '~'));\n}\n\n/**\n * Replace every node `path` descends through with a shallow copy of itself.\n *\n * `root` must already be private to the caller. Afterwards a mutating write\n * along that same path — `setByPath`, `addByPath`, `removeByPath` — only ever\n * touches nodes nobody else is holding, while everything off the path stays\n * shared. That keeps a patch proportional to the depth of its path rather than\n * to the size of the spec, which matters when a stream applies hundreds of\n * them.\n *\n * Descent stops at anything that is not an object: the writers overwrite such\n * a node outright, and one that does not exist yet is created fresh, so in\n * neither case is there anything of the caller's left to protect.\n */\nfunction copyAlongPath(root: Record<string, unknown>, path: string): void {\n const segments = parseJsonPointer(path);\n let current = root;\n\n // The final segment is written, not descended into, so it needs no copy.\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i];\n const child = current[segment];\n if (child === null || typeof child !== 'object') return;\n\n const copy = Array.isArray(child)\n ? [...child]\n : { ...(child as Record<string, unknown>) };\n current[segment] = copy;\n current = copy as unknown as Record<string, unknown>;\n }\n}\n\n/**\n * Write a value at a spec path, copying every node on the way so the caller's\n * previous spec keeps its own contents.\n */\nfunction writeSpecValue(\n newSpec: Spec,\n path: string,\n value: unknown,\n write: PathWriter,\n): void {\n if (path === '/root') {\n newSpec.root = value as string;\n return;\n }\n\n if (path === '/state') {\n newSpec.state = value as Record<string, unknown>;\n return;\n }\n\n if (path.startsWith('/state/')) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice('/state'.length); // e.g. \"/posts\"\n const state = newSpec.state as Record<string, unknown>;\n copyAlongPath(state, statePath);\n write(state, statePath, value);\n return;\n }\n\n if (path.startsWith('/elements/')) {\n const pathParts = path.slice('/elements/'.length).split('/');\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value as UIElement;\n return;\n }\n\n // A prop path whose element is not there is dropped rather than\n // auto-created: the generic writers would happily conjure an element with\n // props and no `type`, which renders as nothing and warns about an unknown\n // component. A malformed patch should lose its own write, not add a broken\n // element to the tree.\n const element = newSpec.elements[elementKey];\n if (!element) return;\n\n const propPath = '/' + pathParts.slice(1).join('/');\n const newElement = { ...element } as unknown as Record<string, unknown>;\n copyAlongPath(newElement, propPath);\n write(newElement, propPath, value);\n newSpec.elements[elementKey] = newElement as unknown as UIElement;\n return;\n }\n\n // Any other top-level path is applied verbatim. The spec grammar is\n // upstream's and grows without this renderer: dropping what we do not\n // recognise would silently discard a field a newer `@json-render/core`\n // understands.\n const root = newSpec as unknown as Record<string, unknown>;\n copyAlongPath(root, path);\n write(root, path, value);\n}\n\n/** Remove the value at a spec path, with the same copy-on-write discipline. */\nfunction removeSpecValue(newSpec: Spec, path: string): void {\n if (path === '/state') {\n delete newSpec.state;\n return;\n }\n\n if (path.startsWith('/state/') && newSpec.state) {\n const statePath = path.slice('/state'.length);\n const state = newSpec.state as Record<string, unknown>;\n copyAlongPath(state, statePath);\n removeByPath(state, statePath);\n return;\n }\n\n if (path.startsWith('/elements/')) {\n const pathParts = path.slice('/elements/'.length).split('/');\n const elementKey = pathParts[0];\n if (!elementKey) return;\n\n if (pathParts.length === 1) {\n const { [elementKey]: _removed, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n return;\n }\n\n const element = newSpec.elements[elementKey];\n if (!element) return;\n\n const propPath = '/' + pathParts.slice(1).join('/');\n const newElement = { ...element } as unknown as Record<string, unknown>;\n copyAlongPath(newElement, propPath);\n removeByPath(newElement, propPath);\n newSpec.elements[elementKey] = newElement as unknown as UIElement;\n return;\n }\n\n const root = newSpec as unknown as Record<string, unknown>;\n copyAlongPath(root, path);\n removeByPath(root, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to a spec, returning a new spec object and\n * sharing every subtree the patch did not touch.\n *\n * This is the only patch engine in the package: `injectUIStream`,\n * `injectChatUI` and `buildSpecFromParts` all route through it, so the same\n * stream produces the same spec whichever one an app reached for. The write\n * primitives come from `@json-render/core`, so `add` splices into an array\n * where `replace` overwrites, exactly as the other renderers do.\n *\n * One deliberate deviation from RFC 6902: a failing `test` op is a no-op\n * rather than an abort. These patches come off a model's output, where the\n * established behaviour — see the line parser — is to drop what does not make\n * sense and keep rendering rather than kill a generation mid-flight.\n */\nexport function applyPatch(spec: Spec, patch: JsonPatch): Spec {\n const newSpec = {\n ...spec,\n elements: { ...spec.elements },\n ...(spec.state ? { state: { ...spec.state } } : {}),\n };\n\n switch (patch.op) {\n case 'add': {\n writeSpecValue(newSpec, patch.path, patch.value, addByPath);\n break;\n }\n case 'replace': {\n writeSpecValue(newSpec, patch.path, patch.value, setByPath);\n break;\n }\n case 'remove': {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case 'move': {\n if (!patch.from) break;\n const moveValue = getByPath(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n writeSpecValue(newSpec, patch.path, moveValue, addByPath);\n break;\n }\n case 'copy': {\n if (!patch.from) break;\n // RFC 6902 copies the *value*. Handing over the live reference instead\n // aliases source and target, and a `path` that descends into its own\n // `from` then makes the spec self-referential — which the next request\n // discovers when it tries to serialise it into the body.\n const copyValue = structuredClone(getByPath(newSpec, patch.from));\n writeSpecValue(newSpec, patch.path, copyValue, addByPath);\n break;\n }\n case 'test': {\n break;\n }\n }\n\n return newSpec;\n}\n","import { type Signal, computed } from '@angular/core';\nimport type {\n FlatElement,\n Spec,\n SpecDataPart,\n UIElement,\n} from '@json-render/core';\nimport { SPEC_DATA_PART_TYPE, nestedToFlat } from '@json-render/core';\nimport { applyPatch } from './patch';\n\n/**\n * Convert a flat element list to a Spec.\n * Input elements use key/parentKey to establish identity and relationships.\n * Output spec uses the map-based format where key is the map entry key\n * and parent-child relationships are expressed through children arrays.\n */\nexport function flatToTree(elements: FlatElement[]): Spec {\n // The map is what gives every element its children array, so the second\n // pass can push into one without checking for it.\n const elementMap: Record<string, UIElement & { children: string[] }> = {};\n let root = '';\n\n // First pass: add all elements to map\n for (const element of elements) {\n elementMap[element.key] = {\n type: element.type,\n props: element.props,\n children: [],\n visible: element.visible,\n };\n }\n\n // Second pass: build parent-child relationships\n for (const element of elements) {\n if (element.parentKey) {\n const parent = elementMap[element.parentKey];\n if (parent) {\n parent.children.push(element.key);\n }\n } else {\n root = element.key;\n }\n }\n\n return { root, elements: elementMap };\n}\n\n/**\n * A single part from the AI SDK's `message.parts` array. This is a minimal\n * structural type so that library helpers do not depend on the AI SDK.\n */\nexport interface DataPart {\n type: string;\n text?: string;\n data?: unknown;\n /**\n * The SDK's reconciliation key. A part written with one is *replaced* by the\n * next part carrying the same id, rather than followed by it — so a spec\n * streamed as patches must be written without an id, and only a whole-spec\n * part (`flat` / `nested`), which is a snapshot of itself, can share one.\n */\n id?: string;\n}\n\n/**\n * Type guard that validates a data part payload looks like a valid\n * {@link SpecDataPart} before we cast it.\n */\nfunction isSpecDataPart(data: unknown): data is SpecDataPart {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n switch (obj['type']) {\n case 'patch':\n return typeof obj['patch'] === 'object' && obj['patch'] !== null;\n case 'flat':\n case 'nested':\n return typeof obj['spec'] === 'object' && obj['spec'] !== null;\n default:\n return false;\n }\n}\n\n/**\n * Build a `Spec` by replaying all spec data parts from a message's\n * parts array (AI SDK `UIMessage.parts`). Returns `null` if no spec data\n * parts are present.\n */\nexport function buildSpecFromParts(parts: DataPart[]): Spec | null {\n let spec: Spec = { root: '', elements: {} };\n let hasSpec = false;\n\n for (const part of parts) {\n if (part.type === SPEC_DATA_PART_TYPE) {\n if (!isSpecDataPart(part.data)) continue;\n const payload = part.data;\n if (payload.type === 'patch') {\n hasSpec = true;\n spec = applyPatch(spec, payload.patch);\n } else if (payload.type === 'flat') {\n hasSpec = true;\n spec = { ...spec, ...payload.spec };\n } else if (payload.type === 'nested') {\n hasSpec = true;\n spec = { ...spec, ...nestedToFlat(payload.spec) };\n }\n }\n }\n\n return hasSpec ? spec : null;\n}\n\n/**\n * Extract and join all text content from a message's parts array.\n */\nexport function getTextFromParts(parts: DataPart[]): string {\n return parts\n .filter(\n (p): p is DataPart & { text: string } =>\n p.type === 'text' && typeof p.text === 'string',\n )\n .map((p) => p.text.trim())\n .filter(Boolean)\n .join('\\n\\n');\n}\n\n/**\n * Extract both the json-render spec and the text content from a message's\n * parts array, as memoized signals. Angular counterpart of\n * `useJsonRenderMessage` from the other renderers.\n *\n * @example\n * ```ts\n * readonly msg = jsonRenderMessage(() => this.message().parts);\n * // template: @if (msg.hasSpec()) { <json-render [spec]=\"msg.spec()\" ... /> }\n * ```\n */\nexport function jsonRenderMessage(\n parts: Signal<DataPart[]> | (() => DataPart[]),\n): {\n spec: Signal<Spec | null>;\n text: Signal<string>;\n hasSpec: Signal<boolean>;\n} {\n const result = computed(() => {\n const p = parts();\n return {\n spec: buildSpecFromParts(p),\n text: getTextFromParts(p),\n };\n });\n\n return {\n spec: computed(() => result().spec),\n text: computed(() => result().text),\n hasSpec: computed(() => {\n const s = result().spec;\n return s !== null && Object.keys(s.elements || {}).length > 0;\n }),\n };\n}\n","/**\n * Sink for the decoded text of a streamed response. `@json-render/core`'s\n * mixed-stream parser already has this shape, so a hook can hand its own\n * consumer or the core one to {@link streamRequest} unchanged.\n */\nexport interface StreamConsumer {\n push(text: string): void;\n flush(): void;\n}\n\n/** One streamed POST: where to send it, what to send, and how to cancel it. */\nexport interface StreamRequest {\n api: string;\n body: unknown;\n fetch?: typeof globalThis.fetch;\n signal: AbortSignal;\n}\n\n/**\n * The write permit of a single request.\n *\n * A hook's signals are shared by every request it ever makes, so a request\n * that has been superseded must not write to them on its way out — its stale\n * spec would flash over the fresh one, and its `finally` would clear\n * `isStreaming` while its replacement is still streaming. Routing every write\n * and callback through {@link commit} makes that structural: a superseded\n * request has no way to reach the signals, rather than each write site being\n * individually responsible for remembering to check.\n */\nexport interface RequestGate {\n readonly signal: AbortSignal;\n /** Whether this request is still the session's current one. */\n isCurrent(): boolean;\n /** Run `write` only while this request is still the current one. */\n commit(write: () => void): void;\n}\n\n/**\n * Tracks which request owns a hook's signals. Each {@link begin} supersedes\n * the one before it.\n */\nexport interface StreamSession {\n begin(): RequestGate;\n /** Abort the in-flight request, leaving no request current. */\n cancel(): void;\n}\n\nexport function createStreamSession(): StreamSession {\n let current: AbortController | null = null;\n\n return {\n begin(): RequestGate {\n current?.abort();\n const controller = new AbortController();\n current = controller;\n const isCurrent = () => current === controller;\n return {\n signal: controller.signal,\n isCurrent,\n commit(write) {\n if (isCurrent()) write();\n },\n };\n },\n cancel() {\n current?.abort();\n // Cleared, not just aborted: with no current controller the in-flight\n // request's gate closes too, so a stop() cannot be undone a moment later\n // by the request it just cancelled.\n current = null;\n },\n };\n}\n\n/** True for the rejection `fetch` and a stream reader raise on abort. */\nexport function isAbortError(error: unknown): boolean {\n return (error as Error | undefined)?.name === 'AbortError';\n}\n\n/**\n * Buffer decoded text and hand back whole lines, dropping blank ones. What is\n * left when the stream ends is flushed as a final line, since a model's last\n * line often arrives without its newline.\n */\nexport function createLineConsumer(\n onLine: (line: string) => void,\n): StreamConsumer {\n let buffer = '';\n return {\n push(text) {\n buffer += text;\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) onLine(trimmed);\n }\n },\n flush() {\n const trimmed = buffer.trim();\n buffer = '';\n if (trimmed) onLine(trimmed);\n },\n };\n}\n\n/**\n * Mine an error response for something better to show than its status code.\n */\nasync function readErrorMessage(response: Response): Promise<string> {\n try {\n const body = await response.json();\n if (body.message) return String(body.message);\n if (body.error) return String(body.error);\n } catch {\n // A non-JSON error body is ordinary; the status line still says enough.\n }\n return `HTTP error: ${response.status}`;\n}\n\n/**\n * POST `body` and feed the streamed response to `consumer` until it ends.\n *\n * Both hooks share this so the request lifecycle — error mining, the reader\n * loop, the decoder's final flush — has one implementation to get right\n * rather than one per hook that has to be fixed twice.\n */\nexport async function streamRequest(\n request: StreamRequest,\n consumer: StreamConsumer,\n): Promise<void> {\n // Bound, because a bare `globalThis.fetch` called as a plain function is\n // an illegal invocation in the browser.\n const doFetch = request.fetch ?? globalThis.fetch.bind(globalThis);\n\n const response = await doFetch(request.api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request.body),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw new Error(await readErrorMessage(response));\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n consumer.push(decoder.decode(value, { stream: true }));\n }\n\n // Without the final, non-streaming decode a multi-byte character split\n // across the last chunk is dropped instead of surfacing.\n const tail = decoder.decode();\n if (tail) consumer.push(tail);\n\n consumer.flush();\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\nimport type { JsonPatch, Spec, SpecIssue } from '@json-render/core';\nimport { formatSpecIssues } from '@json-render/core';\nimport {\n type SpecValidationMode,\n checkSpec,\n reportSpecCheck,\n} from '../spec-validation';\nimport { applyPatch } from './patch';\nimport {\n createLineConsumer,\n createStreamSession,\n isAbortError,\n streamRequest,\n} from './transport';\n\n/**\n * Token usage metadata from AI generation.\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n/**\n * Parse result for a single line — either a patch or usage metadata.\n */\ntype ParsedLine =\n | { type: 'patch'; patch: JsonPatch }\n | { type: 'usage'; usage: TokenUsage }\n | null;\n\n/**\n * Parse a single JSON line (patch or metadata). Anything that is not one of\n * the two is dropped: half-written lines and stray prose are ordinary in a\n * model's output, and aborting the generation over one would lose the UI\n * built so far.\n */\nfunction parseLine(line: string): ParsedLine {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//')) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n\n // Check for usage metadata\n if (parsed.__meta === 'usage') {\n return {\n type: 'usage',\n usage: {\n promptTokens: parsed.promptTokens ?? 0,\n completionTokens: parsed.completionTokens ?? 0,\n totalTokens: parsed.totalTokens ?? 0,\n },\n };\n }\n\n // Parseable JSON is not yet a patch: without this, a stray object would be\n // recorded as a raw line and handed to the engine as an opless patch.\n if (typeof parsed?.op !== 'string' || typeof parsed?.path !== 'string') {\n return null;\n }\n\n return { type: 'patch', patch: parsed as JsonPatch };\n } catch {\n return null;\n }\n}\n\n/**\n * Per-call options for {@link UIStreamReturn.send}.\n */\nexport interface UIStreamSendOptions {\n /** Arbitrary context forwarded to the endpoint as `context`. */\n context?: Record<string, unknown>;\n /**\n * Spec to refine instead of starting from an empty one. It is sent to the\n * endpoint as `currentSpec` and the streamed patches apply on top of it.\n */\n previousSpec?: Spec;\n}\n\n/**\n * Options for {@link injectUIStream}.\n */\nexport interface UIStreamOptions {\n /** API endpoint */\n api: string;\n /** Callback when complete */\n onComplete?: (spec: Spec) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /**\n * Whether to check the finished spec's structure, and what a problem means.\n * Off by default.\n *\n * The check runs once, when the generation completes — a spec mid-stream is\n * supposed to be incomplete. Both modes apply the lossless fixes and publish\n * the fixed spec; `'warn'` reports what is left, while `'strict'` fails the\n * generation instead of calling `onComplete`, so an app that persists the\n * spec there does not persist a broken one.\n */\n validate?: SpecValidationMode;\n /**\n * Transport, defaulting to the global `fetch`.\n *\n * Anything with fetch's shape works, so a test, a demo replaying a recorded\n * generation, or an app that has to add auth headers or route through its\n * own HTTP layer can supply one instead of patching the global. It is called\n * with the endpoint and a request carrying the JSON body and the abort\n * signal, and must resolve to a `Response` whose `body` is a readable\n * stream of the JSONL patches.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Return type for {@link injectUIStream}.\n */\nexport interface UIStreamReturn {\n /** Current UI spec */\n readonly spec: Signal<Spec | null>;\n /** Whether currently streaming */\n readonly isStreaming: Signal<boolean>;\n /** Error if any */\n readonly error: Signal<Error | null>;\n /** Token usage from the last generation */\n readonly usage: Signal<TokenUsage | null>;\n /** Raw JSONL lines received from the stream (JSON patch lines) */\n readonly rawLines: Signal<string[]>;\n /**\n * Structural issues in the finished spec. Empty until a generation\n * completes, and always empty while `validate` is off.\n */\n readonly issues: Signal<readonly SpecIssue[]>;\n /** Send a prompt to generate UI */\n send: (prompt: string, options?: UIStreamSendOptions) => Promise<void>;\n /**\n * Stop the in-flight generation, keeping whatever has rendered so far.\n * A no-op when nothing is streaming.\n */\n stop: () => void;\n /** Stop any generation and clear the spec, error, usage and raw lines. */\n clear: () => void;\n}\n\n/**\n * Streaming UI generation. POSTs `{ prompt, context, currentSpec }` to the\n * endpoint and progressively applies the returned JSONL patch stream to the\n * `spec` signal, so partial UIs render as they arrive.\n *\n * Must be called in an injection context (aborts in-flight requests on\n * destroy).\n *\n * @example\n * ```ts\n * export class GeneratePage {\n * readonly ui = injectUIStream({ api: '/api/generate' });\n * }\n * // template:\n * // <json-render [spec]=\"ui.spec()\" [registry]=\"registry\" [loading]=\"ui.isStreaming()\" />\n * ```\n */\nexport function injectUIStream(options: UIStreamOptions): UIStreamReturn {\n const spec = signal<Spec | null>(null);\n const isStreaming = signal(false);\n const error = signal<Error | null>(null);\n const usage = signal<TokenUsage | null>(null);\n const rawLines = signal<string[]>([]);\n const issues = signal<readonly SpecIssue[]>([]);\n const validate = options.validate ?? 'off';\n const session = createStreamSession();\n\n inject(DestroyRef).onDestroy(() => session.cancel());\n\n const stop = () => {\n session.cancel();\n isStreaming.set(false);\n };\n\n const clear = () => {\n // Aborting first is what makes this true: without it the in-flight\n // request puts its spec straight back on the next patch it applies.\n stop();\n spec.set(null);\n error.set(null);\n usage.set(null);\n rawLines.set([]);\n issues.set([]);\n };\n\n const send = async (prompt: string, sendOptions?: UIStreamSendOptions) => {\n const gate = session.begin();\n\n isStreaming.set(true);\n error.set(null);\n usage.set(null);\n rawLines.set([]);\n issues.set([]);\n\n const previousSpec = sendOptions?.previousSpec;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: '', elements: {} };\n spec.set(currentSpec);\n\n const handleLine = (line: string) => {\n const parsed = parseLine(line);\n if (!parsed) return;\n gate.commit(() => {\n if (parsed.type === 'usage') {\n usage.set(parsed.usage);\n return;\n }\n rawLines.update((prev) => [...prev, line]);\n currentSpec = applyPatch(currentSpec, parsed.patch);\n spec.set(currentSpec);\n });\n };\n\n try {\n await streamRequest(\n {\n api: options.api,\n body: {\n prompt,\n context: sendOptions?.context,\n currentSpec,\n },\n fetch: options.fetch,\n signal: gate.signal,\n },\n createLineConsumer(handleLine),\n );\n\n gate.commit(() => {\n const check = checkSpec(currentSpec, validate);\n reportSpecCheck(check, validate);\n if (check.spec) {\n currentSpec = check.spec;\n spec.set(currentSpec);\n }\n issues.set(check.issues);\n\n // Under `strict` a broken generation is a failure, not a result: the\n // app's onComplete is where a spec usually gets persisted, and handing\n // it one that cannot render is the outcome this mode is asked to\n // prevent. The spec stays put so the app can show or discard it.\n if (validate === 'strict' && check.hasErrors) {\n const invalid = new Error(\n `Generated spec failed validation:\\n${formatSpecIssues([...check.issues])}`,\n );\n error.set(invalid);\n options.onError?.(invalid);\n return;\n }\n options.onComplete?.(currentSpec);\n });\n } catch (err) {\n if (isAbortError(err)) return;\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n gate.commit(() => {\n error.set(resolvedError);\n options.onError?.(resolvedError);\n });\n } finally {\n gate.commit(() => isStreaming.set(false));\n }\n };\n\n return {\n spec: spec.asReadonly(),\n isStreaming: isStreaming.asReadonly(),\n error: error.asReadonly(),\n usage: usage.asReadonly(),\n rawLines: rawLines.asReadonly(),\n issues: issues.asReadonly(),\n send,\n stop,\n clear,\n };\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\nimport type { Spec, SpecIssue } from '@json-render/core';\nimport { createMixedStreamParser, formatSpecIssues } from '@json-render/core';\nimport {\n type SpecValidationMode,\n checkSpec,\n reportSpecCheck,\n} from '../spec-validation';\nimport { applyPatch } from './patch';\nimport { createStreamSession, isAbortError, streamRequest } from './transport';\n\n/**\n * A single message in the chat, which may contain text, a rendered UI spec,\n * or both.\n */\nexport interface ChatMessage {\n /** Unique message ID */\n id: string;\n /** Who sent this message */\n role: 'user' | 'assistant';\n /** Text content (conversational prose) */\n text: string;\n /** json-render Spec built from JSONL patches (null if no UI was generated) */\n spec: Spec | null;\n}\n\n/**\n * Options for {@link injectChatUI}.\n */\nexport interface ChatUIOptions {\n /** API endpoint that accepts `{ messages: Array<{ role, content }> }` and returns a text stream */\n api: string;\n /** Callback when streaming completes for a message */\n onComplete?: (message: ChatMessage) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /**\n * Transport, defaulting to the global `fetch`. Same contract as\n * `UIStreamOptions.fetch`: it receives the endpoint and a request\n * carrying the JSON body and the abort signal, and must resolve to a\n * `Response` whose `body` streams the reply.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Whether to check the spec a reply built, and what a problem means. Off by\n * default; same contract as `UIStreamOptions.validate`, applied once per\n * reply that produced a spec.\n */\n validate?: SpecValidationMode;\n}\n\n/**\n * Return type for {@link injectChatUI}.\n */\nexport interface ChatUIReturn {\n /** All messages in the conversation */\n readonly messages: Signal<ChatMessage[]>;\n /** Whether currently streaming an assistant response */\n readonly isStreaming: Signal<boolean>;\n /** Error from the last request, if any */\n readonly error: Signal<Error | null>;\n /**\n * Structural issues in the spec of the last completed reply. Empty until a\n * reply completes, and always empty while `validate` is off.\n */\n readonly issues: Signal<readonly SpecIssue[]>;\n /** Send a user message */\n send: (text: string) => Promise<void>;\n /**\n * Stop the in-flight reply, keeping whatever the assistant has said so far.\n * A no-op when nothing is streaming.\n */\n stop: () => void;\n /** Stop any reply and clear all messages and the error. */\n clear: () => void;\n}\n\nlet chatMessageIdCounter = 0;\nfunction generateChatId(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n chatMessageIdCounter += 1;\n return `msg-${Date.now()}-${chatMessageIdCounter}`;\n}\n\n/**\n * Chat + GenUI: manages a multi-turn conversation where each assistant\n * message can contain both conversational text and a json-render UI spec.\n * The full message history is sent to the endpoint and the streamed response\n * is split into text lines and JSONL patch lines.\n *\n * Must be called in an injection context.\n */\nexport function injectChatUI(options: ChatUIOptions): ChatUIReturn {\n const messages = signal<ChatMessage[]>([]);\n const isStreaming = signal(false);\n const error = signal<Error | null>(null);\n const issues = signal<readonly SpecIssue[]>([]);\n const validate = options.validate ?? 'off';\n const session = createStreamSession();\n\n inject(DestroyRef).onDestroy(() => session.cancel());\n\n const stop = () => {\n session.cancel();\n isStreaming.set(false);\n };\n\n const clear = () => {\n stop();\n messages.set([]);\n error.set(null);\n issues.set([]);\n };\n\n const send = async (text: string) => {\n if (!text.trim()) return;\n\n const gate = session.begin();\n\n const userMessage: ChatMessage = {\n id: generateChatId(),\n role: 'user',\n text: text.trim(),\n spec: null,\n };\n\n const assistantId = generateChatId();\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n text: '',\n spec: null,\n };\n\n /**\n * Drop this turn's assistant bubble if it never got any text.\n *\n * Deliberately outside the gate: the edit is scoped to this request's own\n * message id, so it is safe even once a newer request has appended its\n * turn — and a superseded request is exactly when it is needed, since an\n * empty bubble left behind renders as a blank reply and is serialised\n * into every later turn's history.\n */\n const dropEmptyPlaceholder = () => {\n messages.update((prev) =>\n prev.filter((m) => m.id !== assistantId || m.text.length > 0),\n );\n };\n\n // Built before the new turn is appended, so it carries the conversation so\n // far. Assistant turns with no text are left out: they say nothing to the\n // model, some providers reject empty content outright, and a turn being\n // superseded right now may still have its placeholder in the list.\n const historyForApi = [\n ...messages()\n .filter((m) => m.role !== 'assistant' || m.text.length > 0)\n .map((m) => ({\n role: m.role,\n content: m.text,\n })),\n { role: 'user' as const, content: text.trim() },\n ];\n\n // Append user message and empty assistant placeholder\n messages.update((prev) => [...prev, userMessage, assistantMessage]);\n isStreaming.set(true);\n error.set(null);\n\n // Mutable state for accumulating the assistant response\n let accumulatedText = '';\n let currentSpec: Spec = { root: '', elements: {} };\n let hasSpec = false;\n\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n // applyPatch returns a fresh spec that shares what the patch did not\n // touch, so the message can hold it directly — no snapshot copy.\n currentSpec = applyPatch(currentSpec, patch);\n const snapshot = currentSpec;\n gate.commit(() =>\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, spec: snapshot } : m,\n ),\n ),\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? '\\n' : '') + line;\n const snapshot = accumulatedText;\n gate.commit(() =>\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, text: snapshot } : m,\n ),\n ),\n );\n },\n });\n\n try {\n await streamRequest(\n {\n api: options.api,\n body: { messages: historyForApi },\n fetch: options.fetch,\n signal: gate.signal,\n },\n parser,\n );\n\n gate.commit(() => {\n // A reply that only talked has no spec to check, and reporting\n // \"missing root\" for a sentence would be nonsense.\n const check = checkSpec(hasSpec ? currentSpec : null, validate);\n if (hasSpec) {\n reportSpecCheck(check, validate);\n if (check.spec) currentSpec = check.spec;\n }\n issues.set(check.issues);\n\n const finalMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n text: accumulatedText,\n spec: hasSpec ? currentSpec : null,\n };\n // The reply keeps the fixed spec, so what renders in the bubble is\n // what was checked.\n messages.update((prev) =>\n prev.map((m) => (m.id === assistantId ? finalMessage : m)),\n );\n\n if (validate === 'strict' && check.hasErrors) {\n const invalid = new Error(\n `Generated spec failed validation:\\n${formatSpecIssues([...check.issues])}`,\n );\n error.set(invalid);\n options.onError?.(invalid);\n return;\n }\n options.onComplete?.(finalMessage);\n });\n } catch (err) {\n // Unconditional: however this turn ended, its own bubble goes with it if\n // nothing was ever said into it. A superseded request usually unwinds by\n // abort, but one whose stream failed for its own reason after being\n // replaced would otherwise leave the placeholder behind.\n dropEmptyPlaceholder();\n if (isAbortError(err)) return;\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n gate.commit(() => {\n error.set(resolvedError);\n options.onError?.(resolvedError);\n });\n } finally {\n gate.commit(() => isStreaming.set(false));\n }\n };\n\n return {\n messages: messages.asReadonly(),\n isStreaming: isStreaming.asReadonly(),\n error: error.asReadonly(),\n issues: issues.asReadonly(),\n send,\n stop,\n clear,\n };\n}\n","/**\n * Streaming: applying a model's output to a spec as it arrives.\n *\n * - `patch` — the immutable RFC 6902 engine every entry point applies through.\n * - `transport` — one streamed request lifecycle, shared by both hooks.\n * - `parts` — adapters for the AI SDK's message parts.\n * - `ui-stream` / `chat-ui` — the two hooks, composed from the above.\n */\nexport { applyPatch } from './patch';\nexport {\n buildSpecFromParts,\n flatToTree,\n getTextFromParts,\n jsonRenderMessage,\n type DataPart,\n} from './parts';\nexport {\n injectUIStream,\n type TokenUsage,\n type UIStreamOptions,\n type UIStreamReturn,\n type UIStreamSendOptions,\n} from './ui-stream';\nexport {\n injectChatUI,\n type ChatMessage,\n type ChatUIOptions,\n type ChatUIReturn,\n} from './chat-ui';\n","import { defineSchema } from '@json-render/core';\n\n/**\n * The schema for ngx-json-render.\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas, and optional actions\n *\n * This is the same spec grammar the other json-render renderers use, so\n * catalogs and specs are portable across frameworks.\n */\nexport const schema = defineSchema(\n (s) => ({\n // What the AI-generated SPEC looks like\n spec: s.object({\n /** Root element key */\n root: s.string(),\n /** Flat map of elements by key */\n elements: s.record(\n s.object({\n /** Component type from catalog */\n type: s.ref('catalog.components'),\n /** Component props */\n props: s.propsOf('catalog.components'),\n /** Child element keys (flat reference) */\n children: s.array(s.string()),\n /** Visibility condition */\n visible: { ...s.any(), ...s.optional() },\n /** Repeat children from a state array */\n repeat: { ...s.any(), ...s.optional() },\n }),\n ),\n }),\n\n // What the CATALOG must provide\n catalog: s.object({\n /** Component definitions */\n components: s.map({\n /** Zod schema for component props */\n props: s.zod(),\n /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */\n slots: s.array(s.string()),\n /** Description for AI generation hints */\n description: s.string(),\n /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example: s.any(),\n }),\n /** Action definitions (optional) */\n actions: s.map({\n /** Zod schema for action params */\n params: s.zod(),\n /** Description for AI generation hints */\n description: s.string(),\n }),\n }),\n }),\n {\n builtInActions: [\n {\n name: 'setState',\n description:\n 'Update a value in the state model at the given statePath. Params: { statePath: string, value: any }',\n },\n {\n name: 'pushState',\n description:\n 'Append an item to an array in state. Params: { statePath: string, value: any, clearStatePath?: string }. Value can contain {\"$state\":\"/path\"} refs and \"$id\" for auto IDs.',\n },\n {\n name: 'removeState',\n description:\n 'Remove an item from an array in state by index. Params: { statePath: string, index: number }',\n },\n {\n name: 'validateForm',\n description:\n 'Validate all registered form fields and write the result to state. Params: { statePath?: string }. Defaults to /formValidation. Result: { valid: boolean, errors: Record<string, string[]> }.',\n },\n {\n name: 'submitForm',\n description:\n \"Validate all registered form fields and, only if every one passes, dispatch another action. Params: { action: string, params?: object, statePath?: string }. Writes the same { valid, errors } result as validateForm. Use this on a form's submit button: it is validateForm and the submit in one binding, and the submit is skipped when the form is invalid.\",\n },\n ],\n defaultRules: [\n // Element integrity\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist. A missing child element causes that entire branch of the UI to be invisible.\",\n 'SELF-CHECK: After generating all elements, mentally walk the tree from root. Every key in every children array must resolve to a defined element. If you find a gap, output the missing element immediately.',\n 'REQUIRED FIELDS: Every element MUST include a \"children\" array. Leaf elements (text, badges, inputs, images) use an empty array: \"children\": []. Omitting \"children\" fails validation.',\n\n // Field placement\n 'CRITICAL: The \"visible\" field goes on the ELEMENT object, NOT inside \"props\". Correct: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{\"$state\":\"/tab\",\"eq\":\"home\"},\"children\":[...]}.',\n 'CRITICAL: The \"on\" field goes on the ELEMENT object, NOT inside \"props\". Use on.press, on.change, on.submit etc. NEVER put action/actionParams inside props.',\n\n // State and data\n 'When the user asks for a UI that displays data (e.g. blog posts, products, users), ALWAYS include a state field with realistic sample data. The state field is a top-level field on the spec (sibling of root/elements).',\n 'When building repeating content backed by a state array (e.g. posts, products, items), use the \"repeat\" field on a container element. Example: { \"type\": \"<ContainerComponent>\", \"props\": {}, \"repeat\": { \"statePath\": \"/posts\", \"key\": \"id\" }, \"children\": [\"post-card\"] }. For a nested list stored on the enclosing item, use \"repeat\": { \"statePath\": { \"$item\": \"comments\" }, \"key\": \"id\" }. The $item statePath form is valid only inside another repeat. Inside repeated children, use { \"$item\": \"field\" } to read a field from the current item, and { \"$index\": true } for the current array index. For two-way binding to an item field use { \"$bindItem\": \"completed\" }. Do NOT hardcode individual elements for each array item.',\n\n // Design quality\n 'Design with visual hierarchy: use container components to group content, heading components for section titles, proper spacing, and status indicators. ONLY use components from the AVAILABLE COMPONENTS list.',\n 'For data-rich UIs, use multi-column layout components if available. For forms and single-column content, use vertical layout components. ONLY use components from the AVAILABLE COMPONENTS list.',\n 'Always include realistic, professional-looking sample data. For blogs include 3-4 posts with varied titles, authors, dates, categories. For products include names, prices, images. Never leave data empty.',\n ],\n },\n);\n\n/**\n * Type for the Angular schema\n */\nexport type AngularSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type AngularSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n","/*\n * Public API Surface of ngx-json-render\n */\n\n// Renderer components\nexport { JsonRenderer } from './lib/renderer.component';\nexport { JrChildren } from './lib/children.component';\nexport { JrElement } from './lib/element.component';\nexport { JrRepeatScope } from './lib/repeat-scope.component';\nexport { JrConfirmDialog } from './lib/confirm-dialog.component';\nexport {\n CONFIRM_CONTEXT,\n JR_CONFIRM_DIALOG,\n JR_CONFIRM_LABELS,\n injectConfirmContext,\n type ConfirmContext,\n type ConfirmLabels,\n} from './lib/confirm-tokens';\n\n// Render context / DI\nexport {\n ELEMENT_KEY,\n RENDER_CONTEXT,\n REPEAT_SCOPE,\n injectElementKey,\n injectRenderContext,\n injectRepeatScope,\n} from './lib/tokens';\nexport { JsonRenderRootContext } from './lib/root-context';\n\n// State\nexport {\n JsonRenderStateService,\n injectStateStore,\n injectStateValue,\n injectStateBinding,\n injectBoundProp,\n} from './lib/state.service';\n\n// Actions\nexport {\n JsonRenderActionsService,\n injectActions,\n injectAction,\n isActionCancelled,\n type PendingConfirmation,\n} from './lib/actions.service';\n\n// Validation\nexport {\n JsonRenderValidationService,\n injectValidation,\n injectFieldValidation,\n type FieldValidationState,\n} from './lib/validation.service';\n\n// Spec validation\nexport {\n checkSpec,\n type SpecCheck,\n type SpecValidationMode,\n} from './lib/spec-validation';\n\n// Registry\nexport {\n defineRegistry,\n createStoreSetState,\n type DefineRegistryResult,\n} from './lib/registry';\n\n// Types\nexport type {\n Actions,\n ActionFn,\n CatalogHasActions,\n ComponentRegistry,\n Components,\n EventHandle,\n RegistryEntry,\n RenderContext,\n RepeatScope,\n SetState,\n StateChange,\n StateModel,\n} from './lib/types';\n\n// Streaming / AI helpers\nexport {\n applyPatch,\n buildSpecFromParts,\n flatToTree,\n getTextFromParts,\n injectChatUI,\n injectUIStream,\n jsonRenderMessage,\n type ChatMessage,\n type ChatUIOptions,\n type ChatUIReturn,\n type DataPart,\n type TokenUsage,\n type UIStreamOptions,\n type UIStreamReturn,\n type UIStreamSendOptions,\n} from './lib/streaming';\n\n// Schema (spec format + prompt rules)\nexport { schema, type AngularSchema, type AngularSpec } from './lib/schema';\n\n// Devtools\nexport { injectDevtoolsActive } from './lib/devtools';\n\n// Core re-exports (for convenience)\nexport type {\n ActionBinding,\n ActionHandler,\n JsonPatch,\n Spec,\n SpecIssue,\n StateStore,\n UIElement,\n VisibilityCondition,\n} from '@json-render/core';\nexport {\n autoFixSpec,\n createStateStore,\n formatSpecIssues,\n nestedToFlat,\n validateSpec,\n} from '@json-render/core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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A,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAA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"}
|