@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.js
CHANGED
|
@@ -37,8 +37,11 @@ __export(index_exports, {
|
|
|
37
37
|
Renderer: () => Renderer,
|
|
38
38
|
ValidationProvider: () => ValidationProvider,
|
|
39
39
|
VisibilityProvider: () => VisibilityProvider,
|
|
40
|
+
createRenderer: () => createRenderer,
|
|
40
41
|
createRendererFromCatalog: () => createRendererFromCatalog,
|
|
42
|
+
elementTreeSchema: () => elementTreeSchema,
|
|
41
43
|
flatToTree: () => flatToTree,
|
|
44
|
+
schema: () => schema,
|
|
42
45
|
useAction: () => useAction,
|
|
43
46
|
useActions: () => useActions,
|
|
44
47
|
useData: () => useData,
|
|
@@ -64,6 +67,16 @@ function DataProvider({
|
|
|
64
67
|
children
|
|
65
68
|
}) {
|
|
66
69
|
const [data, setData] = (0, import_react.useState)(initialData);
|
|
70
|
+
const initialDataJsonRef = (0, import_react.useRef)(JSON.stringify(initialData));
|
|
71
|
+
(0, import_react.useEffect)(() => {
|
|
72
|
+
const newJson = JSON.stringify(initialData);
|
|
73
|
+
if (newJson !== initialDataJsonRef.current) {
|
|
74
|
+
initialDataJsonRef.current = newJson;
|
|
75
|
+
if (initialData && Object.keys(initialData).length > 0) {
|
|
76
|
+
setData((prev) => ({ ...prev, ...initialData }));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}, [initialData]);
|
|
67
80
|
const get = (0, import_react.useCallback)((path) => (0, import_core.getByPath)(data, path), [data]);
|
|
68
81
|
const set = (0, import_react.useCallback)(
|
|
69
82
|
(path, value2) => {
|
|
@@ -109,12 +122,12 @@ function useData() {
|
|
|
109
122
|
return ctx;
|
|
110
123
|
}
|
|
111
124
|
function useDataValue(path) {
|
|
112
|
-
const {
|
|
113
|
-
return
|
|
125
|
+
const { data } = useData();
|
|
126
|
+
return (0, import_core.getByPath)(data, path);
|
|
114
127
|
}
|
|
115
128
|
function useDataBinding(path) {
|
|
116
|
-
const {
|
|
117
|
-
const value =
|
|
129
|
+
const { data, set } = useData();
|
|
130
|
+
const value = (0, import_core.getByPath)(data, path);
|
|
118
131
|
const setValue = (0, import_react.useCallback)(
|
|
119
132
|
(newValue) => set(path, newValue),
|
|
120
133
|
[path, set]
|
|
@@ -515,11 +528,58 @@ function useFieldValidation(path, config) {
|
|
|
515
528
|
};
|
|
516
529
|
}
|
|
517
530
|
|
|
531
|
+
// src/schema.ts
|
|
532
|
+
var import_core5 = require("@json-render/core");
|
|
533
|
+
var schema = (0, import_core5.defineSchema)((s) => ({
|
|
534
|
+
// What the AI-generated SPEC looks like
|
|
535
|
+
spec: s.object({
|
|
536
|
+
/** Root element key */
|
|
537
|
+
root: s.string(),
|
|
538
|
+
/** Flat map of elements by key */
|
|
539
|
+
elements: s.record(
|
|
540
|
+
s.object({
|
|
541
|
+
/** Unique key for this element */
|
|
542
|
+
key: s.string(),
|
|
543
|
+
/** Component type from catalog */
|
|
544
|
+
type: s.ref("catalog.components"),
|
|
545
|
+
/** Component props */
|
|
546
|
+
props: s.propsOf("catalog.components"),
|
|
547
|
+
/** Child element keys (flat reference) */
|
|
548
|
+
children: s.array(s.string()),
|
|
549
|
+
/** Parent element key (null for root) */
|
|
550
|
+
parentKey: s.string(),
|
|
551
|
+
/** Visibility condition */
|
|
552
|
+
visible: s.any()
|
|
553
|
+
})
|
|
554
|
+
)
|
|
555
|
+
}),
|
|
556
|
+
// What the CATALOG must provide
|
|
557
|
+
catalog: s.object({
|
|
558
|
+
/** Component definitions */
|
|
559
|
+
components: s.map({
|
|
560
|
+
/** Zod schema for component props */
|
|
561
|
+
props: s.zod(),
|
|
562
|
+
/** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */
|
|
563
|
+
slots: s.array(s.string()),
|
|
564
|
+
/** Description for AI generation hints */
|
|
565
|
+
description: s.string()
|
|
566
|
+
}),
|
|
567
|
+
/** Action definitions (optional) */
|
|
568
|
+
actions: s.map({
|
|
569
|
+
/** Zod schema for action params */
|
|
570
|
+
params: s.zod(),
|
|
571
|
+
/** Description for AI generation hints */
|
|
572
|
+
description: s.string()
|
|
573
|
+
})
|
|
574
|
+
})
|
|
575
|
+
}));
|
|
576
|
+
var elementTreeSchema = schema;
|
|
577
|
+
|
|
518
578
|
// src/renderer.tsx
|
|
519
579
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
520
580
|
function ElementRenderer({
|
|
521
581
|
element,
|
|
522
|
-
|
|
582
|
+
spec,
|
|
523
583
|
registry,
|
|
524
584
|
loading,
|
|
525
585
|
fallback
|
|
@@ -535,7 +595,7 @@ function ElementRenderer({
|
|
|
535
595
|
return null;
|
|
536
596
|
}
|
|
537
597
|
const children = element.children?.map((childKey) => {
|
|
538
|
-
const childElement =
|
|
598
|
+
const childElement = spec.elements[childKey];
|
|
539
599
|
if (!childElement) {
|
|
540
600
|
return null;
|
|
541
601
|
}
|
|
@@ -543,7 +603,7 @@ function ElementRenderer({
|
|
|
543
603
|
ElementRenderer,
|
|
544
604
|
{
|
|
545
605
|
element: childElement,
|
|
546
|
-
|
|
606
|
+
spec,
|
|
547
607
|
registry,
|
|
548
608
|
loading,
|
|
549
609
|
fallback
|
|
@@ -553,11 +613,11 @@ function ElementRenderer({
|
|
|
553
613
|
});
|
|
554
614
|
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Component, { element, onAction: execute, loading, children });
|
|
555
615
|
}
|
|
556
|
-
function Renderer({
|
|
557
|
-
if (!
|
|
616
|
+
function Renderer({ spec, registry, loading, fallback }) {
|
|
617
|
+
if (!spec || !spec.root) {
|
|
558
618
|
return null;
|
|
559
619
|
}
|
|
560
|
-
const rootElement =
|
|
620
|
+
const rootElement = spec.elements[spec.root];
|
|
561
621
|
if (!rootElement) {
|
|
562
622
|
return null;
|
|
563
623
|
}
|
|
@@ -565,7 +625,7 @@ function Renderer({ tree, registry, loading, fallback }) {
|
|
|
565
625
|
ElementRenderer,
|
|
566
626
|
{
|
|
567
627
|
element: rootElement,
|
|
568
|
-
|
|
628
|
+
spec,
|
|
569
629
|
registry,
|
|
570
630
|
loading,
|
|
571
631
|
fallback
|
|
@@ -614,10 +674,50 @@ function createRendererFromCatalog(_catalog, registry) {
|
|
|
614
674
|
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Renderer, { ...props, registry });
|
|
615
675
|
};
|
|
616
676
|
}
|
|
677
|
+
function createRenderer(catalog, components) {
|
|
678
|
+
const registry = components;
|
|
679
|
+
return function CatalogRenderer({
|
|
680
|
+
spec,
|
|
681
|
+
data,
|
|
682
|
+
onAction,
|
|
683
|
+
onDataChange,
|
|
684
|
+
loading,
|
|
685
|
+
authState,
|
|
686
|
+
fallback
|
|
687
|
+
}) {
|
|
688
|
+
const actionHandlers = onAction ? {
|
|
689
|
+
__default__: (params) => {
|
|
690
|
+
const actionName = params.__actionName__;
|
|
691
|
+
const actionParams = params.__actionParams__;
|
|
692
|
+
return onAction(actionName, actionParams);
|
|
693
|
+
}
|
|
694
|
+
} : void 0;
|
|
695
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
696
|
+
DataProvider,
|
|
697
|
+
{
|
|
698
|
+
initialData: data,
|
|
699
|
+
authState,
|
|
700
|
+
onDataChange,
|
|
701
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(VisibilityProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActionProvider, { handlers: actionHandlers, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(ValidationProvider, { children: [
|
|
702
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
703
|
+
Renderer,
|
|
704
|
+
{
|
|
705
|
+
spec,
|
|
706
|
+
registry,
|
|
707
|
+
loading,
|
|
708
|
+
fallback
|
|
709
|
+
}
|
|
710
|
+
),
|
|
711
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ConfirmationDialogManager, {})
|
|
712
|
+
] }) }) })
|
|
713
|
+
}
|
|
714
|
+
);
|
|
715
|
+
};
|
|
716
|
+
}
|
|
617
717
|
|
|
618
718
|
// src/hooks.ts
|
|
619
719
|
var import_react5 = require("react");
|
|
620
|
-
var
|
|
720
|
+
var import_core6 = require("@json-render/core");
|
|
621
721
|
function parsePatchLine(line) {
|
|
622
722
|
try {
|
|
623
723
|
const trimmed = line.trim();
|
|
@@ -629,33 +729,33 @@ function parsePatchLine(line) {
|
|
|
629
729
|
return null;
|
|
630
730
|
}
|
|
631
731
|
}
|
|
632
|
-
function applyPatch(
|
|
633
|
-
const
|
|
732
|
+
function applyPatch(spec, patch) {
|
|
733
|
+
const newSpec = { ...spec, elements: { ...spec.elements } };
|
|
634
734
|
switch (patch.op) {
|
|
635
735
|
case "set":
|
|
636
736
|
case "add":
|
|
637
737
|
case "replace": {
|
|
638
738
|
if (patch.path === "/root") {
|
|
639
|
-
|
|
640
|
-
return
|
|
739
|
+
newSpec.root = patch.value;
|
|
740
|
+
return newSpec;
|
|
641
741
|
}
|
|
642
742
|
if (patch.path.startsWith("/elements/")) {
|
|
643
743
|
const pathParts = patch.path.slice("/elements/".length).split("/");
|
|
644
744
|
const elementKey = pathParts[0];
|
|
645
|
-
if (!elementKey) return
|
|
745
|
+
if (!elementKey) return newSpec;
|
|
646
746
|
if (pathParts.length === 1) {
|
|
647
|
-
|
|
747
|
+
newSpec.elements[elementKey] = patch.value;
|
|
648
748
|
} else {
|
|
649
|
-
const element =
|
|
749
|
+
const element = newSpec.elements[elementKey];
|
|
650
750
|
if (element) {
|
|
651
751
|
const propPath = "/" + pathParts.slice(1).join("/");
|
|
652
752
|
const newElement = { ...element };
|
|
653
|
-
(0,
|
|
753
|
+
(0, import_core6.setByPath)(
|
|
654
754
|
newElement,
|
|
655
755
|
propPath,
|
|
656
756
|
patch.value
|
|
657
757
|
);
|
|
658
|
-
|
|
758
|
+
newSpec.elements[elementKey] = newElement;
|
|
659
759
|
}
|
|
660
760
|
}
|
|
661
761
|
}
|
|
@@ -665,26 +765,26 @@ function applyPatch(tree, patch) {
|
|
|
665
765
|
if (patch.path.startsWith("/elements/")) {
|
|
666
766
|
const elementKey = patch.path.slice("/elements/".length).split("/")[0];
|
|
667
767
|
if (elementKey) {
|
|
668
|
-
const { [elementKey]: _, ...rest } =
|
|
669
|
-
|
|
768
|
+
const { [elementKey]: _, ...rest } = newSpec.elements;
|
|
769
|
+
newSpec.elements = rest;
|
|
670
770
|
}
|
|
671
771
|
}
|
|
672
772
|
break;
|
|
673
773
|
}
|
|
674
774
|
}
|
|
675
|
-
return
|
|
775
|
+
return newSpec;
|
|
676
776
|
}
|
|
677
777
|
function useUIStream({
|
|
678
778
|
api,
|
|
679
779
|
onComplete,
|
|
680
780
|
onError
|
|
681
781
|
}) {
|
|
682
|
-
const [
|
|
782
|
+
const [spec, setSpec] = (0, import_react5.useState)(null);
|
|
683
783
|
const [isStreaming, setIsStreaming] = (0, import_react5.useState)(false);
|
|
684
784
|
const [error, setError] = (0, import_react5.useState)(null);
|
|
685
785
|
const abortControllerRef = (0, import_react5.useRef)(null);
|
|
686
786
|
const clear = (0, import_react5.useCallback)(() => {
|
|
687
|
-
|
|
787
|
+
setSpec(null);
|
|
688
788
|
setError(null);
|
|
689
789
|
}, []);
|
|
690
790
|
const send = (0, import_react5.useCallback)(
|
|
@@ -693,8 +793,9 @@ function useUIStream({
|
|
|
693
793
|
abortControllerRef.current = new AbortController();
|
|
694
794
|
setIsStreaming(true);
|
|
695
795
|
setError(null);
|
|
696
|
-
|
|
697
|
-
|
|
796
|
+
const previousSpec = context?.previousSpec;
|
|
797
|
+
let currentSpec = previousSpec && previousSpec.root ? { ...previousSpec, elements: { ...previousSpec.elements } } : { root: "", elements: {} };
|
|
798
|
+
setSpec(currentSpec);
|
|
698
799
|
try {
|
|
699
800
|
const response = await fetch(api, {
|
|
700
801
|
method: "POST",
|
|
@@ -702,12 +803,22 @@ function useUIStream({
|
|
|
702
803
|
body: JSON.stringify({
|
|
703
804
|
prompt,
|
|
704
805
|
context,
|
|
705
|
-
|
|
806
|
+
currentSpec
|
|
706
807
|
}),
|
|
707
808
|
signal: abortControllerRef.current.signal
|
|
708
809
|
});
|
|
709
810
|
if (!response.ok) {
|
|
710
|
-
|
|
811
|
+
let errorMessage = `HTTP error: ${response.status}`;
|
|
812
|
+
try {
|
|
813
|
+
const errorData = await response.json();
|
|
814
|
+
if (errorData.message) {
|
|
815
|
+
errorMessage = errorData.message;
|
|
816
|
+
} else if (errorData.error) {
|
|
817
|
+
errorMessage = errorData.error;
|
|
818
|
+
}
|
|
819
|
+
} catch {
|
|
820
|
+
}
|
|
821
|
+
throw new Error(errorMessage);
|
|
711
822
|
}
|
|
712
823
|
const reader = response.body?.getReader();
|
|
713
824
|
if (!reader) {
|
|
@@ -724,19 +835,19 @@ function useUIStream({
|
|
|
724
835
|
for (const line of lines) {
|
|
725
836
|
const patch = parsePatchLine(line);
|
|
726
837
|
if (patch) {
|
|
727
|
-
|
|
728
|
-
|
|
838
|
+
currentSpec = applyPatch(currentSpec, patch);
|
|
839
|
+
setSpec({ ...currentSpec });
|
|
729
840
|
}
|
|
730
841
|
}
|
|
731
842
|
}
|
|
732
843
|
if (buffer.trim()) {
|
|
733
844
|
const patch = parsePatchLine(buffer);
|
|
734
845
|
if (patch) {
|
|
735
|
-
|
|
736
|
-
|
|
846
|
+
currentSpec = applyPatch(currentSpec, patch);
|
|
847
|
+
setSpec({ ...currentSpec });
|
|
737
848
|
}
|
|
738
849
|
}
|
|
739
|
-
onComplete?.(
|
|
850
|
+
onComplete?.(currentSpec);
|
|
740
851
|
} catch (err) {
|
|
741
852
|
if (err.name === "AbortError") {
|
|
742
853
|
return;
|
|
@@ -756,7 +867,7 @@ function useUIStream({
|
|
|
756
867
|
};
|
|
757
868
|
}, []);
|
|
758
869
|
return {
|
|
759
|
-
|
|
870
|
+
spec,
|
|
760
871
|
isStreaming,
|
|
761
872
|
error,
|
|
762
873
|
send,
|
|
@@ -799,8 +910,11 @@ function flatToTree(elements) {
|
|
|
799
910
|
Renderer,
|
|
800
911
|
ValidationProvider,
|
|
801
912
|
VisibilityProvider,
|
|
913
|
+
createRenderer,
|
|
802
914
|
createRendererFromCatalog,
|
|
915
|
+
elementTreeSchema,
|
|
803
916
|
flatToTree,
|
|
917
|
+
schema,
|
|
804
918
|
useAction,
|
|
805
919
|
useActions,
|
|
806
920
|
useData,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/contexts/data.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/renderer.tsx","../src/hooks.ts"],"sourcesContent":["// Contexts\nexport {\n DataProvider,\n useData,\n useDataValue,\n useDataBinding,\n type DataContextValue,\n type DataProviderProps,\n} from \"./contexts/data\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\n// Renderer\nexport {\n Renderer,\n JSONUIProvider,\n createRendererFromCatalog,\n type ComponentRenderProps,\n type ComponentRenderer,\n type ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n\n// Hooks\nexport {\n useUIStream,\n flatToTree,\n type UseUIStreamOptions,\n type UseUIStreamReturn,\n} from \"./hooks\";\n","\"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","import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","executeAction","import_react","import_core","import_jsx_runtime","value","React","import_jsx_runtime","import_react","import_core","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/contexts/data.tsx","../src/contexts/visibility.tsx","../src/contexts/actions.tsx","../src/contexts/validation.tsx","../src/schema.ts","../src/renderer.tsx","../src/hooks.ts"],"sourcesContent":["// Contexts\nexport {\n DataProvider,\n useData,\n useDataValue,\n useDataBinding,\n type DataContextValue,\n type DataProviderProps,\n} from \"./contexts/data\";\n\nexport {\n VisibilityProvider,\n useVisibility,\n useIsVisible,\n type VisibilityContextValue,\n type VisibilityProviderProps,\n} from \"./contexts/visibility\";\n\nexport {\n ActionProvider,\n useActions,\n useAction,\n ConfirmDialog,\n type ActionContextValue,\n type ActionProviderProps,\n type PendingConfirmation,\n type ConfirmDialogProps,\n} from \"./contexts/actions\";\n\nexport {\n ValidationProvider,\n useValidation,\n useFieldValidation,\n type ValidationContextValue,\n type ValidationProviderProps,\n type FieldValidationState,\n} from \"./contexts/validation\";\n\n// Schema (React's spec format)\nexport {\n schema,\n type ReactSchema,\n type ReactSpec,\n // Backward compatibility\n elementTreeSchema,\n type ElementTreeSchema,\n type ElementTreeSpec,\n} from \"./schema\";\n\n// Core types (re-exported for convenience)\nexport type { Spec } from \"@json-render/core\";\n\n// Catalog-aware types for React\nexport type {\n SetData,\n DataModel,\n ActionTrigger,\n ComponentContext,\n ComponentFn,\n Components,\n ActionFn,\n Actions,\n} from \"./catalog-types\";\n\n// Renderer\nexport {\n // New API\n createRenderer,\n type CreateRendererProps,\n type ComponentMap,\n // Legacy API\n Renderer,\n JSONUIProvider,\n createRendererFromCatalog,\n type ComponentRenderProps,\n type ComponentRenderer,\n type ComponentRegistry,\n type RendererProps,\n type JSONUIProviderProps,\n} from \"./renderer\";\n\n// Hooks\nexport {\n useUIStream,\n flatToTree,\n type UseUIStreamOptions,\n type UseUIStreamReturn,\n} from \"./hooks\";\n","\"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","import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/react\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 */\nexport const schema = defineSchema((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 /** Unique key for this element */\n key: s.string(),\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 /** Parent element key (null for root) */\n parentKey: s.string(),\n /** Visibility condition */\n visible: s.any(),\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 }),\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/**\n * Type for the React schema\n */\nexport type ReactSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type ReactSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n\n// Backward compatibility aliases\n/** @deprecated Use `schema` instead */\nexport const elementTreeSchema = schema;\n/** @deprecated Use `ReactSchema` instead */\nexport type ElementTreeSchema = ReactSchema;\n/** @deprecated Use `ReactSpec` instead */\nexport type ElementTreeSpec<T> = ReactSpec<T>;\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","import_react","import_core","import_jsx_runtime","import_react","import_core","import_jsx_runtime","executeAction","import_react","import_core","import_jsx_runtime","value","React","import_core","import_jsx_runtime","import_react","import_core","error"]}
|