@maxhealth.tech/prefab 0.1.2
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/CHANGELOG.md +51 -0
- package/LICENSE +21 -0
- package/README.md +340 -0
- package/dist/actions/client.d.ts +98 -0
- package/dist/actions/client.d.ts.map +1 -0
- package/dist/actions/client.js +188 -0
- package/dist/actions/client.js.map +1 -0
- package/dist/actions/index.d.ts +6 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +3 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/mcp.d.ts +37 -0
- package/dist/actions/mcp.d.ts.map +1 -0
- package/dist/actions/mcp.js +64 -0
- package/dist/actions/mcp.js.map +1 -0
- package/dist/actions/types.d.ts +16 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +8 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/app.d.ts +65 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +120 -0
- package/dist/app.js.map +1 -0
- package/dist/auto/chart.d.ts +36 -0
- package/dist/auto/chart.d.ts.map +1 -0
- package/dist/auto/chart.js +50 -0
- package/dist/auto/chart.js.map +1 -0
- package/dist/auto/comparison.d.ts +32 -0
- package/dist/auto/comparison.d.ts.map +1 -0
- package/dist/auto/comparison.js +66 -0
- package/dist/auto/comparison.js.map +1 -0
- package/dist/auto/form.d.ts +50 -0
- package/dist/auto/form.d.ts.map +1 -0
- package/dist/auto/form.js +68 -0
- package/dist/auto/form.js.map +1 -0
- package/dist/auto/index.d.ts +84 -0
- package/dist/auto/index.d.ts.map +1 -0
- package/dist/auto/index.js +240 -0
- package/dist/auto/index.js.map +1 -0
- package/dist/auto/metrics.d.ts +44 -0
- package/dist/auto/metrics.d.ts.map +1 -0
- package/dist/auto/metrics.js +55 -0
- package/dist/auto/metrics.js.map +1 -0
- package/dist/auto/progress.d.ts +38 -0
- package/dist/auto/progress.d.ts.map +1 -0
- package/dist/auto/progress.js +72 -0
- package/dist/auto/progress.js.map +1 -0
- package/dist/auto/timeline.d.ts +41 -0
- package/dist/auto/timeline.d.ts.map +1 -0
- package/dist/auto/timeline.js +72 -0
- package/dist/auto/timeline.js.map +1 -0
- package/dist/components/alert/index.d.ts +14 -0
- package/dist/components/alert/index.d.ts.map +1 -0
- package/dist/components/alert/index.js +31 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/card/index.d.ts +12 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/card/index.js +33 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/charts/index.d.ts +57 -0
- package/dist/components/charts/index.d.ts.map +1 -0
- package/dist/components/charts/index.js +91 -0
- package/dist/components/charts/index.js.map +1 -0
- package/dist/components/control/index.d.ts +48 -0
- package/dist/components/control/index.d.ts.map +1 -0
- package/dist/components/control/index.js +47 -0
- package/dist/components/control/index.js.map +1 -0
- package/dist/components/data/index.d.ts +53 -0
- package/dist/components/data/index.d.ts.map +1 -0
- package/dist/components/data/index.js +88 -0
- package/dist/components/data/index.js.map +1 -0
- package/dist/components/form/index.d.ts +103 -0
- package/dist/components/form/index.d.ts.map +1 -0
- package/dist/components/form/index.js +247 -0
- package/dist/components/form/index.js.map +1 -0
- package/dist/components/interactive/index.d.ts +33 -0
- package/dist/components/interactive/index.d.ts.map +1 -0
- package/dist/components/interactive/index.js +59 -0
- package/dist/components/interactive/index.js.map +1 -0
- package/dist/components/layout/index.d.ts +61 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +86 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/media/index.d.ts +17 -0
- package/dist/components/media/index.d.ts.map +1 -0
- package/dist/components/media/index.js +41 -0
- package/dist/components/media/index.js.map +1 -0
- package/dist/components/table/index.d.ts +28 -0
- package/dist/components/table/index.d.ts.map +1 -0
- package/dist/components/table/index.js +56 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/typography/index.d.ts +34 -0
- package/dist/components/typography/index.d.ts.map +1 -0
- package/dist/components/typography/index.js +93 -0
- package/dist/components/typography/index.js.map +1 -0
- package/dist/core/component.d.ts +67 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +122 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/validate.d.ts +30 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +178 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/display.d.ts +102 -0
- package/dist/mcp/display.d.ts.map +1 -0
- package/dist/mcp/display.js +124 -0
- package/dist/mcp/display.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +35 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +8 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/renderer/actions.d.ts +36 -0
- package/dist/renderer/actions.d.ts.map +1 -0
- package/dist/renderer/actions.js +296 -0
- package/dist/renderer/actions.js.map +1 -0
- package/dist/renderer/app.d.ts +87 -0
- package/dist/renderer/app.d.ts.map +1 -0
- package/dist/renderer/app.js +166 -0
- package/dist/renderer/app.js.map +1 -0
- package/dist/renderer/bridge.d.ts +91 -0
- package/dist/renderer/bridge.d.ts.map +1 -0
- package/dist/renderer/bridge.js +302 -0
- package/dist/renderer/bridge.js.map +1 -0
- package/dist/renderer/components/alert.d.ts +5 -0
- package/dist/renderer/components/alert.d.ts.map +1 -0
- package/dist/renderer/components/alert.js +44 -0
- package/dist/renderer/components/alert.js.map +1 -0
- package/dist/renderer/components/card.d.ts +5 -0
- package/dist/renderer/components/card.d.ts.map +1 -0
- package/dist/renderer/components/card.js +38 -0
- package/dist/renderer/components/card.js.map +1 -0
- package/dist/renderer/components/charts.d.ts +8 -0
- package/dist/renderer/components/charts.d.ts.map +1 -0
- package/dist/renderer/components/charts.js +232 -0
- package/dist/renderer/components/charts.js.map +1 -0
- package/dist/renderer/components/control.d.ts +5 -0
- package/dist/renderer/components/control.d.ts.map +1 -0
- package/dist/renderer/components/control.js +140 -0
- package/dist/renderer/components/control.js.map +1 -0
- package/dist/renderer/components/data.d.ts +5 -0
- package/dist/renderer/components/data.d.ts.map +1 -0
- package/dist/renderer/components/data.js +268 -0
- package/dist/renderer/components/data.js.map +1 -0
- package/dist/renderer/components/form.d.ts +5 -0
- package/dist/renderer/components/form.d.ts.map +1 -0
- package/dist/renderer/components/form.js +523 -0
- package/dist/renderer/components/form.js.map +1 -0
- package/dist/renderer/components/index.d.ts +5 -0
- package/dist/renderer/components/index.d.ts.map +1 -0
- package/dist/renderer/components/index.js +32 -0
- package/dist/renderer/components/index.js.map +1 -0
- package/dist/renderer/components/interactive.d.ts +5 -0
- package/dist/renderer/components/interactive.d.ts.map +1 -0
- package/dist/renderer/components/interactive.js +324 -0
- package/dist/renderer/components/interactive.js.map +1 -0
- package/dist/renderer/components/layout.d.ts +5 -0
- package/dist/renderer/components/layout.d.ts.map +1 -0
- package/dist/renderer/components/layout.js +113 -0
- package/dist/renderer/components/layout.js.map +1 -0
- package/dist/renderer/components/media.d.ts +5 -0
- package/dist/renderer/components/media.d.ts.map +1 -0
- package/dist/renderer/components/media.js +132 -0
- package/dist/renderer/components/media.js.map +1 -0
- package/dist/renderer/components/table.d.ts +5 -0
- package/dist/renderer/components/table.d.ts.map +1 -0
- package/dist/renderer/components/table.js +101 -0
- package/dist/renderer/components/table.js.map +1 -0
- package/dist/renderer/components/typography.d.ts +5 -0
- package/dist/renderer/components/typography.d.ts.map +1 -0
- package/dist/renderer/components/typography.js +90 -0
- package/dist/renderer/components/typography.js.map +1 -0
- package/dist/renderer/engine.d.ts +53 -0
- package/dist/renderer/engine.d.ts.map +1 -0
- package/dist/renderer/engine.js +112 -0
- package/dist/renderer/engine.js.map +1 -0
- package/dist/renderer/index.d.ts +94 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +215 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/rx.d.ts +37 -0
- package/dist/renderer/rx.d.ts.map +1 -0
- package/dist/renderer/rx.js +360 -0
- package/dist/renderer/rx.js.map +1 -0
- package/dist/renderer/state.d.ts +34 -0
- package/dist/renderer/state.d.ts.map +1 -0
- package/dist/renderer/state.js +132 -0
- package/dist/renderer/state.js.map +1 -0
- package/dist/renderer/theme.d.ts +13 -0
- package/dist/renderer/theme.d.ts.map +1 -0
- package/dist/renderer/theme.js +69 -0
- package/dist/renderer/theme.js.map +1 -0
- package/dist/renderer/transport.d.ts +22 -0
- package/dist/renderer/transport.d.ts.map +1 -0
- package/dist/renderer/transport.js +69 -0
- package/dist/renderer/transport.js.map +1 -0
- package/dist/renderer.min.js +83 -0
- package/dist/rx/index.d.ts +2 -0
- package/dist/rx/index.d.ts.map +1 -0
- package/dist/rx/index.js +2 -0
- package/dist/rx/index.js.map +1 -0
- package/dist/rx/rx.d.ts +81 -0
- package/dist/rx/rx.d.ts.map +1 -0
- package/dist/rx/rx.js +196 -0
- package/dist/rx/rx.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrefabRenderer — Main entry point for the browser renderer.
|
|
3
|
+
*
|
|
4
|
+
* Usage (CDN — new API):
|
|
5
|
+
* ```html
|
|
6
|
+
* <script src="https://cdn.jsdelivr.net/npm/@maxhealth.tech/prefab/dist/renderer.min.js"></script>
|
|
7
|
+
* <script>
|
|
8
|
+
* const ui = await prefab.app();
|
|
9
|
+
* ui.onToolInput((args) => {
|
|
10
|
+
* ui.render('#root', chart({ data: args.data }));
|
|
11
|
+
* });
|
|
12
|
+
* </script>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Usage (CDN — legacy):
|
|
16
|
+
* ```html
|
|
17
|
+
* <script src="https://cdn.jsdelivr.net/npm/@maxhealth.tech/prefab/dist/renderer.min.js"></script>
|
|
18
|
+
* <script>
|
|
19
|
+
* PrefabRenderer.mount(document.getElementById('root'), data);
|
|
20
|
+
* </script>
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Or as ESM:
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { PrefabRenderer, app } from '@maxhealth.tech/prefab/renderer'
|
|
26
|
+
* const ui = await app()
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { Store } from './state.js';
|
|
30
|
+
import { renderNode } from './engine.js';
|
|
31
|
+
import { registerAllComponents } from './components/index.js';
|
|
32
|
+
import { applyTheme, applyKeyBindings } from './theme.js';
|
|
33
|
+
import { dispatchActions, clearAllIntervals } from './actions.js';
|
|
34
|
+
import { createHttpTransport, createNoopTransport } from './transport.js';
|
|
35
|
+
import { app } from './app.js';
|
|
36
|
+
import { Bridge, isIframe } from './bridge.js';
|
|
37
|
+
// Re-export new APIs
|
|
38
|
+
export { app } from './app.js';
|
|
39
|
+
export { Bridge, isIframe, applyHostTheme } from './bridge.js';
|
|
40
|
+
// ── PrefabRenderer ───────────────────────────────────────────────────────────
|
|
41
|
+
export const PrefabRenderer = {
|
|
42
|
+
/**
|
|
43
|
+
* Mount a prefab UI into a DOM element.
|
|
44
|
+
*
|
|
45
|
+
* @param root - The DOM element to render into.
|
|
46
|
+
* @param data - The $prefab wire format JSON.
|
|
47
|
+
* @param options - Optional transport and toast handler.
|
|
48
|
+
* @returns A MountedApp handle for updates and cleanup.
|
|
49
|
+
*/
|
|
50
|
+
mount(root, data, options) {
|
|
51
|
+
// Register all built-in components (idempotent)
|
|
52
|
+
registerAllComponents();
|
|
53
|
+
// Initialize state store
|
|
54
|
+
const store = new Store(data.state);
|
|
55
|
+
// Set up transport
|
|
56
|
+
let transport;
|
|
57
|
+
if (options?.transport && 'callTool' in options.transport) {
|
|
58
|
+
transport = options.transport;
|
|
59
|
+
}
|
|
60
|
+
else if (options?.transport) {
|
|
61
|
+
transport = createHttpTransport(options.transport);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
transport = createNoopTransport();
|
|
65
|
+
}
|
|
66
|
+
// Toast handler with fallback
|
|
67
|
+
const onToast = options?.onToast ?? defaultToastHandler;
|
|
68
|
+
// Build render context
|
|
69
|
+
const ctx = {
|
|
70
|
+
store,
|
|
71
|
+
scope: {},
|
|
72
|
+
transport,
|
|
73
|
+
rerender: () => render(),
|
|
74
|
+
onToast,
|
|
75
|
+
defs: data.defs,
|
|
76
|
+
};
|
|
77
|
+
// Apply theme
|
|
78
|
+
applyTheme(root, data.theme);
|
|
79
|
+
// Inject stylesheets
|
|
80
|
+
const styleEls = [];
|
|
81
|
+
if (data.stylesheets) {
|
|
82
|
+
for (const css of data.stylesheets) {
|
|
83
|
+
const style = document.createElement('style');
|
|
84
|
+
style.textContent = css;
|
|
85
|
+
style.dataset.prefab = 'injected';
|
|
86
|
+
document.head.appendChild(style);
|
|
87
|
+
styleEls.push(style);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Keyboard bindings
|
|
91
|
+
let cleanupKeys;
|
|
92
|
+
if (data.keyBindings) {
|
|
93
|
+
cleanupKeys = applyKeyBindings(data.keyBindings, async (actions) => {
|
|
94
|
+
await dispatchActions(actions, {
|
|
95
|
+
store,
|
|
96
|
+
transport,
|
|
97
|
+
scope: {},
|
|
98
|
+
rerender: () => render(),
|
|
99
|
+
onToast,
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Render function
|
|
104
|
+
function render() {
|
|
105
|
+
root.innerHTML = '';
|
|
106
|
+
const dom = renderNode(data.view, ctx);
|
|
107
|
+
root.appendChild(dom);
|
|
108
|
+
}
|
|
109
|
+
// Initial render
|
|
110
|
+
render();
|
|
111
|
+
// Run onMount from the view root (if present)
|
|
112
|
+
// Already handled by renderNode via queueMicrotask
|
|
113
|
+
return {
|
|
114
|
+
rerender: () => render(),
|
|
115
|
+
update(updateData) {
|
|
116
|
+
store.merge(updateData.update.state);
|
|
117
|
+
render();
|
|
118
|
+
},
|
|
119
|
+
store,
|
|
120
|
+
destroy() {
|
|
121
|
+
cleanupKeys?.();
|
|
122
|
+
clearAllIntervals();
|
|
123
|
+
for (const s of styleEls)
|
|
124
|
+
s.remove();
|
|
125
|
+
root.innerHTML = '';
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
/**
|
|
130
|
+
* Check if data is a prefab wire format.
|
|
131
|
+
*/
|
|
132
|
+
isPrefabData(data) {
|
|
133
|
+
return data != null && typeof data === 'object' && '$prefab' in data;
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* Check if data is a prefab state update.
|
|
137
|
+
*/
|
|
138
|
+
isPrefabUpdate(data) {
|
|
139
|
+
return (data != null &&
|
|
140
|
+
typeof data === 'object' &&
|
|
141
|
+
'$prefab' in data &&
|
|
142
|
+
'update' in data);
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
// ── Default toast ────────────────────────────────────────────────────────────
|
|
146
|
+
function defaultToastHandler(toast) {
|
|
147
|
+
if (typeof document === 'undefined')
|
|
148
|
+
return;
|
|
149
|
+
const container = getOrCreateToastContainer();
|
|
150
|
+
const toastEl = document.createElement('div');
|
|
151
|
+
toastEl.className = 'pf-toast';
|
|
152
|
+
toastEl.setAttribute('data-variant', toast.variant ?? 'default');
|
|
153
|
+
toastEl.style.padding = '12px 16px';
|
|
154
|
+
toastEl.style.borderRadius = '8px';
|
|
155
|
+
toastEl.style.backgroundColor = 'var(--card, #fff)';
|
|
156
|
+
toastEl.style.border = '1px solid var(--border, #e5e7eb)';
|
|
157
|
+
toastEl.style.boxShadow = '0 4px 12px rgb(0 0 0 / 0.15)';
|
|
158
|
+
toastEl.style.marginBottom = '8px';
|
|
159
|
+
toastEl.style.transition = 'opacity 0.3s ease';
|
|
160
|
+
const msg = document.createElement('div');
|
|
161
|
+
msg.textContent = toast.message;
|
|
162
|
+
msg.style.fontWeight = '500';
|
|
163
|
+
toastEl.appendChild(msg);
|
|
164
|
+
if (toast.description) {
|
|
165
|
+
const desc = document.createElement('div');
|
|
166
|
+
desc.textContent = toast.description;
|
|
167
|
+
desc.style.fontSize = '14px';
|
|
168
|
+
desc.style.color = 'var(--muted-foreground, #6b7280)';
|
|
169
|
+
toastEl.appendChild(desc);
|
|
170
|
+
}
|
|
171
|
+
container.appendChild(toastEl);
|
|
172
|
+
const duration = toast.duration ?? 4000;
|
|
173
|
+
setTimeout(() => {
|
|
174
|
+
toastEl.style.opacity = '0';
|
|
175
|
+
setTimeout(() => toastEl.remove(), 300);
|
|
176
|
+
}, duration);
|
|
177
|
+
}
|
|
178
|
+
function getOrCreateToastContainer() {
|
|
179
|
+
const id = 'prefab-toast-container';
|
|
180
|
+
let container = document.getElementById(id);
|
|
181
|
+
if (!container) {
|
|
182
|
+
container = document.createElement('div');
|
|
183
|
+
container.id = id;
|
|
184
|
+
container.style.position = 'fixed';
|
|
185
|
+
container.style.bottom = '16px';
|
|
186
|
+
container.style.right = '16px';
|
|
187
|
+
container.style.zIndex = '9999';
|
|
188
|
+
container.style.maxWidth = '400px';
|
|
189
|
+
document.body.appendChild(container);
|
|
190
|
+
}
|
|
191
|
+
return container;
|
|
192
|
+
}
|
|
193
|
+
// ── Auto-mount from window.__PREFAB_DATA__ ───────────────────────────────────
|
|
194
|
+
if (typeof window !== 'undefined') {
|
|
195
|
+
// Expose as window.PrefabRenderer (legacy) and window.prefab (new API)
|
|
196
|
+
const w = window;
|
|
197
|
+
w.PrefabRenderer = PrefabRenderer;
|
|
198
|
+
w.prefab = {
|
|
199
|
+
app,
|
|
200
|
+
mount: PrefabRenderer.mount.bind(PrefabRenderer),
|
|
201
|
+
isPrefabData: PrefabRenderer.isPrefabData.bind(PrefabRenderer),
|
|
202
|
+
isPrefabUpdate: PrefabRenderer.isPrefabUpdate.bind(PrefabRenderer),
|
|
203
|
+
Bridge,
|
|
204
|
+
isIframe,
|
|
205
|
+
};
|
|
206
|
+
// Auto-mount if data is available
|
|
207
|
+
const prefabData = w.__PREFAB_DATA__;
|
|
208
|
+
if (prefabData != null) {
|
|
209
|
+
const root = document.getElementById('prefab-root');
|
|
210
|
+
if (root) {
|
|
211
|
+
PrefabRenderer.mount(root, prefabData);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rx expression evaluator — parse and evaluate {{ expr }} at runtime.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - State references: {{ count }}, {{ user.name }}
|
|
6
|
+
* - Arithmetic: {{ count + 1 }}, {{ price * quantity }}
|
|
7
|
+
* - Comparisons: {{ count > 0 }}, {{ status === 'active' }}
|
|
8
|
+
* - Ternary: {{ active ? 'Yes' : 'No' }}
|
|
9
|
+
* - Logical: {{ a && b }}, {{ !loading }}
|
|
10
|
+
* - Pipe filters: {{ price | currency:'USD' }}, {{ name | upper }}
|
|
11
|
+
* - Built-in vars: $item, $index, $event, $error, $result, $state
|
|
12
|
+
*/
|
|
13
|
+
import type { Store } from './state.js';
|
|
14
|
+
/** Scope for expression evaluation (loop variables, event data, etc.) */
|
|
15
|
+
export interface EvalScope {
|
|
16
|
+
$item?: unknown;
|
|
17
|
+
$index?: number;
|
|
18
|
+
$event?: unknown;
|
|
19
|
+
$error?: unknown;
|
|
20
|
+
$result?: unknown;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if a string contains {{ }} expressions.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isRxExpression(value: unknown): value is string;
|
|
27
|
+
/**
|
|
28
|
+
* Evaluate a string that may contain {{ expr }} templates.
|
|
29
|
+
* If the entire string is a single {{ expr }}, returns the raw value (not stringified).
|
|
30
|
+
* If mixed with text, interpolates as string.
|
|
31
|
+
*/
|
|
32
|
+
export declare function evaluateTemplate(template: string, store: Store, scope?: EvalScope): unknown;
|
|
33
|
+
/**
|
|
34
|
+
* Evaluate a raw expression string (without {{ }}).
|
|
35
|
+
*/
|
|
36
|
+
export declare function evaluateExpression(expr: string, store: Store, scope?: EvalScope): unknown;
|
|
37
|
+
//# sourceMappingURL=rx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rx.d.ts","sourceRoot":"","sources":["../../src/renderer/rx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,KAAK,CAAC,EAAE,SAAS,GAChB,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,KAAK,CAAC,EAAE,SAAS,GAChB,OAAO,CAYT"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rx expression evaluator — parse and evaluate {{ expr }} at runtime.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - State references: {{ count }}, {{ user.name }}
|
|
6
|
+
* - Arithmetic: {{ count + 1 }}, {{ price * quantity }}
|
|
7
|
+
* - Comparisons: {{ count > 0 }}, {{ status === 'active' }}
|
|
8
|
+
* - Ternary: {{ active ? 'Yes' : 'No' }}
|
|
9
|
+
* - Logical: {{ a && b }}, {{ !loading }}
|
|
10
|
+
* - Pipe filters: {{ price | currency:'USD' }}, {{ name | upper }}
|
|
11
|
+
* - Built-in vars: $item, $index, $event, $error, $result, $state
|
|
12
|
+
*/
|
|
13
|
+
const RX_PATTERN = /\{\{\s*(.+?)\s*\}\}/g;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a string contains {{ }} expressions.
|
|
16
|
+
*/
|
|
17
|
+
export function isRxExpression(value) {
|
|
18
|
+
return typeof value === 'string' && value.includes('{{') && value.includes('}}');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Evaluate a string that may contain {{ expr }} templates.
|
|
22
|
+
* If the entire string is a single {{ expr }}, returns the raw value (not stringified).
|
|
23
|
+
* If mixed with text, interpolates as string.
|
|
24
|
+
*/
|
|
25
|
+
export function evaluateTemplate(template, store, scope) {
|
|
26
|
+
// Fast path: entire string is a single expression
|
|
27
|
+
const trimmed = template.trim();
|
|
28
|
+
if (trimmed.startsWith('{{') && trimmed.endsWith('}}') && countOccurrences(trimmed, '{{') === 1) {
|
|
29
|
+
const expr = trimmed.slice(2, -2).trim();
|
|
30
|
+
return evaluateExpression(expr, store, scope);
|
|
31
|
+
}
|
|
32
|
+
// Mixed template: interpolate all {{ }} blocks as strings
|
|
33
|
+
return template.replace(RX_PATTERN, (_, expr) => {
|
|
34
|
+
const val = evaluateExpression(expr.trim(), store, scope);
|
|
35
|
+
return val == null ? '' : String(val);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Evaluate a raw expression string (without {{ }}).
|
|
40
|
+
*/
|
|
41
|
+
export function evaluateExpression(expr, store, scope) {
|
|
42
|
+
// Handle pipe filters: split on | that's not inside quotes
|
|
43
|
+
const [baseExpr, ...pipes] = splitPipes(expr);
|
|
44
|
+
let value = evaluateCore(baseExpr.trim(), store, scope);
|
|
45
|
+
// Apply pipe filters
|
|
46
|
+
for (const pipe of pipes) {
|
|
47
|
+
value = applyFilter(pipe.trim(), value);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
// ── Core expression evaluator ────────────────────────────────────────────────
|
|
52
|
+
function evaluateCore(expr, store, scope) {
|
|
53
|
+
// Ternary: a ? b : c
|
|
54
|
+
const ternaryIdx = findTernary(expr);
|
|
55
|
+
if (ternaryIdx >= 0) {
|
|
56
|
+
const condition = expr.slice(0, ternaryIdx).trim();
|
|
57
|
+
const rest = expr.slice(ternaryIdx + 1);
|
|
58
|
+
const colonIdx = findColon(rest);
|
|
59
|
+
if (colonIdx >= 0) {
|
|
60
|
+
const ifTrue = rest.slice(0, colonIdx).trim();
|
|
61
|
+
const ifFalse = rest.slice(colonIdx + 1).trim();
|
|
62
|
+
const condResult = evaluateCore(condition, store, scope);
|
|
63
|
+
return condResult !== null && condResult !== undefined && condResult !== false && condResult !== 0 && condResult !== ''
|
|
64
|
+
? evaluateCore(ifTrue, store, scope)
|
|
65
|
+
: evaluateCore(ifFalse, store, scope);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Logical OR: a || b
|
|
69
|
+
const orIdx = expr.indexOf('||');
|
|
70
|
+
if (orIdx >= 0) {
|
|
71
|
+
const left = evaluateCore(expr.slice(0, orIdx).trim(), store, scope);
|
|
72
|
+
return left !== null && left !== undefined && left !== false && left !== 0 && left !== ''
|
|
73
|
+
? left
|
|
74
|
+
: evaluateCore(expr.slice(orIdx + 2).trim(), store, scope);
|
|
75
|
+
}
|
|
76
|
+
// Logical AND: a && b
|
|
77
|
+
const andIdx = expr.indexOf('&&');
|
|
78
|
+
if (andIdx >= 0) {
|
|
79
|
+
const left = evaluateCore(expr.slice(0, andIdx).trim(), store, scope);
|
|
80
|
+
if (left === null || left === undefined || left === false || left === 0 || left === '')
|
|
81
|
+
return left;
|
|
82
|
+
return evaluateCore(expr.slice(andIdx + 2).trim(), store, scope);
|
|
83
|
+
}
|
|
84
|
+
// Comparisons
|
|
85
|
+
for (const [op, fn] of COMPARISONS) {
|
|
86
|
+
const idx = expr.indexOf(op);
|
|
87
|
+
if (idx >= 0) {
|
|
88
|
+
const left = evaluateCore(expr.slice(0, idx).trim(), store, scope);
|
|
89
|
+
const right = evaluateCore(expr.slice(idx + op.length).trim(), store, scope);
|
|
90
|
+
return fn(left, right);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Negation: !expr
|
|
94
|
+
if (expr.startsWith('!')) {
|
|
95
|
+
const negResult = evaluateCore(expr.slice(1).trim(), store, scope);
|
|
96
|
+
return negResult === null || negResult === undefined || negResult === false || negResult === 0 || negResult === '';
|
|
97
|
+
}
|
|
98
|
+
// Arithmetic: +, -, *, /, %
|
|
99
|
+
for (const [op, fn] of ARITHMETIC) {
|
|
100
|
+
const idx = findArithOp(expr, op);
|
|
101
|
+
if (idx >= 0) {
|
|
102
|
+
const left = evaluateCore(expr.slice(0, idx).trim(), store, scope);
|
|
103
|
+
const right = evaluateCore(expr.slice(idx + op.length).trim(), store, scope);
|
|
104
|
+
return fn(Number(left), Number(right));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Literal values
|
|
108
|
+
if (expr === 'true')
|
|
109
|
+
return true;
|
|
110
|
+
if (expr === 'false')
|
|
111
|
+
return false;
|
|
112
|
+
if (expr === 'null' || expr === 'undefined')
|
|
113
|
+
return null;
|
|
114
|
+
if (/^-?\d+(\.\d+)?$/.test(expr))
|
|
115
|
+
return Number(expr);
|
|
116
|
+
if ((expr.startsWith("'") && expr.endsWith("'")) || (expr.startsWith('"') && expr.endsWith('"'))) {
|
|
117
|
+
return expr.slice(1, -1);
|
|
118
|
+
}
|
|
119
|
+
// Scope variables ($item, $index, etc.)
|
|
120
|
+
if (scope && expr.startsWith('$')) {
|
|
121
|
+
const dotIdx = expr.indexOf('.');
|
|
122
|
+
if (dotIdx >= 0) {
|
|
123
|
+
const varName = expr.slice(0, dotIdx);
|
|
124
|
+
const rest = expr.slice(dotIdx + 1);
|
|
125
|
+
const base = scope[varName];
|
|
126
|
+
return resolveDeep(base, rest);
|
|
127
|
+
}
|
|
128
|
+
return scope[expr];
|
|
129
|
+
}
|
|
130
|
+
// State reference (dot-path)
|
|
131
|
+
if (scope) {
|
|
132
|
+
// Check scope first for overrides
|
|
133
|
+
const topKey = expr.split('.')[0];
|
|
134
|
+
if (topKey in scope) {
|
|
135
|
+
return resolveDeep(scope[topKey], expr.includes('.') ? expr.slice(topKey.length + 1) : '');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return store.get(expr);
|
|
139
|
+
}
|
|
140
|
+
// ── Pipe filters ─────────────────────────────────────────────────────────────
|
|
141
|
+
function applyFilter(filterStr, value) {
|
|
142
|
+
const colonIdx = filterStr.indexOf(':');
|
|
143
|
+
const name = colonIdx >= 0 ? filterStr.slice(0, colonIdx).trim() : filterStr;
|
|
144
|
+
const argStr = colonIdx >= 0 ? filterStr.slice(colonIdx + 1).trim() : undefined;
|
|
145
|
+
const arg = argStr ? parseLiteral(argStr) : undefined;
|
|
146
|
+
switch (name) {
|
|
147
|
+
case 'length':
|
|
148
|
+
return Array.isArray(value) ? value.length : typeof value === 'string' ? value.length : 0;
|
|
149
|
+
case 'upper':
|
|
150
|
+
return typeof value === 'string' ? value.toUpperCase() : value;
|
|
151
|
+
case 'lower':
|
|
152
|
+
return typeof value === 'string' ? value.toLowerCase() : value;
|
|
153
|
+
case 'truncate':
|
|
154
|
+
if (typeof value === 'string' && typeof arg === 'number')
|
|
155
|
+
return value.slice(0, arg);
|
|
156
|
+
return value;
|
|
157
|
+
case 'join':
|
|
158
|
+
return Array.isArray(value) ? value.join(typeof arg === 'string' ? arg : ', ') : value;
|
|
159
|
+
case 'first':
|
|
160
|
+
return Array.isArray(value) ? value[0] : value;
|
|
161
|
+
case 'last':
|
|
162
|
+
return Array.isArray(value) ? value[value.length - 1] : value;
|
|
163
|
+
case 'abs':
|
|
164
|
+
return Math.abs(Number(value));
|
|
165
|
+
case 'round':
|
|
166
|
+
return typeof arg === 'number' ? Number(Number(value).toFixed(arg)) : Math.round(Number(value));
|
|
167
|
+
case 'number':
|
|
168
|
+
return typeof arg === 'number' ? Number(Number(value).toFixed(arg)) : Number(value);
|
|
169
|
+
case 'currency': {
|
|
170
|
+
const code = typeof arg === 'string' ? arg : 'USD';
|
|
171
|
+
try {
|
|
172
|
+
return new Intl.NumberFormat('en-US', { style: 'currency', currency: code }).format(Number(value));
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
case 'percent':
|
|
179
|
+
return typeof arg === 'number'
|
|
180
|
+
? `${(Number(value) * 100).toFixed(arg)}%`
|
|
181
|
+
: `${Math.round(Number(value) * 100)}%`;
|
|
182
|
+
case 'compact': {
|
|
183
|
+
const digits = typeof arg === 'number' ? arg : 1;
|
|
184
|
+
try {
|
|
185
|
+
return new Intl.NumberFormat('en-US', { notation: 'compact', maximumFractionDigits: digits }).format(Number(value));
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
case 'date':
|
|
192
|
+
try {
|
|
193
|
+
return new Date(value).toLocaleDateString();
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return value;
|
|
197
|
+
}
|
|
198
|
+
case 'time':
|
|
199
|
+
try {
|
|
200
|
+
return new Date(value).toLocaleTimeString();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return value;
|
|
204
|
+
}
|
|
205
|
+
case 'datetime':
|
|
206
|
+
try {
|
|
207
|
+
return new Date(value).toLocaleString();
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
case 'pluralize': {
|
|
213
|
+
const n = Number(value);
|
|
214
|
+
const word = typeof arg === 'string' ? arg : '';
|
|
215
|
+
return n === 1 ? word : `${word}s`;
|
|
216
|
+
}
|
|
217
|
+
case 'default':
|
|
218
|
+
return value == null || value === '' ? arg : value;
|
|
219
|
+
case 'selectattr':
|
|
220
|
+
return Array.isArray(value) && typeof arg === 'string'
|
|
221
|
+
? value.filter(item => item != null && typeof item === 'object' && Boolean(item[arg]))
|
|
222
|
+
: value;
|
|
223
|
+
case 'rejectattr':
|
|
224
|
+
return Array.isArray(value) && typeof arg === 'string'
|
|
225
|
+
? value.filter(item => {
|
|
226
|
+
if (item == null || typeof item !== 'object')
|
|
227
|
+
return false;
|
|
228
|
+
const attr = item[arg];
|
|
229
|
+
return attr == null || attr === false || attr === 0 || attr === '';
|
|
230
|
+
})
|
|
231
|
+
: value;
|
|
232
|
+
default:
|
|
233
|
+
return value;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
237
|
+
const COMPARISONS = [
|
|
238
|
+
['!==', (a, b) => a !== b],
|
|
239
|
+
['===', (a, b) => a === b],
|
|
240
|
+
['>=', (a, b) => Number(a) >= Number(b)],
|
|
241
|
+
['<=', (a, b) => Number(a) <= Number(b)],
|
|
242
|
+
['>', (a, b) => Number(a) > Number(b)],
|
|
243
|
+
['<', (a, b) => Number(a) < Number(b)],
|
|
244
|
+
];
|
|
245
|
+
const ARITHMETIC = [
|
|
246
|
+
[' + ', (a, b) => a + b],
|
|
247
|
+
[' - ', (a, b) => a - b],
|
|
248
|
+
[' * ', (a, b) => a * b],
|
|
249
|
+
[' / ', (a, b) => b !== 0 ? a / b : 0],
|
|
250
|
+
[' % ', (a, b) => a % b],
|
|
251
|
+
];
|
|
252
|
+
function findArithOp(expr, op) {
|
|
253
|
+
// Find operator not inside quotes
|
|
254
|
+
let inQuote = null;
|
|
255
|
+
for (let i = 0; i < expr.length; i++) {
|
|
256
|
+
const ch = expr[i];
|
|
257
|
+
if (ch === "'" || ch === '"') {
|
|
258
|
+
inQuote = inQuote === ch ? null : (inQuote ?? ch);
|
|
259
|
+
}
|
|
260
|
+
if (!inQuote && expr.slice(i, i + op.length) === op)
|
|
261
|
+
return i;
|
|
262
|
+
}
|
|
263
|
+
return -1;
|
|
264
|
+
}
|
|
265
|
+
function findTernary(expr) {
|
|
266
|
+
let depth = 0;
|
|
267
|
+
let inQuote = null;
|
|
268
|
+
for (let i = 0; i < expr.length; i++) {
|
|
269
|
+
const ch = expr[i];
|
|
270
|
+
if (ch === "'" || ch === '"') {
|
|
271
|
+
inQuote = inQuote === ch ? null : (inQuote ?? ch);
|
|
272
|
+
}
|
|
273
|
+
if (!inQuote) {
|
|
274
|
+
if (ch === '(')
|
|
275
|
+
depth++;
|
|
276
|
+
else if (ch === ')')
|
|
277
|
+
depth--;
|
|
278
|
+
else if (ch === '?' && depth === 0)
|
|
279
|
+
return i;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return -1;
|
|
283
|
+
}
|
|
284
|
+
function findColon(expr) {
|
|
285
|
+
let depth = 0;
|
|
286
|
+
let inQuote = null;
|
|
287
|
+
for (let i = 0; i < expr.length; i++) {
|
|
288
|
+
const ch = expr[i];
|
|
289
|
+
if (ch === "'" || ch === '"') {
|
|
290
|
+
inQuote = inQuote === ch ? null : (inQuote ?? ch);
|
|
291
|
+
}
|
|
292
|
+
if (!inQuote) {
|
|
293
|
+
if (ch === '?' || ch === '(')
|
|
294
|
+
depth++;
|
|
295
|
+
else if (ch === ')')
|
|
296
|
+
depth--;
|
|
297
|
+
else if (ch === ':' && depth === 0)
|
|
298
|
+
return i;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return -1;
|
|
302
|
+
}
|
|
303
|
+
function splitPipes(expr) {
|
|
304
|
+
const parts = [];
|
|
305
|
+
let current = '';
|
|
306
|
+
let inQuote = null;
|
|
307
|
+
for (let i = 0; i < expr.length; i++) {
|
|
308
|
+
const ch = expr[i];
|
|
309
|
+
if (ch === "'" || ch === '"') {
|
|
310
|
+
inQuote = inQuote === ch ? null : (inQuote ?? ch);
|
|
311
|
+
}
|
|
312
|
+
if (ch === '|' && !inQuote) {
|
|
313
|
+
// Skip || (logical OR) — not a pipe
|
|
314
|
+
if (expr[i + 1] === '|') {
|
|
315
|
+
current += '||';
|
|
316
|
+
i++; // consume second |
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
parts.push(current);
|
|
320
|
+
current = '';
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
current += ch;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
parts.push(current);
|
|
328
|
+
return parts;
|
|
329
|
+
}
|
|
330
|
+
function parseLiteral(s) {
|
|
331
|
+
const trimmed = s.replace(/^['"]|['"]$/g, '');
|
|
332
|
+
if (trimmed === 'true')
|
|
333
|
+
return true;
|
|
334
|
+
if (trimmed === 'false')
|
|
335
|
+
return false;
|
|
336
|
+
const n = Number(trimmed);
|
|
337
|
+
return isNaN(n) ? trimmed : n;
|
|
338
|
+
}
|
|
339
|
+
function resolveDeep(obj, path) {
|
|
340
|
+
if (!path)
|
|
341
|
+
return obj;
|
|
342
|
+
const parts = path.split('.');
|
|
343
|
+
let current = obj;
|
|
344
|
+
for (const part of parts) {
|
|
345
|
+
if (current == null || typeof current !== 'object')
|
|
346
|
+
return undefined;
|
|
347
|
+
current = current[part];
|
|
348
|
+
}
|
|
349
|
+
return current;
|
|
350
|
+
}
|
|
351
|
+
function countOccurrences(s, sub) {
|
|
352
|
+
let count = 0;
|
|
353
|
+
let idx = 0;
|
|
354
|
+
while ((idx = s.indexOf(sub, idx)) !== -1) {
|
|
355
|
+
count++;
|
|
356
|
+
idx += sub.length;
|
|
357
|
+
}
|
|
358
|
+
return count;
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=rx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rx.js","sourceRoot":"","sources":["../../src/renderer/rx.ts"],"names":[],"mappings":"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"}
|