ngx-json-render 0.1.4 → 0.2.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 +51 -33
- package/fesm2022/ngx-json-render.mjs +68 -10
- package/fesm2022/ngx-json-render.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ngx-json-render.d.ts +18 -0
package/README.md
CHANGED
|
@@ -175,9 +175,27 @@ app.post('/api/generate', async (req, res) => {
|
|
|
175
175
|
|
|
176
176
|
The patches apply to the `spec` signal as each line arrives, so the UI assembles on screen while the model is still generating — exactly what the [demo's Streaming tab](https://shteynu.github.io/ngx-json-render/) replays. Prefer structured output? `catalog.jsonSchema()` exports a JSON Schema for `streamObject`/tool calls, and `catalog.validate(spec)` checks a finished spec against the catalog.
|
|
177
177
|
|
|
178
|
+
### Supplying the transport
|
|
179
|
+
|
|
180
|
+
By default the request goes through the global `fetch`. Pass your own to add
|
|
181
|
+
auth headers, route through your app's HTTP layer, or replay a recorded
|
|
182
|
+
generation in a test — it is called with the endpoint and a request carrying
|
|
183
|
+
the JSON body and the abort signal, and must resolve to a `Response` whose
|
|
184
|
+
`body` streams the JSONL:
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
readonly ui = injectUIStream({
|
|
188
|
+
api: '/api/generate',
|
|
189
|
+
fetch: (url, init) =>
|
|
190
|
+
fetch(url, { ...init, headers: { ...init?.headers, Authorization: token } }),
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`injectChatUI` takes the same option.
|
|
195
|
+
|
|
178
196
|
Also available:
|
|
179
197
|
|
|
180
|
-
- `injectChatUI({ api })` — chat + GenUI: the endpoint takes `{ messages }` and streams prose mixed with ` ```spec ` fenced JSONL; each assistant message carries `text` and/or a `spec`.
|
|
198
|
+
- `injectChatUI({ api, fetch? })` — chat + GenUI: the endpoint takes `{ messages }` and streams prose mixed with ` ```spec ` fenced JSONL; each assistant message carries `text` and/or a `spec`.
|
|
181
199
|
- `applyPatch(spec, patch)` — immutably apply one RFC 6902 patch to a spec.
|
|
182
200
|
- `buildSpecFromParts` / `getTextFromParts` / `jsonRenderMessage` — derive specs from AI SDK `message.parts`.
|
|
183
201
|
- `catalog.prompt()` / `buildUserPrompt` (from `@json-render/core`) — generate the system/user prompts for your catalog.
|
|
@@ -186,22 +204,22 @@ Also available:
|
|
|
186
204
|
|
|
187
205
|
Full parity with the baseline json-render contract:
|
|
188
206
|
|
|
189
|
-
| Feature
|
|
190
|
-
|
|
|
191
|
-
| Dynamic props
|
|
192
|
-
| Two-way binding
|
|
193
|
-
| Conditionals
|
|
194
|
-
| Templates
|
|
195
|
-
| Computed / directives | `{ "$computed": "fmtDate", "args": {...} }`, custom `$`-directives
|
|
196
|
-
| Visibility
|
|
197
|
-
| Events → actions
|
|
198
|
-
| Built-in actions
|
|
199
|
-
| Repeat
|
|
200
|
-
| Watch
|
|
201
|
-
| Slots
|
|
202
|
-
| Validation
|
|
203
|
-
| Confirm dialogs
|
|
204
|
-
| Devtools hooks
|
|
207
|
+
| Feature | Example |
|
|
208
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
209
|
+
| Dynamic props | `{ "$state": "/user/name" }` |
|
|
210
|
+
| Two-way binding | `{ "$bindState": "/form/email" }`, `{ "$bindItem": "done" }` |
|
|
211
|
+
| Conditionals | `{ "$cond": {...}, "$then": ..., "$else": ... }` |
|
|
212
|
+
| Templates | `{ "$template": "Hello, ${/user/name}" }` |
|
|
213
|
+
| Computed / directives | `{ "$computed": "fmtDate", "args": {...} }`, custom `$`-directives |
|
|
214
|
+
| Visibility | `"visible": { "$state": "/count", "gte": 5 }` (incl. `$and`/`$or`, `$item`, `$index`) |
|
|
215
|
+
| Events → actions | `"on": { "press": { "action": "...", "params": {...}, "confirm": {...}, "onSuccess": ..., "onError": ... } }` |
|
|
216
|
+
| Built-in actions | `setState`, `pushState` (with `$id`), `removeState`, `push`/`pop`, `validateForm` |
|
|
217
|
+
| Repeat | `"repeat": { "statePath": "/todos", "key": "id" }`, nested via `{ "$item": "..." }` |
|
|
218
|
+
| Watch | `"watch": { "/country": { "action": "loadCities" } }` |
|
|
219
|
+
| Slots | `"slots": { "header": ["title-el"] }` + `<jr-children slot="header" />` |
|
|
220
|
+
| Validation | field checks via `ValidationConfig`, `validateForm`, `injectFieldValidation` |
|
|
221
|
+
| Confirm dialogs | built-in `<jr-confirm-dialog>` (auto-rendered) |
|
|
222
|
+
| Devtools hooks | action observer + `data-jr-key` picker attributes |
|
|
205
223
|
|
|
206
224
|
## State
|
|
207
225
|
|
|
@@ -250,7 +268,7 @@ rest.
|
|
|
250
268
|
and `onSuccess.set` all take a `statePath` straight from the spec, so a
|
|
251
269
|
generated UI can write anywhere in the state model it is rendered against —
|
|
252
270
|
and `push`/`pop` write `/currentScreen` and `/navStack`. In controlled mode
|
|
253
|
-
this is
|
|
271
|
+
this is _your_ store. Give the renderer a store scoped to the generated view
|
|
254
272
|
rather than the one holding session, entitlement or billing state.
|
|
255
273
|
|
|
256
274
|
**A spec chooses the navigation target.** `onSuccess: { navigate }` passes its
|
|
@@ -265,7 +283,7 @@ one.
|
|
|
265
283
|
|
|
266
284
|
**`confirm` is a UX affordance, not a security control.** It routes an action
|
|
267
285
|
through the confirmation dialog before the handler runs, but it is set on the
|
|
268
|
-
action binding
|
|
286
|
+
action binding _inside the spec_ (`on.press.confirm`) — so the same party that
|
|
269
287
|
chose the action also chose whether to ask. Real authorization belongs in the
|
|
270
288
|
handler, on the server.
|
|
271
289
|
|
|
@@ -281,20 +299,20 @@ Everything from `@json-render/core` (types, `createStateStore`, `nestedToFlat`,
|
|
|
281
299
|
|
|
282
300
|
## Renderer inputs
|
|
283
301
|
|
|
284
|
-
| Input
|
|
285
|
-
|
|
|
286
|
-
| `spec`
|
|
287
|
-
| `registry`
|
|
288
|
-
| `loading`
|
|
289
|
-
| `fallback`
|
|
290
|
-
| `state`
|
|
291
|
-
| `store`
|
|
292
|
-
| `handlers`
|
|
293
|
-
| `onAction`
|
|
294
|
-
| `navigate`
|
|
295
|
-
| `validationFunctions` | `Record<string, ValidationFunction>` | Custom validation
|
|
296
|
-
| `functions`
|
|
297
|
-
| `directives`
|
|
302
|
+
| Input | Type | Purpose |
|
|
303
|
+
| --------------------- | ------------------------------------ | ------------------------------------------------------ |
|
|
304
|
+
| `spec` | `Spec \| null` | The UI spec (may be partial while streaming) |
|
|
305
|
+
| `registry` | `ComponentRegistry` | Catalog type → Angular component |
|
|
306
|
+
| `loading` | `boolean` | Suppress missing-element warnings while streaming |
|
|
307
|
+
| `fallback` | `Type<unknown>` | Component for unknown types |
|
|
308
|
+
| `state` | `StateModel` | Initial state (uncontrolled; defaults to `spec.state`) |
|
|
309
|
+
| `store` | `StateStore` | External store (controlled mode) |
|
|
310
|
+
| `handlers` | `Record<string, ActionHandler>` | Action handlers |
|
|
311
|
+
| `onAction` | `(name, params) => unknown` | Catch-all action handler |
|
|
312
|
+
| `navigate` | `(path) => void` | Used by `onSuccess: { navigate }` |
|
|
313
|
+
| `validationFunctions` | `Record<string, ValidationFunction>` | Custom validation |
|
|
314
|
+
| `functions` | `Record<string, ComputedFunction>` | `$computed` functions |
|
|
315
|
+
| `directives` | `DirectiveDefinition[]` | Custom `$`-prefixed expressions |
|
|
298
316
|
|
|
299
317
|
Output: `(stateChange)` — batched `{ path, value }[]` in uncontrolled mode.
|
|
300
318
|
|
|
@@ -863,12 +863,17 @@ class JrElement {
|
|
|
863
863
|
const el = this.rawElement();
|
|
864
864
|
if (!el)
|
|
865
865
|
return undefined;
|
|
866
|
-
return {
|
|
866
|
+
return {
|
|
867
|
+
...el,
|
|
868
|
+
props: resolveElementProps(el.props ?? {}, this.resolutionCtx()),
|
|
869
|
+
};
|
|
867
870
|
}, ...(ngDevMode ? [{ debugName: "resolvedElement" }] : /* istanbul ignore next */ []));
|
|
868
871
|
/** Two-way binding paths ($bindState / $bindItem) by prop name. */
|
|
869
872
|
bindings = computed(() => {
|
|
870
873
|
const el = this.rawElement();
|
|
871
|
-
return el
|
|
874
|
+
return el
|
|
875
|
+
? resolveBindings(el.props ?? {}, this.resolutionCtx())
|
|
876
|
+
: undefined;
|
|
872
877
|
}, ...(ngDevMode ? [{ debugName: "bindings" }] : /* istanbul ignore next */ []));
|
|
873
878
|
entry = computed(() => {
|
|
874
879
|
const el = this.rawElement();
|
|
@@ -1431,6 +1436,47 @@ function parseLine(line) {
|
|
|
1431
1436
|
return null;
|
|
1432
1437
|
}
|
|
1433
1438
|
}
|
|
1439
|
+
/**
|
|
1440
|
+
* Split a JSON Pointer into its segments, undoing RFC 6901's escapes.
|
|
1441
|
+
*
|
|
1442
|
+
* `@json-render/core` parses pointers the same way for `setByPath` and
|
|
1443
|
+
* friends but does not export the helper, so {@link copyAlongPath} carries
|
|
1444
|
+
* its own copy. The two must agree on where a path descends, or a write would
|
|
1445
|
+
* land on a node that was never copied.
|
|
1446
|
+
*/
|
|
1447
|
+
function parseJsonPointer(path) {
|
|
1448
|
+
const raw = path.startsWith('/') ? path.slice(1).split('/') : path.split('/');
|
|
1449
|
+
return raw.map((token) => token.replace(/~1/g, '/').replace(/~0/g, '~'));
|
|
1450
|
+
}
|
|
1451
|
+
/**
|
|
1452
|
+
* Replace every node `path` descends through with a shallow copy of itself.
|
|
1453
|
+
*
|
|
1454
|
+
* `root` must already be private to the caller. Afterwards a mutating write
|
|
1455
|
+
* along that same path — `setByPath`, `removeByPath` — only ever touches
|
|
1456
|
+
* nodes nobody else is holding, while everything off the path stays shared.
|
|
1457
|
+
* That keeps a patch proportional to the depth of its path rather than to the
|
|
1458
|
+
* size of the spec, which matters when a stream applies hundreds of them.
|
|
1459
|
+
*
|
|
1460
|
+
* Descent stops at anything that is not an object: `setByPath` overwrites
|
|
1461
|
+
* such a node outright, and one that does not exist yet is created fresh, so
|
|
1462
|
+
* in neither case is there anything of the caller's left to protect.
|
|
1463
|
+
*/
|
|
1464
|
+
function copyAlongPath(root, path) {
|
|
1465
|
+
const segments = parseJsonPointer(path);
|
|
1466
|
+
let current = root;
|
|
1467
|
+
// The final segment is written, not descended into, so it needs no copy.
|
|
1468
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
1469
|
+
const segment = segments[i];
|
|
1470
|
+
const child = current[segment];
|
|
1471
|
+
if (child === null || typeof child !== 'object')
|
|
1472
|
+
return;
|
|
1473
|
+
const copy = Array.isArray(child)
|
|
1474
|
+
? [...child]
|
|
1475
|
+
: { ...child };
|
|
1476
|
+
current[segment] = copy;
|
|
1477
|
+
current = copy;
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1434
1480
|
/**
|
|
1435
1481
|
* Set a value at a spec path (for add/replace operations).
|
|
1436
1482
|
*/
|
|
@@ -1447,7 +1493,9 @@ function setSpecValue(newSpec, path, value) {
|
|
|
1447
1493
|
if (!newSpec.state)
|
|
1448
1494
|
newSpec.state = {};
|
|
1449
1495
|
const statePath = path.slice('/state'.length); // e.g. "/posts"
|
|
1450
|
-
|
|
1496
|
+
const state = newSpec.state;
|
|
1497
|
+
copyAlongPath(state, statePath);
|
|
1498
|
+
setByPath(state, statePath, value);
|
|
1451
1499
|
return;
|
|
1452
1500
|
}
|
|
1453
1501
|
if (path.startsWith('/elements/')) {
|
|
@@ -1463,6 +1511,7 @@ function setSpecValue(newSpec, path, value) {
|
|
|
1463
1511
|
if (element) {
|
|
1464
1512
|
const propPath = '/' + pathParts.slice(1).join('/');
|
|
1465
1513
|
const newElement = { ...element };
|
|
1514
|
+
copyAlongPath(newElement, propPath);
|
|
1466
1515
|
setByPath(newElement, propPath, value);
|
|
1467
1516
|
newSpec.elements[elementKey] = newElement;
|
|
1468
1517
|
}
|
|
@@ -1479,7 +1528,9 @@ function removeSpecValue(newSpec, path) {
|
|
|
1479
1528
|
}
|
|
1480
1529
|
if (path.startsWith('/state/') && newSpec.state) {
|
|
1481
1530
|
const statePath = path.slice('/state'.length);
|
|
1482
|
-
|
|
1531
|
+
const state = newSpec.state;
|
|
1532
|
+
copyAlongPath(state, statePath);
|
|
1533
|
+
removeByPath(state, statePath);
|
|
1483
1534
|
return;
|
|
1484
1535
|
}
|
|
1485
1536
|
if (path.startsWith('/elements/')) {
|
|
@@ -1496,6 +1547,7 @@ function removeSpecValue(newSpec, path) {
|
|
|
1496
1547
|
if (element) {
|
|
1497
1548
|
const propPath = '/' + pathParts.slice(1).join('/');
|
|
1498
1549
|
const newElement = { ...element };
|
|
1550
|
+
copyAlongPath(newElement, propPath);
|
|
1499
1551
|
removeByPath(newElement, propPath);
|
|
1500
1552
|
newSpec.elements[elementKey] = newElement;
|
|
1501
1553
|
}
|
|
@@ -1622,8 +1674,11 @@ function injectUIStream(options) {
|
|
|
1622
1674
|
spec.set(currentSpec);
|
|
1623
1675
|
}
|
|
1624
1676
|
};
|
|
1677
|
+
// Bound, because a bare `globalThis.fetch` called as a plain function is
|
|
1678
|
+
// an illegal invocation in the browser.
|
|
1679
|
+
const doFetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
1625
1680
|
try {
|
|
1626
|
-
const response = await
|
|
1681
|
+
const response = await doFetch(options.api, {
|
|
1627
1682
|
method: 'POST',
|
|
1628
1683
|
headers: { 'Content-Type': 'application/json' },
|
|
1629
1684
|
body: JSON.stringify({
|
|
@@ -1708,6 +1763,8 @@ function injectUIStream(options) {
|
|
|
1708
1763
|
* and parent-child relationships are expressed through children arrays.
|
|
1709
1764
|
*/
|
|
1710
1765
|
function flatToTree(elements) {
|
|
1766
|
+
// The map is what gives every element its children array, so the second
|
|
1767
|
+
// pass can push into one without checking for it.
|
|
1711
1768
|
const elementMap = {};
|
|
1712
1769
|
let root = '';
|
|
1713
1770
|
// First pass: add all elements to map
|
|
@@ -1724,9 +1781,6 @@ function flatToTree(elements) {
|
|
|
1724
1781
|
if (element.parentKey) {
|
|
1725
1782
|
const parent = elementMap[element.parentKey];
|
|
1726
1783
|
if (parent) {
|
|
1727
|
-
if (!parent.children) {
|
|
1728
|
-
parent.children = [];
|
|
1729
|
-
}
|
|
1730
1784
|
parent.children.push(element.key);
|
|
1731
1785
|
}
|
|
1732
1786
|
}
|
|
@@ -1824,7 +1878,8 @@ function jsonRenderMessage(parts) {
|
|
|
1824
1878
|
}
|
|
1825
1879
|
let chatMessageIdCounter = 0;
|
|
1826
1880
|
function generateChatId() {
|
|
1827
|
-
if (typeof crypto !== 'undefined' &&
|
|
1881
|
+
if (typeof crypto !== 'undefined' &&
|
|
1882
|
+
typeof crypto.randomUUID === 'function') {
|
|
1828
1883
|
return crypto.randomUUID();
|
|
1829
1884
|
}
|
|
1830
1885
|
chatMessageIdCounter += 1;
|
|
@@ -1896,8 +1951,11 @@ function injectChatUI(options) {
|
|
|
1896
1951
|
elements: { ...currentSpec.elements },
|
|
1897
1952
|
...(currentSpec.state ? { state: { ...currentSpec.state } } : {}),
|
|
1898
1953
|
});
|
|
1954
|
+
// Bound, because a bare `globalThis.fetch` called as a plain function is
|
|
1955
|
+
// an illegal invocation in the browser.
|
|
1956
|
+
const doFetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
1899
1957
|
try {
|
|
1900
|
-
const response = await
|
|
1958
|
+
const response = await doFetch(options.api, {
|
|
1901
1959
|
method: 'POST',
|
|
1902
1960
|
headers: { 'Content-Type': 'application/json' },
|
|
1903
1961
|
body: JSON.stringify({ messages: historyForApi }),
|
|
@@ -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.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) | null | 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<(changes: StateChange[]) => void>();\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 = 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 = 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\n | 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 {\n PropResolutionContext,\n UIElement,\n} 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 { ...el, props: resolveElementProps(el.props ?? {}, this.resolutionCtx()) };\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 ? resolveBindings(el.props ?? {}, this.resolutionCtx()) : 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(() => this.entry()?.component ?? null);\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 { DestroyRef, type Signal, computed, inject, signal } from '@angular/core';\nimport type {\n FlatElement,\n JsonPatch,\n Spec,\n SpecDataPart,\n UIElement,\n} from '@json-render/core';\nimport {\n SPEC_DATA_PART_TYPE,\n applySpecPatch,\n createMixedStreamParser,\n getByPath,\n nestedToFlat,\n removeByPath,\n setByPath,\n} from '@json-render/core';\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).\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 return { type: 'patch', patch: parsed as JsonPatch };\n } catch {\n return null;\n }\n}\n\n/**\n * Set a value at a spec path (for add/replace operations).\n */\nfunction setSpecValue(newSpec: Spec, path: string, value: unknown): 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 setByPath(newSpec.state as Record<string, unknown>, 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 } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = '/' + pathParts.slice(1).join('/');\n const newElement = { ...element };\n setByPath(\n newElement as unknown as Record<string, unknown>,\n propPath,\n value,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Remove a value at a spec path.\n */\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 removeByPath(newSpec.state as Record<string, unknown>, 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]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = '/' + pathParts.slice(1).join('/');\n const newElement = { ...element };\n removeByPath(newElement as unknown as Record<string, unknown>, propPath);\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\n\n/**\n * Get a value at a spec path.\n */\nfunction getSpecValue(spec: Spec, path: string): unknown {\n if (path === '/root') return spec.root;\n if (path === '/state') return spec.state;\n if (path.startsWith('/state/') && spec.state) {\n const statePath = path.slice('/state'.length);\n return getByPath(spec.state as Record<string, unknown>, statePath);\n }\n return getByPath(spec as unknown as Record<string, unknown>, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to the current spec, returning a new spec\n * object (structural sharing for untouched elements).\n * Supports add, remove, replace, move, copy, and test operations.\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 case 'replace': {\n setSpecValue(newSpec, patch.path, patch.value);\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 = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case 'copy': {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case 'test': {\n // test is a no-op for rendering purposes (validation only)\n break;\n }\n }\n\n return newSpec;\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\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, context?: Record<string, unknown>) => Promise<void>;\n /** Clear the current spec */\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 let abortController: AbortController | null = null;\n\n inject(DestroyRef).onDestroy(() => {\n abortController?.abort();\n });\n\n const clear = () => {\n spec.set(null);\n error.set(null);\n };\n\n const send = async (prompt: string, context?: Record<string, unknown>) => {\n // Abort any existing request\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n\n // A superseded request must not write to the shared signals on its way\n // out: its `finally` would otherwise clear `isStreaming` while the request\n // that replaced it is still streaming.\n const isCurrent = () => abortController === controller;\n\n isStreaming.set(true);\n error.set(null);\n usage.set(null);\n rawLines.set([]);\n\n // Start with previous spec if provided, otherwise empty spec\n const previousSpec = context?.['previousSpec'] as Spec | undefined;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: '', elements: {} };\n spec.set(currentSpec);\n\n const handleLine = (trimmed: string) => {\n const result = parseLine(trimmed);\n if (!result) return;\n if (result.type === 'usage') {\n usage.set(result.usage);\n } else {\n rawLines.update((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n spec.set(currentSpec);\n }\n };\n\n try {\n const response = await fetch(options.api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n prompt,\n context,\n currentSpec,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n // Try to parse JSON error response for better error messages\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors, use default message\n }\n throw new Error(errorMessage);\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 let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n handleLine(trimmed);\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n handleLine(buffer.trim());\n }\n\n options.onComplete?.(currentSpec);\n } catch (err) {\n if ((err as Error).name === 'AbortError' || !isCurrent()) {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n error.set(resolvedError);\n options.onError?.(resolvedError);\n } finally {\n if (isCurrent()) {\n isStreaming.set(false);\n }\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 clear,\n };\n}\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 const elementMap: Record<string, UIElement> = {};\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 if (!parent.children) {\n parent.children = [];\n }\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// buildSpecFromParts — Derive Spec from AI SDK data parts\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 const 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 applySpecPatch(spec, payload.patch);\n } else if (payload.type === 'flat') {\n hasSpec = true;\n Object.assign(spec, payload.spec);\n } else if (payload.type === 'nested') {\n hasSpec = true;\n const flat = nestedToFlat(payload.spec);\n Object.assign(spec, flat);\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(parts: Signal<DataPart[]> | (() => DataPart[])): {\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// =============================================================================\n// injectChatUI — Chat + GenUI\n// =============================================================================\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\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 /** Clear all messages and reset the conversation */\n clear: () => void;\n}\n\nlet chatMessageIdCounter = 0;\nfunction generateChatId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\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 let abortController: AbortController | null = null;\n\n inject(DestroyRef).onDestroy(() => {\n abortController?.abort();\n });\n\n const clear = () => {\n messages.set([]);\n error.set(null);\n };\n\n const send = async (text: string) => {\n if (!text.trim()) return;\n\n // Abort any existing request\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n\n // See injectUIStream: a superseded request must not clear `isStreaming`\n // out from under the request that replaced it.\n const isCurrent = () => abortController === controller;\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 // Build messages array for the API (full conversation history + new message).\n const historyForApi = [\n ...messages()\n .filter((m) => m.id !== userMessage.id && m.id !== assistantId)\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 const currentSpec: Spec = { root: '', elements: {} };\n let hasSpec = false;\n\n const snapshotSpec = (): Spec => ({\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...(currentSpec.state ? { state: { ...currentSpec.state } } : {}),\n });\n\n try {\n const response = await fetch(options.api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: historyForApi }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors\n }\n throw new Error(errorMessage);\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\n // Use createMixedStreamParser to classify lines\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n applySpecPatch(currentSpec, patch);\n const snapshot = snapshotSpec();\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, spec: snapshot } : m,\n ),\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? '\\n' : '') + line;\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, text: accumulatedText } : m,\n ),\n );\n },\n });\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.push(decoder.decode(value, { stream: true }));\n }\n parser.flush();\n\n // Build final message for onComplete callback\n const finalMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n text: accumulatedText,\n spec: hasSpec ? snapshotSpec() : null,\n };\n options.onComplete?.(finalMessage);\n } catch (err) {\n if ((err as Error).name === 'AbortError' || !isCurrent()) {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n error.set(resolvedError);\n // Remove empty assistant message on error\n messages.update((prev) =>\n prev.filter((m) => m.id !== assistantId || m.text.length > 0),\n );\n options.onError?.(resolvedError);\n } finally {\n if (isCurrent()) {\n isStreaming.set(false);\n }\n }\n };\n\n return {\n messages: messages.asReadonly(),\n isStreaming: isStreaming.asReadonly(),\n error: error.asReadonly(),\n send,\n clear,\n };\n}\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} 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-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.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 {\n DestroyRef,\n type Signal,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport type {\n FlatElement,\n JsonPatch,\n Spec,\n SpecDataPart,\n UIElement,\n} from '@json-render/core';\nimport {\n SPEC_DATA_PART_TYPE,\n applySpecPatch,\n createMixedStreamParser,\n getByPath,\n nestedToFlat,\n removeByPath,\n setByPath,\n} from '@json-render/core';\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).\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 return { type: 'patch', patch: parsed as JsonPatch };\n } catch {\n return null;\n }\n}\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`, `removeByPath` — only ever touches\n * nodes nobody else is holding, while everything off the path stays shared.\n * That keeps a patch proportional to the depth of its path rather than to the\n * size of the spec, which matters when a stream applies hundreds of them.\n *\n * Descent stops at anything that is not an object: `setByPath` overwrites\n * such a node outright, and one that does not exist yet is created fresh, so\n * in 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 * Set a value at a spec path (for add/replace operations).\n */\nfunction setSpecValue(newSpec: Spec, path: string, value: unknown): 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 setByPath(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 } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = '/' + pathParts.slice(1).join('/');\n const newElement = { ...element } as unknown as Record<string, unknown>;\n copyAlongPath(newElement, propPath);\n setByPath(newElement, propPath, value);\n newSpec.elements[elementKey] = newElement as unknown as UIElement;\n }\n }\n }\n}\n\n/**\n * Remove a value at a spec path.\n */\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]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\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 }\n }\n }\n}\n\n/**\n * Get a value at a spec path.\n */\nfunction getSpecValue(spec: Spec, path: string): unknown {\n if (path === '/root') return spec.root;\n if (path === '/state') return spec.state;\n if (path.startsWith('/state/') && spec.state) {\n const statePath = path.slice('/state'.length);\n return getByPath(spec.state as Record<string, unknown>, statePath);\n }\n return getByPath(spec as unknown as Record<string, unknown>, path);\n}\n\n/**\n * Apply an RFC 6902 JSON patch to the current spec, returning a new spec\n * object (structural sharing for untouched elements).\n * Supports add, remove, replace, move, copy, and test operations.\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 case 'replace': {\n setSpecValue(newSpec, patch.path, patch.value);\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 = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case 'copy': {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case 'test': {\n // test is a no-op for rendering purposes (validation only)\n break;\n }\n }\n\n return newSpec;\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, context?: Record<string, unknown>) => Promise<void>;\n /** Clear the current spec */\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 let abortController: AbortController | null = null;\n\n inject(DestroyRef).onDestroy(() => {\n abortController?.abort();\n });\n\n const clear = () => {\n spec.set(null);\n error.set(null);\n };\n\n const send = async (prompt: string, context?: Record<string, unknown>) => {\n // Abort any existing request\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n\n // A superseded request must not write to the shared signals on its way\n // out: its `finally` would otherwise clear `isStreaming` while the request\n // that replaced it is still streaming.\n const isCurrent = () => abortController === controller;\n\n isStreaming.set(true);\n error.set(null);\n usage.set(null);\n rawLines.set([]);\n\n // Start with previous spec if provided, otherwise empty spec\n const previousSpec = context?.['previousSpec'] as Spec | undefined;\n let currentSpec: Spec =\n previousSpec && previousSpec.root\n ? { ...previousSpec, elements: { ...previousSpec.elements } }\n : { root: '', elements: {} };\n spec.set(currentSpec);\n\n const handleLine = (trimmed: string) => {\n const result = parseLine(trimmed);\n if (!result) return;\n if (result.type === 'usage') {\n usage.set(result.usage);\n } else {\n rawLines.update((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n spec.set(currentSpec);\n }\n };\n\n // Bound, because a bare `globalThis.fetch` called as a plain function is\n // an illegal invocation in the browser.\n const doFetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n try {\n const response = await doFetch(options.api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n prompt,\n context,\n currentSpec,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n // Try to parse JSON error response for better error messages\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors, use default message\n }\n throw new Error(errorMessage);\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 let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n handleLine(trimmed);\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n handleLine(buffer.trim());\n }\n\n options.onComplete?.(currentSpec);\n } catch (err) {\n if ((err as Error).name === 'AbortError' || !isCurrent()) {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n error.set(resolvedError);\n options.onError?.(resolvedError);\n } finally {\n if (isCurrent()) {\n isStreaming.set(false);\n }\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 clear,\n };\n}\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// buildSpecFromParts — Derive Spec from AI SDK data parts\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 const 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 applySpecPatch(spec, payload.patch);\n } else if (payload.type === 'flat') {\n hasSpec = true;\n Object.assign(spec, payload.spec);\n } else if (payload.type === 'nested') {\n hasSpec = true;\n const flat = nestedToFlat(payload.spec);\n Object.assign(spec, flat);\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// =============================================================================\n// injectChatUI — Chat + GenUI\n// =============================================================================\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 * {@link 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 /** Clear all messages and reset the conversation */\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 let abortController: AbortController | null = null;\n\n inject(DestroyRef).onDestroy(() => {\n abortController?.abort();\n });\n\n const clear = () => {\n messages.set([]);\n error.set(null);\n };\n\n const send = async (text: string) => {\n if (!text.trim()) return;\n\n // Abort any existing request\n abortController?.abort();\n const controller = new AbortController();\n abortController = controller;\n\n // See injectUIStream: a superseded request must not clear `isStreaming`\n // out from under the request that replaced it.\n const isCurrent = () => abortController === controller;\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 // Build messages array for the API (full conversation history + new message).\n const historyForApi = [\n ...messages()\n .filter((m) => m.id !== userMessage.id && m.id !== assistantId)\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 const currentSpec: Spec = { root: '', elements: {} };\n let hasSpec = false;\n\n const snapshotSpec = (): Spec => ({\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...(currentSpec.state ? { state: { ...currentSpec.state } } : {}),\n });\n\n // Bound, because a bare `globalThis.fetch` called as a plain function is\n // an illegal invocation in the browser.\n const doFetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n\n try {\n const response = await doFetch(options.api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: historyForApi }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors\n }\n throw new Error(errorMessage);\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\n // Use createMixedStreamParser to classify lines\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n applySpecPatch(currentSpec, patch);\n const snapshot = snapshotSpec();\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, spec: snapshot } : m,\n ),\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? '\\n' : '') + line;\n messages.update((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, text: accumulatedText } : m,\n ),\n );\n },\n });\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.push(decoder.decode(value, { stream: true }));\n }\n parser.flush();\n\n // Build final message for onComplete callback\n const finalMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n text: accumulatedText,\n spec: hasSpec ? snapshotSpec() : null,\n };\n options.onComplete?.(finalMessage);\n } catch (err) {\n if ((err as Error).name === 'AbortError' || !isCurrent()) {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n error.set(resolvedError);\n // Remove empty assistant message on error\n messages.update((prev) =>\n prev.filter((m) => m.id !== assistantId || m.text.length > 0),\n );\n options.onError?.(resolvedError);\n } finally {\n if (isCurrent()) {\n isStreaming.set(false);\n }\n }\n };\n\n return {\n messages: messages.asReadonly(),\n isStreaming: isStreaming.asReadonly(),\n error: error.asReadonly(),\n send,\n clear,\n };\n}\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} 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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"}
|
package/package.json
CHANGED
|
@@ -617,6 +617,17 @@ interface UIStreamOptions {
|
|
|
617
617
|
onComplete?: (spec: Spec) => void;
|
|
618
618
|
/** Callback on error */
|
|
619
619
|
onError?: (error: Error) => void;
|
|
620
|
+
/**
|
|
621
|
+
* Transport, defaulting to the global `fetch`.
|
|
622
|
+
*
|
|
623
|
+
* Anything with fetch's shape works, so a test, a demo replaying a recorded
|
|
624
|
+
* generation, or an app that has to add auth headers or route through its
|
|
625
|
+
* own HTTP layer can supply one instead of patching the global. It is called
|
|
626
|
+
* with the endpoint and a request carrying the JSON body and the abort
|
|
627
|
+
* signal, and must resolve to a `Response` whose `body` is a readable
|
|
628
|
+
* stream of the JSONL patches.
|
|
629
|
+
*/
|
|
630
|
+
fetch?: typeof globalThis.fetch;
|
|
620
631
|
}
|
|
621
632
|
/**
|
|
622
633
|
* Return type for {@link injectUIStream}.
|
|
@@ -721,6 +732,13 @@ interface ChatUIOptions {
|
|
|
721
732
|
onComplete?: (message: ChatMessage) => void;
|
|
722
733
|
/** Callback on error */
|
|
723
734
|
onError?: (error: Error) => void;
|
|
735
|
+
/**
|
|
736
|
+
* Transport, defaulting to the global `fetch`. Same contract as
|
|
737
|
+
* {@link UIStreamOptions.fetch}: it receives the endpoint and a request
|
|
738
|
+
* carrying the JSON body and the abort signal, and must resolve to a
|
|
739
|
+
* `Response` whose `body` streams the reply.
|
|
740
|
+
*/
|
|
741
|
+
fetch?: typeof globalThis.fetch;
|
|
724
742
|
}
|
|
725
743
|
/**
|
|
726
744
|
* Return type for {@link injectChatUI}.
|