@treenity/react 3.0.1 → 3.0.3
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 +1 -1
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +33 -7
- package/dist/App.js.map +1 -1
- package/dist/ComponentSection.js +1 -1
- package/dist/ComponentSection.js.map +1 -1
- package/dist/ErrorBoundary.d.ts.map +1 -1
- package/dist/ErrorBoundary.js +2 -1
- package/dist/ErrorBoundary.js.map +1 -1
- package/dist/Treenity.d.ts +15 -0
- package/dist/Treenity.d.ts.map +1 -0
- package/dist/Treenity.js +17 -0
- package/dist/Treenity.js.map +1 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +5 -0
- package/dist/cache.js.map +1 -1
- package/dist/client-tree.d.ts.map +1 -1
- package/dist/client-tree.js +2 -2
- package/dist/client-tree.js.map +1 -1
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +3 -3
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/pagination.d.ts +2 -2
- package/dist/components/ui/pagination.d.ts.map +1 -1
- package/dist/components/ui/pagination.js +3 -3
- package/dist/components/ui/pagination.js.map +1 -1
- package/dist/components/ui/textarea.js +1 -1
- package/dist/components/ui/textarea.js.map +1 -1
- package/dist/events.d.ts +2 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +47 -2
- package/dist/events.js.map +1 -1
- package/dist/fiber-tree.d.ts.map +1 -1
- package/dist/fiber-tree.js.map +1 -1
- package/dist/hooks.d.ts +9 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +80 -5
- package/dist/hooks.js.map +1 -1
- package/dist/lib/minimd.d.ts.map +1 -1
- package/dist/lib/minimd.js +8 -1
- package/dist/lib/minimd.js.map +1 -1
- package/dist/lib/sanitize-href.d.ts +3 -0
- package/dist/lib/sanitize-href.d.ts.map +1 -0
- package/dist/lib/sanitize-href.js +14 -0
- package/dist/lib/sanitize-href.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +14 -5
- package/dist/main.js.map +1 -1
- package/dist/mods/editor-ui/FieldLabel.d.ts.map +1 -1
- package/dist/mods/editor-ui/FieldLabel.js +2 -1
- package/dist/mods/editor-ui/FieldLabel.js.map +1 -1
- package/dist/mods/editor-ui/default-edit.js +4 -2
- package/dist/mods/editor-ui/default-edit.js.map +1 -1
- package/dist/mods/editor-ui/form-field.d.ts.map +1 -1
- package/dist/mods/editor-ui/form-field.js +3 -2
- package/dist/mods/editor-ui/form-field.js.map +1 -1
- package/dist/mods/editor-ui/type-picker.d.ts.map +1 -1
- package/dist/mods/editor-ui/type-picker.js +2 -1
- package/dist/mods/editor-ui/type-picker.js.map +1 -1
- package/dist/mods/treenity/preview.d.ts.map +1 -1
- package/dist/mods/treenity/preview.js +2 -3
- package/dist/mods/treenity/preview.js.map +1 -1
- package/dist/mods/treenity/ref-view.js +2 -1
- package/dist/mods/treenity/ref-view.js.map +1 -1
- package/dist/mods/treenity/seed.js +3 -2
- package/dist/mods/treenity/seed.js.map +1 -1
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +11 -5
- package/dist/symbols.js.map +1 -1
- package/package.json +4 -2
- package/src/App.tsx +29 -1
- package/src/ComponentSection.tsx +1 -1
- package/src/ErrorBoundary.tsx +6 -3
- package/src/Treenity.tsx +32 -0
- package/src/cache.ts +7 -0
- package/src/client-tree.ts +7 -7
- package/src/components/ui/button.tsx +4 -5
- package/src/components/ui/pagination.tsx +4 -9
- package/src/components/ui/textarea.tsx +1 -1
- package/src/events.ts +46 -6
- package/src/fiber-tree.ts +3 -3
- package/src/hooks.ts +73 -4
- package/src/lib/minimd.ts +7 -1
- package/src/lib/sanitize-href.ts +13 -0
- package/src/main.tsx +23 -11
- package/src/mods/editor-ui/FieldLabel.tsx +5 -4
- package/src/mods/editor-ui/default-edit.tsx +6 -4
- package/src/mods/editor-ui/form-field.tsx +4 -2
- package/src/mods/editor-ui/type-picker.tsx +3 -2
- package/src/mods/treenity/preview.tsx +6 -7
- package/src/mods/treenity/ref-view.tsx +11 -6
- package/src/mods/treenity/seed.ts +3 -2
- package/src/symbols.ts +12 -5
- package/src/bind/bind.test.ts +0 -316
- package/src/cache.test.ts +0 -139
- package/src/client-tree.test.ts +0 -116
- package/src/optimistic.test.ts +0 -111
- package/src/remote-tree.test.ts +0 -142
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Button } from '#components/ui/button';
|
|
3
3
|
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '#components/ui/command';
|
|
4
4
|
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '#components/ui/dialog';
|
|
5
|
+
import { Input } from '#components/ui/input';
|
|
5
6
|
import { trpc } from '#trpc';
|
|
6
7
|
import { isOfType } from '@treenity/core';
|
|
7
8
|
import { useEffect, useRef, useState } from 'react';
|
|
@@ -61,7 +62,7 @@ export function TypePicker({ onSelect, onCancel, title = 'Create Node', nameLabe
|
|
|
61
62
|
}
|
|
62
63
|
const groups = groupByNamespace(types);
|
|
63
64
|
return (_jsx(Dialog, { open: true, onOpenChange: (open) => { if (!open)
|
|
64
|
-
onCancel(); }, children: _jsxs(DialogContent, { className: "p-0 gap-0 max-w-[380px]", showCloseButton: false, children: [_jsx(DialogHeader, { className: "px-4 pt-4 pb-2", children: _jsx(DialogTitle, { className: "text-[15px]", children: title }) }), _jsxs(Command, { className: "rounded-none border-none", shouldFilter: true, children: [_jsx(CommandInput, { placeholder: "Search types..." }), _jsxs(CommandList, { className: "max-h-[280px]", children: [loading && _jsx("div", { className: "p-3 text-muted-foreground text-[13px]", children: "Loading types..." }), error && _jsx("div", { className: "p-3 text-destructive text-[13px]", children: error }), _jsx(CommandEmpty, { children: "No types found" }), [...groups.entries()].map(([ns, items]) => (_jsx(CommandGroup, { heading: ns, children: items.map((t) => (_jsx(CommandItem, { value: `${t.type} ${t.label} ${t.description}`, onSelect: () => handleSelectType(t.type), className: selectedType === t.type ? 'bg-accent text-accent-foreground' : '', children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[13px]", children: t.type }), t.label !== t.type && _jsx("span", { className: "text-muted-foreground text-[12px]", children: t.label })] }), t.description && (_jsx("span", { className: "text-[11px] text-muted-foreground/60 leading-tight", children: t.description }))] }) }, t.type))) }, ns)))] })] }), _jsx("div", { className: "px-4 py-3 border-t border-border", children: _jsx(
|
|
65
|
+
onCancel(); }, children: _jsxs(DialogContent, { className: "p-0 gap-0 max-w-[380px]", showCloseButton: false, children: [_jsx(DialogHeader, { className: "px-4 pt-4 pb-2", children: _jsx(DialogTitle, { className: "text-[15px]", children: title }) }), _jsxs(Command, { className: "rounded-none border-none", shouldFilter: true, children: [_jsx(CommandInput, { placeholder: "Search types..." }), _jsxs(CommandList, { className: "max-h-[280px]", children: [loading && _jsx("div", { className: "p-3 text-muted-foreground text-[13px]", children: "Loading types..." }), error && _jsx("div", { className: "p-3 text-destructive text-[13px]", children: error }), _jsx(CommandEmpty, { children: "No types found" }), [...groups.entries()].map(([ns, items]) => (_jsx(CommandGroup, { heading: ns, children: items.map((t) => (_jsx(CommandItem, { value: `${t.type} ${t.label} ${t.description}`, onSelect: () => handleSelectType(t.type), className: selectedType === t.type ? 'bg-accent text-accent-foreground' : '', children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[13px]", children: t.type }), t.label !== t.type && _jsx("span", { className: "text-muted-foreground text-[12px]", children: t.label })] }), t.description && (_jsx("span", { className: "text-[11px] text-muted-foreground/60 leading-tight", children: t.description }))] }) }, t.type))) }, ns)))] })] }), _jsx("div", { className: "px-4 py-3 border-t border-border", children: _jsx(Input, { ref: nameRef, className: "h-8 text-sm", placeholder: nameLabel, value: name, onChange: (e) => { setName(e.target.value); setNameManual(true); }, onKeyDown: (e) => { if (e.key === 'Enter') {
|
|
65
66
|
e.preventDefault();
|
|
66
67
|
handleSubmit();
|
|
67
68
|
} } }) }), _jsxs(DialogFooter, { className: "px-4 pb-4", children: [_jsx(Button, { variant: "outline", onClick: onCancel, children: "Cancel" }), _jsxs(Button, { disabled: !name || !selectedType, onClick: handleSubmit, children: [action, name ? ` "${name}"` : '', selectedType ? ` as ${selectedType}` : ''] })] })] }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-picker.js","sourceRoot":"","sources":["../../../src/mods/editor-ui/type-picker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvG,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAiB,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIpD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAG3F,CAAC;IACF,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,MAAM,GAAG,CAAC,CAAC,MAA6E,CAAC;QAC/F,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzE,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,QAAQ;YAChC,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,EAAE;SACvC,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAiB;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,QAAQ,EACR,QAAQ,EACR,KAAK,GAAG,aAAa,EACrB,SAAS,GAAG,WAAW,EACvB,MAAM,GAAG,QAAQ,EACjB,QAAQ,GAAG,KAAK,GAQjB;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,EAAE;aACR,IAAI,CAAC,QAAQ,CAAC;aACd,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;YAC5C,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACnC,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,gBAAgB,CAAC,IAAY;QACpC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtF,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;QACD,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,SAAS,YAAY;QACnB,IAAI,IAAI,IAAI,YAAY;YAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEvC,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,QAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI;YAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,YAC7D,MAAC,aAAa,IAAC,SAAS,EAAC,yBAAyB,EAAC,eAAe,EAAE,KAAK,aACvE,KAAC,YAAY,IAAC,SAAS,EAAC,gBAAgB,YACtC,KAAC,WAAW,IAAC,SAAS,EAAC,aAAa,YAAE,KAAK,GAAe,GAC7C,EAEf,MAAC,OAAO,IAAC,SAAS,EAAC,0BAA0B,EAAC,YAAY,mBACxD,KAAC,YAAY,IAAC,WAAW,EAAC,iBAAiB,GAAG,EAC9C,MAAC,WAAW,IAAC,SAAS,EAAC,eAAe,aACnC,OAAO,IAAI,cAAK,SAAS,EAAC,uCAAuC,iCAAuB,EACxF,KAAK,IAAI,cAAK,SAAS,EAAC,kCAAkC,YAAE,KAAK,GAAO,EACzE,KAAC,YAAY,iCAA8B,EAC1C,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAC1C,KAAC,YAAY,IAAU,OAAO,EAAE,EAAE,YAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,KAAC,WAAW,IAEV,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,EAAE,EAC9C,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,EACxC,SAAS,EAAE,YAAY,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,YAE5E,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,uBAAuB,YAAE,CAAC,CAAC,IAAI,GAAQ,EACtD,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,eAAM,SAAS,EAAC,mCAAmC,YAAE,CAAC,CAAC,KAAK,GAAQ,IACvF,EACL,CAAC,CAAC,WAAW,IAAI,CAChB,eAAM,SAAS,EAAC,oDAAoD,YAAE,CAAC,CAAC,WAAW,GAAQ,CAC5F,IACG,IAbD,CAAC,CAAC,IAAI,CAcC,CACf,CAAC,IAlBe,EAAE,CAmBN,CAChB,CAAC,IACU,IACN,EAEV,cAAK,SAAS,EAAC,kCAAkC,YAC/C,
|
|
1
|
+
{"version":3,"file":"type-picker.js","sourceRoot":"","sources":["../../../src/mods/editor-ui/type-picker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":"AA+DA,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIvG;AAID,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD,kDAyDA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// Reusable type preview — Storybook-like: context switcher + live render + schema form editor
|
|
3
|
+
import { Button } from '#components/ui/button';
|
|
3
4
|
import { Render, RenderContext } from '#context';
|
|
4
5
|
import { getContextsForType } from '@treenity/core';
|
|
5
6
|
import { useMemo, useState } from 'react';
|
|
@@ -88,8 +89,6 @@ export function TypePreview({ typeName, properties }) {
|
|
|
88
89
|
const handleFormChange = (next) => {
|
|
89
90
|
setNode({ ...next, $path: initial.$path, $type: initial.$type });
|
|
90
91
|
};
|
|
91
|
-
return (_jsxs("div", { children: [_jsx("div", { className: "flex gap-1.5 mb-2", children: reactContexts.map(c => (_jsx("
|
|
92
|
-
? 'bg-primary text-primary-foreground border-primary'
|
|
93
|
-
: 'bg-muted border-border text-muted-foreground hover:border-primary/50'}`, children: c }, c))) }), previewCtx && (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { className: "border border-border rounded-lg p-3 bg-background/50", children: _jsx(RenderContext, { name: previewCtx, children: _jsx(Render, { value: node }) }) }), _jsxs("details", { className: "group", children: [_jsx("summary", { className: "text-xs text-muted-foreground cursor-pointer select-none hover:text-foreground transition-colors", children: "Edit data" }), _jsx("div", { className: "mt-2 border border-border rounded-lg p-3 bg-muted/30", children: _jsx(RenderContext, { name: "react:form", children: _jsx(Render, { value: node, onChange: handleFormChange }) }) })] })] }))] }));
|
|
92
|
+
return (_jsxs("div", { children: [_jsx("div", { className: "flex gap-1.5 mb-2", children: reactContexts.map(c => (_jsx(Button, { variant: previewCtx === c ? 'default' : 'outline', size: "sm", className: "h-auto rounded-full px-2.5 py-0.5 text-xs font-mono", onClick: () => setPreviewCtx(prev => prev === c ? null : c), children: c }, c))) }), previewCtx && (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { className: "border border-border rounded-lg p-3 bg-background/50", children: _jsx(RenderContext, { name: previewCtx, children: _jsx(Render, { value: node }) }) }), _jsxs("details", { className: "group", children: [_jsx("summary", { className: "text-xs text-muted-foreground cursor-pointer select-none hover:text-foreground transition-colors", children: "Edit data" }), _jsx("div", { className: "mt-2 border border-border rounded-lg p-3 bg-muted/30", children: _jsx(RenderContext, { name: "react:form", children: _jsx(Render, { value: node, onChange: handleFormChange }) }) })] })] }))] }));
|
|
94
93
|
}
|
|
95
94
|
//# sourceMappingURL=preview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/mods/treenity/preview.tsx"],"names":[],"mappings":";AAAA,8FAA8F;AAE9F,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAsB,kBAAkB,EAAiB,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE1C,wDAAwD;AAExD,MAAM,YAAY,GAAuB;IACvC,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;IAChD,CAAC,0CAA0C,EAAE,uEAAuE,CAAC;IACrH,CAAC,mBAAmB,EAAE,aAAa,CAAC;IACpC,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IACzC,CAAC,iCAAiC,EAAE,yCAAyC,CAAC;IAC9E,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAC9B,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,UAAU,EAAE,8BAA8B,CAAC;IAC5C,CAAC,QAAQ,EAAE,SAAS,CAAC;IACrB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,eAAe,EAAE,QAAQ,CAAC;IAC3B,CAAC,eAAe,EAAE,UAAU,CAAC;CAC9B,CAAC;AAEF,SAAS,SAAS,CAAC,MAA+B,EAAE,SAAS,GAAG,EAAE;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAA0B,CAAC;IAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IACzG,IAAI,MAAM,CAAC,IAAI;QAAE,OAAQ,MAAM,CAAC,IAAkB,CAAC,CAAC,CAAC,CAAC;IAEtD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,CAAC,MAA4B,CAAC;YAChD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,WAAW;gBAAE,OAAO,YAAY,CAAC;YAC/D,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAO,kBAAkB,CAAC;YAC/C,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK;gBAAE,OAAO,qBAAqB,CAAC;YACjE,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAO,SAAS,CAAC;YACtC,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAO,yCAAyC,CAAC;YACtE,IAAI,GAAG,KAAK,UAAU;gBAAE,OAAO,0DAA0D,CAAC;YAC1F,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,YAAY;gBAAE,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;oBAAE,OAAO,GAAG,CAAC;YACzE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QACjE,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,GAAG,GAAI,MAAM,CAAC,OAAkB,IAAI,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAI,MAAM,CAAC,OAAkB,IAAI,GAAG,CAAC;YAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC;QACd,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,CAAC,KAA4C,CAAC;YAClE,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA4C,CAAC;YACnF,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAmD;IAC5E,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0BAA0B;AAE1B,MAAM,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAGjD;IACC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7B,KAAK,EAAE,YAAY,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;QACjD,KAAK,EAAE,QAAQ;QACf,GAAG,UAAU,CAAC,UAAU,CAAC;KACb,CAAA,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE5B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,OAAO,CAAC,CAAC;IAEpD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,gBAAgB,GAAG,CAAC,IAAmB,EAAE,EAAE;QAC/C,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAc,CAAC,CAAC;IAC/E,CAAC,CAAC;IAEF,OAAO,CACL,0BACE,cAAK,SAAS,EAAC,mBAAmB,YAC/B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACtB,KAAC,MAAM,IAEL,OAAO,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACjD,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,qDAAqD,EAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAE1D,CAAC,IANG,CAAC,CAOC,CACV,CAAC,GACE,EAEL,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,qBAAqB,aAClC,cAAK,SAAS,EAAC,sDAAsD,YACnE,KAAC,aAAa,IAAC,IAAI,EAAE,UAAU,YAC7B,KAAC,MAAM,IAAC,KAAK,EAAE,IAAI,GAAI,GACT,GACZ,EAEN,mBAAS,SAAS,EAAC,OAAO,aACxB,kBAAS,SAAS,EAAC,kGAAkG,0BAE3G,EACV,cAAK,SAAS,EAAC,sDAAsD,YACnE,KAAC,aAAa,IAAC,IAAI,EAAC,YAAY,YAC9B,KAAC,MAAM,IAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,GAAI,GACrC,GACZ,IACE,IACN,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
// Ref node/component view — shows target path, resolve button, inline preview
|
|
3
|
+
import { Button } from '#components/ui/button';
|
|
3
4
|
import { Render } from '#context';
|
|
4
5
|
import { usePath } from '#hooks';
|
|
5
6
|
import { register } from '@treenity/core';
|
|
@@ -21,7 +22,7 @@ function RefListItem({ value }) {
|
|
|
21
22
|
function RefDisplay({ target, onSelect }) {
|
|
22
23
|
const [resolved, setResolved] = useState(false);
|
|
23
24
|
const targetNode = usePath(resolved ? target : null);
|
|
24
|
-
return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: "ref" }), _jsx("span", { className: "text-sm font-mono text-primary", children: target }), onSelect && (_jsx("
|
|
25
|
+
return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: "ref" }), _jsx("span", { className: "text-sm font-mono text-primary", children: target }), onSelect && (_jsx(Button, { variant: "outline", size: "sm", className: "h-auto px-2 py-0.5 text-xs", onClick: () => onSelect(target), children: "Go to" })), _jsx(Button, { variant: "outline", size: "sm", className: "h-auto px-2 py-0.5 text-xs", onClick: () => setResolved(!resolved), children: resolved ? 'Collapse' : 'Resolve' })] }), resolved && (_jsx("div", { className: "border border-border rounded p-3 bg-muted/30", children: targetNode ? (_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground mb-2", children: [_jsx("span", { className: "font-mono", children: targetNode.$type }), _jsx("span", { children: targetNode.$path })] }), _jsx(Render, { value: targetNode })] })) : (_jsx("div", { className: "text-sm text-muted-foreground", children: "Loading..." })) }))] }));
|
|
25
26
|
}
|
|
26
27
|
// ── Registration ──
|
|
27
28
|
register('ref', 'react', RefNodeView);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref-view.js","sourceRoot":"","sources":["../../../src/mods/treenity/ref-view.tsx"],"names":[],"mappings":";AAAA,8EAA8E;AAE9E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAiB,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,gEAAgE;AAEhE,SAAS,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAuD;IAC3F,MAAM,GAAG,GAAI,KAAa,CAAC,IAA0B,CAAC;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,cAAK,SAAS,EAAC,+BAA+B,sCAA4B,CAAC;IAE5F,OAAO,KAAC,UAAU,IAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC;AACzD,CAAC;AAED,oDAAoD;AAEpD,SAAS,WAAW,CAAC,EAAE,KAAK,EAAuB;IACjD,MAAM,GAAG,GAAI,KAAa,CAAC,IAA0B,CAAC;IACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;IAE1D,OAAO,CACL,8BACE,eAAM,SAAS,EAAC,YAAY,6BAAiB,EAC7C,eAAK,SAAS,EAAC,YAAY,aACzB,eAAM,SAAS,EAAC,YAAY,YAAE,IAAI,GAAQ,EAC1C,eAAM,SAAS,EAAC,YAAY,YAAE,GAAG,IAAI,KAAK,GAAQ,IAC9C,IACL,CACJ,CAAC;AACJ,CAAC;AAED,uBAAuB;AAEvB,SAAS,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAsD;IAC1F,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAErD,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aAExB,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,+BAA+B,oBAAW,EAC1D,eAAM,SAAS,EAAC,gCAAgC,YAAE,MAAM,GAAQ,EAE/D,QAAQ,IAAI,CACX,
|
|
1
|
+
{"version":3,"file":"ref-view.js","sourceRoot":"","sources":["../../../src/mods/treenity/ref-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { R, S } from '@treenity/core';
|
|
1
|
+
import { A, R, S, W } from '@treenity/core';
|
|
2
2
|
import { registerPrefab } from '@treenity/core/mod';
|
|
3
3
|
registerPrefab('core', 'seed', [
|
|
4
4
|
{ $path: 'sys', $type: 'treenity.system' },
|
|
5
|
-
{ $path: 'auth', $type: 'dir' },
|
|
5
|
+
{ $path: 'auth', $type: 'dir', $acl: [{ g: 'admins', p: R | W | A | S }, { g: 'public', p: 0 }] },
|
|
6
6
|
{ $path: 'auth/users', $type: 'mount-point',
|
|
7
7
|
connection: { $type: 'connection', db: 'treenity', collection: 'users' },
|
|
8
8
|
mount: { $type: 't.mount.mongo' },
|
|
@@ -19,6 +19,7 @@ registerPrefab('core', 'seed', [
|
|
|
19
19
|
{ $path: 'auth/sessions', $type: 'mount-point',
|
|
20
20
|
connection: { $type: 'connection', db: 'treenity', collection: 'sessions' },
|
|
21
21
|
mount: { $type: 't.mount.mongo' },
|
|
22
|
+
$acl: [{ g: 'admins', p: R | W | A | S }, { g: 'authenticated', p: 0 }, { g: 'public', p: 0 }],
|
|
22
23
|
},
|
|
23
24
|
{ $path: 'mnt', $type: 'dir' },
|
|
24
25
|
{ $path: 'mnt/orders', $type: 't.mount.mongo',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/mods/treenity/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/mods/treenity/seed.ts"],"names":[],"mappings":"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"}
|
package/dist/symbols.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE5D,eAAO,MAAM,IAAI,eAA8B,CAAC;AAChD,eAAO,MAAM,KAAK,eAA+B,CAAC;AAMlD,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAW9C"}
|
package/dist/symbols.js
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
// Symbol-based component location metadata.
|
|
2
|
-
// Stamped on deserialization (cache.put).
|
|
2
|
+
// Stamped on deserialization (cache.put). Non-enumerable so they're
|
|
3
|
+
// invisible to structuredClone, spread, and JSON/keys/entries.
|
|
3
4
|
import { isComponent } from '@treenity/core';
|
|
4
5
|
export const $key = Symbol.for('treenity.$key');
|
|
5
6
|
export const $node = Symbol.for('treenity.$node');
|
|
7
|
+
function hide(obj, sym, value) {
|
|
8
|
+
Object.defineProperty(obj, sym, { value, enumerable: false, writable: false, configurable: true });
|
|
9
|
+
}
|
|
6
10
|
export function stampNode(node) {
|
|
7
|
-
node[$
|
|
8
|
-
|
|
11
|
+
if (node[$node] === node)
|
|
12
|
+
return;
|
|
13
|
+
hide(node, $key, '');
|
|
14
|
+
hide(node, $node, node);
|
|
9
15
|
for (const [k, v] of Object.entries(node)) {
|
|
10
16
|
if (k.startsWith('$') || !isComponent(v))
|
|
11
17
|
continue;
|
|
12
|
-
v
|
|
13
|
-
v
|
|
18
|
+
hide(v, $key, k);
|
|
19
|
+
hide(v, $node, node);
|
|
14
20
|
}
|
|
15
21
|
}
|
|
16
22
|
//# sourceMappingURL=symbols.js.map
|
package/dist/symbols.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,oEAAoE;AACpE,+DAA+D;AAE/D,OAAO,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AAE5D,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAElD,SAAS,IAAI,CAAC,GAAW,EAAE,GAAW,EAAE,KAAc;IACpD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAK,IAAY,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,OAAO;IAE1C,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAExB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAAE,SAAS;QACnD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@treenity/react",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"description": "React binding for Treenity — reactive hooks, admin UI, and context-based component rendering.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
9
|
-
"license": "
|
|
9
|
+
"license": "FSL-1.1-MIT",
|
|
10
10
|
"author": "Treenity <hello@treenity.ai> (https://treenity.ai)",
|
|
11
11
|
"homepage": "https://github.com/treenity-ai/treenity",
|
|
12
12
|
"repository": {
|
|
@@ -73,6 +73,8 @@
|
|
|
73
73
|
"files": [
|
|
74
74
|
"dist",
|
|
75
75
|
"src",
|
|
76
|
+
"!src/**/*.test.ts",
|
|
77
|
+
"!src/**/*.test.tsx",
|
|
76
78
|
"LICENSE",
|
|
77
79
|
"README.md"
|
|
78
80
|
],
|
package/src/App.tsx
CHANGED
|
@@ -17,7 +17,7 @@ import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from '
|
|
|
17
17
|
import { toast } from 'sonner';
|
|
18
18
|
import * as cache from './cache';
|
|
19
19
|
import { tree } from './client';
|
|
20
|
-
import { startEvents, stopEvents } from './events';
|
|
20
|
+
import { SSE_CONNECTED, SSE_DISCONNECTED, startEvents, stopEvents } from './events';
|
|
21
21
|
import { NavigateProvider } from './hooks';
|
|
22
22
|
import { Inspector } from './Inspector';
|
|
23
23
|
import { LoginModal, LoginScreen } from './Login';
|
|
@@ -109,6 +109,29 @@ export function App() {
|
|
|
109
109
|
const [filter, setFilter] = useState('');
|
|
110
110
|
const [showHidden, setShowHidden] = useState(false);
|
|
111
111
|
const [toastMsg, setToastMsg] = useState<{ text: string; type: 'success' | 'error' } | null>(null);
|
|
112
|
+
const [sseDown, setSseDown] = useState(false);
|
|
113
|
+
const sseDownTimer = useRef<ReturnType<typeof setTimeout>>(undefined);
|
|
114
|
+
|
|
115
|
+
// TODO: remove debounce, extract from App code, remove debounce
|
|
116
|
+
// SSE connection indicator — debounce disconnect by 2s to avoid flicker
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
const onConnect = () => {
|
|
119
|
+
if (sseDownTimer.current) { clearTimeout(sseDownTimer.current); sseDownTimer.current = undefined; }
|
|
120
|
+
setSseDown(false);
|
|
121
|
+
};
|
|
122
|
+
const onDisconnect = () => {
|
|
123
|
+
if (!sseDownTimer.current) {
|
|
124
|
+
sseDownTimer.current = setTimeout(() => { sseDownTimer.current = undefined; setSseDown(true); }, 2000);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
window.addEventListener(SSE_CONNECTED, onConnect);
|
|
128
|
+
window.addEventListener(SSE_DISCONNECTED, onDisconnect);
|
|
129
|
+
return () => {
|
|
130
|
+
window.removeEventListener(SSE_CONNECTED, onConnect);
|
|
131
|
+
window.removeEventListener(SSE_DISCONNECTED, onDisconnect);
|
|
132
|
+
if (sseDownTimer.current) clearTimeout(sseDownTimer.current);
|
|
133
|
+
};
|
|
134
|
+
}, []);
|
|
112
135
|
|
|
113
136
|
// Granular: only re-render App when root node appears/disappears
|
|
114
137
|
const hasRootNode = useSyncExternalStore(
|
|
@@ -438,6 +461,11 @@ export function App() {
|
|
|
438
461
|
|
|
439
462
|
return (
|
|
440
463
|
<NavigateProvider value={navigate}>
|
|
464
|
+
{sseDown && (
|
|
465
|
+
<div className="fixed top-0 inset-x-0 z-50 bg-yellow-500 text-black text-center text-sm py-1">
|
|
466
|
+
Reconnecting to server…
|
|
467
|
+
</div>
|
|
468
|
+
)}
|
|
441
469
|
<div className="flex h-screen bg-background text-foreground overflow-hidden">
|
|
442
470
|
<ResizablePanelGroup orientation="horizontal" className="h-full">
|
|
443
471
|
<ResizablePanel
|
package/src/ComponentSection.tsx
CHANGED
|
@@ -59,7 +59,7 @@ export function ComponentSection({
|
|
|
59
59
|
toast,
|
|
60
60
|
onActionComplete,
|
|
61
61
|
}: ComponentSectionProps) {
|
|
62
|
-
const isMain = !
|
|
62
|
+
const isMain = !name;
|
|
63
63
|
|
|
64
64
|
return (
|
|
65
65
|
<div className="border-t border-border mt-2 pt-0.5 first:border-t-0 first:mt-0 first:pt-0">
|
package/src/ErrorBoundary.tsx
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Button } from '#components/ui/button';
|
|
1
2
|
import { Component, type ReactNode } from 'react';
|
|
2
3
|
|
|
3
4
|
type Props = {
|
|
@@ -10,12 +11,14 @@ type State = { error: string | null };
|
|
|
10
11
|
const defaultFallback = (error: string, reset: () => void) => (
|
|
11
12
|
<div className="rounded border border-destructive/30 bg-destructive/5 p-2 text-[11px]">
|
|
12
13
|
<div className="text-destructive font-mono break-all">{error}</div>
|
|
13
|
-
<
|
|
14
|
-
|
|
14
|
+
<Button
|
|
15
|
+
variant="link"
|
|
16
|
+
size="sm"
|
|
17
|
+
className="mt-1 h-auto p-0 text-[10px] text-muted-foreground hover:text-foreground underline"
|
|
15
18
|
onClick={reset}
|
|
16
19
|
>
|
|
17
20
|
Retry
|
|
18
|
-
</
|
|
21
|
+
</Button>
|
|
19
22
|
</div>
|
|
20
23
|
);
|
|
21
24
|
|
package/src/Treenity.tsx
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
|
2
|
+
import { enablePatches } from 'immer'
|
|
3
|
+
import { type ReactNode } from 'react'
|
|
4
|
+
import { App } from './App'
|
|
5
|
+
import './load-client'
|
|
6
|
+
import { Toaster } from './components/ui/sonner'
|
|
7
|
+
import './root.css'
|
|
8
|
+
|
|
9
|
+
enablePatches()
|
|
10
|
+
|
|
11
|
+
const queryClient = new QueryClient()
|
|
12
|
+
|
|
13
|
+
export interface TreenityProps {
|
|
14
|
+
/** Override initial path */
|
|
15
|
+
path?: string
|
|
16
|
+
/** Wrap with custom providers */
|
|
17
|
+
children?: ReactNode
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Treenity as a single React component.
|
|
22
|
+
* Includes all providers, auth, SSE, cache.
|
|
23
|
+
*/
|
|
24
|
+
export function Treenity({ children }: TreenityProps) {
|
|
25
|
+
return (
|
|
26
|
+
<QueryClientProvider client={queryClient}>
|
|
27
|
+
<App />
|
|
28
|
+
<Toaster />
|
|
29
|
+
{children}
|
|
30
|
+
</QueryClientProvider>
|
|
31
|
+
)
|
|
32
|
+
}
|
package/src/cache.ts
CHANGED
|
@@ -6,6 +6,10 @@ import type { NodeData } from '@treenity/core';
|
|
|
6
6
|
import * as idb from './idb';
|
|
7
7
|
import { stampNode } from './symbols';
|
|
8
8
|
|
|
9
|
+
/** Shallow-freeze in dev mode to catch accidental cache mutation at the source */
|
|
10
|
+
const devFreeze: (node: NodeData) => void =
|
|
11
|
+
import.meta.env?.DEV ? (node) => Object.freeze(node) : () => {};
|
|
12
|
+
|
|
9
13
|
type Sub = () => void;
|
|
10
14
|
|
|
11
15
|
const nodes = new Map<string, NodeData>();
|
|
@@ -112,6 +116,7 @@ export function removeFromParent(path: string, parent: string) {
|
|
|
112
116
|
export function put(node: NodeData, virtualParent?: string) {
|
|
113
117
|
stampNode(node);
|
|
114
118
|
nodes.set(node.$path, node);
|
|
119
|
+
devFreeze(node);
|
|
115
120
|
const p = virtualParent ?? parentOf(node.$path);
|
|
116
121
|
if (p !== null) {
|
|
117
122
|
if (!parentIndex.has(p)) parentIndex.set(p, new Set());
|
|
@@ -139,6 +144,7 @@ export function putMany(items: NodeData[], virtualParent?: string) {
|
|
|
139
144
|
for (const n of items) {
|
|
140
145
|
stampNode(n);
|
|
141
146
|
nodes.set(n.$path, n);
|
|
147
|
+
devFreeze(n);
|
|
142
148
|
lastUpdated.set(n.$path, ts);
|
|
143
149
|
fire(pathSubs, n.$path);
|
|
144
150
|
const p = virtualParent ?? parentOf(n.$path);
|
|
@@ -230,6 +236,7 @@ export async function hydrate(): Promise<void> {
|
|
|
230
236
|
for (const { data, lastUpdated: ts, virtualParent } of entries) {
|
|
231
237
|
stampNode(data);
|
|
232
238
|
nodes.set(data.$path, data);
|
|
239
|
+
devFreeze(data);
|
|
233
240
|
lastUpdated.set(data.$path, ts);
|
|
234
241
|
const p = virtualParent ?? parentOf(data.$path);
|
|
235
242
|
if (p !== null) {
|
package/src/client-tree.ts
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
// FilterTree: /local/* → memory+mounts, everything else → remote.
|
|
3
3
|
// Reads merge both — /local visible alongside server nodes.
|
|
4
4
|
|
|
5
|
-
import type { NodeData } from '@treenity/core'
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import '
|
|
10
|
-
import { createRemoteTree } from './remote-tree'
|
|
11
|
-
import type { trpc } from './trpc'
|
|
5
|
+
import type { NodeData } from '@treenity/core';
|
|
6
|
+
import { withMounts } from '@treenity/core/server/mount';
|
|
7
|
+
import './fiber-tree'; // registers t.mount.react
|
|
8
|
+
import { createFilterTree, createMemoryTree } from '@treenity/core/tree';
|
|
9
|
+
import { withCache } from '@treenity/core/tree/cache';
|
|
10
|
+
import { createRemoteTree } from './remote-tree';
|
|
11
|
+
import type { trpc } from './trpc';
|
|
12
12
|
|
|
13
13
|
type TrpcClient = typeof trpc
|
|
14
14
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { cva, type VariantProps } from
|
|
3
|
-
import { Slot } from
|
|
4
|
-
|
|
5
|
-
import { cn } from "#components/lib/utils"
|
|
1
|
+
import { cn } from '#components/lib/utils';
|
|
2
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
3
|
+
import { Slot } from 'radix-ui';
|
|
4
|
+
import * as React from 'react';
|
|
6
5
|
|
|
7
6
|
const buttonVariants = cva(
|
|
8
7
|
"inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
MoreHorizontalIcon,
|
|
6
|
-
} from "lucide-react"
|
|
7
|
-
|
|
8
|
-
import { cn } from "#components/lib/utils"
|
|
9
|
-
import { buttonVariants, type Button } from "#components/ui/button"
|
|
1
|
+
import { cn } from '#components/lib/utils';
|
|
2
|
+
import { type Button, buttonVariants } from '#components/ui/button';
|
|
3
|
+
import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react';
|
|
4
|
+
import * as React from 'react';
|
|
10
5
|
|
|
11
6
|
function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
|
|
12
7
|
return (
|
|
@@ -6,7 +6,7 @@ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
|
|
|
6
6
|
<textarea
|
|
7
7
|
data-slot="textarea"
|
|
8
8
|
className={cn(
|
|
9
|
-
"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
9
|
+
"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 max-h-64 overflow-y-auto w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
10
10
|
className
|
|
11
11
|
)}
|
|
12
12
|
{...props}
|
package/src/events.ts
CHANGED
|
@@ -14,14 +14,44 @@ interface EventsConfig {
|
|
|
14
14
|
getSelected: () => string | null;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
// ── SSE connection events (consumed by App.tsx) ──
|
|
18
|
+
|
|
19
|
+
export const SSE_CONNECTED = 'sse-connected';
|
|
20
|
+
export const SSE_DISCONNECTED = 'sse-disconnected';
|
|
21
|
+
|
|
17
22
|
let unsub: (() => void) | null = null;
|
|
23
|
+
let reconnectTimer: ReturnType<typeof setTimeout> | null = null;
|
|
24
|
+
let lastConfig: EventsConfig | null = null;
|
|
18
25
|
|
|
19
26
|
export function startEvents(config: EventsConfig) {
|
|
20
27
|
stopEvents();
|
|
28
|
+
lastConfig = config;
|
|
21
29
|
|
|
22
30
|
const { loadChildren, getExpanded, getSelected } = config;
|
|
23
31
|
|
|
24
32
|
const sub = trpc.events.subscribe(undefined as void, {
|
|
33
|
+
onStarted() {
|
|
34
|
+
window.dispatchEvent(new Event(SSE_CONNECTED));
|
|
35
|
+
},
|
|
36
|
+
onConnectionStateChange(state: { state: string }) {
|
|
37
|
+
if (state.state === 'connecting') {
|
|
38
|
+
window.dispatchEvent(new Event(SSE_DISCONNECTED));
|
|
39
|
+
} else if (state.state === 'pending') {
|
|
40
|
+
// 'pending' = connected and waiting for data — SSE is alive
|
|
41
|
+
window.dispatchEvent(new Event(SSE_CONNECTED));
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
onError(err: unknown) {
|
|
45
|
+
console.error('[sse] subscription error (non-retryable):', err);
|
|
46
|
+
window.dispatchEvent(new Event(SSE_DISCONNECTED));
|
|
47
|
+
// tRPC exhausted retries — schedule a single delayed re-subscribe
|
|
48
|
+
scheduleResubscribe();
|
|
49
|
+
},
|
|
50
|
+
onStopped() {
|
|
51
|
+
// Server closed the stream — schedule re-subscribe
|
|
52
|
+
window.dispatchEvent(new Event(SSE_DISCONNECTED));
|
|
53
|
+
scheduleResubscribe();
|
|
54
|
+
},
|
|
25
55
|
onData(event) {
|
|
26
56
|
if (event.type === 'reconnect') {
|
|
27
57
|
if (!event.preserved) {
|
|
@@ -45,8 +75,9 @@ export function startEvents(config: EventsConfig) {
|
|
|
45
75
|
const existing = cache.get(event.path);
|
|
46
76
|
if (existing && event.patches) {
|
|
47
77
|
try {
|
|
48
|
-
|
|
49
|
-
|
|
78
|
+
const patched = structuredClone(existing);
|
|
79
|
+
applyPatch(patched, event.patches as Operation[]);
|
|
80
|
+
cache.put(patched);
|
|
50
81
|
} catch (e) {
|
|
51
82
|
console.error('Failed to apply patches, fetching full node:', e);
|
|
52
83
|
trpc.get.query({ path: event.path }).then((n) => {
|
|
@@ -73,9 +104,18 @@ export function startEvents(config: EventsConfig) {
|
|
|
73
104
|
unsub = () => sub.unsubscribe();
|
|
74
105
|
}
|
|
75
106
|
|
|
107
|
+
const RESUBSCRIBE_DELAY = 5_000;
|
|
108
|
+
|
|
109
|
+
function scheduleResubscribe() {
|
|
110
|
+
if (reconnectTimer || !lastConfig) return;
|
|
111
|
+
console.log(`[sse] will re-subscribe in ${RESUBSCRIBE_DELAY}ms`);
|
|
112
|
+
reconnectTimer = setTimeout(() => {
|
|
113
|
+
reconnectTimer = null;
|
|
114
|
+
if (lastConfig) startEvents(lastConfig);
|
|
115
|
+
}, RESUBSCRIBE_DELAY);
|
|
116
|
+
}
|
|
117
|
+
|
|
76
118
|
export function stopEvents() {
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
unsub = null;
|
|
80
|
-
}
|
|
119
|
+
if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; }
|
|
120
|
+
if (unsub) { unsub(); unsub = null; }
|
|
81
121
|
}
|
package/src/fiber-tree.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// Walks the live Fiber tree on each query — no state, no tracking.
|
|
3
3
|
// Registered as t.mount.react — isomorphic mount, same as server-side mounts.
|
|
4
4
|
|
|
5
|
-
import type { NodeData } from '@treenity/core'
|
|
6
|
-
import { register } from '@treenity/core'
|
|
7
|
-
import type { Tree } from '@treenity/core/tree'
|
|
5
|
+
import type { NodeData } from '@treenity/core';
|
|
6
|
+
import { register } from '@treenity/core';
|
|
7
|
+
import type { Tree } from '@treenity/core/tree';
|
|
8
8
|
|
|
9
9
|
const PREFIX = '/local/react'
|
|
10
10
|
|