@pebble-software/bonsai 0.2.1 → 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 +47 -5
- package/dist/ast.js +1 -1
- package/dist/chunks/{builder.meta-B7Y9M7Ab.js → builder.meta-DKq-ggkn.js} +3 -3
- package/dist/chunks/{builder.meta-B7Y9M7Ab.js.map → builder.meta-DKq-ggkn.js.map} +1 -1
- package/dist/chunks/class-names-CoKRVvWM.js +66 -0
- package/dist/chunks/class-names-CoKRVvWM.js.map +1 -0
- package/dist/chunks/{create-renderer-C4nV9RV6.js → create-renderer-CSFyNcqr.js} +55 -55
- package/dist/chunks/create-renderer-CSFyNcqr.js.map +1 -0
- package/dist/chunks/{index-CD5pykpk.js → index-df-PhUtD.js} +2 -2
- package/dist/chunks/{index-CD5pykpk.js.map → index-df-PhUtD.js.map} +1 -1
- package/dist/chunks/{render-shared-Cwb527d4.js → render-shared-DSYQFhTh.js} +3 -3
- package/dist/chunks/render-shared-DSYQFhTh.js.map +1 -0
- package/dist/classes.d.ts +51 -0
- package/dist/classes.js +27 -0
- package/dist/classes.js.map +1 -0
- package/dist/classes.json +1 -0
- package/dist/components/ui/signature-pad.d.ts +2 -2
- package/dist/constants.js +7 -2
- package/dist/constants.js.map +1 -1
- package/dist/core.js +3 -3
- package/dist/css.d.ts +42 -0
- package/dist/css.js +7483 -0
- package/dist/css.js.map +1 -0
- package/dist/index.js +120 -110
- package/dist/index.js.map +1 -1
- package/dist/lib/ast/class-names.d.ts +28 -0
- package/dist/library/constants/src/components.d.ts +1 -0
- package/dist/presets/signature.js +2 -2
- package/dist/presets/signature.js.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/styles/presets.json +2 -1
- package/package.json +13 -1
- package/dist/chunks/create-renderer-C4nV9RV6.js.map +0 -1
- package/dist/chunks/render-shared-Cwb527d4.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-names-CoKRVvWM.js","sources":["../../src/lib/ast/class-names.ts"],"sourcesContent":["import { compileExpression } from \"./index\";\nimport type { ASTNode, KnownNode } from \"./types\";\n\n// Past this many possible results an expression is reported rather than enumerated.\nconst MAX_OUTCOMES = 1024;\n\nconst tokens = (value: string) => value.split(/\\s+/).filter(Boolean);\n\nfunction union(a: string[] | null, b: string[] | null): string[] | null {\n return a && b ? [...new Set([...a, ...b])] : null;\n}\n\nfunction product(a: string[] | null, b: string[] | null): string[] | null {\n if (!a || !b || a.length * b.length > MAX_OUTCOMES) return null;\n return [...new Set(a.flatMap((left) => b.map((right) => left + right)))];\n}\n\n/**\n * Every string an expression can evaluate to, or null when a result can come\n * from data or a computation instead of a literal. Only result positions are\n * constrained: a ternary's test, or the left side of `&&`, may read anything.\n * Each literal reached is pushed onto `written`.\n */\nfunction outcomes(node: ASTNode, written: string[]): string[] | null {\n const n = node as KnownNode;\n switch (n.type) {\n case \"Literal\": {\n // `null` / booleans render no class; a number renders as its digits.\n const value =\n n.value == null || typeof n.value === \"boolean\" ? \"\" : String(n.value);\n written.push(value);\n return [value];\n }\n\n case \"ConditionalExpression\":\n return union(\n outcomes(n.consequent, written),\n outcomes(n.alternate, written),\n );\n\n case \"BinaryExpression\":\n switch (n.operator) {\n // A falsy left side renders no class, so only the right side is a result.\n case \"&&\":\n return union([\"\"], outcomes(n.right, written));\n case \"||\":\n case \"??\":\n return union(outcomes(n.left, written), outcomes(n.right, written));\n case \"+\":\n return product(outcomes(n.left, written), outcomes(n.right, written));\n default:\n return null;\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Whether an arg takes classes: `className` itself, or a name ending in\n * `ClassName` for a part of the component (`containerClassName`). Validation\n * and the class manifest's template scan both find class props by this name\n * alone, so a prop named any other way is neither checked nor styled.\n */\nexport function isClassNameProp(name: string): boolean {\n return name === \"className\" || name.endsWith(\"ClassName\");\n}\n\nexport interface ClassNameAnalysis {\n /**\n * Every class written whole in the value: a plain string's classes, or the\n * classes inside an expression's string literals.\n */\n classes: string[];\n /** Why the value can render a class missing from `classes`, or null when it can't. */\n issue: string | null;\n}\n\n/**\n * What a class prop's value can render, read from its source text alone.\n *\n * Template stylesheets are compiled from the template JSON plus the component\n * class manifest, without rendering. That covers an expression only when every\n * class it can produce is written whole inside one of its string literals:\n * `{{ x ? 'bg-red-500' : 'p-2' }}` and `{{ 'p-4 ' + (x ? 'shadow-md' : '') }}`\n * are fine, `{{ 'bg-' + color }}` and `{{ 'bg-' + (x ? 'red-500' : 'blue-500') }}`\n * are not. Plain strings always pass; an expression that fails to parse is left\n * for the render to report.\n */\nexport function analyzeClassName(value: unknown): ClassNameAnalysis {\n if (typeof value !== \"string\") return { classes: [], issue: null };\n\n const expression = compileExpression(value);\n if (!expression) return { classes: tokens(value), issue: null };\n if (!expression.ast) return { classes: [], issue: null };\n\n const written: string[] = [];\n const results = outcomes(expression.ast, written);\n const classes = [...new Set(written.flatMap(tokens))];\n if (!results) {\n return {\n classes,\n issue:\n \"must evaluate to classes written in string literals (e.g. a ternary between class strings), not to data or a computed value\",\n };\n }\n\n const whole = new Set(classes);\n for (const result of results) {\n for (const token of tokens(result)) {\n if (!whole.has(token)) {\n return {\n classes,\n issue: `builds \"${token}\" by joining strings; write each class whole inside one string literal`,\n };\n }\n }\n }\n return { classes, issue: null };\n}\n"],"names":["MAX_OUTCOMES","tokens","value","union","a","b","product","left","right","outcomes","node","written","isClassNameProp","name","analyzeClassName","expression","compileExpression","results","classes","whole","result","token"],"mappings":";AAIA,MAAMA,IAAe,MAEfC,IAAS,CAACC,MAAkBA,EAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAEnE,SAASC,EAAMC,GAAoBC,GAAqC;AACtE,SAAOD,KAAKC,IAAI,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAGD,GAAG,GAAGC,CAAC,CAAC,CAAC,IAAI;AAC/C;AAEA,SAASC,EAAQF,GAAoBC,GAAqC;AACxE,SAAI,CAACD,KAAK,CAACC,KAAKD,EAAE,SAASC,EAAE,SAASL,IAAqB,OACpD,CAAC,GAAG,IAAI,IAAII,EAAE,QAAQ,CAACG,MAASF,EAAE,IAAI,CAACG,MAAUD,IAAOC,CAAK,CAAC,CAAC,CAAC;AACzE;AAQA,SAASC,EAASC,GAAeC,GAAoC;AACnE,QAAM,IAAID;AACV,UAAQ,EAAE,MAAA;AAAA,IACR,KAAK,WAAW;AAEd,YAAMR,IACJ,EAAE,SAAS,QAAQ,OAAO,EAAE,SAAU,YAAY,KAAK,OAAO,EAAE,KAAK;AACvE,aAAAS,EAAQ,KAAKT,CAAK,GACX,CAACA,CAAK;AAAA,IACf;AAAA,IAEA,KAAK;AACH,aAAOC;AAAA,QACLM,EAAS,EAAE,YAAYE,CAAO;AAAA,QAC9BF,EAAS,EAAE,WAAWE,CAAO;AAAA,MAAA;AAAA,IAGjC,KAAK;AACH,cAAQ,EAAE,UAAA;AAAA;AAAA,QAER,KAAK;AACH,iBAAOR,EAAM,CAAC,EAAE,GAAGM,EAAS,EAAE,OAAOE,CAAO,CAAC;AAAA,QAC/C,KAAK;AAAA,QACL,KAAK;AACH,iBAAOR,EAAMM,EAAS,EAAE,MAAME,CAAO,GAAGF,EAAS,EAAE,OAAOE,CAAO,CAAC;AAAA,QACpE,KAAK;AACH,iBAAOL,EAAQG,EAAS,EAAE,MAAME,CAAO,GAAGF,EAAS,EAAE,OAAOE,CAAO,CAAC;AAAA,QACtE;AACE,iBAAO;AAAA,MAAA;AAAA,IAGb;AACE,aAAO;AAAA,EAAA;AAEb;AAQO,SAASC,EAAgBC,GAAuB;AACrD,SAAOA,MAAS,eAAeA,EAAK,SAAS,WAAW;AAC1D;AAuBO,SAASC,EAAiBZ,GAAmC;AAClE,MAAI,OAAOA,KAAU,SAAU,QAAO,EAAE,SAAS,CAAA,GAAI,OAAO,KAAA;AAE5D,QAAMa,IAAaC,EAAkBd,CAAK;AAC1C,MAAI,CAACa,EAAY,QAAO,EAAE,SAASd,EAAOC,CAAK,GAAG,OAAO,KAAA;AACzD,MAAI,CAACa,EAAW,IAAK,QAAO,EAAE,SAAS,CAAA,GAAI,OAAO,KAAA;AAElD,QAAMJ,IAAoB,CAAA,GACpBM,IAAUR,EAASM,EAAW,KAAKJ,CAAO,GAC1CO,IAAU,CAAC,GAAG,IAAI,IAAIP,EAAQ,QAAQV,CAAM,CAAC,CAAC;AACpD,MAAI,CAACgB;AACH,WAAO;AAAA,MACL,SAAAC;AAAA,MACA,OACE;AAAA,IAAA;AAIN,QAAMC,IAAQ,IAAI,IAAID,CAAO;AAC7B,aAAWE,KAAUH;AACnB,eAAWI,KAASpB,EAAOmB,CAAM;AAC/B,UAAI,CAACD,EAAM,IAAIE,CAAK;AAClB,eAAO;AAAA,UACL,SAAAH;AAAA,UACA,OAAO,WAAWG,CAAK;AAAA,QAAA;AAK/B,SAAO,EAAE,SAAAH,GAAS,OAAO,KAAA;AAC3B;"}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { jsx as d } from "react/jsx-runtime";
|
|
2
2
|
import { createElement as y, memo as h, useCallback as N, useState as j, useRef as B, useEffectEvent as L, useLayoutEffect as M, useEffect as P, createContext as W, useContext as A } from "react";
|
|
3
|
-
import { i as T, B as O, r as b, j as S, k as V, l as D, m, n as
|
|
3
|
+
import { i as T, B as O, r as b, j as S, k as V, l as D, m, n as R, o as q, p as $, q as J, V as z, s as F, t as G, v as H, f as Q, b as U, w as X } from "./render-shared-DSYQFhTh.js";
|
|
4
4
|
import { proxy as Y, snapshot as v, subscribe as Z, useSnapshot as k } from "valtio";
|
|
5
5
|
const tt = {
|
|
6
6
|
dataSlice(t, e, r) {
|
|
7
7
|
return D(t.dynamicKeys, (n) => n in r && n !== "data" ? r[n] : m(r.data ?? r, n));
|
|
8
8
|
},
|
|
9
|
-
rowCtx(t, e, r, n,
|
|
10
|
-
const { as: a, indexAlias: i } =
|
|
9
|
+
rowCtx(t, e, r, n, o, s) {
|
|
10
|
+
const { as: a, indexAlias: i } = o, c = {
|
|
11
11
|
...e,
|
|
12
12
|
data: {
|
|
13
13
|
...e.data ?? e,
|
|
14
14
|
[a]: r,
|
|
15
15
|
...i ? { [i]: n } : {}
|
|
16
16
|
}
|
|
17
|
-
}, u =
|
|
17
|
+
}, u = s ? { ...t.scope, [a]: `${s}.${n}` } : t.scope;
|
|
18
18
|
return { data: c, scope: u };
|
|
19
19
|
},
|
|
20
|
-
renderChild(t, e, r, n,
|
|
20
|
+
renderChild(t, e, r, n, o) {
|
|
21
21
|
return /* @__PURE__ */ d(
|
|
22
22
|
K,
|
|
23
23
|
{
|
|
@@ -27,20 +27,20 @@ const tt = {
|
|
|
27
27
|
data: n.data,
|
|
28
28
|
scope: n.scope
|
|
29
29
|
},
|
|
30
|
-
|
|
30
|
+
o
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
33
|
}, K = h(
|
|
34
|
-
({ node: t, index: e = 0, path: r = "root", data: n, scope:
|
|
35
|
-
const
|
|
34
|
+
({ node: t, index: e = 0, path: r = "root", data: n, scope: o }) => {
|
|
35
|
+
const s = S(), a = N(() => {
|
|
36
36
|
}, []);
|
|
37
37
|
return V(
|
|
38
38
|
t,
|
|
39
39
|
e,
|
|
40
40
|
r,
|
|
41
|
-
{ data: n, scope:
|
|
41
|
+
{ data: n, scope: o },
|
|
42
42
|
n,
|
|
43
|
-
|
|
43
|
+
s,
|
|
44
44
|
a,
|
|
45
45
|
tt
|
|
46
46
|
);
|
|
@@ -51,8 +51,8 @@ function et({
|
|
|
51
51
|
expiry: e,
|
|
52
52
|
data: r,
|
|
53
53
|
status: n = "pending",
|
|
54
|
-
render:
|
|
55
|
-
as:
|
|
54
|
+
render: o = "web",
|
|
55
|
+
as: s,
|
|
56
56
|
registry: a
|
|
57
57
|
}) {
|
|
58
58
|
const i = {
|
|
@@ -60,12 +60,12 @@ function et({
|
|
|
60
60
|
expiry: e ?? "",
|
|
61
61
|
status: n,
|
|
62
62
|
submitting: !1
|
|
63
|
-
}, c = T(t).root, u = b(
|
|
64
|
-
return /* @__PURE__ */ d(O, { registry: a, render:
|
|
63
|
+
}, c = T(t).root, u = b(o, s);
|
|
64
|
+
return /* @__PURE__ */ d(O, { registry: a, render: o, children: y(
|
|
65
65
|
u,
|
|
66
66
|
{
|
|
67
|
-
"data-mode":
|
|
68
|
-
className:
|
|
67
|
+
"data-mode": o,
|
|
68
|
+
className: o === "pdf" ? "group bonsai-root w-full" : "group bonsai-root"
|
|
69
69
|
},
|
|
70
70
|
/* @__PURE__ */ d(K, { node: c, index: 0, path: "root", data: i })
|
|
71
71
|
) });
|
|
@@ -84,18 +84,18 @@ function rt() {
|
|
|
84
84
|
[t]
|
|
85
85
|
);
|
|
86
86
|
}
|
|
87
|
-
function nt(t, e, r, n,
|
|
88
|
-
const
|
|
89
|
-
return n &&
|
|
87
|
+
function nt(t, e, r, n, o) {
|
|
88
|
+
const s = G(t);
|
|
89
|
+
return n && s in n ? t === s ? n[s] : void 0 : r && s in r ? m(e.data ?? e, H(t, r)) : o && Object.hasOwn(o, s) ? m(o, t) : t in e && t !== "data" ? e[t] : m(e.data ?? e, t);
|
|
90
90
|
}
|
|
91
|
-
const
|
|
92
|
-
({ node: t, index: e = 0, path: r = "root", scope: n, indexScope:
|
|
91
|
+
const ot = h(
|
|
92
|
+
({ node: t, index: e = 0, path: r = "root", scope: n, indexScope: o, valueScope: s }) => {
|
|
93
93
|
const a = S(), i = t.source;
|
|
94
94
|
if (!i) return null;
|
|
95
95
|
if (t.isText)
|
|
96
96
|
return i;
|
|
97
97
|
try {
|
|
98
|
-
const c = t.type, u = q(a, c), p =
|
|
98
|
+
const c = t.type, u = q(a, c), p = $(t, e, r), l = J(t, {}, p);
|
|
99
99
|
if (t.isImage && (l.src === "" || l.src == null))
|
|
100
100
|
return null;
|
|
101
101
|
const f = t.children.length > 0 ? t.children.map(
|
|
@@ -104,9 +104,9 @@ const st = h(
|
|
|
104
104
|
E,
|
|
105
105
|
`${r}-${e}`,
|
|
106
106
|
n,
|
|
107
|
-
s,
|
|
108
107
|
o,
|
|
109
|
-
|
|
108
|
+
s,
|
|
109
|
+
$(t, E, `${r}-${e}`)
|
|
110
110
|
)
|
|
111
111
|
) : void 0, C = typeof u == "string" && z.has(u) ? void 0 : f;
|
|
112
112
|
return C !== void 0 ? y(u, l, C) : y(u, l);
|
|
@@ -115,16 +115,16 @@ const st = h(
|
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
);
|
|
118
|
-
function g(t, e, r, n,
|
|
118
|
+
function g(t, e, r, n, o, s, a) {
|
|
119
119
|
return t.isStatic ? /* @__PURE__ */ d(
|
|
120
|
-
|
|
120
|
+
ot,
|
|
121
121
|
{
|
|
122
122
|
node: t,
|
|
123
123
|
index: e,
|
|
124
124
|
path: r,
|
|
125
125
|
scope: n,
|
|
126
|
-
indexScope:
|
|
127
|
-
valueScope:
|
|
126
|
+
indexScope: o,
|
|
127
|
+
valueScope: s
|
|
128
128
|
},
|
|
129
129
|
a
|
|
130
130
|
) : /* @__PURE__ */ d(
|
|
@@ -134,8 +134,8 @@ function g(t, e, r, n, s, o, a) {
|
|
|
134
134
|
index: e,
|
|
135
135
|
path: r,
|
|
136
136
|
scope: n,
|
|
137
|
-
indexScope:
|
|
138
|
-
valueScope:
|
|
137
|
+
indexScope: o,
|
|
138
|
+
valueScope: s
|
|
139
139
|
},
|
|
140
140
|
a
|
|
141
141
|
);
|
|
@@ -145,17 +145,17 @@ function x(t, e) {
|
|
|
145
145
|
const r = { ...t };
|
|
146
146
|
return delete r[e], r;
|
|
147
147
|
}
|
|
148
|
-
const
|
|
148
|
+
const st = {
|
|
149
149
|
dataSlice(t, e, r) {
|
|
150
150
|
return D(
|
|
151
151
|
t.dynamicKeys,
|
|
152
152
|
(n) => nt(n, r, e.scope, e.indexScope, e.valueScope)
|
|
153
153
|
);
|
|
154
154
|
},
|
|
155
|
-
rowCtx(t, e, r, n,
|
|
156
|
-
const { as: a, indexAlias: i } =
|
|
157
|
-
return
|
|
158
|
-
scope: { ...t.scope, [a]: `${
|
|
155
|
+
rowCtx(t, e, r, n, o, s) {
|
|
156
|
+
const { as: a, indexAlias: i } = o, c = i ? { ...t.indexScope, [i]: n } : t.indexScope;
|
|
157
|
+
return s ? {
|
|
158
|
+
scope: { ...t.scope, [a]: `${s}.${n}` },
|
|
159
159
|
indexScope: c,
|
|
160
160
|
valueScope: x(t.valueScope, a)
|
|
161
161
|
} : {
|
|
@@ -164,21 +164,21 @@ const ot = {
|
|
|
164
164
|
valueScope: { ...t.valueScope, [a]: r }
|
|
165
165
|
};
|
|
166
166
|
},
|
|
167
|
-
renderChild(t, e, r, n,
|
|
168
|
-
return g(t, e, r, n.scope, n.indexScope, n.valueScope,
|
|
167
|
+
renderChild(t, e, r, n, o) {
|
|
168
|
+
return g(t, e, r, n.scope, n.indexScope, n.valueScope, o);
|
|
169
169
|
}
|
|
170
170
|
}, at = h(
|
|
171
|
-
({ node: t, index: e = 0, path: r = "root", scope: n, indexScope:
|
|
171
|
+
({ node: t, index: e = 0, path: r = "root", scope: n, indexScope: o, valueScope: s }) => {
|
|
172
172
|
const a = S(), i = w(), c = k(i, { sync: !0 }), u = rt();
|
|
173
173
|
return V(
|
|
174
174
|
t,
|
|
175
175
|
e,
|
|
176
176
|
r,
|
|
177
|
-
{ scope: n, indexScope:
|
|
177
|
+
{ scope: n, indexScope: o, valueScope: s },
|
|
178
178
|
c,
|
|
179
179
|
a,
|
|
180
180
|
u,
|
|
181
|
-
|
|
181
|
+
st
|
|
182
182
|
);
|
|
183
183
|
}
|
|
184
184
|
);
|
|
@@ -187,16 +187,16 @@ function it({
|
|
|
187
187
|
template: e,
|
|
188
188
|
render: r = "web",
|
|
189
189
|
as: n,
|
|
190
|
-
onSubmit:
|
|
191
|
-
onError:
|
|
190
|
+
onSubmit: o,
|
|
191
|
+
onError: s,
|
|
192
192
|
registry: a
|
|
193
193
|
}) {
|
|
194
194
|
const i = w(), c = async (l) => {
|
|
195
|
-
if (l.preventDefault(), i.status === "pending" && !(!
|
|
195
|
+
if (l.preventDefault(), i.status === "pending" && !(!o && !t)) {
|
|
196
196
|
i.submitting = !0;
|
|
197
197
|
try {
|
|
198
|
-
if (
|
|
199
|
-
await
|
|
198
|
+
if (o)
|
|
199
|
+
await o(v(i.data));
|
|
200
200
|
else {
|
|
201
201
|
const f = await fetch(t, {
|
|
202
202
|
method: "POST",
|
|
@@ -213,8 +213,8 @@ function it({
|
|
|
213
213
|
}
|
|
214
214
|
i.status = "captured";
|
|
215
215
|
} catch (f) {
|
|
216
|
-
if (!
|
|
217
|
-
|
|
216
|
+
if (!s) throw f;
|
|
217
|
+
s(f);
|
|
218
218
|
} finally {
|
|
219
219
|
i.submitting = !1;
|
|
220
220
|
}
|
|
@@ -224,7 +224,7 @@ function it({
|
|
|
224
224
|
p,
|
|
225
225
|
{
|
|
226
226
|
"data-mode": r,
|
|
227
|
-
className:
|
|
227
|
+
className: r === "pdf" ? "group bonsai-root w-full" : "group bonsai-root",
|
|
228
228
|
...p === "form" ? { onSubmit: c } : {}
|
|
229
229
|
},
|
|
230
230
|
g(u, 0, "root", void 0, void 0, void 0, "root-0")
|
|
@@ -235,28 +235,28 @@ function ct(t) {
|
|
|
235
235
|
() => Y({
|
|
236
236
|
status: t.status ?? "pending",
|
|
237
237
|
expiry: t.expiry ?? "",
|
|
238
|
-
data:
|
|
238
|
+
data: R(t.data ?? {}),
|
|
239
239
|
submitting: !1
|
|
240
240
|
})
|
|
241
|
-
), r = B(t.data), n = B(!1),
|
|
242
|
-
t.onDataChange?.(
|
|
241
|
+
), r = B(t.data), n = B(!1), o = L((s) => {
|
|
242
|
+
t.onDataChange?.(s);
|
|
243
243
|
});
|
|
244
244
|
return M(() => {
|
|
245
245
|
if (!Object.is(r.current, t.data)) {
|
|
246
246
|
r.current = t.data, n.current = !0;
|
|
247
247
|
try {
|
|
248
|
-
e.data =
|
|
248
|
+
e.data = R(t.data ?? {});
|
|
249
249
|
} finally {
|
|
250
250
|
n.current = !1;
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
}, [e, t.data]), P(() => {
|
|
254
|
-
let
|
|
254
|
+
let s = v(e.data);
|
|
255
255
|
return Z(
|
|
256
256
|
e,
|
|
257
257
|
() => {
|
|
258
258
|
const a = v(e.data);
|
|
259
|
-
a !==
|
|
259
|
+
a !== s && (s = a, !n.current && o(a));
|
|
260
260
|
},
|
|
261
261
|
!0
|
|
262
262
|
);
|
|
@@ -279,4 +279,4 @@ export {
|
|
|
279
279
|
mt as c,
|
|
280
280
|
rt as u
|
|
281
281
|
};
|
|
282
|
-
//# sourceMappingURL=create-renderer-
|
|
282
|
+
//# sourceMappingURL=create-renderer-CSFyNcqr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-renderer-CSFyNcqr.js","sources":["../../src/components/core/render-tree-server.tsx","../../src/components/core/render-tree-client.tsx","../../src/components/core/bonsai.tsx","../../src/renderer/create-renderer.tsx"],"sourcesContent":["import { createElement, memo, useCallback } from \"react\";\nimport { type CompiledNode } from \"../../lib/renderer/compile-template\";\nimport { compileTemplate } from \"../../lib/renderer/compile-template\";\nimport {\n BonsaiRoot,\n useBonsaiRegistry,\n buildDataSlice,\n getValue,\n resolveWrapper,\n renderCompiledNode,\n type GlobalData,\n type NodeCtx,\n type RenderStrategy,\n type BonsaiProps,\n} from \"./render-shared\";\n\ninterface RenderTreeServerProps {\n // Precompiled metadata for this node; `node.source` is the raw template node.\n node: CompiledNode;\n index?: number;\n path?: string;\n data: GlobalData;\n // Alias -> real store path prefix set by an ancestor `each` (e.g. { applicant: \"applicants.3\" }); SSR-only.\n scope?: Record<string, string>;\n}\n\n// SSR ctx is the prop-drilled global data object plus the current `each` scope.\ninterface ServerCtx extends NodeCtx {\n data: GlobalData;\n}\n\nconst SERVER_MODE: RenderStrategy<ServerCtx> = {\n dataSlice(node, _ctx, globalData) {\n return buildDataSlice(node.dynamicKeys, (key) => {\n if (key in globalData && key !== \"data\") return globalData[key];\n return getValue(globalData.data ?? globalData, key);\n });\n },\n rowCtx(ctx, globalData, item, i, each, realItemsPath) {\n const { as, indexAlias } = each;\n const rowData = {\n ...globalData,\n data: {\n ...(globalData.data ?? globalData),\n [as]: item,\n ...(indexAlias ? { [indexAlias]: i } : {}),\n },\n };\n const rowScope = realItemsPath\n ? { ...ctx.scope, [as]: `${realItemsPath}.${i}` }\n : ctx.scope;\n return { data: rowData, scope: rowScope };\n },\n renderChild(child, i, path, ctx, key) {\n return (\n <RenderTreeServer\n key={key}\n node={child}\n index={i}\n path={path}\n data={ctx.data}\n scope={ctx.scope}\n />\n );\n },\n};\n\n// SSR: single-pass render over a plain, prop-drilled object — no store, no snapshots.\nconst RenderTreeServer = memo(\n ({ node, index = 0, path = \"root\", data, scope }: RenderTreeServerProps) => {\n const registry = useBonsaiRegistry();\n const updateData = useCallback(() => {\n // Attached for the controlled-component contract but never invoked during SSR.\n }, []);\n\n return renderCompiledNode(\n node,\n index,\n path,\n { data, scope },\n data,\n registry,\n updateData,\n SERVER_MODE,\n );\n },\n);\n\nexport function BonsaiServer({\n template,\n expiry,\n data,\n status = \"pending\",\n render = \"web\",\n as,\n registry,\n}: BonsaiProps) {\n const ctx = {\n data: data ?? {},\n expiry: expiry ?? \"\",\n status,\n submitting: false,\n };\n\n // Cached by template identity, so N instances of the same template compile once.\n const root = compileTemplate(template).root;\n const Wrapper = resolveWrapper(render, as);\n\n return (\n <BonsaiRoot registry={registry} render={render}>\n {createElement(\n Wrapper,\n {\n \"data-mode\": render,\n className:\n render === \"pdf\" ? \"group bonsai-root w-full\" : \"group bonsai-root\",\n },\n <RenderTreeServer node={root} index={0} path=\"root\" data={ctx} />,\n )}\n </BonsaiRoot>\n );\n}\n","import {\n createContext,\n createElement,\n memo,\n useCallback,\n useContext,\n useEffect,\n useEffectEvent,\n useLayoutEffect,\n useRef,\n useState,\n type SubmitEvent,\n} from \"react\";\nimport { proxy, snapshot, subscribe, useSnapshot } from \"valtio\";\nimport { type CompiledNode } from \"../../lib/renderer/compile-template\";\nimport { compileTemplate } from \"../../lib/renderer/compile-template\";\nimport {\n BonsaiRoot,\n useBonsaiRegistry,\n VOID_ELEMENTS,\n getKey,\n getValue,\n setValue,\n resolveScopedPath,\n pathRoot,\n buildDataSlice,\n resolveElementType,\n prepareState,\n resolveWrapper,\n cloneData,\n renderCompiledNode,\n type GlobalData,\n type NodeCtx,\n type RenderStrategy,\n type BonsaiProps,\n} from \"./render-shared\";\n\n// scope/indexScope/valueScope are the only things an `each` row hands its children on the live path —\n// store data is never prop-drilled (valueScope carries only computed-row items, which have no store path).\ninterface RenderTreeClientProps {\n node: CompiledNode;\n index?: number;\n path?: string;\n scope?: Record<string, string>;\n indexScope?: Record<string, number>;\n valueScope?: Record<string, unknown>;\n}\n\ntype BonsaiState = {\n status: string;\n expiry: string;\n data: Record<string, unknown>;\n submitting: boolean;\n};\n\nconst BonsaiContext = createContext<ReturnType<\n typeof proxy<BonsaiState>\n> | null>(null);\n\nfunction useBonsaiStore(): ReturnType<typeof proxy<BonsaiState>> {\n const store = useContext(BonsaiContext);\n if (!store) {\n throw new Error(\"useBonsaiStore must be used within a <Bonsai> component\");\n }\n return store;\n}\n\nexport function useUpdateData() {\n const store = useBonsaiStore();\n return useCallback(\n (path: string, value: unknown) => setValue(store.data, path, value),\n [store],\n );\n}\n\n// Live-path lookup: resolves each-scoped aliases at read time against a fresh snapshot.\nfunction resolveKeyValue(\n key: string,\n globalData: GlobalData,\n scope: Record<string, string> | undefined,\n indexScope: Record<string, number> | undefined,\n valueScope: Record<string, unknown> | undefined,\n): unknown {\n const root = pathRoot(key);\n\n if (indexScope && root in indexScope) {\n return key === root ? indexScope[root] : undefined;\n }\n\n if (scope && root in scope) {\n return getValue(globalData.data ?? globalData, resolveScopedPath(key, scope));\n }\n\n if (valueScope && Object.hasOwn(valueScope, root)) {\n return getValue(valueScope, key);\n }\n\n if (key in globalData && key !== \"data\") {\n return globalData[key];\n }\n\n return getValue(globalData.data ?? globalData, key);\n}\n\n// Children still go through `renderClientNode`, so a binding nested inside an unbound wrapper stays reactive.\nconst StaticNode = memo(\n ({ node, index = 0, path = \"root\", scope, indexScope, valueScope }: RenderTreeClientProps) => {\n const registry = useBonsaiRegistry();\n const tree = node.source;\n\n if (!tree) return null;\n if (node.isText) {\n // `isStatic` guarantees this has no `{{...}}` binding to evaluate.\n return tree as unknown as string;\n }\n\n try {\n const type = node.type;\n const ElementType = resolveElementType(registry, type);\n const key = getKey(node, index, path);\n const props = prepareState(node, {}, key);\n\n if (node.isImage && (props.src === \"\" || props.src == null)) {\n return null;\n }\n\n const childNodes =\n node.children.length > 0\n ? node.children.map((branch: CompiledNode, i: number) =>\n renderClientNode(\n branch,\n i,\n `${path}-${index}`,\n scope,\n indexScope,\n valueScope,\n getKey(node, i, `${path}-${index}`),\n ),\n )\n : undefined;\n\n const safeChildNodes =\n typeof ElementType === \"string\" && VOID_ELEMENTS.has(ElementType)\n ? undefined\n : childNodes;\n\n if (safeChildNodes !== undefined) {\n return createElement(ElementType, props, safeChildNodes);\n }\n return createElement(ElementType, props);\n } catch (error) {\n console.error(`Error at ${path}-${index}:`, error);\n return null;\n }\n },\n);\n\n// A plain function, not a hook, since it decides which component type to mount — always a safe conditional.\nfunction renderClientNode(\n node: CompiledNode,\n index: number,\n path: string,\n scope: Record<string, string> | undefined,\n indexScope: Record<string, number> | undefined,\n valueScope: Record<string, unknown> | undefined,\n key: string,\n): React.ReactNode {\n return node.isStatic ? (\n <StaticNode\n key={key}\n node={node}\n index={index}\n path={path}\n scope={scope}\n indexScope={indexScope}\n valueScope={valueScope}\n />\n ) : (\n <RenderTreeClient\n key={key}\n node={node}\n index={index}\n path={path}\n scope={scope}\n indexScope={indexScope}\n valueScope={valueScope}\n />\n );\n}\n\n// Client ctx carries only what an `each` row hands its children on this path — no data is prop-drilled.\ninterface ClientCtx extends NodeCtx {\n indexScope?: Record<string, number>;\n}\n\nfunction omitKey<T>(\n obj: Record<string, T> | undefined,\n key: string,\n): Record<string, T> | undefined {\n if (!obj || !Object.hasOwn(obj, key)) return obj;\n const rest = { ...obj };\n delete rest[key];\n return rest;\n}\n\nconst CLIENT_MODE: RenderStrategy<ClientCtx> = {\n dataSlice(node, ctx, globalData) {\n return buildDataSlice(node.dynamicKeys, (key) =>\n resolveKeyValue(key, globalData, ctx.scope, ctx.indexScope, ctx.valueScope),\n );\n },\n rowCtx(ctx, _globalData, item, i, each, realItemsPath) {\n const { as, indexAlias } = each;\n const rowIndexScope = indexAlias\n ? { ...ctx.indexScope, [indexAlias]: i }\n : ctx.indexScope;\n // A plain-path row resolves its alias against the store; a computed row has no store path, so it\n // carries the item itself. Each clears the alias from the other map so an inner alias shadows an outer one.\n if (realItemsPath) {\n return {\n scope: { ...ctx.scope, [as]: `${realItemsPath}.${i}` },\n indexScope: rowIndexScope,\n valueScope: omitKey(ctx.valueScope, as),\n };\n }\n return {\n scope: omitKey(ctx.scope, as),\n indexScope: rowIndexScope,\n valueScope: { ...ctx.valueScope, [as]: item },\n };\n },\n renderChild(child, i, path, ctx, key) {\n return renderClientNode(child, i, path, ctx.scope, ctx.indexScope, ctx.valueScope, key);\n },\n};\n\n// Client: every node calls useSnapshot itself, so it only re-renders when a path it actually reads changes.\nconst RenderTreeClient = memo(\n ({ node, index = 0, path = \"root\", scope, indexScope, valueScope }: RenderTreeClientProps) => {\n const registry = useBonsaiRegistry();\n const store = useBonsaiStore();\n // sync: true keeps the store write and its re-render in the same event, avoiding a one-tick display lag.\n const globalData = useSnapshot(store, { sync: true });\n const updateData = useUpdateData();\n\n return renderCompiledNode(\n node,\n index,\n path,\n { scope, indexScope, valueScope },\n globalData,\n registry,\n updateData,\n CLIENT_MODE,\n );\n },\n);\n\nexport function BonsaiClient({\n captureUrl,\n template,\n render = \"web\",\n as,\n onSubmit,\n onError,\n registry,\n}: BonsaiProps) {\n const store = useBonsaiStore();\n\n const submit = async (e: SubmitEvent) => {\n e.preventDefault();\n // Already captured/completed/revoked: nothing to send, and the lifecycle flags stay as they are.\n if (store.status !== \"pending\") return;\n // Display-only instance: nothing to submit to, so don't touch the lifecycle.\n if (!onSubmit && !captureUrl) return;\n\n // eslint-disable-next-line react-hooks/immutability -- the store is a valtio proxy, mutated by design\n store.submitting = true;\n try {\n if (onSubmit) {\n await onSubmit(snapshot(store.data) as Record<string, unknown>);\n } else {\n const res = await fetch(captureUrl!, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n data: store.data,\n }),\n });\n // fetch only rejects on network failure; an error status must not count as captured.\n if (!res.ok) {\n throw new Error(`Capture failed: ${res.status} ${res.statusText}`.trim());\n }\n }\n\n store.status = \"captured\";\n } catch (error) {\n // Without an `onError`, this keeps the pre-existing behaviour of letting\n // the failure propagate out of the submit handler.\n if (!onError) throw error;\n onError(error);\n } finally {\n store.submitting = false;\n }\n };\n\n // Cached by template identity, so N instances of the same template compile once.\n const root = compileTemplate(template).root;\n const Wrapper = resolveWrapper(render, as);\n\n return (\n <BonsaiRoot registry={registry} render={render}>\n {createElement(\n Wrapper,\n {\n \"data-mode\": render,\n className:\n render === \"pdf\" ? \"group bonsai-root w-full\" : \"group bonsai-root\",\n ...(Wrapper === \"form\" ? { onSubmit: submit } : {}),\n },\n renderClientNode(root, 0, \"root\", undefined, undefined, undefined, \"root-0\"),\n )}\n </BonsaiRoot>\n );\n}\n\nexport function BonsaiProvider(props: BonsaiProps) {\n const [store] = useState(() =>\n proxy<BonsaiState>({\n status: props.status ?? \"pending\",\n expiry: props.expiry ?? \"\",\n data: cloneData(props.data ?? {}),\n submitting: false,\n }),\n );\n // The `data` object identity this store was last seeded from.\n const seenDataRef = useRef<BonsaiProps[\"data\"]>(props.data);\n // Set while the provider itself writes to the store, so a parent-driven\n // resync isn't echoed back out through `onDataChange`.\n const resyncingRef = useRef(false);\n const onDataChange = useEffectEvent((next: Record<string, unknown>) => {\n props.onDataChange?.(next);\n });\n\n useLayoutEffect(() => {\n // A new `data` object arrived from the parent — adopt it before paint.\n // Same-reference renders (including in-place mutations) are deliberately ignored.\n if (Object.is(seenDataRef.current, props.data)) return;\n seenDataRef.current = props.data;\n resyncingRef.current = true;\n try {\n store.data = cloneData(props.data ?? {});\n } finally {\n resyncingRef.current = false;\n }\n }, [store, props.data]);\n\n useEffect(() => {\n // valtio only populates subscription `ops` when the (unstable) op tracking\n // is switched on globally, so changes are detected by snapshot identity\n // instead: `snapshot` is memoised per version, so an unchanged `data`\n // subtree returns the very same object and is filtered out here.\n //\n // Notify in sync: the resync flag below is only reliable if the callback\n // runs inside the write, not on a later microtask.\n let previous = snapshot(store.data);\n return subscribe(\n store,\n () => {\n const next = snapshot(store.data);\n if (next === previous) return;\n previous = next;\n // A parent-driven resync isn't a user edit — don't echo it back.\n if (resyncingRef.current) return;\n onDataChange(next as Record<string, unknown>);\n },\n true,\n );\n }, [store]);\n\n return (\n <BonsaiContext.Provider value={store}>\n <BonsaiClient {...props} />\n </BonsaiContext.Provider>\n );\n}\n","import { BonsaiServer } from \"./render-tree-server\";\nimport { BonsaiProvider } from \"./render-tree-client\";\nimport type { BonsaiProps } from \"./render-shared\";\n\nexport {\n BonsaiRegistryContext,\n getValue,\n setValue,\n useBonsaiRenderMode,\n type BonsaiProps,\n type RenderMode,\n} from \"./render-shared\";\nexport { useUpdateData, BonsaiClient, BonsaiProvider } from \"./render-tree-client\";\nexport { BonsaiServer } from \"./render-tree-server\";\n\nexport function Bonsai(props: BonsaiProps) {\n if (typeof window === \"undefined\") {\n return <BonsaiServer {...props} />;\n }\n\n return <BonsaiProvider {...props} />;\n}\n","import {\n Bonsai as BonsaiRenderer,\n BonsaiRegistryContext,\n type BonsaiProps,\n} from \"../components/core/bonsai\";\nimport {\n coreRegistry,\n extendRegistry,\n type ComponentRegistry,\n type ControlledInputRegistry,\n} from \"./core-registry\";\nimport type { BonsaiRegistry } from \"../lib/registry/types\";\n\nexport interface BonsaiRendererOptions {\n /** Base registry. Defaults to the lightweight core registry. */\n registry?: BonsaiRegistry;\n /** Extra components layered over `registry` (they win on key collision). */\n components?: Partial<ComponentRegistry>;\n controlledInputs?: Partial<ControlledInputRegistry>;\n}\n\nexport interface BonsaiRendererInstance {\n Bonsai: React.ComponentType<BonsaiProps>;\n}\n\n/**\n * Builds a renderer bound to its own component registry.\n *\n * The registry is `options.registry` (the lightweight core set by default)\n * plus whatever components the caller supplies (caller entries win on key\n * collision); a `registry` prop on an individual `<Bonsai>` still overrides it. It is captured in a React context at\n * this call, so registries never leak between renderer instances and consumers\n * never have to mutate the exported `componentMap`.\n *\n * Heavy built-ins are opt-in via the presets in `renderer/presets/*`:\n *\n * ```ts\n * import { createBonsaiRenderer } from \"@pebble-software/bonsai/core\";\n * import { calendarPreset } from \"@pebble-software/bonsai/presets/calendar\";\n *\n * const { Bonsai } = createBonsaiRenderer({\n * components: { ...calendarPreset.components, rating: Rating },\n * controlledInputs: { ...calendarPreset.controlledInputs },\n * });\n * ```\n *\n * Call this at module scope: each call returns a fresh component type, so\n * calling it during render would remount the whole tree every time.\n */\nexport function createBonsaiRenderer(\n options: BonsaiRendererOptions = {},\n): BonsaiRendererInstance {\n // Cast: a `Partial<...>` widens values to `| undefined`, but it only ever\n // holds keys the caller actually supplied.\n const registry = extendRegistry(options.registry ?? coreRegistry, {\n components: options.components as ComponentRegistry | undefined,\n controlledInputs: options.controlledInputs as ControlledInputRegistry | undefined,\n });\n\n function Bonsai(props: BonsaiProps) {\n return (\n <BonsaiRegistryContext.Provider value={registry}>\n <BonsaiRenderer {...props} />\n </BonsaiRegistryContext.Provider>\n );\n }\n Bonsai.displayName = \"Bonsai\";\n\n return { Bonsai };\n}\n"],"names":["SERVER_MODE","node","_ctx","globalData","buildDataSlice","key","getValue","ctx","item","i","each","realItemsPath","as","indexAlias","rowData","rowScope","child","path","jsx","RenderTreeServer","memo","index","data","scope","registry","useBonsaiRegistry","updateData","useCallback","renderCompiledNode","BonsaiServer","template","expiry","status","render","root","compileTemplate","Wrapper","resolveWrapper","BonsaiRoot","createElement","BonsaiContext","createContext","useBonsaiStore","store","useContext","useUpdateData","value","setValue","resolveKeyValue","indexScope","valueScope","pathRoot","resolveScopedPath","StaticNode","tree","type","ElementType","resolveElementType","getKey","props","prepareState","childNodes","branch","renderClientNode","safeChildNodes","VOID_ELEMENTS","error","RenderTreeClient","omitKey","obj","rest","CLIENT_MODE","_globalData","rowIndexScope","useSnapshot","BonsaiClient","captureUrl","onSubmit","onError","submit","e","snapshot","res","BonsaiProvider","useState","proxy","cloneData","seenDataRef","useRef","resyncingRef","onDataChange","useEffectEvent","next","useLayoutEffect","useEffect","previous","subscribe","Bonsai","createBonsaiRenderer","options","extendRegistry","coreRegistry","BonsaiRegistryContext","BonsaiRenderer"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import x from "jsep";
|
|
2
2
|
import U from "@jsep-plugin/arrow";
|
|
3
|
+
x.plugins.register(U);
|
|
3
4
|
class b {
|
|
4
5
|
cache = /* @__PURE__ */ new Map();
|
|
5
6
|
maxSize;
|
|
@@ -20,7 +21,6 @@ class b {
|
|
|
20
21
|
this.cache.clear();
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
|
-
x.plugins.register(U);
|
|
24
24
|
const D = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
25
25
|
function g(e, r) {
|
|
26
26
|
if (e != null && !(typeof r == "string" && D.has(r)) && Object.prototype.hasOwnProperty.call(e, r))
|
|
@@ -364,4 +364,4 @@ export {
|
|
|
364
364
|
v as p,
|
|
365
365
|
C as s
|
|
366
366
|
};
|
|
367
|
-
//# sourceMappingURL=index-
|
|
367
|
+
//# sourceMappingURL=index-df-PhUtD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CD5pykpk.js","sources":["../../src/lib/ast/cache.ts","../../src/lib/ast/setup.ts","../../src/lib/ast/utils.ts","../../src/lib/ast/helpers.ts","../../src/lib/ast/evaluator.ts","../../src/lib/ast/index.ts"],"sourcesContent":["export class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private maxSize: number;\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value !== undefined) {\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n set(key: K, value: V): void {\n this.cache.delete(key);\n this.cache.set(key, value);\n\n if (this.cache.size > this.maxSize) {\n const { value: firstKey, done } = this.cache.keys().next();\n if (!done) this.cache.delete(firstKey);\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n","import jsep from \"jsep\";\nimport arrow from \"@jsep-plugin/arrow\";\n\n// Teaches jsep arrow syntax (`a => a.age >= 18`) — the body is still walked by our own evaluate(), never eval'd.\njsep.plugins.register(arrow);\n\nexport default jsep;\n","import type { ASTNode, KnownNode } from \"./types\";\n\n// Blocked even as a literal own-key, since a JSON.parse'd payload can carry one.\nconst FORBIDDEN_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n// Null-safe, own-property-only read — blocks prototype-chain escapes from template expressions.\nexport function getOwn(obj: unknown, key: PropertyKey): unknown {\n if (obj == null) return undefined;\n if (typeof key === \"string\" && FORBIDDEN_KEYS.has(key)) return undefined;\n if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\n return (obj as Record<PropertyKey, unknown>)[key];\n}\n\n// Rebuilds a static dot/bracket path string; returns null for a non-literal computed key (e.g. `items[i].label`).\nexport function staticPath(node: ASTNode): string | null {\n const n = node as KnownNode;\n if (n.type === \"Identifier\") return n.name;\n\n if (n.type === \"MemberExpression\") {\n const objectPath = staticPath(n.object);\n if (objectPath == null) return null;\n\n const property = n.property as KnownNode;\n if (n.computed) {\n if (property.type !== \"Literal\") return null;\n return `${objectPath}[${JSON.stringify(property.value)}]`;\n }\n if (property.type !== \"Identifier\") return null;\n return `${objectPath}.${property.name}`;\n }\n\n return null;\n}\n\n// Extracts the leading identifier from a static path (\"a.age\" -> \"a\").\nfunction rootOf(path: string): string {\n const match = path.match(/^[^.[]+/);\n return match ? match[0] : path;\n}\n\n// Collects the data paths an expression reads (root identifiers + static member paths); arrow params are\n// tracked in `bound` so they're excluded as locally-scoped, while free variables inside the body still surface.\nexport function extractIdentifiers(node: ASTNode): string[] {\n const identifiers = new Set<string>();\n\n function traverse(expr: ASTNode | null | undefined, bound: ReadonlySet<string>) {\n if (!expr) return;\n const n = expr as KnownNode;\n\n switch (n.type) {\n case \"Identifier\": {\n if (!bound.has(n.name)) identifiers.add(n.name);\n return;\n }\n\n case \"MemberExpression\": {\n const path = staticPath(n);\n if (path != null) {\n if (!bound.has(rootOf(path))) identifiers.add(path);\n return;\n }\n traverse(n.object, bound);\n traverse(n.property, bound);\n return;\n }\n\n case \"UnaryExpression\":\n traverse(n.argument, bound);\n return;\n\n case \"BinaryExpression\":\n traverse(n.left, bound);\n traverse(n.right, bound);\n return;\n\n case \"ConditionalExpression\":\n traverse(n.test, bound);\n traverse(n.consequent, bound);\n traverse(n.alternate, bound);\n return;\n\n case \"ArrayExpression\":\n n.elements.forEach((el) => traverse(el, bound));\n return;\n\n case \"CallExpression\": {\n // The callee itself is never a data read; only a MemberExpression callee's object is.\n const callee = n.callee as KnownNode;\n if (callee.type === \"MemberExpression\") {\n traverse(callee.object, bound);\n }\n n.arguments.forEach((arg) => {\n const a = arg as KnownNode;\n if (a.type === \"ArrowFunctionExpression\") {\n const withParams = new Set(bound);\n a.params?.forEach((param) => {\n const p = param as KnownNode;\n if (p.type === \"Identifier\") withParams.add(p.name);\n });\n traverse(a.body, withParams);\n } else {\n traverse(arg, bound);\n }\n });\n return;\n }\n\n case \"Compound\":\n n.body.forEach((stmt) => traverse(stmt, bound));\n return;\n\n default:\n return;\n }\n }\n\n traverse(node, new Set());\n return Array.from(identifiers);\n}\n","// Formula-language helper registry. Helpers run in SSR/PDF too, so they must be pure and synchronous — no\n// fetch, no clock reads, no randomness — or SSR output stops being a pure function of (template, data).\n\n// Method syntax on purpose: it keeps parameters bivariant, so each helper declares the argument\n// types it expects while the evaluator calls it with whatever values a template passes.\nexport type Helper = { helper(...args: unknown[]): unknown }[\"helper\"];\n\nconst pad = (n: number, len = 2): string => String(n).padStart(len, \"0\");\n\nfunction toDate(value: unknown): Date | null {\n // Any other value is coerced by the Date constructor, same as an untyped call.\n const date = value instanceof Date ? value : new Date(value as string | number);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction toNumber(value: unknown): number {\n // parseFloat stringifies non-strings itself.\n const n = typeof value === \"number\" ? value : parseFloat(value as string);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction flattenNumbers(args: unknown[]): number[] {\n return args.flat(Infinity).map(toNumber);\n}\n\nexport const helpers: Record<string, Helper> = {\n // Uses UTC getters so SSR and client render the same calendar date regardless of local timezone.\n formatDate(value: unknown, format: string = \"YYYY-MM-DD\"): string {\n const date = toDate(value);\n if (!date) return \"\";\n\n if (format === \"short\" || format === \"medium\" || format === \"long\" || format === \"full\") {\n return new Intl.DateTimeFormat(\"en-US\", { dateStyle: format, timeZone: \"UTC\" }).format(date);\n }\n\n const tokens: Record<string, string> = {\n YYYY: String(date.getUTCFullYear()),\n MM: pad(date.getUTCMonth() + 1),\n DD: pad(date.getUTCDate()),\n HH: pad(date.getUTCHours()),\n mm: pad(date.getUTCMinutes()),\n ss: pad(date.getUTCSeconds()),\n };\n return format.replace(/YYYY|MM|DD|HH|mm|ss/g, (token) => tokens[token]);\n },\n\n formatCurrency(value: unknown, currency: string = \"USD\", locale: string = \"en-US\"): string {\n const amount = toNumber(value);\n return new Intl.NumberFormat(locale, { style: \"currency\", currency }).format(amount);\n },\n\n upper(value: unknown): string {\n return String(value ?? \"\").toUpperCase();\n },\n\n lower(value: unknown): string {\n return String(value ?? \"\").toLowerCase();\n },\n\n trim(value: unknown): string {\n return String(value ?? \"\").trim();\n },\n\n concat(...args: unknown[]): string {\n return args.map((a) => (a ?? \"\")).join(\"\");\n },\n\n join(value: unknown, separator: string = \", \"): string {\n return Array.isArray(value) ? value.join(separator) : \"\";\n },\n\n default(value: unknown, fallback: unknown): unknown {\n return value == null || value === \"\" ? fallback : value;\n },\n\n length(value: unknown): number {\n if (typeof value === \"string\" || Array.isArray(value)) return value.length;\n return 0;\n },\n\n count(value: unknown): number {\n return Array.isArray(value) ? value.length : 0;\n },\n\n sum(value: unknown): number {\n return Array.isArray(value) ? value.reduce((acc: number, v: unknown) => acc + toNumber(v), 0) : 0;\n },\n\n min(...args: unknown[]): number | undefined {\n const nums = flattenNumbers(args);\n return nums.length ? Math.min(...nums) : undefined;\n },\n\n max(...args: unknown[]): number | undefined {\n const nums = flattenNumbers(args);\n return nums.length ? Math.max(...nums) : undefined;\n },\n\n round(value: unknown, digits: number = 0): number {\n const factor = 10 ** digits;\n return Math.round(toNumber(value) * factor) / factor;\n },\n};\n","import type { Identifier } from \"jsep\";\nimport type { ArrowExpression } from \"@jsep-plugin/arrow\";\nimport type { ASTNode, KnownNode } from \"./types\";\nimport { getOwn } from \"./utils\";\nimport { helpers } from \"./helpers\";\n\ntype Lambda = (item: unknown, index: number) => unknown;\n\n// Only these array methods are callable via `.method(lambda)`; anything else is always an error.\nconst ARRAY_METHODS: Record<string, (items: unknown[], fn: Lambda) => unknown> = {\n map: (items, fn) => items.map(fn),\n filter: (items, fn) => items.filter(fn),\n some: (items, fn) => items.some(fn),\n every: (items, fn) => items.every(fn),\n find: (items, fn) => items.find(fn),\n};\n\n// Walks the arrow body with `evaluate()` itself — no real JS function is ever compiled from the lambda.\nfunction callArrow(\n arrow: ArrowExpression,\n args: unknown[],\n outerData: Record<string, unknown>,\n): unknown {\n const scope: Record<string, unknown> = { ...outerData };\n (arrow.params ?? []).forEach((param, i) => {\n const p = param as KnownNode;\n if (p.type === \"Identifier\") scope[p.name] = args[i];\n });\n return evaluate(arrow.body, scope);\n}\n\nexport function evaluate(node: ASTNode, data: Record<string, unknown>): unknown {\n const n = node as KnownNode;\n switch (n.type) {\n case \"Literal\":\n return n.value;\n\n case \"Identifier\":\n return getOwn(data, n.name);\n\n case \"MemberExpression\": {\n const objectValue = evaluate(n.object, data);\n // A computed key can evaluate to anything; the own-property lookup coerces it like `obj[key]` would.\n const key = n.computed\n ? (evaluate(n.property, data) as PropertyKey)\n : (n.property as Identifier).name;\n return getOwn(objectValue, key);\n }\n\n case \"UnaryExpression\": {\n // Operands are whatever the template produced; JS coercion is the intended semantics,\n // so they're typed as numbers only to satisfy the checker.\n const argument = evaluate(n.argument, data) as number;\n switch (n.operator) {\n case \"!\":\n return !argument;\n case \"-\":\n return -argument;\n case \"+\":\n return +argument;\n case \"~\":\n return ~argument;\n default:\n throw new Error(`Unknown unary operator: ${n.operator}`);\n }\n }\n\n case \"BinaryExpression\": {\n const operator = n.operator;\n\n // Short-circuit: right side only evaluated when needed; returns the operand, not a boolean (JS semantics).\n if (operator === \"&&\" || operator === \"||\" || operator === \"??\") {\n const left = evaluate(n.left, data);\n const shortCircuits =\n operator === \"&&\"\n ? !left\n : operator === \"||\"\n ? !!left\n : left != null;\n return shortCircuits ? left : evaluate(n.right, data);\n }\n\n // Same as the unary case: JS coercion semantics, number types only for the checker.\n const left = evaluate(n.left, data) as number;\n const right = evaluate(n.right, data) as number;\n\n switch (operator) {\n case \"===\":\n return left === right;\n case \"!==\":\n return left !== right;\n case \"==\":\n return left == right;\n case \"!=\":\n return left != right;\n case \"<\":\n return left < right;\n case \">\":\n return left > right;\n case \"<=\":\n return left <= right;\n case \">=\":\n return left >= right;\n case \"+\":\n return left + right;\n case \"-\":\n return left - right;\n case \"*\":\n return left * right;\n case \"/\":\n return left / right;\n case \"%\":\n return left % right;\n case \"**\":\n return left ** right;\n case \"&\":\n return left & right;\n case \"|\":\n return left | right;\n case \"^\":\n return left ^ right;\n case \"<<\":\n return left << right;\n case \">>\":\n return left >> right;\n case \">>>\":\n return left >>> right;\n default:\n throw new Error(`Unknown binary operator: ${operator}`);\n }\n }\n\n case \"ConditionalExpression\": {\n const test = evaluate(n.test, data);\n return test\n ? evaluate(n.consequent, data)\n : evaluate(n.alternate, data);\n }\n\n case \"ArrayExpression\":\n return n.elements.map((el) => (el ? evaluate(el, data) : undefined));\n\n case \"CallExpression\": {\n const callee = n.callee as KnownNode;\n const argNodes = n.arguments;\n\n // Allowlisted array method + lambda; any other member-access call is rejected before the receiver is touched.\n if (callee.type === \"MemberExpression\") {\n const property = callee.property as KnownNode;\n if (callee.computed || property.type !== \"Identifier\") {\n throw new Error(\n \"Method calls must use a fixed dot-notation method name\",\n );\n }\n const methodName = property.name;\n const method = Object.hasOwn(ARRAY_METHODS, methodName)\n ? ARRAY_METHODS[methodName]\n : undefined;\n if (!method) {\n throw new Error(`Unknown array method: ${methodName}`);\n }\n\n const receiver = evaluate(callee.object, data);\n if (!Array.isArray(receiver)) {\n throw new Error(`.${methodName}() can only be called on an array`);\n }\n\n const arg = argNodes[0] as KnownNode | undefined;\n if (argNodes.length !== 1 || arg?.type !== \"ArrowFunctionExpression\") {\n throw new Error(\n `.${methodName}() requires a single arrow-function argument`,\n );\n }\n\n return method(receiver, (item, index) => callArrow(arg, [item, index], data));\n }\n\n if (callee.type !== \"Identifier\") {\n throw new Error(\n \"Function calls are only allowed via a bare helper name\",\n );\n }\n\n // Own keys only, so inherited names like `constructor` or `toString` never resolve to a helper.\n const helper = Object.hasOwn(helpers, callee.name) ? helpers[callee.name] : undefined;\n if (typeof helper !== \"function\") {\n throw new Error(`Unknown helper: ${callee.name}`);\n }\n\n return helper(...argNodes.map((a) => evaluate(a, data)));\n }\n\n default:\n throw new Error(`Unsupported expression type: ${node.type}`);\n }\n}\n","import jsep from \"./setup\";\nimport type { ASTNode } from \"./types\";\nimport { LRUCache } from \"./cache\";\nimport { evaluate } from \"./evaluator\";\nimport { extractIdentifiers } from \"./utils\";\n\nexport type { ASTNode } from \"./types\";\n\nconst astCache = new LRUCache<string, ASTNode>(250);\n\nfunction parseToAST(content: string): ASTNode {\n let ast = astCache.get(content);\n if (ast) {\n return ast;\n }\n\n ast = jsep(content) as ASTNode;\n astCache.set(content, ast);\n return ast;\n}\n\nexport function extractVariables(expr: string): string[] {\n if (!expr || typeof expr !== \"string\") {\n return [];\n }\n\n if (!expr.startsWith(\"{{\") || !expr.endsWith(\"}}\")) {\n return [];\n }\n\n const content = expr.slice(2, -2).trim();\n if (!content) {\n return [];\n }\n\n try {\n return extractIdentifiers(parseToAST(content));\n } catch (error) {\n console.error(`Error extracting variables from \"${expr}\":`, error);\n return [];\n }\n}\n\nexport function parseExpression(expr: unknown, data: Record<string, unknown>): unknown {\n if (!expr || typeof expr !== \"string\") {\n return expr;\n }\n\n if (!expr.startsWith(\"{{\") || !expr.endsWith(\"}}\")) {\n return expr;\n }\n\n const content = expr.slice(2, -2).trim();\n if (!content) {\n return undefined;\n }\n\n try {\n return evaluate(parseToAST(content), data);\n } catch (error) {\n console.error(`Error parsing expression \"${expr}\":`, error);\n return undefined;\n }\n}\n\nexport function clearExpressionCache(): void {\n astCache.clear();\n}\n\n/**\n * The single predicate that decides whether a value is a template expression.\n * `parseExpression` / `extractVariables` / the template compiler must all agree\n * on it — a divergence would silently stop evaluating a prop.\n */\nexport function isExpression(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"{{\") && value.endsWith(\"}}\")\n );\n}\n\nexport interface CompiledExpression {\n /** The original `{{...}}` source, i.e. what gets handed to `parseExpression`. */\n source: string;\n /** The trimmed inner content, i.e. the raw binding path for a plain path binding. */\n content: string;\n /** Parsed AST, or null for an empty expression or a parse failure. */\n ast: ASTNode | null;\n /** Parse failure, if any. Deferred to evaluation time so logging stays per-render. */\n error: unknown;\n /** Data paths the expression reads. Empty for literal-only expressions. */\n variables: string[];\n}\n\n/**\n * Parses an expression ahead of render. Returns null for anything that isn't a\n * `{{...}}` expression. Never throws: a malformed expression is captured in\n * `error` so the caller can keep `parseExpression`'s per-render error reporting.\n */\nexport function compileExpression(value: unknown): CompiledExpression | null {\n if (!isExpression(value)) return null;\n\n const content = value.slice(2, -2).trim();\n if (!content) {\n return { source: value, content, ast: null, error: null, variables: [] };\n }\n\n try {\n const ast = parseToAST(content);\n return {\n source: value,\n content,\n ast,\n error: null,\n variables: extractIdentifiers(ast),\n };\n } catch (error) {\n return { source: value, content, ast: null, error, variables: [] };\n }\n}\n"],"names":["LRUCache","maxSize","key","value","firstKey","done","jsep","arrow","FORBIDDEN_KEYS","getOwn","obj","staticPath","node","n","objectPath","property","rootOf","path","match","extractIdentifiers","identifiers","traverse","expr","bound","el","callee","arg","a","withParams","param","p","stmt","pad","len","toDate","date","toNumber","flattenNumbers","args","helpers","format","tokens","token","currency","locale","amount","separator","fallback","acc","v","nums","digits","factor","ARRAY_METHODS","items","fn","callArrow","outerData","scope","i","evaluate","data","objectValue","argument","operator","left","right","test","argNodes","methodName","method","receiver","item","index","helper","astCache","parseToAST","content","ast","extractVariables","error","parseExpression","clearExpressionCache","isExpression","compileExpression"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-df-PhUtD.js","sources":["../../src/lib/ast/setup.ts","../../src/lib/ast/cache.ts","../../src/lib/ast/utils.ts","../../src/lib/ast/helpers.ts","../../src/lib/ast/evaluator.ts","../../src/lib/ast/index.ts"],"sourcesContent":["import jsep from \"jsep\";\nimport arrow from \"@jsep-plugin/arrow\";\n\n// Teaches jsep arrow syntax (`a => a.age >= 18`) — the body is still walked by our own evaluate(), never eval'd.\njsep.plugins.register(arrow);\n\nexport default jsep;\n","export class LRUCache<K, V> {\n private cache = new Map<K, V>();\n private maxSize: number;\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value !== undefined) {\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n set(key: K, value: V): void {\n this.cache.delete(key);\n this.cache.set(key, value);\n\n if (this.cache.size > this.maxSize) {\n const { value: firstKey, done } = this.cache.keys().next();\n if (!done) this.cache.delete(firstKey);\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n","import type { ASTNode, KnownNode } from \"./types\";\n\n// Blocked even as a literal own-key, since a JSON.parse'd payload can carry one.\nconst FORBIDDEN_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n// Null-safe, own-property-only read — blocks prototype-chain escapes from template expressions.\nexport function getOwn(obj: unknown, key: PropertyKey): unknown {\n if (obj == null) return undefined;\n if (typeof key === \"string\" && FORBIDDEN_KEYS.has(key)) return undefined;\n if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\n return (obj as Record<PropertyKey, unknown>)[key];\n}\n\n// Rebuilds a static dot/bracket path string; returns null for a non-literal computed key (e.g. `items[i].label`).\nexport function staticPath(node: ASTNode): string | null {\n const n = node as KnownNode;\n if (n.type === \"Identifier\") return n.name;\n\n if (n.type === \"MemberExpression\") {\n const objectPath = staticPath(n.object);\n if (objectPath == null) return null;\n\n const property = n.property as KnownNode;\n if (n.computed) {\n if (property.type !== \"Literal\") return null;\n return `${objectPath}[${JSON.stringify(property.value)}]`;\n }\n if (property.type !== \"Identifier\") return null;\n return `${objectPath}.${property.name}`;\n }\n\n return null;\n}\n\n// Extracts the leading identifier from a static path (\"a.age\" -> \"a\").\nfunction rootOf(path: string): string {\n const match = path.match(/^[^.[]+/);\n return match ? match[0] : path;\n}\n\n// Collects the data paths an expression reads (root identifiers + static member paths); arrow params are\n// tracked in `bound` so they're excluded as locally-scoped, while free variables inside the body still surface.\nexport function extractIdentifiers(node: ASTNode): string[] {\n const identifiers = new Set<string>();\n\n function traverse(expr: ASTNode | null | undefined, bound: ReadonlySet<string>) {\n if (!expr) return;\n const n = expr as KnownNode;\n\n switch (n.type) {\n case \"Identifier\": {\n if (!bound.has(n.name)) identifiers.add(n.name);\n return;\n }\n\n case \"MemberExpression\": {\n const path = staticPath(n);\n if (path != null) {\n if (!bound.has(rootOf(path))) identifiers.add(path);\n return;\n }\n traverse(n.object, bound);\n traverse(n.property, bound);\n return;\n }\n\n case \"UnaryExpression\":\n traverse(n.argument, bound);\n return;\n\n case \"BinaryExpression\":\n traverse(n.left, bound);\n traverse(n.right, bound);\n return;\n\n case \"ConditionalExpression\":\n traverse(n.test, bound);\n traverse(n.consequent, bound);\n traverse(n.alternate, bound);\n return;\n\n case \"ArrayExpression\":\n n.elements.forEach((el) => traverse(el, bound));\n return;\n\n case \"CallExpression\": {\n // The callee itself is never a data read; only a MemberExpression callee's object is.\n const callee = n.callee as KnownNode;\n if (callee.type === \"MemberExpression\") {\n traverse(callee.object, bound);\n }\n n.arguments.forEach((arg) => {\n const a = arg as KnownNode;\n if (a.type === \"ArrowFunctionExpression\") {\n const withParams = new Set(bound);\n a.params?.forEach((param) => {\n const p = param as KnownNode;\n if (p.type === \"Identifier\") withParams.add(p.name);\n });\n traverse(a.body, withParams);\n } else {\n traverse(arg, bound);\n }\n });\n return;\n }\n\n case \"Compound\":\n n.body.forEach((stmt) => traverse(stmt, bound));\n return;\n\n default:\n return;\n }\n }\n\n traverse(node, new Set());\n return Array.from(identifiers);\n}\n","// Formula-language helper registry. Helpers run in SSR/PDF too, so they must be pure and synchronous — no\n// fetch, no clock reads, no randomness — or SSR output stops being a pure function of (template, data).\n\n// Method syntax on purpose: it keeps parameters bivariant, so each helper declares the argument\n// types it expects while the evaluator calls it with whatever values a template passes.\nexport type Helper = { helper(...args: unknown[]): unknown }[\"helper\"];\n\nconst pad = (n: number, len = 2): string => String(n).padStart(len, \"0\");\n\nfunction toDate(value: unknown): Date | null {\n // Any other value is coerced by the Date constructor, same as an untyped call.\n const date = value instanceof Date ? value : new Date(value as string | number);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction toNumber(value: unknown): number {\n // parseFloat stringifies non-strings itself.\n const n = typeof value === \"number\" ? value : parseFloat(value as string);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction flattenNumbers(args: unknown[]): number[] {\n return args.flat(Infinity).map(toNumber);\n}\n\nexport const helpers: Record<string, Helper> = {\n // Uses UTC getters so SSR and client render the same calendar date regardless of local timezone.\n formatDate(value: unknown, format: string = \"YYYY-MM-DD\"): string {\n const date = toDate(value);\n if (!date) return \"\";\n\n if (format === \"short\" || format === \"medium\" || format === \"long\" || format === \"full\") {\n return new Intl.DateTimeFormat(\"en-US\", { dateStyle: format, timeZone: \"UTC\" }).format(date);\n }\n\n const tokens: Record<string, string> = {\n YYYY: String(date.getUTCFullYear()),\n MM: pad(date.getUTCMonth() + 1),\n DD: pad(date.getUTCDate()),\n HH: pad(date.getUTCHours()),\n mm: pad(date.getUTCMinutes()),\n ss: pad(date.getUTCSeconds()),\n };\n return format.replace(/YYYY|MM|DD|HH|mm|ss/g, (token) => tokens[token]);\n },\n\n formatCurrency(value: unknown, currency: string = \"USD\", locale: string = \"en-US\"): string {\n const amount = toNumber(value);\n return new Intl.NumberFormat(locale, { style: \"currency\", currency }).format(amount);\n },\n\n upper(value: unknown): string {\n return String(value ?? \"\").toUpperCase();\n },\n\n lower(value: unknown): string {\n return String(value ?? \"\").toLowerCase();\n },\n\n trim(value: unknown): string {\n return String(value ?? \"\").trim();\n },\n\n concat(...args: unknown[]): string {\n return args.map((a) => (a ?? \"\")).join(\"\");\n },\n\n join(value: unknown, separator: string = \", \"): string {\n return Array.isArray(value) ? value.join(separator) : \"\";\n },\n\n default(value: unknown, fallback: unknown): unknown {\n return value == null || value === \"\" ? fallback : value;\n },\n\n length(value: unknown): number {\n if (typeof value === \"string\" || Array.isArray(value)) return value.length;\n return 0;\n },\n\n count(value: unknown): number {\n return Array.isArray(value) ? value.length : 0;\n },\n\n sum(value: unknown): number {\n return Array.isArray(value) ? value.reduce((acc: number, v: unknown) => acc + toNumber(v), 0) : 0;\n },\n\n min(...args: unknown[]): number | undefined {\n const nums = flattenNumbers(args);\n return nums.length ? Math.min(...nums) : undefined;\n },\n\n max(...args: unknown[]): number | undefined {\n const nums = flattenNumbers(args);\n return nums.length ? Math.max(...nums) : undefined;\n },\n\n round(value: unknown, digits: number = 0): number {\n const factor = 10 ** digits;\n return Math.round(toNumber(value) * factor) / factor;\n },\n};\n","import type { Identifier } from \"jsep\";\nimport type { ArrowExpression } from \"@jsep-plugin/arrow\";\nimport type { ASTNode, KnownNode } from \"./types\";\nimport { getOwn } from \"./utils\";\nimport { helpers } from \"./helpers\";\n\ntype Lambda = (item: unknown, index: number) => unknown;\n\n// Only these array methods are callable via `.method(lambda)`; anything else is always an error.\nconst ARRAY_METHODS: Record<string, (items: unknown[], fn: Lambda) => unknown> = {\n map: (items, fn) => items.map(fn),\n filter: (items, fn) => items.filter(fn),\n some: (items, fn) => items.some(fn),\n every: (items, fn) => items.every(fn),\n find: (items, fn) => items.find(fn),\n};\n\n// Walks the arrow body with `evaluate()` itself — no real JS function is ever compiled from the lambda.\nfunction callArrow(\n arrow: ArrowExpression,\n args: unknown[],\n outerData: Record<string, unknown>,\n): unknown {\n const scope: Record<string, unknown> = { ...outerData };\n (arrow.params ?? []).forEach((param, i) => {\n const p = param as KnownNode;\n if (p.type === \"Identifier\") scope[p.name] = args[i];\n });\n return evaluate(arrow.body, scope);\n}\n\nexport function evaluate(node: ASTNode, data: Record<string, unknown>): unknown {\n const n = node as KnownNode;\n switch (n.type) {\n case \"Literal\":\n return n.value;\n\n case \"Identifier\":\n return getOwn(data, n.name);\n\n case \"MemberExpression\": {\n const objectValue = evaluate(n.object, data);\n // A computed key can evaluate to anything; the own-property lookup coerces it like `obj[key]` would.\n const key = n.computed\n ? (evaluate(n.property, data) as PropertyKey)\n : (n.property as Identifier).name;\n return getOwn(objectValue, key);\n }\n\n case \"UnaryExpression\": {\n // Operands are whatever the template produced; JS coercion is the intended semantics,\n // so they're typed as numbers only to satisfy the checker.\n const argument = evaluate(n.argument, data) as number;\n switch (n.operator) {\n case \"!\":\n return !argument;\n case \"-\":\n return -argument;\n case \"+\":\n return +argument;\n case \"~\":\n return ~argument;\n default:\n throw new Error(`Unknown unary operator: ${n.operator}`);\n }\n }\n\n case \"BinaryExpression\": {\n const operator = n.operator;\n\n // Short-circuit: right side only evaluated when needed; returns the operand, not a boolean (JS semantics).\n if (operator === \"&&\" || operator === \"||\" || operator === \"??\") {\n const left = evaluate(n.left, data);\n const shortCircuits =\n operator === \"&&\"\n ? !left\n : operator === \"||\"\n ? !!left\n : left != null;\n return shortCircuits ? left : evaluate(n.right, data);\n }\n\n // Same as the unary case: JS coercion semantics, number types only for the checker.\n const left = evaluate(n.left, data) as number;\n const right = evaluate(n.right, data) as number;\n\n switch (operator) {\n case \"===\":\n return left === right;\n case \"!==\":\n return left !== right;\n case \"==\":\n return left == right;\n case \"!=\":\n return left != right;\n case \"<\":\n return left < right;\n case \">\":\n return left > right;\n case \"<=\":\n return left <= right;\n case \">=\":\n return left >= right;\n case \"+\":\n return left + right;\n case \"-\":\n return left - right;\n case \"*\":\n return left * right;\n case \"/\":\n return left / right;\n case \"%\":\n return left % right;\n case \"**\":\n return left ** right;\n case \"&\":\n return left & right;\n case \"|\":\n return left | right;\n case \"^\":\n return left ^ right;\n case \"<<\":\n return left << right;\n case \">>\":\n return left >> right;\n case \">>>\":\n return left >>> right;\n default:\n throw new Error(`Unknown binary operator: ${operator}`);\n }\n }\n\n case \"ConditionalExpression\": {\n const test = evaluate(n.test, data);\n return test\n ? evaluate(n.consequent, data)\n : evaluate(n.alternate, data);\n }\n\n case \"ArrayExpression\":\n return n.elements.map((el) => (el ? evaluate(el, data) : undefined));\n\n case \"CallExpression\": {\n const callee = n.callee as KnownNode;\n const argNodes = n.arguments;\n\n // Allowlisted array method + lambda; any other member-access call is rejected before the receiver is touched.\n if (callee.type === \"MemberExpression\") {\n const property = callee.property as KnownNode;\n if (callee.computed || property.type !== \"Identifier\") {\n throw new Error(\n \"Method calls must use a fixed dot-notation method name\",\n );\n }\n const methodName = property.name;\n const method = Object.hasOwn(ARRAY_METHODS, methodName)\n ? ARRAY_METHODS[methodName]\n : undefined;\n if (!method) {\n throw new Error(`Unknown array method: ${methodName}`);\n }\n\n const receiver = evaluate(callee.object, data);\n if (!Array.isArray(receiver)) {\n throw new Error(`.${methodName}() can only be called on an array`);\n }\n\n const arg = argNodes[0] as KnownNode | undefined;\n if (argNodes.length !== 1 || arg?.type !== \"ArrowFunctionExpression\") {\n throw new Error(\n `.${methodName}() requires a single arrow-function argument`,\n );\n }\n\n return method(receiver, (item, index) => callArrow(arg, [item, index], data));\n }\n\n if (callee.type !== \"Identifier\") {\n throw new Error(\n \"Function calls are only allowed via a bare helper name\",\n );\n }\n\n // Own keys only, so inherited names like `constructor` or `toString` never resolve to a helper.\n const helper = Object.hasOwn(helpers, callee.name) ? helpers[callee.name] : undefined;\n if (typeof helper !== \"function\") {\n throw new Error(`Unknown helper: ${callee.name}`);\n }\n\n return helper(...argNodes.map((a) => evaluate(a, data)));\n }\n\n default:\n throw new Error(`Unsupported expression type: ${node.type}`);\n }\n}\n","import jsep from \"./setup\";\nimport type { ASTNode } from \"./types\";\nimport { LRUCache } from \"./cache\";\nimport { evaluate } from \"./evaluator\";\nimport { extractIdentifiers } from \"./utils\";\n\nexport type { ASTNode } from \"./types\";\n\nconst astCache = new LRUCache<string, ASTNode>(250);\n\nfunction parseToAST(content: string): ASTNode {\n let ast = astCache.get(content);\n if (ast) {\n return ast;\n }\n\n ast = jsep(content) as ASTNode;\n astCache.set(content, ast);\n return ast;\n}\n\nexport function extractVariables(expr: string): string[] {\n if (!expr || typeof expr !== \"string\") {\n return [];\n }\n\n if (!expr.startsWith(\"{{\") || !expr.endsWith(\"}}\")) {\n return [];\n }\n\n const content = expr.slice(2, -2).trim();\n if (!content) {\n return [];\n }\n\n try {\n return extractIdentifiers(parseToAST(content));\n } catch (error) {\n console.error(`Error extracting variables from \"${expr}\":`, error);\n return [];\n }\n}\n\nexport function parseExpression(expr: unknown, data: Record<string, unknown>): unknown {\n if (!expr || typeof expr !== \"string\") {\n return expr;\n }\n\n if (!expr.startsWith(\"{{\") || !expr.endsWith(\"}}\")) {\n return expr;\n }\n\n const content = expr.slice(2, -2).trim();\n if (!content) {\n return undefined;\n }\n\n try {\n return evaluate(parseToAST(content), data);\n } catch (error) {\n console.error(`Error parsing expression \"${expr}\":`, error);\n return undefined;\n }\n}\n\nexport function clearExpressionCache(): void {\n astCache.clear();\n}\n\n/**\n * The single predicate that decides whether a value is a template expression.\n * `parseExpression` / `extractVariables` / the template compiler must all agree\n * on it — a divergence would silently stop evaluating a prop.\n */\nexport function isExpression(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"{{\") && value.endsWith(\"}}\")\n );\n}\n\nexport interface CompiledExpression {\n /** The original `{{...}}` source, i.e. what gets handed to `parseExpression`. */\n source: string;\n /** The trimmed inner content, i.e. the raw binding path for a plain path binding. */\n content: string;\n /** Parsed AST, or null for an empty expression or a parse failure. */\n ast: ASTNode | null;\n /** Parse failure, if any. Deferred to evaluation time so logging stays per-render. */\n error: unknown;\n /** Data paths the expression reads. Empty for literal-only expressions. */\n variables: string[];\n}\n\n/**\n * Parses an expression ahead of render. Returns null for anything that isn't a\n * `{{...}}` expression. Never throws: a malformed expression is captured in\n * `error` so the caller can keep `parseExpression`'s per-render error reporting.\n */\nexport function compileExpression(value: unknown): CompiledExpression | null {\n if (!isExpression(value)) return null;\n\n const content = value.slice(2, -2).trim();\n if (!content) {\n return { source: value, content, ast: null, error: null, variables: [] };\n }\n\n try {\n const ast = parseToAST(content);\n return {\n source: value,\n content,\n ast,\n error: null,\n variables: extractIdentifiers(ast),\n };\n } catch (error) {\n return { source: value, content, ast: null, error, variables: [] };\n }\n}\n"],"names":["jsep","arrow","LRUCache","maxSize","key","value","firstKey","done","FORBIDDEN_KEYS","getOwn","obj","staticPath","node","n","objectPath","property","rootOf","path","match","extractIdentifiers","identifiers","traverse","expr","bound","el","callee","arg","a","withParams","param","p","stmt","pad","len","toDate","date","toNumber","flattenNumbers","args","helpers","format","tokens","token","currency","locale","amount","separator","fallback","acc","v","nums","digits","factor","ARRAY_METHODS","items","fn","callArrow","outerData","scope","i","evaluate","data","objectValue","argument","operator","left","right","test","argNodes","methodName","method","receiver","item","index","helper","astCache","parseToAST","content","ast","extractVariables","error","parseExpression","clearExpressionCache","isExpression","compileExpression"],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import { OTPInput as _a } from "input-otp";
|
|
|
17
17
|
import { Progress as N } from "@base-ui/react/progress";
|
|
18
18
|
import { Separator as Sa } from "@base-ui/react/separator";
|
|
19
19
|
import { Switch as aa } from "@base-ui/react/switch";
|
|
20
|
-
import { L as Va, c as L, s as La, p as ja } from "./index-
|
|
20
|
+
import { L as Va, c as L, s as La, p as ja } from "./index-df-PhUtD.js";
|
|
21
21
|
const $a = /* @__PURE__ */ new Set([
|
|
22
22
|
"__proto__",
|
|
23
23
|
"dangerouslySetInnerHTML",
|
|
@@ -282,7 +282,7 @@ function Wa({
|
|
|
282
282
|
{
|
|
283
283
|
"data-slot": "accordion-trigger",
|
|
284
284
|
className: i(
|
|
285
|
-
"neo-base neo-accordion-focus pt-3 text-left text-base font-medium cursor-pointer shrink-0 group/accordion-trigger relative flex flex-1 items-center justify-between border border-transparent transition-[opacity,border]
|
|
285
|
+
"neo-base neo-accordion-focus pt-3 text-left text-base font-medium cursor-pointer shrink-0 group/accordion-trigger relative flex flex-1 items-center justify-between border border-transparent transition-[opacity,border] data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
286
286
|
"p-4",
|
|
287
287
|
"hover:underline",
|
|
288
288
|
"group-first/accordion-item:rounded-t-base",
|
|
@@ -2028,4 +2028,4 @@ export {
|
|
|
2028
2028
|
$ as v,
|
|
2029
2029
|
ha as w
|
|
2030
2030
|
};
|
|
2031
|
-
//# sourceMappingURL=render-shared-
|
|
2031
|
+
//# sourceMappingURL=render-shared-DSYQFhTh.js.map
|