@json-render/react 0.2.0 → 0.4.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 +253 -175
- package/dist/chunk-IGPI5WNB.mjs +52 -0
- package/dist/chunk-IGPI5WNB.mjs.map +1 -0
- package/dist/index.d.mts +138 -16
- package/dist/index.d.ts +138 -16
- package/dist/index.js +150 -36
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +109 -38
- package/dist/index.mjs.map +1 -1
- package/dist/schema.d.mts +106 -0
- package/dist/schema.d.ts +106 -0
- package/dist/schema.js +77 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.mjs +9 -0
- package/dist/schema.mjs.map +1 -0
- package/package.json +7 -2
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
elementTreeSchema,
|
|
3
|
+
schema
|
|
4
|
+
} from "./chunk-IGPI5WNB.mjs";
|
|
5
|
+
|
|
1
6
|
// src/contexts/data.tsx
|
|
2
7
|
import {
|
|
3
8
|
createContext,
|
|
4
9
|
useContext,
|
|
5
10
|
useState,
|
|
6
11
|
useCallback,
|
|
7
|
-
useMemo
|
|
12
|
+
useMemo,
|
|
13
|
+
useEffect,
|
|
14
|
+
useRef
|
|
8
15
|
} from "react";
|
|
9
16
|
import {
|
|
10
17
|
getByPath,
|
|
@@ -19,6 +26,16 @@ function DataProvider({
|
|
|
19
26
|
children
|
|
20
27
|
}) {
|
|
21
28
|
const [data, setData] = useState(initialData);
|
|
29
|
+
const initialDataJsonRef = useRef(JSON.stringify(initialData));
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
const newJson = JSON.stringify(initialData);
|
|
32
|
+
if (newJson !== initialDataJsonRef.current) {
|
|
33
|
+
initialDataJsonRef.current = newJson;
|
|
34
|
+
if (initialData && Object.keys(initialData).length > 0) {
|
|
35
|
+
setData((prev) => ({ ...prev, ...initialData }));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}, [initialData]);
|
|
22
39
|
const get = useCallback((path) => getByPath(data, path), [data]);
|
|
23
40
|
const set = useCallback(
|
|
24
41
|
(path, value2) => {
|
|
@@ -64,12 +81,12 @@ function useData() {
|
|
|
64
81
|
return ctx;
|
|
65
82
|
}
|
|
66
83
|
function useDataValue(path) {
|
|
67
|
-
const {
|
|
68
|
-
return
|
|
84
|
+
const { data } = useData();
|
|
85
|
+
return getByPath(data, path);
|
|
69
86
|
}
|
|
70
87
|
function useDataBinding(path) {
|
|
71
|
-
const {
|
|
72
|
-
const value =
|
|
88
|
+
const { data, set } = useData();
|
|
89
|
+
const value = getByPath(data, path);
|
|
73
90
|
const setValue = useCallback(
|
|
74
91
|
(newValue) => set(path, newValue),
|
|
75
92
|
[path, set]
|
|
@@ -497,7 +514,7 @@ function useFieldValidation(path, config) {
|
|
|
497
514
|
import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
498
515
|
function ElementRenderer({
|
|
499
516
|
element,
|
|
500
|
-
|
|
517
|
+
spec,
|
|
501
518
|
registry,
|
|
502
519
|
loading,
|
|
503
520
|
fallback
|
|
@@ -513,7 +530,7 @@ function ElementRenderer({
|
|
|
513
530
|
return null;
|
|
514
531
|
}
|
|
515
532
|
const children = element.children?.map((childKey) => {
|
|
516
|
-
const childElement =
|
|
533
|
+
const childElement = spec.elements[childKey];
|
|
517
534
|
if (!childElement) {
|
|
518
535
|
return null;
|
|
519
536
|
}
|
|
@@ -521,7 +538,7 @@ function ElementRenderer({
|
|
|
521
538
|
ElementRenderer,
|
|
522
539
|
{
|
|
523
540
|
element: childElement,
|
|
524
|
-
|
|
541
|
+
spec,
|
|
525
542
|
registry,
|
|
526
543
|
loading,
|
|
527
544
|
fallback
|
|
@@ -531,11 +548,11 @@ function ElementRenderer({
|
|
|
531
548
|
});
|
|
532
549
|
return /* @__PURE__ */ jsx5(Component, { element, onAction: execute, loading, children });
|
|
533
550
|
}
|
|
534
|
-
function Renderer({
|
|
535
|
-
if (!
|
|
551
|
+
function Renderer({ spec, registry, loading, fallback }) {
|
|
552
|
+
if (!spec || !spec.root) {
|
|
536
553
|
return null;
|
|
537
554
|
}
|
|
538
|
-
const rootElement =
|
|
555
|
+
const rootElement = spec.elements[spec.root];
|
|
539
556
|
if (!rootElement) {
|
|
540
557
|
return null;
|
|
541
558
|
}
|
|
@@ -543,7 +560,7 @@ function Renderer({ tree, registry, loading, fallback }) {
|
|
|
543
560
|
ElementRenderer,
|
|
544
561
|
{
|
|
545
562
|
element: rootElement,
|
|
546
|
-
|
|
563
|
+
spec,
|
|
547
564
|
registry,
|
|
548
565
|
loading,
|
|
549
566
|
fallback
|
|
@@ -592,9 +609,49 @@ function createRendererFromCatalog(_catalog, registry) {
|
|
|
592
609
|
return /* @__PURE__ */ jsx5(Renderer, { ...props, registry });
|
|
593
610
|
};
|
|
594
611
|
}
|
|
612
|
+
function createRenderer(catalog, components) {
|
|
613
|
+
const registry = components;
|
|
614
|
+
return function CatalogRenderer({
|
|
615
|
+
spec,
|
|
616
|
+
data,
|
|
617
|
+
onAction,
|
|
618
|
+
onDataChange,
|
|
619
|
+
loading,
|
|
620
|
+
authState,
|
|
621
|
+
fallback
|
|
622
|
+
}) {
|
|
623
|
+
const actionHandlers = onAction ? {
|
|
624
|
+
__default__: (params) => {
|
|
625
|
+
const actionName = params.__actionName__;
|
|
626
|
+
const actionParams = params.__actionParams__;
|
|
627
|
+
return onAction(actionName, actionParams);
|
|
628
|
+
}
|
|
629
|
+
} : void 0;
|
|
630
|
+
return /* @__PURE__ */ jsx5(
|
|
631
|
+
DataProvider,
|
|
632
|
+
{
|
|
633
|
+
initialData: data,
|
|
634
|
+
authState,
|
|
635
|
+
onDataChange,
|
|
636
|
+
children: /* @__PURE__ */ jsx5(VisibilityProvider, { children: /* @__PURE__ */ jsx5(ActionProvider, { handlers: actionHandlers, children: /* @__PURE__ */ jsxs2(ValidationProvider, { children: [
|
|
637
|
+
/* @__PURE__ */ jsx5(
|
|
638
|
+
Renderer,
|
|
639
|
+
{
|
|
640
|
+
spec,
|
|
641
|
+
registry,
|
|
642
|
+
loading,
|
|
643
|
+
fallback
|
|
644
|
+
}
|
|
645
|
+
),
|
|
646
|
+
/* @__PURE__ */ jsx5(ConfirmationDialogManager, {})
|
|
647
|
+
] }) }) })
|
|
648
|
+
}
|
|
649
|
+
);
|
|
650
|
+
};
|
|
651
|
+
}
|
|
595
652
|
|
|
596
653
|
// src/hooks.ts
|
|
597
|
-
import { useState as useState4, useCallback as useCallback4, useRef, useEffect } from "react";
|
|
654
|
+
import { useState as useState4, useCallback as useCallback4, useRef as useRef2, useEffect as useEffect2 } from "react";
|
|
598
655
|
import { setByPath as setByPath2 } from "@json-render/core";
|
|
599
656
|
function parsePatchLine(line) {
|
|
600
657
|
try {
|
|
@@ -607,24 +664,24 @@ function parsePatchLine(line) {
|
|
|
607
664
|
return null;
|
|
608
665
|
}
|
|
609
666
|
}
|
|
610
|
-
function applyPatch(
|
|
611
|
-
const
|
|
667
|
+
function applyPatch(spec, patch) {
|
|
668
|
+
const newSpec = { ...spec, elements: { ...spec.elements } };
|
|
612
669
|
switch (patch.op) {
|
|
613
670
|
case "set":
|
|
614
671
|
case "add":
|
|
615
672
|
case "replace": {
|
|
616
673
|
if (patch.path === "/root") {
|
|
617
|
-
|
|
618
|
-
return
|
|
674
|
+
newSpec.root = patch.value;
|
|
675
|
+
return newSpec;
|
|
619
676
|
}
|
|
620
677
|
if (patch.path.startsWith("/elements/")) {
|
|
621
678
|
const pathParts = patch.path.slice("/elements/".length).split("/");
|
|
622
679
|
const elementKey = pathParts[0];
|
|
623
|
-
if (!elementKey) return
|
|
680
|
+
if (!elementKey) return newSpec;
|
|
624
681
|
if (pathParts.length === 1) {
|
|
625
|
-
|
|
682
|
+
newSpec.elements[elementKey] = patch.value;
|
|
626
683
|
} else {
|
|
627
|
-
const element =
|
|
684
|
+
const element = newSpec.elements[elementKey];
|
|
628
685
|
if (element) {
|
|
629
686
|
const propPath = "/" + pathParts.slice(1).join("/");
|
|
630
687
|
const newElement = { ...element };
|
|
@@ -633,7 +690,7 @@ function applyPatch(tree, patch) {
|
|
|
633
690
|
propPath,
|
|
634
691
|
patch.value
|
|
635
692
|
);
|
|
636
|
-
|
|
693
|
+
newSpec.elements[elementKey] = newElement;
|
|
637
694
|
}
|
|
638
695
|
}
|
|
639
696
|
}
|
|
@@ -643,26 +700,26 @@ function applyPatch(tree, patch) {
|
|
|
643
700
|
if (patch.path.startsWith("/elements/")) {
|
|
644
701
|
const elementKey = patch.path.slice("/elements/".length).split("/")[0];
|
|
645
702
|
if (elementKey) {
|
|
646
|
-
const { [elementKey]: _, ...rest } =
|
|
647
|
-
|
|
703
|
+
const { [elementKey]: _, ...rest } = newSpec.elements;
|
|
704
|
+
newSpec.elements = rest;
|
|
648
705
|
}
|
|
649
706
|
}
|
|
650
707
|
break;
|
|
651
708
|
}
|
|
652
709
|
}
|
|
653
|
-
return
|
|
710
|
+
return newSpec;
|
|
654
711
|
}
|
|
655
712
|
function useUIStream({
|
|
656
713
|
api,
|
|
657
714
|
onComplete,
|
|
658
715
|
onError
|
|
659
716
|
}) {
|
|
660
|
-
const [
|
|
717
|
+
const [spec, setSpec] = useState4(null);
|
|
661
718
|
const [isStreaming, setIsStreaming] = useState4(false);
|
|
662
719
|
const [error, setError] = useState4(null);
|
|
663
|
-
const abortControllerRef =
|
|
720
|
+
const abortControllerRef = useRef2(null);
|
|
664
721
|
const clear = useCallback4(() => {
|
|
665
|
-
|
|
722
|
+
setSpec(null);
|
|
666
723
|
setError(null);
|
|
667
724
|
}, []);
|
|
668
725
|
const send = useCallback4(
|
|
@@ -671,8 +728,9 @@ function useUIStream({
|
|
|
671
728
|
abortControllerRef.current = new AbortController();
|
|
672
729
|
setIsStreaming(true);
|
|
673
730
|
setError(null);
|
|
674
|
-
|
|
675
|
-
|
|
731
|
+
const previousSpec = context?.previousSpec;
|
|
732
|
+
let currentSpec = previousSpec && previousSpec.root ? { ...previousSpec, elements: { ...previousSpec.elements } } : { root: "", elements: {} };
|
|
733
|
+
setSpec(currentSpec);
|
|
676
734
|
try {
|
|
677
735
|
const response = await fetch(api, {
|
|
678
736
|
method: "POST",
|
|
@@ -680,12 +738,22 @@ function useUIStream({
|
|
|
680
738
|
body: JSON.stringify({
|
|
681
739
|
prompt,
|
|
682
740
|
context,
|
|
683
|
-
|
|
741
|
+
currentSpec
|
|
684
742
|
}),
|
|
685
743
|
signal: abortControllerRef.current.signal
|
|
686
744
|
});
|
|
687
745
|
if (!response.ok) {
|
|
688
|
-
|
|
746
|
+
let errorMessage = `HTTP error: ${response.status}`;
|
|
747
|
+
try {
|
|
748
|
+
const errorData = await response.json();
|
|
749
|
+
if (errorData.message) {
|
|
750
|
+
errorMessage = errorData.message;
|
|
751
|
+
} else if (errorData.error) {
|
|
752
|
+
errorMessage = errorData.error;
|
|
753
|
+
}
|
|
754
|
+
} catch {
|
|
755
|
+
}
|
|
756
|
+
throw new Error(errorMessage);
|
|
689
757
|
}
|
|
690
758
|
const reader = response.body?.getReader();
|
|
691
759
|
if (!reader) {
|
|
@@ -702,19 +770,19 @@ function useUIStream({
|
|
|
702
770
|
for (const line of lines) {
|
|
703
771
|
const patch = parsePatchLine(line);
|
|
704
772
|
if (patch) {
|
|
705
|
-
|
|
706
|
-
|
|
773
|
+
currentSpec = applyPatch(currentSpec, patch);
|
|
774
|
+
setSpec({ ...currentSpec });
|
|
707
775
|
}
|
|
708
776
|
}
|
|
709
777
|
}
|
|
710
778
|
if (buffer.trim()) {
|
|
711
779
|
const patch = parsePatchLine(buffer);
|
|
712
780
|
if (patch) {
|
|
713
|
-
|
|
714
|
-
|
|
781
|
+
currentSpec = applyPatch(currentSpec, patch);
|
|
782
|
+
setSpec({ ...currentSpec });
|
|
715
783
|
}
|
|
716
784
|
}
|
|
717
|
-
onComplete?.(
|
|
785
|
+
onComplete?.(currentSpec);
|
|
718
786
|
} catch (err) {
|
|
719
787
|
if (err.name === "AbortError") {
|
|
720
788
|
return;
|
|
@@ -728,13 +796,13 @@ function useUIStream({
|
|
|
728
796
|
},
|
|
729
797
|
[api, onComplete, onError]
|
|
730
798
|
);
|
|
731
|
-
|
|
799
|
+
useEffect2(() => {
|
|
732
800
|
return () => {
|
|
733
801
|
abortControllerRef.current?.abort();
|
|
734
802
|
};
|
|
735
803
|
}, []);
|
|
736
804
|
return {
|
|
737
|
-
|
|
805
|
+
spec,
|
|
738
806
|
isStreaming,
|
|
739
807
|
error,
|
|
740
808
|
send,
|
|
@@ -776,8 +844,11 @@ export {
|
|
|
776
844
|
Renderer,
|
|
777
845
|
ValidationProvider,
|
|
778
846
|
VisibilityProvider,
|
|
847
|
+
createRenderer,
|
|
779
848
|
createRendererFromCatalog,
|
|
849
|
+
elementTreeSchema,
|
|
780
850
|
flatToTree,
|
|
851
|
+
schema,
|
|
781
852
|
useAction,
|
|
782
853
|
useActions,
|
|
783
854
|
useData,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contexts/data.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/renderer.tsx","../src/hooks.ts"],"sourcesContent":["\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n getByPath,\n setByPath,\n type DataModel,\n type AuthState,\n} from \"@json-render/core\";\n\n/**\n * Data context value\n */\nexport interface DataContextValue {\n /** The current data model */\n data: DataModel;\n /** Auth state for visibility evaluation */\n authState?: AuthState;\n /** Get a value by path */\n get: (path: string) => unknown;\n /** Set a value by path */\n set: (path: string, value: unknown) => void;\n /** Update multiple values at once */\n update: (updates: Record<string, unknown>) => void;\n}\n\nconst DataContext = createContext<DataContextValue | null>(null);\n\n/**\n * Props for DataProvider\n */\nexport interface DataProviderProps {\n /** Initial data model */\n initialData?: DataModel;\n /** Auth state */\n authState?: AuthState;\n /** Callback when data changes */\n onDataChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\n/**\n * Provider for data model context\n */\nexport function DataProvider({\n initialData = {},\n authState,\n onDataChange,\n children,\n}: DataProviderProps) {\n const [data, setData] = useState<DataModel>(initialData);\n\n const get = useCallback((path: string) => getByPath(data, path), [data]);\n\n const set = useCallback(\n (path: string, value: unknown) => {\n setData((prev) => {\n const next = { ...prev };\n setByPath(next, path, value);\n return next;\n });\n onDataChange?.(path, value);\n },\n [onDataChange],\n );\n\n const update = useCallback(\n (updates: Record<string, unknown>) => {\n setData((prev) => {\n const next = { ...prev };\n for (const [path, value] of Object.entries(updates)) {\n setByPath(next, path, value);\n onDataChange?.(path, value);\n }\n return next;\n });\n },\n [onDataChange],\n );\n\n const value = useMemo<DataContextValue>(\n () => ({\n data,\n authState,\n get,\n set,\n update,\n }),\n [data, authState, get, set, update],\n );\n\n return <DataContext.Provider value={value}>{children}</DataContext.Provider>;\n}\n\n/**\n * Hook to access the data context\n */\nexport function useData(): DataContextValue {\n const ctx = useContext(DataContext);\n if (!ctx) {\n throw new Error(\"useData must be used within a DataProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to get a value from the data model\n */\nexport function useDataValue<T>(path: string): T | undefined {\n const { get } = useData();\n return get(path) as T | undefined;\n}\n\n/**\n * Hook to get and set a value from the data model (like useState)\n */\nexport function useDataBinding<T>(\n path: string,\n): [T | undefined, (value: T) => void] {\n const { get, set } = useData();\n const value = get(path) as T | undefined;\n const setValue = useCallback(\n (newValue: T) => set(path, newValue),\n [path, set],\n );\n return [value, setValue];\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useData } from \"./data\";\n\n/**\n * Visibility context value\n */\nexport interface VisibilityContextValue {\n /** Evaluate a visibility condition */\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n /** The underlying visibility context */\n ctx: CoreVisibilityContext;\n}\n\nconst VisibilityContext = createContext<VisibilityContextValue | null>(null);\n\n/**\n * Props for VisibilityProvider\n */\nexport interface VisibilityProviderProps {\n children: ReactNode;\n}\n\n/**\n * Provider for visibility evaluation\n */\nexport function VisibilityProvider({ children }: VisibilityProviderProps) {\n const { data, authState } = useData();\n\n const ctx: CoreVisibilityContext = useMemo(\n () => ({\n dataModel: data,\n authState,\n }),\n [data, authState],\n );\n\n const isVisible = useMemo(\n () => (condition: VisibilityCondition | undefined) =>\n evaluateVisibility(condition, ctx),\n [ctx],\n );\n\n const value = useMemo<VisibilityContextValue>(\n () => ({ isVisible, ctx }),\n [isVisible, ctx],\n );\n\n return (\n <VisibilityContext.Provider value={value}>\n {children}\n </VisibilityContext.Provider>\n );\n}\n\n/**\n * Hook to access visibility evaluation\n */\nexport function useVisibility(): VisibilityContextValue {\n const ctx = useContext(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to check if a condition is visible\n */\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): boolean {\n const { isVisible } = useVisibility();\n return isVisible(condition);\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n resolveAction,\n executeAction,\n type Action,\n type ActionHandler,\n type ActionConfirm,\n type ResolvedAction,\n} from \"@json-render/core\";\nimport { useData } from \"./data\";\n\n/**\n * Pending confirmation state\n */\nexport interface PendingConfirmation {\n /** The resolved action */\n action: ResolvedAction;\n /** The action handler */\n handler: ActionHandler;\n /** Resolve callback */\n resolve: () => void;\n /** Reject callback */\n reject: () => void;\n}\n\n/**\n * Action context value\n */\nexport interface ActionContextValue {\n /** Registered action handlers */\n handlers: Record<string, ActionHandler>;\n /** Currently loading action names */\n loadingActions: Set<string>;\n /** Pending confirmation dialog */\n pendingConfirmation: PendingConfirmation | null;\n /** Execute an action */\n execute: (action: Action) => Promise<void>;\n /** Confirm the pending action */\n confirm: () => void;\n /** Cancel the pending action */\n cancel: () => void;\n /** Register an action handler */\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\n/**\n * Props for ActionProvider\n */\nexport interface ActionProviderProps {\n /** Initial action handlers */\n handlers?: Record<string, ActionHandler>;\n /** Navigation function */\n navigate?: (path: string) => void;\n children: ReactNode;\n}\n\n/**\n * Provider for action execution\n */\nexport function ActionProvider({\n handlers: initialHandlers = {},\n navigate,\n children,\n}: ActionProviderProps) {\n const { data, set } = useData();\n const [handlers, setHandlers] =\n useState<Record<string, ActionHandler>>(initialHandlers);\n const [loadingActions, setLoadingActions] = useState<Set<string>>(new Set());\n const [pendingConfirmation, setPendingConfirmation] =\n useState<PendingConfirmation | null>(null);\n\n const registerHandler = useCallback(\n (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n },\n [],\n );\n\n const execute = useCallback(\n async (action: Action) => {\n const resolved = resolveAction(action, data);\n const handler = handlers[resolved.name];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.name}`);\n return;\n }\n\n // If confirmation is required, show dialog\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.name));\n try {\n await executeAction({\n action: resolved,\n handler,\n setData: set,\n navigate,\n executeAction: async (name) => {\n const subAction: Action = { name };\n await execute(subAction);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.name);\n return next;\n });\n }\n });\n }\n\n // Execute immediately\n setLoadingActions((prev) => new Set(prev).add(resolved.name));\n try {\n await executeAction({\n action: resolved,\n handler,\n setData: set,\n navigate,\n executeAction: async (name) => {\n const subAction: Action = { name };\n await execute(subAction);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.name);\n return next;\n });\n }\n },\n [data, handlers, set, navigate],\n );\n\n const confirm = useCallback(() => {\n pendingConfirmation?.resolve();\n }, [pendingConfirmation]);\n\n const cancel = useCallback(() => {\n pendingConfirmation?.reject();\n }, [pendingConfirmation]);\n\n const value = useMemo<ActionContextValue>(\n () => ({\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n }),\n [\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n ],\n );\n\n return (\n <ActionContext.Provider value={value}>{children}</ActionContext.Provider>\n );\n}\n\n/**\n * Hook to access action context\n */\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to execute an action\n */\nexport function useAction(action: Action): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const { execute, loadingActions } = useActions();\n const isLoading = loadingActions.has(action.name);\n\n const executeAction = useCallback(() => execute(action), [execute, action]);\n\n return { execute: executeAction, isLoading };\n}\n\n/**\n * Props for ConfirmDialog component\n */\nexport interface ConfirmDialogProps {\n /** The confirmation config */\n confirm: ActionConfirm;\n /** Called when confirmed */\n onConfirm: () => void;\n /** Called when cancelled */\n onCancel: () => void;\n}\n\n/**\n * Default confirmation dialog component\n */\nexport function ConfirmDialog({\n confirm,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const isDanger = confirm.variant === \"danger\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 50,\n }}\n onClick={onCancel}\n >\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"8px\",\n padding: \"24px\",\n maxWidth: \"400px\",\n width: \"100%\",\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <h3\n style={{\n margin: \"0 0 8px 0\",\n fontSize: \"18px\",\n fontWeight: 600,\n }}\n >\n {confirm.title}\n </h3>\n <p\n style={{\n margin: \"0 0 24px 0\",\n color: \"#6b7280\",\n }}\n >\n {confirm.message}\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"12px\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={onCancel}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"white\",\n cursor: \"pointer\",\n }}\n >\n {confirm.cancelLabel ?? \"Cancel\"}\n </button>\n <button\n onClick={onConfirm}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"none\",\n backgroundColor: isDanger ? \"#dc2626\" : \"#3b82f6\",\n color: \"white\",\n cursor: \"pointer\",\n }}\n >\n {confirm.confirmLabel ?? \"Confirm\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useData } from \"./data\";\n\n/**\n * Field validation state\n */\nexport interface FieldValidationState {\n /** Whether the field has been touched */\n touched: boolean;\n /** Whether the field has been validated */\n validated: boolean;\n /** Validation result */\n result: ValidationResult | null;\n}\n\n/**\n * Validation context value\n */\nexport interface ValidationContextValue {\n /** Custom validation functions from catalog */\n customFunctions: Record<string, ValidationFunction>;\n /** Validation state by field path */\n fieldStates: Record<string, FieldValidationState>;\n /** Validate a field */\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n /** Mark field as touched */\n touch: (path: string) => void;\n /** Clear validation for a field */\n clear: (path: string) => void;\n /** Validate all fields */\n validateAll: () => boolean;\n /** Register field config */\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\n/**\n * Props for ValidationProvider\n */\nexport interface ValidationProviderProps {\n /** Custom validation functions from catalog */\n customFunctions?: Record<string, ValidationFunction>;\n children: ReactNode;\n}\n\n/**\n * Provider for validation\n */\nexport function ValidationProvider({\n customFunctions = {},\n children,\n}: ValidationProviderProps) {\n const { data, authState } = useData();\n const [fieldStates, setFieldStates] = useState<\n Record<string, FieldValidationState>\n >({});\n const [fieldConfigs, setFieldConfigs] = useState<\n Record<string, ValidationConfig>\n >({});\n\n const registerField = useCallback(\n (path: string, config: ValidationConfig) => {\n setFieldConfigs((prev) => ({ ...prev, [path]: config }));\n },\n [],\n );\n\n const validate = useCallback(\n (path: string, config: ValidationConfig): ValidationResult => {\n const value = data[path.split(\"/\").filter(Boolean).join(\".\")];\n const result = runValidation(config, {\n value,\n dataModel: data,\n customFunctions,\n authState,\n });\n\n setFieldStates((prev) => ({\n ...prev,\n [path]: {\n touched: prev[path]?.touched ?? true,\n validated: true,\n result,\n },\n }));\n\n return result;\n },\n [data, customFunctions, authState],\n );\n\n const touch = useCallback((path: string) => {\n setFieldStates((prev) => ({\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 const clear = useCallback((path: string) => {\n setFieldStates((prev) => {\n const { [path]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const validateAll = useCallback(() => {\n let allValid = true;\n\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n\n return allValid;\n }, [fieldConfigs, validate]);\n\n const value = useMemo<ValidationContextValue>(\n () => ({\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n }),\n [\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n ],\n );\n\n return (\n <ValidationContext.Provider value={value}>\n {children}\n </ValidationContext.Provider>\n );\n}\n\n/**\n * Hook to access validation context\n */\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to get validation state for a field\n */\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: FieldValidationState;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: string[];\n isValid: boolean;\n} {\n const {\n fieldStates,\n validate: validateField,\n touch: touchField,\n clear: clearField,\n registerField,\n } = useValidation();\n\n // Register field on mount\n React.useEffect(() => {\n if (config) {\n registerField(path, config);\n }\n }, [path, config, registerField]);\n\n const state = fieldStates[path] ?? {\n touched: false,\n validated: false,\n result: null,\n };\n\n const validate = useCallback(\n () => validateField(path, config ?? { checks: [] }),\n [path, config, validateField],\n );\n\n const touch = useCallback(() => touchField(path), [path, touchField]);\n const clear = useCallback(() => clearField(path), [path, clearField]);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors: state.result?.errors ?? [],\n isValid: state.result?.valid ?? true,\n };\n}\n","\"use client\";\n\nimport React, { type ComponentType, type ReactNode, useMemo } from \"react\";\nimport type {\n UIElement,\n UITree,\n Action,\n Catalog,\n ComponentDefinition,\n} from \"@json-render/core\";\nimport { useIsVisible } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useData } from \"./contexts/data\";\n\n/**\n * Props passed to component renderers\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n /** The element being rendered */\n element: UIElement<string, P>;\n /** Rendered children */\n children?: ReactNode;\n /** Execute an action */\n onAction?: (action: Action) => void;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Component renderer type\n */\nexport type ComponentRenderer<P = Record<string, unknown>> = ComponentType<\n ComponentRenderProps<P>\n>;\n\n/**\n * Registry of component renderers\n */\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n /** The UI tree to render */\n tree: UITree | null;\n /** Component registry */\n registry: ComponentRegistry;\n /** Whether the tree is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n/**\n * Element renderer component\n */\nfunction ElementRenderer({\n element,\n tree,\n registry,\n loading,\n fallback,\n}: {\n element: UIElement;\n tree: UITree;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}) {\n const isVisible = useIsVisible(element.visible);\n const { execute } = useActions();\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n // Get the component renderer\n const Component = registry[element.type] ?? fallback;\n\n if (!Component) {\n console.warn(`No renderer for component type: ${element.type}`);\n return null;\n }\n\n // Render children\n const children = element.children?.map((childKey) => {\n const childElement = tree.elements[childKey];\n if (!childElement) {\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n tree={tree}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n });\n\n return (\n <Component element={element} onAction={execute} loading={loading}>\n {children}\n </Component>\n );\n}\n\n/**\n * Main renderer component\n */\nexport function Renderer({ tree, registry, loading, fallback }: RendererProps) {\n if (!tree || !tree.root) {\n return null;\n }\n\n const rootElement = tree.elements[tree.root];\n if (!rootElement) {\n return null;\n }\n\n return (\n <ElementRenderer\n element={rootElement}\n tree={tree}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n}\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n /** Component registry */\n registry: ComponentRegistry;\n /** Initial data model */\n initialData?: Record<string, unknown>;\n /** Auth state */\n authState?: { isSignedIn: boolean; user?: Record<string, unknown> };\n /** Action handlers */\n actionHandlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n /** Navigation function */\n navigate?: (path: string) => void;\n /** Custom validation functions */\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n /** Callback when data changes */\n onDataChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\n// Import the providers\nimport { DataProvider } from \"./contexts/data\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { ConfirmDialog } from \"./contexts/actions\";\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport function JSONUIProvider({\n registry,\n initialData,\n authState,\n actionHandlers,\n navigate,\n validationFunctions,\n onDataChange,\n children,\n}: JSONUIProviderProps) {\n return (\n <DataProvider\n initialData={initialData}\n authState={authState}\n onDataChange={onDataChange}\n >\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers} navigate={navigate}>\n <ValidationProvider customFunctions={validationFunctions}>\n {children}\n <ConfirmationDialogManager />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </DataProvider>\n );\n}\n\n/**\n * Renders the confirmation dialog when needed\n */\nfunction ConfirmationDialogManager() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n if (!pendingConfirmation?.action.confirm) {\n return null;\n }\n\n return (\n <ConfirmDialog\n confirm={pendingConfirmation.action.confirm}\n onConfirm={confirm}\n onCancel={cancel}\n />\n );\n}\n\n/**\n * Helper to create a renderer component from a catalog\n */\nexport function createRendererFromCatalog<\n C extends Catalog<Record<string, ComponentDefinition>>,\n>(\n _catalog: C,\n registry: ComponentRegistry,\n): ComponentType<Omit<RendererProps, \"registry\">> {\n return function CatalogRenderer(props: Omit<RendererProps, \"registry\">) {\n return <Renderer {...props} registry={registry} />;\n };\n}\n","\"use client\";\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport type { UITree, UIElement, JsonPatch } from \"@json-render/core\";\nimport { setByPath } from \"@json-render/core\";\n\n/**\n * Parse a single JSON patch line\n */\nfunction parsePatchLine(line: string): JsonPatch | null {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"//\")) {\n return null;\n }\n return JSON.parse(trimmed) as JsonPatch;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply a JSON patch to the current tree\n */\nfunction applyPatch(tree: UITree, patch: JsonPatch): UITree {\n const newTree = { ...tree, elements: { ...tree.elements } };\n\n switch (patch.op) {\n case \"set\":\n case \"add\":\n case \"replace\": {\n // Handle root path\n if (patch.path === \"/root\") {\n newTree.root = patch.value as string;\n return newTree;\n }\n\n // Handle elements paths\n if (patch.path.startsWith(\"/elements/\")) {\n const pathParts = patch.path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n\n if (!elementKey) return newTree;\n\n if (pathParts.length === 1) {\n // Setting entire element\n newTree.elements[elementKey] = patch.value as UIElement;\n } else {\n // Setting property of element\n const element = newTree.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 patch.value,\n );\n newTree.elements[elementKey] = newElement;\n }\n }\n }\n break;\n }\n case \"remove\": {\n if (patch.path.startsWith(\"/elements/\")) {\n const elementKey = patch.path.slice(\"/elements/\".length).split(\"/\")[0];\n if (elementKey) {\n const { [elementKey]: _, ...rest } = newTree.elements;\n newTree.elements = rest;\n }\n }\n break;\n }\n }\n\n return newTree;\n}\n\n/**\n * Options for useUIStream\n */\nexport interface UseUIStreamOptions {\n /** API endpoint */\n api: string;\n /** Callback when complete */\n onComplete?: (tree: UITree) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Return type for useUIStream\n */\nexport interface UseUIStreamReturn {\n /** Current UI tree */\n tree: UITree | null;\n /** Whether currently streaming */\n isStreaming: boolean;\n /** Error if any */\n error: Error | null;\n /** Send a prompt to generate UI */\n send: (prompt: string, context?: Record<string, unknown>) => Promise<void>;\n /** Clear the current tree */\n clear: () => void;\n}\n\n/**\n * Hook for streaming UI generation\n */\nexport function useUIStream({\n api,\n onComplete,\n onError,\n}: UseUIStreamOptions): UseUIStreamReturn {\n const [tree, setTree] = useState<UITree | null>(null);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const clear = useCallback(() => {\n setTree(null);\n setError(null);\n }, []);\n\n const send = useCallback(\n async (prompt: string, context?: Record<string, unknown>) => {\n // Abort any existing request\n abortControllerRef.current?.abort();\n abortControllerRef.current = new AbortController();\n\n setIsStreaming(true);\n setError(null);\n\n // Start with an empty tree\n let currentTree: UITree = { root: \"\", elements: {} };\n setTree(currentTree);\n\n try {\n const response = await fetch(api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n context,\n currentTree,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\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 patch = parsePatchLine(line);\n if (patch) {\n currentTree = applyPatch(currentTree, patch);\n setTree({ ...currentTree });\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const patch = parsePatchLine(buffer);\n if (patch) {\n currentTree = applyPatch(currentTree, patch);\n setTree({ ...currentTree });\n }\n }\n\n onComplete?.(currentTree);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n return;\n }\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n } finally {\n setIsStreaming(false);\n }\n },\n [api, onComplete, onError],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n return {\n tree,\n isStreaming,\n error,\n send,\n clear,\n };\n}\n\n/**\n * Convert a flat element list to a UITree\n */\nexport function flatToTree(\n elements: Array<UIElement & { parentKey?: string | null }>,\n): UITree {\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 key: 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"],"mappings":"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","names":["value","createContext","useContext","useMemo","jsx","createContext","useMemo","useContext","createContext","useContext","useState","useCallback","useMemo","jsx","createContext","useState","useCallback","useMemo","useContext","executeAction","React","createContext","useContext","useState","useCallback","useMemo","jsx","createContext","useState","useCallback","value","useMemo","useContext","React","jsx","jsxs","useState","useCallback","setByPath","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/contexts/data.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/renderer.tsx","../src/hooks.ts"],"sourcesContent":["\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n getByPath,\n setByPath,\n type DataModel,\n type AuthState,\n} from \"@json-render/core\";\n\n/**\n * Data context value\n */\nexport interface DataContextValue {\n /** The current data model */\n data: DataModel;\n /** Auth state for visibility evaluation */\n authState?: AuthState;\n /** Get a value by path */\n get: (path: string) => unknown;\n /** Set a value by path */\n set: (path: string, value: unknown) => void;\n /** Update multiple values at once */\n update: (updates: Record<string, unknown>) => void;\n}\n\nconst DataContext = createContext<DataContextValue | null>(null);\n\n/**\n * Props for DataProvider\n */\nexport interface DataProviderProps {\n /** Initial data model */\n initialData?: DataModel;\n /** Auth state */\n authState?: AuthState;\n /** Callback when data changes */\n onDataChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\n/**\n * Provider for data model context\n */\nexport function DataProvider({\n initialData = {},\n authState,\n onDataChange,\n children,\n}: DataProviderProps) {\n const [data, setData] = useState<DataModel>(initialData);\n\n // Track the serialized initialData to detect actual value changes (not just reference changes)\n const initialDataJsonRef = useRef<string>(JSON.stringify(initialData));\n\n // Sync external data changes with internal state - only when values actually change\n useEffect(() => {\n const newJson = JSON.stringify(initialData);\n if (newJson !== initialDataJsonRef.current) {\n initialDataJsonRef.current = newJson;\n if (initialData && Object.keys(initialData).length > 0) {\n setData((prev) => ({ ...prev, ...initialData }));\n }\n }\n }, [initialData]);\n\n const get = useCallback((path: string) => getByPath(data, path), [data]);\n\n const set = useCallback(\n (path: string, value: unknown) => {\n setData((prev) => {\n const next = { ...prev };\n setByPath(next, path, value);\n return next;\n });\n onDataChange?.(path, value);\n },\n [onDataChange],\n );\n\n const update = useCallback(\n (updates: Record<string, unknown>) => {\n setData((prev) => {\n const next = { ...prev };\n for (const [path, value] of Object.entries(updates)) {\n setByPath(next, path, value);\n onDataChange?.(path, value);\n }\n return next;\n });\n },\n [onDataChange],\n );\n\n const value = useMemo<DataContextValue>(\n () => ({\n data,\n authState,\n get,\n set,\n update,\n }),\n [data, authState, get, set, update],\n );\n\n return <DataContext.Provider value={value}>{children}</DataContext.Provider>;\n}\n\n/**\n * Hook to access the data context\n */\nexport function useData(): DataContextValue {\n const ctx = useContext(DataContext);\n if (!ctx) {\n throw new Error(\"useData must be used within a DataProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to get a value from the data model\n */\nexport function useDataValue<T>(path: string): T | undefined {\n const { data } = useData();\n return getByPath(data, path) as T | undefined;\n}\n\n/**\n * Hook to get and set a value from the data model (like useState)\n */\nexport function useDataBinding<T>(\n path: string,\n): [T | undefined, (value: T) => void] {\n const { data, set } = useData();\n const value = getByPath(data, path) as T | undefined;\n const setValue = useCallback(\n (newValue: T) => set(path, newValue),\n [path, set],\n );\n return [value, setValue];\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n evaluateVisibility,\n type VisibilityCondition,\n type VisibilityContext as CoreVisibilityContext,\n} from \"@json-render/core\";\nimport { useData } from \"./data\";\n\n/**\n * Visibility context value\n */\nexport interface VisibilityContextValue {\n /** Evaluate a visibility condition */\n isVisible: (condition: VisibilityCondition | undefined) => boolean;\n /** The underlying visibility context */\n ctx: CoreVisibilityContext;\n}\n\nconst VisibilityContext = createContext<VisibilityContextValue | null>(null);\n\n/**\n * Props for VisibilityProvider\n */\nexport interface VisibilityProviderProps {\n children: ReactNode;\n}\n\n/**\n * Provider for visibility evaluation\n */\nexport function VisibilityProvider({ children }: VisibilityProviderProps) {\n const { data, authState } = useData();\n\n const ctx: CoreVisibilityContext = useMemo(\n () => ({\n dataModel: data,\n authState,\n }),\n [data, authState],\n );\n\n const isVisible = useMemo(\n () => (condition: VisibilityCondition | undefined) =>\n evaluateVisibility(condition, ctx),\n [ctx],\n );\n\n const value = useMemo<VisibilityContextValue>(\n () => ({ isVisible, ctx }),\n [isVisible, ctx],\n );\n\n return (\n <VisibilityContext.Provider value={value}>\n {children}\n </VisibilityContext.Provider>\n );\n}\n\n/**\n * Hook to access visibility evaluation\n */\nexport function useVisibility(): VisibilityContextValue {\n const ctx = useContext(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to check if a condition is visible\n */\nexport function useIsVisible(\n condition: VisibilityCondition | undefined,\n): boolean {\n const { isVisible } = useVisibility();\n return isVisible(condition);\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n resolveAction,\n executeAction,\n type Action,\n type ActionHandler,\n type ActionConfirm,\n type ResolvedAction,\n} from \"@json-render/core\";\nimport { useData } from \"./data\";\n\n/**\n * Pending confirmation state\n */\nexport interface PendingConfirmation {\n /** The resolved action */\n action: ResolvedAction;\n /** The action handler */\n handler: ActionHandler;\n /** Resolve callback */\n resolve: () => void;\n /** Reject callback */\n reject: () => void;\n}\n\n/**\n * Action context value\n */\nexport interface ActionContextValue {\n /** Registered action handlers */\n handlers: Record<string, ActionHandler>;\n /** Currently loading action names */\n loadingActions: Set<string>;\n /** Pending confirmation dialog */\n pendingConfirmation: PendingConfirmation | null;\n /** Execute an action */\n execute: (action: Action) => Promise<void>;\n /** Confirm the pending action */\n confirm: () => void;\n /** Cancel the pending action */\n cancel: () => void;\n /** Register an action handler */\n registerHandler: (name: string, handler: ActionHandler) => void;\n}\n\nconst ActionContext = createContext<ActionContextValue | null>(null);\n\n/**\n * Props for ActionProvider\n */\nexport interface ActionProviderProps {\n /** Initial action handlers */\n handlers?: Record<string, ActionHandler>;\n /** Navigation function */\n navigate?: (path: string) => void;\n children: ReactNode;\n}\n\n/**\n * Provider for action execution\n */\nexport function ActionProvider({\n handlers: initialHandlers = {},\n navigate,\n children,\n}: ActionProviderProps) {\n const { data, set } = useData();\n const [handlers, setHandlers] =\n useState<Record<string, ActionHandler>>(initialHandlers);\n const [loadingActions, setLoadingActions] = useState<Set<string>>(new Set());\n const [pendingConfirmation, setPendingConfirmation] =\n useState<PendingConfirmation | null>(null);\n\n const registerHandler = useCallback(\n (name: string, handler: ActionHandler) => {\n setHandlers((prev) => ({ ...prev, [name]: handler }));\n },\n [],\n );\n\n const execute = useCallback(\n async (action: Action) => {\n const resolved = resolveAction(action, data);\n const handler = handlers[resolved.name];\n\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.name}`);\n return;\n }\n\n // If confirmation is required, show dialog\n if (resolved.confirm) {\n return new Promise<void>((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n },\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.name));\n try {\n await executeAction({\n action: resolved,\n handler,\n setData: set,\n navigate,\n executeAction: async (name) => {\n const subAction: Action = { name };\n await execute(subAction);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.name);\n return next;\n });\n }\n });\n }\n\n // Execute immediately\n setLoadingActions((prev) => new Set(prev).add(resolved.name));\n try {\n await executeAction({\n action: resolved,\n handler,\n setData: set,\n navigate,\n executeAction: async (name) => {\n const subAction: Action = { name };\n await execute(subAction);\n },\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.name);\n return next;\n });\n }\n },\n [data, handlers, set, navigate],\n );\n\n const confirm = useCallback(() => {\n pendingConfirmation?.resolve();\n }, [pendingConfirmation]);\n\n const cancel = useCallback(() => {\n pendingConfirmation?.reject();\n }, [pendingConfirmation]);\n\n const value = useMemo<ActionContextValue>(\n () => ({\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n }),\n [\n handlers,\n loadingActions,\n pendingConfirmation,\n execute,\n confirm,\n cancel,\n registerHandler,\n ],\n );\n\n return (\n <ActionContext.Provider value={value}>{children}</ActionContext.Provider>\n );\n}\n\n/**\n * Hook to access action context\n */\nexport function useActions(): ActionContextValue {\n const ctx = useContext(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to execute an action\n */\nexport function useAction(action: Action): {\n execute: () => Promise<void>;\n isLoading: boolean;\n} {\n const { execute, loadingActions } = useActions();\n const isLoading = loadingActions.has(action.name);\n\n const executeAction = useCallback(() => execute(action), [execute, action]);\n\n return { execute: executeAction, isLoading };\n}\n\n/**\n * Props for ConfirmDialog component\n */\nexport interface ConfirmDialogProps {\n /** The confirmation config */\n confirm: ActionConfirm;\n /** Called when confirmed */\n onConfirm: () => void;\n /** Called when cancelled */\n onCancel: () => void;\n}\n\n/**\n * Default confirmation dialog component\n */\nexport function ConfirmDialog({\n confirm,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const isDanger = confirm.variant === \"danger\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 50,\n }}\n onClick={onCancel}\n >\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"8px\",\n padding: \"24px\",\n maxWidth: \"400px\",\n width: \"100%\",\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1)\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <h3\n style={{\n margin: \"0 0 8px 0\",\n fontSize: \"18px\",\n fontWeight: 600,\n }}\n >\n {confirm.title}\n </h3>\n <p\n style={{\n margin: \"0 0 24px 0\",\n color: \"#6b7280\",\n }}\n >\n {confirm.message}\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"12px\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={onCancel}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"white\",\n cursor: \"pointer\",\n }}\n >\n {confirm.cancelLabel ?? \"Cancel\"}\n </button>\n <button\n onClick={onConfirm}\n style={{\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n border: \"none\",\n backgroundColor: isDanger ? \"#dc2626\" : \"#3b82f6\",\n color: \"white\",\n cursor: \"pointer\",\n }}\n >\n {confirm.confirmLabel ?? \"Confirm\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport {\n runValidation,\n type ValidationConfig,\n type ValidationFunction,\n type ValidationResult,\n} from \"@json-render/core\";\nimport { useData } from \"./data\";\n\n/**\n * Field validation state\n */\nexport interface FieldValidationState {\n /** Whether the field has been touched */\n touched: boolean;\n /** Whether the field has been validated */\n validated: boolean;\n /** Validation result */\n result: ValidationResult | null;\n}\n\n/**\n * Validation context value\n */\nexport interface ValidationContextValue {\n /** Custom validation functions from catalog */\n customFunctions: Record<string, ValidationFunction>;\n /** Validation state by field path */\n fieldStates: Record<string, FieldValidationState>;\n /** Validate a field */\n validate: (path: string, config: ValidationConfig) => ValidationResult;\n /** Mark field as touched */\n touch: (path: string) => void;\n /** Clear validation for a field */\n clear: (path: string) => void;\n /** Validate all fields */\n validateAll: () => boolean;\n /** Register field config */\n registerField: (path: string, config: ValidationConfig) => void;\n}\n\nconst ValidationContext = createContext<ValidationContextValue | null>(null);\n\n/**\n * Props for ValidationProvider\n */\nexport interface ValidationProviderProps {\n /** Custom validation functions from catalog */\n customFunctions?: Record<string, ValidationFunction>;\n children: ReactNode;\n}\n\n/**\n * Provider for validation\n */\nexport function ValidationProvider({\n customFunctions = {},\n children,\n}: ValidationProviderProps) {\n const { data, authState } = useData();\n const [fieldStates, setFieldStates] = useState<\n Record<string, FieldValidationState>\n >({});\n const [fieldConfigs, setFieldConfigs] = useState<\n Record<string, ValidationConfig>\n >({});\n\n const registerField = useCallback(\n (path: string, config: ValidationConfig) => {\n setFieldConfigs((prev) => ({ ...prev, [path]: config }));\n },\n [],\n );\n\n const validate = useCallback(\n (path: string, config: ValidationConfig): ValidationResult => {\n const value = data[path.split(\"/\").filter(Boolean).join(\".\")];\n const result = runValidation(config, {\n value,\n dataModel: data,\n customFunctions,\n authState,\n });\n\n setFieldStates((prev) => ({\n ...prev,\n [path]: {\n touched: prev[path]?.touched ?? true,\n validated: true,\n result,\n },\n }));\n\n return result;\n },\n [data, customFunctions, authState],\n );\n\n const touch = useCallback((path: string) => {\n setFieldStates((prev) => ({\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 const clear = useCallback((path: string) => {\n setFieldStates((prev) => {\n const { [path]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const validateAll = useCallback(() => {\n let allValid = true;\n\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n\n return allValid;\n }, [fieldConfigs, validate]);\n\n const value = useMemo<ValidationContextValue>(\n () => ({\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n }),\n [\n customFunctions,\n fieldStates,\n validate,\n touch,\n clear,\n validateAll,\n registerField,\n ],\n );\n\n return (\n <ValidationContext.Provider value={value}>\n {children}\n </ValidationContext.Provider>\n );\n}\n\n/**\n * Hook to access validation context\n */\nexport function useValidation(): ValidationContextValue {\n const ctx = useContext(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\n\n/**\n * Hook to get validation state for a field\n */\nexport function useFieldValidation(\n path: string,\n config?: ValidationConfig,\n): {\n state: FieldValidationState;\n validate: () => ValidationResult;\n touch: () => void;\n clear: () => void;\n errors: string[];\n isValid: boolean;\n} {\n const {\n fieldStates,\n validate: validateField,\n touch: touchField,\n clear: clearField,\n registerField,\n } = useValidation();\n\n // Register field on mount\n React.useEffect(() => {\n if (config) {\n registerField(path, config);\n }\n }, [path, config, registerField]);\n\n const state = fieldStates[path] ?? {\n touched: false,\n validated: false,\n result: null,\n };\n\n const validate = useCallback(\n () => validateField(path, config ?? { checks: [] }),\n [path, config, validateField],\n );\n\n const touch = useCallback(() => touchField(path), [path, touchField]);\n const clear = useCallback(() => clearField(path), [path, clearField]);\n\n return {\n state,\n validate,\n touch,\n clear,\n errors: state.result?.errors ?? [],\n isValid: state.result?.valid ?? true,\n };\n}\n","\"use client\";\n\nimport React, { type ComponentType, type ReactNode, useMemo } from \"react\";\nimport type {\n UIElement,\n Spec,\n Action,\n Catalog as NewCatalog,\n SchemaDefinition,\n LegacyCatalog,\n ComponentDefinition,\n} from \"@json-render/core\";\nimport { useIsVisible } from \"./contexts/visibility\";\nimport { useActions } from \"./contexts/actions\";\nimport { useData } from \"./contexts/data\";\nimport { DataProvider } from \"./contexts/data\";\nimport { VisibilityProvider } from \"./contexts/visibility\";\nimport { ActionProvider } from \"./contexts/actions\";\nimport { ValidationProvider } from \"./contexts/validation\";\nimport { ConfirmDialog } from \"./contexts/actions\";\n\n/**\n * Props passed to component renderers\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>> {\n /** The element being rendered */\n element: UIElement<string, P>;\n /** Rendered children */\n children?: ReactNode;\n /** Execute an action */\n onAction?: (action: Action) => void;\n /** Whether the parent is loading */\n loading?: boolean;\n}\n\n/**\n * Component renderer type\n */\nexport type ComponentRenderer<P = Record<string, unknown>> = ComponentType<\n ComponentRenderProps<P>\n>;\n\n/**\n * Registry of component renderers\n */\nexport type ComponentRegistry = Record<string, ComponentRenderer<any>>;\n\n/**\n * Props for the Renderer component\n */\nexport interface RendererProps {\n /** The UI spec to render */\n spec: Spec | null;\n /** Component registry */\n registry: ComponentRegistry;\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n/**\n * Element renderer component\n */\nfunction ElementRenderer({\n element,\n spec,\n registry,\n loading,\n fallback,\n}: {\n element: UIElement;\n spec: Spec;\n registry: ComponentRegistry;\n loading?: boolean;\n fallback?: ComponentRenderer;\n}) {\n const isVisible = useIsVisible(element.visible);\n const { execute } = useActions();\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n // Get the component renderer\n const Component = registry[element.type] ?? fallback;\n\n if (!Component) {\n console.warn(`No renderer for component type: ${element.type}`);\n return null;\n }\n\n // Render children\n const children = element.children?.map((childKey) => {\n const childElement = spec.elements[childKey];\n if (!childElement) {\n return null;\n }\n return (\n <ElementRenderer\n key={childKey}\n element={childElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n });\n\n return (\n <Component element={element} onAction={execute} loading={loading}>\n {children}\n </Component>\n );\n}\n\n/**\n * Main renderer component\n */\nexport function Renderer({ spec, registry, loading, fallback }: RendererProps) {\n if (!spec || !spec.root) {\n return null;\n }\n\n const rootElement = spec.elements[spec.root];\n if (!rootElement) {\n return null;\n }\n\n return (\n <ElementRenderer\n element={rootElement}\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n );\n}\n\n/**\n * Props for JSONUIProvider\n */\nexport interface JSONUIProviderProps {\n /** Component registry */\n registry: ComponentRegistry;\n /** Initial data model */\n initialData?: Record<string, unknown>;\n /** Auth state */\n authState?: { isSignedIn: boolean; user?: Record<string, unknown> };\n /** Action handlers */\n actionHandlers?: Record<\n string,\n (params: Record<string, unknown>) => Promise<unknown> | unknown\n >;\n /** Navigation function */\n navigate?: (path: string) => void;\n /** Custom validation functions */\n validationFunctions?: Record<\n string,\n (value: unknown, args?: Record<string, unknown>) => boolean\n >;\n /** Callback when data changes */\n onDataChange?: (path: string, value: unknown) => void;\n children: ReactNode;\n}\n\n/**\n * Combined provider for all JSONUI contexts\n */\nexport function JSONUIProvider({\n registry,\n initialData,\n authState,\n actionHandlers,\n navigate,\n validationFunctions,\n onDataChange,\n children,\n}: JSONUIProviderProps) {\n return (\n <DataProvider\n initialData={initialData}\n authState={authState}\n onDataChange={onDataChange}\n >\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers} navigate={navigate}>\n <ValidationProvider customFunctions={validationFunctions}>\n {children}\n <ConfirmationDialogManager />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </DataProvider>\n );\n}\n\n/**\n * Renders the confirmation dialog when needed\n */\nfunction ConfirmationDialogManager() {\n const { pendingConfirmation, confirm, cancel } = useActions();\n\n if (!pendingConfirmation?.action.confirm) {\n return null;\n }\n\n return (\n <ConfirmDialog\n confirm={pendingConfirmation.action.confirm}\n onConfirm={confirm}\n onCancel={cancel}\n />\n );\n}\n\n/**\n * Legacy helper to create a renderer component from a catalog\n * @deprecated Use createRenderer with the new catalog API instead\n */\nexport function createRendererFromCatalog<\n C extends LegacyCatalog<Record<string, ComponentDefinition>>,\n>(\n _catalog: C,\n registry: ComponentRegistry,\n): ComponentType<Omit<RendererProps, \"registry\">> {\n return function CatalogRenderer(props: Omit<RendererProps, \"registry\">) {\n return <Renderer {...props} registry={registry} />;\n };\n}\n\n// ============================================================================\n// NEW API\n// ============================================================================\n\n/**\n * Props for renderers created with createRenderer\n */\nexport interface CreateRendererProps {\n /** The spec to render (AI-generated JSON) */\n spec: Spec | null;\n /** Data context for dynamic values */\n data?: Record<string, unknown>;\n /** Action handler */\n onAction?: (actionName: string, params?: Record<string, unknown>) => void;\n /** Callback when data changes (e.g., from form inputs) */\n onDataChange?: (path: string, value: unknown) => void;\n /** Whether the spec is currently loading/streaming */\n loading?: boolean;\n /** Auth state for visibility conditions */\n authState?: { isSignedIn: boolean; user?: Record<string, unknown> };\n /** Fallback component for unknown types */\n fallback?: ComponentRenderer;\n}\n\n/**\n * Component map type - maps component names to React components\n */\nexport type ComponentMap<\n TComponents extends Record<string, { props: unknown }>,\n> = {\n [K in keyof TComponents]: ComponentType<\n ComponentRenderProps<\n TComponents[K][\"props\"] extends { _output: infer O }\n ? O\n : Record<string, unknown>\n >\n >;\n};\n\n/**\n * Create a renderer from a catalog\n *\n * @example\n * ```typescript\n * const DashboardRenderer = createRenderer(dashboardCatalog, {\n * Card: ({ element, children }) => <div className=\"card\">{children}</div>,\n * Metric: ({ element }) => <span>{element.props.value}</span>,\n * });\n *\n * // Usage\n * <DashboardRenderer spec={aiGeneratedSpec} data={data} />\n * ```\n */\nexport function createRenderer<\n TDef extends SchemaDefinition,\n TCatalog extends { components: Record<string, { props: unknown }> },\n>(\n catalog: NewCatalog<TDef, TCatalog>,\n components: ComponentMap<TCatalog[\"components\"]>,\n): ComponentType<CreateRendererProps> {\n // Convert component map to registry\n const registry: ComponentRegistry =\n components as unknown as ComponentRegistry;\n\n // Return the renderer component\n return function CatalogRenderer({\n spec,\n data,\n onAction,\n onDataChange,\n loading,\n authState,\n fallback,\n }: CreateRendererProps) {\n // Wrap onAction to match internal API\n const actionHandlers = onAction\n ? {\n __default__: (params: Record<string, unknown>) => {\n const actionName = params.__actionName__ as string;\n const actionParams = params.__actionParams__ as Record<\n string,\n unknown\n >;\n return onAction(actionName, actionParams);\n },\n }\n : undefined;\n\n return (\n <DataProvider\n initialData={data}\n authState={authState}\n onDataChange={onDataChange}\n >\n <VisibilityProvider>\n <ActionProvider handlers={actionHandlers}>\n <ValidationProvider>\n <Renderer\n spec={spec}\n registry={registry}\n loading={loading}\n fallback={fallback}\n />\n <ConfirmationDialogManager />\n </ValidationProvider>\n </ActionProvider>\n </VisibilityProvider>\n </DataProvider>\n );\n };\n}\n","\"use client\";\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport type { Spec, UIElement, JsonPatch } from \"@json-render/core\";\nimport { setByPath } from \"@json-render/core\";\n\n/**\n * Parse a single JSON patch line\n */\nfunction parsePatchLine(line: string): JsonPatch | null {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"//\")) {\n return null;\n }\n return JSON.parse(trimmed) as JsonPatch;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply a JSON patch to the current spec\n */\nfunction applyPatch(spec: Spec, patch: JsonPatch): Spec {\n const newSpec = { ...spec, elements: { ...spec.elements } };\n\n switch (patch.op) {\n case \"set\":\n case \"add\":\n case \"replace\": {\n // Handle root path\n if (patch.path === \"/root\") {\n newSpec.root = patch.value as string;\n return newSpec;\n }\n\n // Handle elements paths\n if (patch.path.startsWith(\"/elements/\")) {\n const pathParts = patch.path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n\n if (!elementKey) return newSpec;\n\n if (pathParts.length === 1) {\n // Setting entire element\n newSpec.elements[elementKey] = patch.value as UIElement;\n } else {\n // Setting property of element\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 patch.value,\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n break;\n }\n case \"remove\": {\n if (patch.path.startsWith(\"/elements/\")) {\n const elementKey = patch.path.slice(\"/elements/\".length).split(\"/\")[0];\n if (elementKey) {\n const { [elementKey]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n }\n }\n break;\n }\n }\n\n return newSpec;\n}\n\n/**\n * Options for useUIStream\n */\nexport interface UseUIStreamOptions {\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 useUIStream\n */\nexport interface UseUIStreamReturn {\n /** Current UI spec */\n spec: Spec | null;\n /** Whether currently streaming */\n isStreaming: boolean;\n /** Error if any */\n error: Error | null;\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 * Hook for streaming UI generation\n */\nexport function useUIStream({\n api,\n onComplete,\n onError,\n}: UseUIStreamOptions): UseUIStreamReturn {\n const [spec, setSpec] = useState<Spec | null>(null);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const clear = useCallback(() => {\n setSpec(null);\n setError(null);\n }, []);\n\n const send = useCallback(\n async (prompt: string, context?: Record<string, unknown>) => {\n // Abort any existing request\n abortControllerRef.current?.abort();\n abortControllerRef.current = new AbortController();\n\n setIsStreaming(true);\n setError(null);\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 setSpec(currentSpec);\n\n try {\n const response = await fetch(api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n context,\n currentSpec,\n }),\n signal: abortControllerRef.current.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 patch = parsePatchLine(line);\n if (patch) {\n currentSpec = applyPatch(currentSpec, patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const patch = parsePatchLine(buffer);\n if (patch) {\n currentSpec = applyPatch(currentSpec, patch);\n setSpec({ ...currentSpec });\n }\n }\n\n onComplete?.(currentSpec);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n return;\n }\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n } finally {\n setIsStreaming(false);\n }\n },\n [api, onComplete, onError],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n return {\n spec,\n isStreaming,\n error,\n send,\n clear,\n };\n}\n\n/**\n * Convert a flat element list to a Spec\n */\nexport function flatToTree(\n elements: Array<UIElement & { parentKey?: string | null }>,\n): 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 key: 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"],"mappings":"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","names":["value","createContext","useContext","useMemo","jsx","createContext","useMemo","useContext","createContext","useContext","useState","useCallback","useMemo","jsx","createContext","useState","useCallback","useMemo","useContext","executeAction","React","createContext","useContext","useState","useCallback","useMemo","jsx","createContext","useState","useCallback","value","useMemo","useContext","React","jsx","jsxs","useState","useCallback","useRef","useEffect","setByPath","error"]}
|