ngx-json-render 0.1.3 → 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 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 | Example |
190
- | --- | --- |
191
- | Dynamic props | `{ "$state": "/user/name" }` |
192
- | Two-way binding | `{ "$bindState": "/form/email" }`, `{ "$bindItem": "done" }` |
193
- | Conditionals | `{ "$cond": {...}, "$then": ..., "$else": ... }` |
194
- | Templates | `{ "$template": "Hello, ${/user/name}" }` |
195
- | Computed / directives | `{ "$computed": "fmtDate", "args": {...} }`, custom `$`-directives |
196
- | Visibility | `"visible": { "$state": "/count", "gte": 5 }` (incl. `$and`/`$or`, `$item`, `$index`) |
197
- | Events → actions | `"on": { "press": { "action": "...", "params": {...}, "confirm": {...}, "onSuccess": ..., "onError": ... } }` |
198
- | Built-in actions | `setState`, `pushState` (with `$id`), `removeState`, `push`/`pop`, `validateForm` |
199
- | Repeat | `"repeat": { "statePath": "/todos", "key": "id" }`, nested via `{ "$item": "..." }` |
200
- | Watch | `"watch": { "/country": { "action": "loadCities" } }` |
201
- | Slots | `"slots": { "header": ["title-el"] }` + `<jr-children slot="header" />` |
202
- | Validation | field checks via `ValidationConfig`, `validateForm`, `injectFieldValidation` |
203
- | Confirm dialogs | built-in `<jr-confirm-dialog>` (auto-rendered) |
204
- | Devtools hooks | action observer + `data-jr-key` picker attributes |
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 *your* store. Give the renderer a store scoped to the generated view
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 *inside the spec* (`on.press.confirm`) — so the same party that
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 | Type | Purpose |
285
- | --- | --- | --- |
286
- | `spec` | `Spec \| null` | The UI spec (may be partial while streaming) |
287
- | `registry` | `ComponentRegistry` | Catalog type → Angular component |
288
- | `loading` | `boolean` | Suppress missing-element warnings while streaming |
289
- | `fallback` | `Type<unknown>` | Component for unknown types |
290
- | `state` | `StateModel` | Initial state (uncontrolled; defaults to `spec.state`) |
291
- | `store` | `StateStore` | External store (controlled mode) |
292
- | `handlers` | `Record<string, ActionHandler>` | Action handlers |
293
- | `onAction` | `(name, params) => unknown` | Catch-all action handler |
294
- | `navigate` | `(path) => void` | Used by `onSuccess: { navigate }` |
295
- | `validationFunctions` | `Record<string, ValidationFunction>` | Custom validation |
296
- | `functions` | `Record<string, ComputedFunction>` | `$computed` functions |
297
- | `directives` | `DirectiveDefinition[]` | Custom `$`-prefixed expressions |
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
 
@@ -427,6 +427,23 @@ function deepResolveValue(value, get) {
427
427
  }
428
428
  return value;
429
429
  }
430
+ /**
431
+ * Rejection produced when the user dismisses an action's confirmation dialog.
432
+ * Carries a stable `name` so callers can tell a cancellation apart from a
433
+ * handler failure without matching on the message.
434
+ *
435
+ * @internal Not part of the public API; check `error.name` instead.
436
+ */
437
+ class ActionCancelledError extends Error {
438
+ constructor() {
439
+ super('Action cancelled');
440
+ this.name = 'ActionCancelledError';
441
+ }
442
+ }
443
+ /** True for the rejection produced by cancelling a confirmation dialog. */
444
+ function isActionCancelled(error) {
445
+ return error instanceof Error && error.name === 'ActionCancelledError';
446
+ }
430
447
  /**
431
448
  * Action dispatcher of a `<json-render>` subtree.
432
449
  *
@@ -561,7 +578,9 @@ class JsonRenderActionsService {
561
578
  return;
562
579
  }
563
580
  if (resolved.confirm) {
564
- return new Promise((resolve, reject) => {
581
+ // Awaited, not returned: a returned promise would let the `finally`
582
+ // below settle the observers before the user has even answered.
583
+ await new Promise((resolve, reject) => {
565
584
  this._pendingConfirmation.set({
566
585
  action: resolved,
567
586
  handler,
@@ -571,10 +590,10 @@ class JsonRenderActionsService {
571
590
  },
572
591
  reject: () => {
573
592
  this._pendingConfirmation.set(null);
574
- reject(new Error('Action cancelled'));
593
+ reject(new ActionCancelledError());
575
594
  },
576
595
  });
577
- }).then(() => this.runHandler(resolved, handler));
596
+ });
578
597
  }
579
598
  await this.runHandler(resolved, handler);
580
599
  }
@@ -792,6 +811,15 @@ function injectRepeatScope() {
792
811
  }
793
812
 
794
813
  const warnedSlots = new Set();
814
+ /**
815
+ * Report a failure from a fire-and-forget action dispatch. Cancelling a
816
+ * confirmation dialog is a normal outcome, not an error, so it stays silent.
817
+ */
818
+ function reportActionError(error) {
819
+ if (isActionCancelled(error))
820
+ return;
821
+ console.error(error);
822
+ }
795
823
  /**
796
824
  * Renders a single spec element: evaluates visibility, resolves prop
797
825
  * expressions against the state model, wires event/watch bindings, and
@@ -835,12 +863,17 @@ class JrElement {
835
863
  const el = this.rawElement();
836
864
  if (!el)
837
865
  return undefined;
838
- return { ...el, props: resolveElementProps(el.props ?? {}, this.resolutionCtx()) };
866
+ return {
867
+ ...el,
868
+ props: resolveElementProps(el.props ?? {}, this.resolutionCtx()),
869
+ };
839
870
  }, ...(ngDevMode ? [{ debugName: "resolvedElement" }] : /* istanbul ignore next */ []));
840
871
  /** Two-way binding paths ($bindState / $bindItem) by prop name. */
841
872
  bindings = computed(() => {
842
873
  const el = this.rawElement();
843
- return el ? resolveBindings(el.props ?? {}, this.resolutionCtx()) : undefined;
874
+ return el
875
+ ? resolveBindings(el.props ?? {}, this.resolutionCtx())
876
+ : undefined;
844
877
  }, ...(ngDevMode ? [{ debugName: "bindings" }] : /* istanbul ignore next */ []));
845
878
  entry = computed(() => {
846
879
  const el = this.rawElement();
@@ -851,7 +884,7 @@ class JrElement {
851
884
  renderCtx = {
852
885
  element: this.resolvedElement,
853
886
  props: computed(() => this.resolvedElement()?.props ?? {}),
854
- emit: (event) => void this.emitEvent(event),
887
+ emit: (event) => this.fireEvent(event),
855
888
  on: (event) => this.eventHandle(event),
856
889
  bindings: this.bindings,
857
890
  loading: computed(() => this.root.loading()),
@@ -931,7 +964,7 @@ class JrElement {
931
964
  await this.actions.execute({ ...b, params: resolved });
932
965
  }
933
966
  }
934
- })().catch(console.error);
967
+ })().catch(reportActionError);
935
968
  });
936
969
  onCleanup(unsubscribe);
937
970
  });
@@ -946,6 +979,14 @@ class JrElement {
946
979
  stateModel: this.state.getSnapshot(),
947
980
  };
948
981
  }
982
+ /**
983
+ * Fire-and-forget entry point for event emission: dispatching is async, but
984
+ * a template listener has nowhere to await it, so the failure must be
985
+ * handled here rather than escaping as an unhandled rejection.
986
+ */
987
+ fireEvent(eventName) {
988
+ this.emitEvent(eventName).catch(reportActionError);
989
+ }
949
990
  async emitEvent(eventName) {
950
991
  const el = untracked(this.rawElement);
951
992
  const binding = el?.on?.[eventName];
@@ -973,7 +1014,7 @@ class JrElement {
973
1014
  }
974
1015
  const actionBindings = Array.isArray(binding) ? binding : [binding];
975
1016
  return {
976
- emit: () => void this.emitEvent(eventName),
1017
+ emit: () => this.fireEvent(eventName),
977
1018
  shouldPreventDefault: actionBindings.some((b) => b.preventDefault),
978
1019
  bound: true,
979
1020
  };
@@ -1395,6 +1436,47 @@ function parseLine(line) {
1395
1436
  return null;
1396
1437
  }
1397
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
+ }
1398
1480
  /**
1399
1481
  * Set a value at a spec path (for add/replace operations).
1400
1482
  */
@@ -1411,7 +1493,9 @@ function setSpecValue(newSpec, path, value) {
1411
1493
  if (!newSpec.state)
1412
1494
  newSpec.state = {};
1413
1495
  const statePath = path.slice('/state'.length); // e.g. "/posts"
1414
- setByPath(newSpec.state, statePath, value);
1496
+ const state = newSpec.state;
1497
+ copyAlongPath(state, statePath);
1498
+ setByPath(state, statePath, value);
1415
1499
  return;
1416
1500
  }
1417
1501
  if (path.startsWith('/elements/')) {
@@ -1427,6 +1511,7 @@ function setSpecValue(newSpec, path, value) {
1427
1511
  if (element) {
1428
1512
  const propPath = '/' + pathParts.slice(1).join('/');
1429
1513
  const newElement = { ...element };
1514
+ copyAlongPath(newElement, propPath);
1430
1515
  setByPath(newElement, propPath, value);
1431
1516
  newSpec.elements[elementKey] = newElement;
1432
1517
  }
@@ -1443,7 +1528,9 @@ function removeSpecValue(newSpec, path) {
1443
1528
  }
1444
1529
  if (path.startsWith('/state/') && newSpec.state) {
1445
1530
  const statePath = path.slice('/state'.length);
1446
- removeByPath(newSpec.state, statePath);
1531
+ const state = newSpec.state;
1532
+ copyAlongPath(state, statePath);
1533
+ removeByPath(state, statePath);
1447
1534
  return;
1448
1535
  }
1449
1536
  if (path.startsWith('/elements/')) {
@@ -1460,6 +1547,7 @@ function removeSpecValue(newSpec, path) {
1460
1547
  if (element) {
1461
1548
  const propPath = '/' + pathParts.slice(1).join('/');
1462
1549
  const newElement = { ...element };
1550
+ copyAlongPath(newElement, propPath);
1463
1551
  removeByPath(newElement, propPath);
1464
1552
  newSpec.elements[elementKey] = newElement;
1465
1553
  }
@@ -1557,7 +1645,12 @@ function injectUIStream(options) {
1557
1645
  const send = async (prompt, context) => {
1558
1646
  // Abort any existing request
1559
1647
  abortController?.abort();
1560
- abortController = new AbortController();
1648
+ const controller = new AbortController();
1649
+ abortController = controller;
1650
+ // A superseded request must not write to the shared signals on its way
1651
+ // out: its `finally` would otherwise clear `isStreaming` while the request
1652
+ // that replaced it is still streaming.
1653
+ const isCurrent = () => abortController === controller;
1561
1654
  isStreaming.set(true);
1562
1655
  error.set(null);
1563
1656
  usage.set(null);
@@ -1581,8 +1674,11 @@ function injectUIStream(options) {
1581
1674
  spec.set(currentSpec);
1582
1675
  }
1583
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);
1584
1680
  try {
1585
- const response = await fetch(options.api, {
1681
+ const response = await doFetch(options.api, {
1586
1682
  method: 'POST',
1587
1683
  headers: { 'Content-Type': 'application/json' },
1588
1684
  body: JSON.stringify({
@@ -1590,7 +1686,7 @@ function injectUIStream(options) {
1590
1686
  context,
1591
1687
  currentSpec,
1592
1688
  }),
1593
- signal: abortController.signal,
1689
+ signal: controller.signal,
1594
1690
  });
1595
1691
  if (!response.ok) {
1596
1692
  // Try to parse JSON error response for better error messages
@@ -1637,7 +1733,7 @@ function injectUIStream(options) {
1637
1733
  options.onComplete?.(currentSpec);
1638
1734
  }
1639
1735
  catch (err) {
1640
- if (err.name === 'AbortError') {
1736
+ if (err.name === 'AbortError' || !isCurrent()) {
1641
1737
  return;
1642
1738
  }
1643
1739
  const resolvedError = err instanceof Error ? err : new Error(String(err));
@@ -1645,7 +1741,9 @@ function injectUIStream(options) {
1645
1741
  options.onError?.(resolvedError);
1646
1742
  }
1647
1743
  finally {
1648
- isStreaming.set(false);
1744
+ if (isCurrent()) {
1745
+ isStreaming.set(false);
1746
+ }
1649
1747
  }
1650
1748
  };
1651
1749
  return {
@@ -1665,6 +1763,8 @@ function injectUIStream(options) {
1665
1763
  * and parent-child relationships are expressed through children arrays.
1666
1764
  */
1667
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.
1668
1768
  const elementMap = {};
1669
1769
  let root = '';
1670
1770
  // First pass: add all elements to map
@@ -1681,9 +1781,6 @@ function flatToTree(elements) {
1681
1781
  if (element.parentKey) {
1682
1782
  const parent = elementMap[element.parentKey];
1683
1783
  if (parent) {
1684
- if (!parent.children) {
1685
- parent.children = [];
1686
- }
1687
1784
  parent.children.push(element.key);
1688
1785
  }
1689
1786
  }
@@ -1781,7 +1878,8 @@ function jsonRenderMessage(parts) {
1781
1878
  }
1782
1879
  let chatMessageIdCounter = 0;
1783
1880
  function generateChatId() {
1784
- if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
1881
+ if (typeof crypto !== 'undefined' &&
1882
+ typeof crypto.randomUUID === 'function') {
1785
1883
  return crypto.randomUUID();
1786
1884
  }
1787
1885
  chatMessageIdCounter += 1;
@@ -1812,7 +1910,11 @@ function injectChatUI(options) {
1812
1910
  return;
1813
1911
  // Abort any existing request
1814
1912
  abortController?.abort();
1815
- abortController = new AbortController();
1913
+ const controller = new AbortController();
1914
+ abortController = controller;
1915
+ // See injectUIStream: a superseded request must not clear `isStreaming`
1916
+ // out from under the request that replaced it.
1917
+ const isCurrent = () => abortController === controller;
1816
1918
  const userMessage = {
1817
1919
  id: generateChatId(),
1818
1920
  role: 'user',
@@ -1849,12 +1951,15 @@ function injectChatUI(options) {
1849
1951
  elements: { ...currentSpec.elements },
1850
1952
  ...(currentSpec.state ? { state: { ...currentSpec.state } } : {}),
1851
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);
1852
1957
  try {
1853
- const response = await fetch(options.api, {
1958
+ const response = await doFetch(options.api, {
1854
1959
  method: 'POST',
1855
1960
  headers: { 'Content-Type': 'application/json' },
1856
1961
  body: JSON.stringify({ messages: historyForApi }),
1857
- signal: abortController.signal,
1962
+ signal: controller.signal,
1858
1963
  });
1859
1964
  if (!response.ok) {
1860
1965
  let errorMessage = `HTTP error: ${response.status}`;
@@ -1907,7 +2012,7 @@ function injectChatUI(options) {
1907
2012
  options.onComplete?.(finalMessage);
1908
2013
  }
1909
2014
  catch (err) {
1910
- if (err.name === 'AbortError') {
2015
+ if (err.name === 'AbortError' || !isCurrent()) {
1911
2016
  return;
1912
2017
  }
1913
2018
  const resolvedError = err instanceof Error ? err : new Error(String(err));
@@ -1917,7 +2022,9 @@ function injectChatUI(options) {
1917
2022
  options.onError?.(resolvedError);
1918
2023
  }
1919
2024
  finally {
1920
- isStreaming.set(false);
2025
+ if (isCurrent()) {
2026
+ isStreaming.set(false);
2027
+ }
1921
2028
  }
1922
2029
  };
1923
2030
  return {
@@ -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 * 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 return 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 Error('Action cancelled'));\n },\n });\n }).then(() => this.runHandler(resolved, handler));\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 } 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 * 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) => void this.emitEvent(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(console.error);\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 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: () => void this.emitEvent(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 abortController = new AbortController();\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: abortController.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') {\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 isStreaming.set(false);\n }\n };\n\n return {\n spec: spec.asReadonly(),\n isStreaming: isStreaming.asReadonly(),\n error: error.asReadonly(),\n usage: usage.asReadonly(),\n rawLines: rawLines.asReadonly(),\n send,\n 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 abortController = new AbortController();\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: abortController.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') {\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 isStreaming.set(false);\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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-json-render",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "Angular renderer for json-render — stream AI-generated JSON specs into real Angular components with signals.",
5
5
  "keywords": [
6
6
  "angular",
@@ -386,6 +386,12 @@ declare class JrElement {
386
386
  * later actions of a chain see mutations from earlier ones.
387
387
  */
388
388
  private liveResolutionCtx;
389
+ /**
390
+ * Fire-and-forget entry point for event emission: dispatching is async, but
391
+ * a template listener has nowhere to await it, so the failure must be
392
+ * handled here rather than escaping as an unhandled rejection.
393
+ */
394
+ private fireEvent;
389
395
  private emitEvent;
390
396
  private eventHandle;
391
397
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<JrElement, never>;
@@ -611,6 +617,17 @@ interface UIStreamOptions {
611
617
  onComplete?: (spec: Spec) => void;
612
618
  /** Callback on error */
613
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;
614
631
  }
615
632
  /**
616
633
  * Return type for {@link injectUIStream}.
@@ -715,6 +732,13 @@ interface ChatUIOptions {
715
732
  onComplete?: (message: ChatMessage) => void;
716
733
  /** Callback on error */
717
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;
718
742
  }
719
743
  /**
720
744
  * Return type for {@link injectChatUI}.