sprae 11.0.8 → 11.1.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/core.js +6 -3
- package/directive/ref.js +7 -3
- package/directive/value.js +27 -24
- package/dist/sprae.js +59 -58
- package/dist/sprae.js.map +4 -4
- package/dist/sprae.min.js +3 -3
- package/dist/sprae.min.js.map +3 -3
- package/dist/sprae.umd.js +87 -85
- package/dist/sprae.umd.js.map +4 -4
- package/dist/sprae.umd.min.js +3 -3
- package/dist/sprae.umd.min.js.map +3 -3
- package/package.json +1 -1
- package/readme.md +6 -14
package/core.js
CHANGED
|
@@ -15,8 +15,11 @@ const directive = {}
|
|
|
15
15
|
* @param {(el: Element, state: Object, attrValue: string, attrName: string) => (value: any) => void} create - A function to create the directive.
|
|
16
16
|
* @param {(expr: string) => (state: Object) => any} [p=parse] - Create evaluator from expression string.
|
|
17
17
|
*/
|
|
18
|
-
export const dir = (name, create, p=parse) => directive[name] = (el, expr, state, name, update, evaluate) =>
|
|
19
|
-
|
|
18
|
+
export const dir = (name, create, p = parse) => directive[name] = (el, expr, state, name, update, evaluate) => (
|
|
19
|
+
evaluate = p(expr),
|
|
20
|
+
update = create(el, state, expr, name, evaluate),
|
|
21
|
+
() => update(evaluate(state))
|
|
22
|
+
)
|
|
20
23
|
|
|
21
24
|
/**
|
|
22
25
|
* Applies directives to an HTML element and manages its reactive state.
|
|
@@ -112,7 +115,7 @@ export const parse = (expr, dir) => {
|
|
|
112
115
|
* @throws {Error} The enhanced error object with a formatted message.
|
|
113
116
|
*/
|
|
114
117
|
export const err = (e, dir, expr = '') => {
|
|
115
|
-
throw Object.assign(e, { message: `∴ ${e.message}\n\n${dir}${expr ? `="${expr}"\n\n` : ""}`, expr })
|
|
118
|
+
throw Object.assign(e, { message: `∴ ${e.message}\n\n${dir || ''}${expr ? `="${expr}"\n\n` : ""}`, expr })
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
/**
|
package/directive/ref.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { dir } from "../core.js";
|
|
1
|
+
import { dir, parse } from "../core.js";
|
|
2
|
+
import { setter, ensure } from "./value.js";
|
|
2
3
|
|
|
3
|
-
dir('ref', (el, state, expr) => (
|
|
4
|
-
|
|
4
|
+
dir('ref', (el, state, expr, _, ev) => (
|
|
5
|
+
ensure(state, expr),
|
|
6
|
+
ev(state) == null ?
|
|
7
|
+
(setter(expr)(state, el), _ => _) :
|
|
8
|
+
v => v.call(null, el)
|
|
5
9
|
))
|
package/directive/value.js
CHANGED
|
@@ -29,36 +29,39 @@ dir('value', (el, state, expr) => {
|
|
|
29
29
|
} :
|
|
30
30
|
(value) => (el.value = value);
|
|
31
31
|
|
|
32
|
+
// make sure value exists in state
|
|
33
|
+
ensure(state, expr)
|
|
34
|
+
|
|
32
35
|
// bind ui back to value
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
el.type === '
|
|
36
|
-
|
|
36
|
+
try {
|
|
37
|
+
const set = setter(expr)
|
|
38
|
+
const handleChange = el.type === 'checkbox' ? () => set(state, el.checked) :
|
|
39
|
+
el.type === 'select-multiple' ? () => set(state, [...el.selectedOptions].map(o => o.value)) :
|
|
40
|
+
() => set(state, el.selectedIndex < 0 ? null : el.value)
|
|
37
41
|
|
|
38
|
-
|
|
42
|
+
el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually via `.oninput = somethingElse` - it saves 5 loc vs addEventListener
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
if (el.type?.startsWith('select')) {
|
|
45
|
+
// select element also must observe any added/removed options or changed values (outside of sprae)
|
|
46
|
+
new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
// select options must be initialized before calling an update
|
|
49
|
+
sprae(el, state)
|
|
50
|
+
}
|
|
51
|
+
} catch {}
|
|
47
52
|
|
|
48
53
|
return update
|
|
49
54
|
})
|
|
50
55
|
|
|
51
56
|
// create expression setter, reflecting value back to state
|
|
52
|
-
export const setter = expr =>
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
catch (e) { }
|
|
64
|
-
}
|
|
57
|
+
export const setter = (expr, set = parse(`${expr}=__`)) => (
|
|
58
|
+
// FIXME: if there's a simpler way to set value in justin?
|
|
59
|
+
(state, value) => (
|
|
60
|
+
state.__ = value,
|
|
61
|
+
set(state, value),
|
|
62
|
+
delete state.__
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
// make sure state contains first element of path, eg. `a` from `a.b[c]`
|
|
67
|
+
export const ensure = (state, expr, name = expr.match(/^\w+(?=\s*(?:\.|\[|$))/)) => name && (state[name[0]] ||= null)
|
package/dist/sprae.js
CHANGED
|
@@ -135,7 +135,7 @@ var _state = Symbol("state");
|
|
|
135
135
|
var _on = Symbol("on");
|
|
136
136
|
var _off = Symbol("off");
|
|
137
137
|
var directive = {};
|
|
138
|
-
var dir = (name, create, p = parse) => directive[name] = (el, expr, state, name2, update, evaluate) => (evaluate = p(expr), update = create(el, state, expr, name2), () => update(evaluate(state)));
|
|
138
|
+
var dir = (name, create, p = parse) => directive[name] = (el, expr, state, name2, update, evaluate) => (evaluate = p(expr), update = create(el, state, expr, name2, evaluate), () => update(evaluate(state)));
|
|
139
139
|
function sprae(el, values) {
|
|
140
140
|
if (!el?.childNodes) return;
|
|
141
141
|
if (_state in el) {
|
|
@@ -183,7 +183,7 @@ var parse = (expr, dir2) => {
|
|
|
183
183
|
var err = (e, dir2, expr = "") => {
|
|
184
184
|
throw Object.assign(e, { message: `\u2234 ${e.message}
|
|
185
185
|
|
|
186
|
-
${dir2}${expr ? `="${expr}"
|
|
186
|
+
${dir2 || ""}${expr ? `="${expr}"
|
|
187
187
|
|
|
188
188
|
` : ""}`, expr });
|
|
189
189
|
};
|
|
@@ -291,46 +291,6 @@ dir(
|
|
|
291
291
|
(expr) => parse(expr.split(/\s+in\s+/)[1])
|
|
292
292
|
);
|
|
293
293
|
|
|
294
|
-
// directive/ref.js
|
|
295
|
-
dir("ref", (el, state, expr) => (v) => v.call(null, el));
|
|
296
|
-
|
|
297
|
-
// directive/with.js
|
|
298
|
-
dir("with", (el, rootState, state) => (state = null, (values) => sprae(el, state ? values : state = store(values, rootState))));
|
|
299
|
-
|
|
300
|
-
// directive/text.js
|
|
301
|
-
dir("text", (el) => (
|
|
302
|
-
// <template :text="a"/> or previously initialized template
|
|
303
|
-
(el.content && el.replaceWith(el = frag(el).childNodes[0]), (value) => el.textContent = value == null ? "" : value)
|
|
304
|
-
));
|
|
305
|
-
|
|
306
|
-
// directive/class.js
|
|
307
|
-
dir(
|
|
308
|
-
"class",
|
|
309
|
-
(el, cur) => (cur = /* @__PURE__ */ new Set(), (v) => {
|
|
310
|
-
let clsx = /* @__PURE__ */ new Set();
|
|
311
|
-
if (v) {
|
|
312
|
-
if (typeof v === "string") v.split(" ").map((cls) => clsx.add(cls));
|
|
313
|
-
else if (Array.isArray(v)) v.map((v2) => v2 && clsx.add(v2));
|
|
314
|
-
else Object.entries(v).map(([k, v2]) => v2 && clsx.add(k));
|
|
315
|
-
}
|
|
316
|
-
for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls);
|
|
317
|
-
else el.classList.remove(cls);
|
|
318
|
-
for (let cls of cur = clsx) el.classList.add(cls);
|
|
319
|
-
})
|
|
320
|
-
);
|
|
321
|
-
|
|
322
|
-
// directive/style.js
|
|
323
|
-
dir(
|
|
324
|
-
"style",
|
|
325
|
-
(el, initStyle) => (initStyle = el.getAttribute("style"), (v) => {
|
|
326
|
-
if (typeof v === "string") el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
|
|
327
|
-
else {
|
|
328
|
-
if (initStyle) el.setAttribute("style", initStyle);
|
|
329
|
-
for (let k in v) k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
|
|
330
|
-
}
|
|
331
|
-
})
|
|
332
|
-
);
|
|
333
|
-
|
|
334
294
|
// directive/default.js
|
|
335
295
|
dir("default", (target, state, expr, name) => {
|
|
336
296
|
if (!name.startsWith("on"))
|
|
@@ -486,27 +446,68 @@ dir("value", (el, state, expr) => {
|
|
|
486
446
|
for (let o of el.options) o.removeAttribute("selected");
|
|
487
447
|
for (let v of value) el.querySelector(`[value="${v}"]`).setAttribute("selected", "");
|
|
488
448
|
} : (value) => el.value = value;
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
449
|
+
ensure(state, expr);
|
|
450
|
+
try {
|
|
451
|
+
const set2 = setter(expr);
|
|
452
|
+
const handleChange = el.type === "checkbox" ? () => set2(state, el.checked) : el.type === "select-multiple" ? () => set2(state, [...el.selectedOptions].map((o) => o.value)) : () => set2(state, el.selectedIndex < 0 ? null : el.value);
|
|
453
|
+
el.oninput = el.onchange = handleChange;
|
|
454
|
+
if (el.type?.startsWith("select")) {
|
|
455
|
+
new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });
|
|
456
|
+
sprae(el, state);
|
|
457
|
+
}
|
|
458
|
+
} catch {
|
|
495
459
|
}
|
|
496
460
|
return update;
|
|
497
461
|
});
|
|
498
|
-
var setter = (expr) =>
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
};
|
|
506
|
-
} catch (e) {
|
|
507
|
-
}
|
|
462
|
+
var setter = (expr, set2 = parse(`${expr}=__`)) => (
|
|
463
|
+
// FIXME: if there's a simpler way to set value in justin?
|
|
464
|
+
(state, value) => (state.__ = value, set2(state, value), delete state.__)
|
|
465
|
+
);
|
|
466
|
+
var ensure = (state, expr, name = expr.match(/^\w+(?=\s*(?:\.|\[|$))/)) => {
|
|
467
|
+
var _a;
|
|
468
|
+
return name && (state[_a = name[0]] || (state[_a] = null));
|
|
508
469
|
};
|
|
509
470
|
|
|
471
|
+
// directive/ref.js
|
|
472
|
+
dir("ref", (el, state, expr, _, ev) => (ensure(state, expr), ev(state) == null ? (setter(expr)(state, el), (_2) => _2) : (v) => v.call(null, el)));
|
|
473
|
+
|
|
474
|
+
// directive/with.js
|
|
475
|
+
dir("with", (el, rootState, state) => (state = null, (values) => sprae(el, state ? values : state = store(values, rootState))));
|
|
476
|
+
|
|
477
|
+
// directive/text.js
|
|
478
|
+
dir("text", (el) => (
|
|
479
|
+
// <template :text="a"/> or previously initialized template
|
|
480
|
+
(el.content && el.replaceWith(el = frag(el).childNodes[0]), (value) => el.textContent = value == null ? "" : value)
|
|
481
|
+
));
|
|
482
|
+
|
|
483
|
+
// directive/class.js
|
|
484
|
+
dir(
|
|
485
|
+
"class",
|
|
486
|
+
(el, cur) => (cur = /* @__PURE__ */ new Set(), (v) => {
|
|
487
|
+
let clsx = /* @__PURE__ */ new Set();
|
|
488
|
+
if (v) {
|
|
489
|
+
if (typeof v === "string") v.split(" ").map((cls) => clsx.add(cls));
|
|
490
|
+
else if (Array.isArray(v)) v.map((v2) => v2 && clsx.add(v2));
|
|
491
|
+
else Object.entries(v).map(([k, v2]) => v2 && clsx.add(k));
|
|
492
|
+
}
|
|
493
|
+
for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls);
|
|
494
|
+
else el.classList.remove(cls);
|
|
495
|
+
for (let cls of cur = clsx) el.classList.add(cls);
|
|
496
|
+
})
|
|
497
|
+
);
|
|
498
|
+
|
|
499
|
+
// directive/style.js
|
|
500
|
+
dir(
|
|
501
|
+
"style",
|
|
502
|
+
(el, initStyle) => (initStyle = el.getAttribute("style"), (v) => {
|
|
503
|
+
if (typeof v === "string") el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
|
|
504
|
+
else {
|
|
505
|
+
if (initStyle) el.setAttribute("style", initStyle);
|
|
506
|
+
for (let k in v) k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
|
|
507
|
+
}
|
|
508
|
+
})
|
|
509
|
+
);
|
|
510
|
+
|
|
510
511
|
// directive/fx.js
|
|
511
512
|
dir("fx", (_) => (_2) => _2);
|
|
512
513
|
|
package/dist/sprae.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../signal.js", "../store.js", "../core.js", "../directive/if.js", "../directive/each.js", "../directive/
|
|
4
|
-
"sourcesContent": ["// ulive copy, stable minimal implementation\nlet current;\n\nexport let signal = (v, s, obs = new Set) => (\n s = {\n get value() {\n current?.deps.push(obs.add(current));\n return v\n },\n set value(val) {\n if (val === v) return\n v = val;\n for (let sub of obs) sub(); // notify effects\n },\n peek() { return v },\n },\n s.toJSON = s.then = s.toString = s.valueOf = () => s.value,\n s\n),\n effect = (fn, teardown, fx, deps) => (\n fx = (prev) => {\n teardown?.call?.();\n prev = current, current = fx;\n try { teardown = fn(); } finally { current = prev; }\n },\n deps = fx.deps = [],\n\n fx(),\n (dep) => { teardown?.call?.(); while (dep = deps.pop()) dep.delete(fx); }\n ),\n computed = (fn, s = signal(), c, e) => (\n c = {\n get value() {\n e ||= effect(() => s.value = fn());\n return s.value\n },\n peek: s.peek\n },\n c.toJSON = c.then = c.toString = c.valueOf = () => c.value,\n c\n ),\n batch = fn => fn(),\n untracked = batch\n\n// signals adapter - allows switching signals implementation and not depend on core\n\nexport function use(s) {\n signal = s.signal\n effect = s.effect\n computed = s.computed\n batch = s.batch || batch\n untracked = s.untracked || batch\n}\n", "// signals-based proxy\nimport { signal, computed, batch, untracked } from './signal.js'\n\nexport const _signals = Symbol('signals'), _change = Symbol('change');\n\n// object store is not lazy\nexport default function store(values, parent) {\n if (!values) return values\n\n // ignore existing state as argument\n if (values[_signals]) return values;\n\n // redirect for optimized array store\n if (Array.isArray(values)) return list(values)\n\n // ignore non-objects or custom objects\n if (values.constructor !== Object || values[Symbol.toStringTag]) return values;\n\n // NOTE: if you decide to unlazy values, think about large arrays - init upfront can be costly\n let signals = { ...parent?.[_signals] }, _len = signal(Object.values(values).length)\n\n // proxy conducts prop access to signals\n const state = new Proxy(signals, {\n get: (_, key) => key === _change ? _len : key === _signals ? signals : signals[key]?.valueOf(),\n set: (_, key, v, s) => (s = signals[key], set(signals, key, v), s ?? (++_len.value), 1), // bump length for new signal\n deleteProperty: (_, key) => (signals[key] && (del(signals, key), _len.value--), 1),\n ownKeys() {\n // subscribe to length when object is spread\n _len.value\n return Reflect.ownKeys(signals);\n },\n })\n\n // init signals for values\n for (let key in values) {\n const desc = Object.getOwnPropertyDescriptor(values, key)\n\n // getter turns into computed\n if (desc?.get) {\n // stash setter\n (signals[key] = computed(desc.get.bind(state)))._set = desc.set?.bind(state);\n }\n else {\n // init blank signal - make sure we don't take prototype one\n signals[key] = undefined\n set(signals, key, values[key]);\n }\n }\n\n return state\n}\n\n// length changing methods\nconst mut = { push: 1, pop: 1, shift: 1, unshift: 1, splice: 1 }\n\n// array store - signals are lazy since arrays can be very large & expensive\nexport function list(values) {\n // track last accessed property to find out if .length was directly accessed from expression or via .push/etc method\n let lastProp\n\n // ignore existing state as argument\n if (values[_signals]) return values;\n\n // .length signal is stored separately, since it cannot be replaced on array\n let _len = signal(values.length),\n // gotta fill with null since proto methods like .reduce may fail\n signals = Array(values.length).fill();\n\n // proxy conducts prop access to signals\n const state = new Proxy(signals, {\n get(_, key) {\n // covers Symbol.isConcatSpreadable etc.\n if (typeof key === 'symbol') return key === _change ? _len : key === _signals ? signals : signals[key]\n\n // if .length is read within .push/etc - peek signal to avoid recursive subscription\n if (key === 'length') return mut[lastProp] ? _len.peek() : _len.value;\n\n lastProp = key;\n\n if (signals[key]) return signals[key].valueOf()\n\n // I hope reading values here won't diverge from signals\n if (key < signals.length) return (signals[key] = signal(store(values[key]))).value\n },\n\n set(_, key, v) {\n // .length\n if (key === 'length') {\n // force cleaning up tail\n for (let i = v, l = signals.length; i < l; i++) delete state[i]\n // .length = N directly\n _len.value = signals.length = v;\n return true\n }\n\n set(signals, key, v)\n\n // force changing length, if eg. a=[]; a[1]=1 - need to come after setting the item\n if (key >= _len.peek()) _len.value = signals.length = Number(key) + 1\n\n return true\n },\n\n deleteProperty: (_, key) => (signals[key] && del(signals, key), 1),\n\n })\n\n return state\n}\n\n// set/update signal value\nfunction set(signals, key, v) {\n let s = signals[key]\n\n // untracked\n if (key[0] === '_') signals[key] = v\n // new property\n else if (!s) {\n // preserve signal value as is\n signals[key] = s = v?.peek ? v : signal(store(v))\n }\n // skip unchanged (although can be handled by last condition - we skip a few checks this way)\n else if (v === s.peek());\n // stashed _set for value with getter/setter\n else if (s._set) s._set(v)\n // patch array\n else if (Array.isArray(v) && Array.isArray(s.peek())) {\n const cur = s.peek()\n // if we update plain array (stored in signal) - take over value instead\n if (cur[_change]) {\n batch(() => {\n let i = 0, l = v.length;\n for (; i < l; i++) cur[i] = v[i]\n cur.length = l // forces deleting tail signals\n })\n }\n else {\n s.value = v\n }\n }\n // .x = y\n else {\n s.value = store(v)\n }\n}\n\n// delete signal\nfunction del(signals, key) {\n const s = signals[key], del = s[Symbol.dispose]\n if (del) delete s[Symbol.dispose]\n delete signals[key]\n del?.()\n}\n", "import { use, effect } from \"./signal.js\";\nimport store, { _signals } from './store.js';\n\n// polyfill\nconst _dispose = (Symbol.dispose ||= Symbol(\"dispose\"));\n\nexport const _state = Symbol(\"state\"), _on = Symbol('on'), _off = Symbol('off')\n\n// registered directives\nconst directive = {}\n\n/**\n * Register a directive with a parsed expression and evaluator.\n * @param {string} name - The name of the directive.\n * @param {(el: Element, state: Object, attrValue: string, attrName: string) => (value: any) => void} create - A function to create the directive.\n * @param {(expr: string) => (state: Object) => any} [p=parse] - Create evaluator from expression string.\n */\nexport const dir = (name, create, p=parse) => directive[name] = (el, expr, state, name, update, evaluate) =>\n (evaluate = p(expr), update = create(el, state, expr, name), () => update(evaluate(state)))\n\n/**\n * Applies directives to an HTML element and manages its reactive state.\n *\n * @param {Element} el - The target HTML element to apply directives to.\n * @param {Object} [values] - Initial values to populate the element's reactive state.\n * @returns {Object} The reactive state object associated with the element.\n */\nexport default function sprae(el, values) {\n // text nodes, comments etc\n if (!el?.childNodes) return\n\n // repeated call can be caused by :each with new objects with old keys needs an update\n if (_state in el) {\n // we rewrite signals instead of update, because user should have what he provided\n return Object.assign(el[_state], values)\n }\n\n // take over existing state instead of creating clone\n const state = store(values || {}), offs = [], fx = []\n\n init(el);\n\n // if element was spraed by inline :with instruction (meaning it has extended state) - skip, otherwise save _state\n if (!(_state in el)) {\n el[_state] = state\n\n // on/off all effects\n el[_off] = () => { while (offs.length) offs.pop()() }\n el[_on] = () => offs.push(...fx.map(f => effect(f)))\n\n // destroy\n el[_dispose] = () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = null)\n }\n\n return state;\n\n function init(el) {\n // ignore text nodes, comments etc\n if (!el.childNodes) return\n\n // init generic-name attributes second\n for (let i = 0; i < el.attributes?.length;) {\n let attr = el.attributes[i], update;\n\n if (attr.name[0] === ':') {\n el.removeAttribute(attr.name);\n\n // multiple attributes like :id:for=\"\"\n for (let name of attr.name.slice(1).split(':')) {\n update = (directive[name] || directive.default)(el, attr.value, state, name)\n\n fx.push(update), offs.push(effect(update)) // save & start effect\n\n // stop after :each, :if, :with?\n if (_state in el) return\n }\n } else i++;\n }\n\n for (let child of [...el.childNodes]) init(child);\n };\n}\n\n\nconst memo = {};\n/**\n * Parses an expression into an evaluator function, caching the result for reuse.\n *\n * @param {string} expr - The expression to parse and compile into a function.\n * @param {string} dir - The directive associated with the expression (used for error reporting).\n * @returns {Function} The compiled evaluator function for the expression.\n */\nexport const parse = (expr, dir) => {\n let fn\n\n if (fn = memo[expr = expr.trim()]) return fn\n\n // static-time errors\n try { fn = compile(expr) }\n catch (e) { err(e, dir, expr) }\n\n // runtime errors\n return memo[expr] = fn\n}\n\n/**\n * Branded sprae error with context about the directive and expression\n *\n * @param {Error} e - The original error object to enhance.\n * @param {string} dir - The directive where the error occurred.\n * @param {string} [expr=''] - The expression associated with the error, if any.\n * @throws {Error} The enhanced error object with a formatted message.\n */\nexport const err = (e, dir, expr = '') => {\n throw Object.assign(e, { message: `\u2234 ${e.message}\\n\\n${dir}${expr ? `=\"${expr}\"\\n\\n` : \"\"}`, expr })\n}\n\n/**\n * Compiles an expression into an evaluator function.\n *\n * @type {(expr: string) => Function}\n */\nexport let compile\n\n// configure signals/compile\n// it's more compact than using sprae.signal = signal etc.\nsprae.use = s => {\n s.signal && use(s);\n s.compile && (compile = s.compile);\n}\n\n\n// instantiated <template> fragment holder, like persisting fragment but with minimal API surface\nexport const frag = (tpl) => {\n if (!tpl.nodeType) return tpl // existing tpl\n\n let content = tpl.content.cloneNode(true),\n attributes = [...tpl.attributes],\n ref = document.createTextNode(''),\n // ensure at least one node\n childNodes = (content.append(ref), [...content.childNodes])\n\n return {\n // get parentNode() { return childNodes[0].parentNode },\n childNodes,\n content,\n remove: () => content.append(...childNodes),\n replaceWith(el) {\n if (el === ref) return\n ref.before(el)\n content.append(...childNodes)\n },\n attributes,\n removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) },\n setAttributeNode() { }\n }\n}\n", "import sprae, { dir, _state, _on, _off, frag } from \"../core.js\";\n\n// :if is interchangeable with :each depending on order, :if :each or :each :if have different meanings\n// as for :if :with - :if must init first, since it is lazy, to avoid initializing component ahead of time by :with\n// we consider :with={x} :if={x} case insignificant\nconst _prevIf = Symbol(\"if\");\n\ndir('if', (el, state) => {\n const holder = document.createTextNode('')\n\n let next = el.nextElementSibling,\n curEl, ifEl, elseEl;\n\n el.replaceWith(holder)\n\n ifEl = el.content ? frag(el) : el\n ifEl[_state] = null // mark el as fake-spraed to holdon init, since we sprae rest when branch matches\n\n if (next?.hasAttribute(\":else\")) {\n next.removeAttribute(\":else\");\n // if next is :else :if - leave it for its own :if handler\n if (!next.hasAttribute(\":if\")) next.remove(), elseEl = next.content ? frag(next) : next, elseEl[_state] = null\n }\n\n return (value) => {\n const newEl = value ? ifEl : el[_prevIf] ? null : elseEl;\n if (next) next[_prevIf] = newEl === ifEl\n if (curEl != newEl) {\n // disable effects on child elements when element is not matched\n if (curEl) curEl.remove(), curEl[_off]?.();\n if (curEl = newEl) {\n holder.before(curEl.content || curEl)\n curEl[_state] === null && delete curEl[_state] // remove fake memo to sprae as new\n // enable effects if branch is matched\n curEl[_state] ? curEl[_on]() : sprae(curEl, state)\n }\n }\n };\n})\n", "import sprae, { _state, dir, frag, parse } from \"../core.js\";\nimport store, { _change, _signals } from \"../store.js\";\nimport { effect } from '../signal.js';\n\n\ndir('each', (tpl, state, expr) => {\n const [itemVar, idxVar = \"$\"] = expr.split(/\\s+in\\s+/)[0].split(/\\s*,\\s*/);\n\n // we need :if to be able to replace holder instead of tpl for :if :each case\n const holder = document.createTextNode(\"\");\n tpl.replaceWith(holder);\n tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template\n\n // we re-create items any time new items are produced\n let cur, keys, items, prevl = 0\n\n const update = () => {\n let i = 0, newItems = items, newl = newItems.length\n\n // plain array update, not store (signal with array) - updates full list\n if (cur && !cur[_change]) {\n for (let s of cur[_signals] || []) s[Symbol.dispose]()\n cur = null, prevl = 0\n }\n\n // delete\n if (newl < prevl) cur.length = newl\n\n // update, append, init\n else {\n // init\n if (!cur) cur = newItems\n // update\n else while (i < prevl) cur[i] = newItems[i++]\n\n // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n let idx = i,\n scope = store({\n [itemVar]: cur[_signals]?.[idx] || cur[idx],\n [idxVar]: keys ? keys[idx] : idx\n }, state),\n el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n\n holder.before(el.content || el);\n sprae(el, scope);\n\n // signal/holder disposal removes element\n ((cur[_signals] ||= [])[i] ||= {})[Symbol.dispose] = () => {\n el[Symbol.dispose]?.(), el.remove()\n };\n }\n }\n\n prevl = newl\n }\n\n return value => {\n keys = null\n if (typeof value === \"number\") items = Array.from({ length: value }, (_, i) => i + 1)\n else if (value?.constructor === Object) keys = Object.keys(value), items = Object.values(value)\n else items = value || []\n\n // whenever list changes, we rebind internal change effect\n let planned = 0\n return effect(() => {\n // subscribe to items change (.length) - we do it every time (not just in update) since preact unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n if (!planned++) update(), queueMicrotask(() => (planned > 1 && update(), planned = 0));\n })\n }\n },\n\n // redefine evaluator to take second part of expression\n expr => parse(expr.split(/\\s+in\\s+/)[1])\n)\n", "import { dir } from \"../core.js\";\n\ndir('ref', (el, state, expr) => (\n v => v.call(null, el)\n))\n", "import sprae, { dir } from \"../core.js\";\nimport store, { _signals } from '../store.js';\n\ndir('with', (el, rootState, state) => (state=null, values => sprae(el, state ? values : state = store(values, rootState))))\n", "import { dir, frag } from \"../core.js\";\n\ndir('text', el => (\n // <template :text=\"a\"/> or previously initialized template\n el.content && el.replaceWith(el = frag(el).childNodes[0]),\n value => el.textContent = value == null ? \"\" : value\n))\n", "import { dir } from \"../core.js\";\n\ndir('class', (el, cur) => (\n cur = new Set,\n v => {\n let clsx = new Set;\n if (v) {\n if (typeof v === \"string\") v.split(' ').map(cls => clsx.add(cls));\n else if (Array.isArray(v)) v.map(v => v && clsx.add(v));\n else Object.entries(v).map(([k, v]) => v && clsx.add(k));\n }\n for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls); else el.classList.remove(cls);\n for (let cls of cur = clsx) el.classList.add(cls)\n })\n)\n", "import { dir } from \"../core.js\";\n\ndir('style', (el, initStyle) => (\n initStyle = el.getAttribute(\"style\"),\n v => {\n if (typeof v === \"string\") el.setAttribute(\"style\", initStyle + (initStyle.endsWith(';') ? '' : '; ') + v);\n else {\n if (initStyle) el.setAttribute(\"style\", initStyle);\n for (let k in v) k[0] == '-' ? (el.style.setProperty(k, v[k])) : el.style[k] = v[k]\n }\n })\n)\n", "// generic property directive\nimport { dir, err } from \"../core.js\";\n\ndir('default', (target, state, expr, name) => {\n // simple prop\n if (!name.startsWith('on'))\n return name ?\n value => attr(target, name, value) :\n value => { for (let key in value) attr(target, dashcase(key), value[key]) };\n\n // bind event to a target\n // NOTE: if you decide to remove chain of events, thing again - that's unique feature of sprae, don't diminish your own value.\n // ona..onb\n const ctxs = name.split('..').map(e => {\n let ctx = { evt: '', target, test: () => true };\n ctx.evt = (e.startsWith('on') ? e.slice(2) : e).replace(/\\.(\\w+)?-?([-\\w]+)?/g,\n (_, mod, param = '') => (ctx.test = mods[mod]?.(ctx, ...param.split('-')) || ctx.test, '')\n );\n return ctx;\n });\n\n // add listener with the context\n const addListener = (fn, { evt, target, test, defer, stop, prevent, immediate, ...opts }) => {\n if (defer) fn = defer(fn)\n\n const cb = (e) => {\n try {\n test(e) && (stop && (immediate ? e.stopImmediatePropagation() : e.stopPropagation()), prevent && e.preventDefault(), fn?.call(state, e))\n } catch (error) { err(error, `:on${evt}`, fn) }\n };\n\n target.addEventListener(evt, cb, opts)\n return () => target.removeEventListener(evt, cb, opts)\n };\n\n // single event\n if (ctxs.length == 1) return v => addListener(v, ctxs[0])\n\n // events cycler\n let startFn, nextFn, off, idx = 0\n const nextListener = (fn) => {\n off = addListener((e) => (\n off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : (startFn && nextListener(startFn))\n ), ctxs[idx]);\n }\n\n return value => (\n startFn = value,\n !off && nextListener(startFn),\n () => startFn = null // nil startFn to autodispose chain\n )\n})\n\n// event modifiers\nconst mods = {\n // actions\n prevent(ctx) { ctx.prevent = true; },\n stop(ctx) { ctx.stop = true; },\n immediate(ctx) { ctx.immediate = true; },\n\n // options\n once(ctx) { ctx.once = true; },\n passive(ctx) { ctx.passive = true; },\n capture(ctx) { ctx.capture = true; },\n\n // target\n window(ctx) { ctx.target = window; },\n document(ctx) { ctx.target = document; },\n parent(ctx) { ctx.target = ctx.target.parentNode; },\n\n throttle(ctx, limit) { ctx.defer = (fn) => throttle(fn, limit ? Number(limit) || 0 : 108); },\n debounce(ctx, wait) { ctx.defer = (fn) => debounce(fn, wait ? Number(wait) || 0 : 108); },\n\n // test\n outside: (ctx) => (e) => {\n let target = ctx.target;\n if (target.contains(e.target)) return false;\n if (e.target.isConnected === false) return false;\n if (target.offsetWidth < 1 && target.offsetHeight < 1) return false;\n return true;\n },\n self: (ctx) => (e) => e.target === ctx.target,\n\n // keyboard\n ctrl: (_, ...param) => (e) => keys.ctrl(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n shift: (_, ...param) => (e) => keys.shift(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n alt: (_, ...param) => (e) => keys.alt(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n meta: (_, ...param) => (e) => keys.meta(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n // NOTE: we don't expose up/left/right/down as too verbose: can and better be handled/differentiated at once\n arrow: () => keys.arrow,\n enter: () => keys.enter,\n esc: () => keys.esc,\n tab: () => keys.tab,\n space: () => keys.space,\n delete: () => keys.delete,\n digit: () => keys.digit,\n letter: () => keys.letter,\n char: () => keys.char,\n};\n\n// key testers\nconst keys = {\n ctrl: (e) => e.ctrlKey || e.key === \"Control\" || e.key === \"Ctrl\",\n shift: (e) => e.shiftKey || e.key === \"Shift\",\n alt: (e) => e.altKey || e.key === \"Alt\",\n meta: (e) => e.metaKey || e.key === \"Meta\" || e.key === \"Command\",\n arrow: (e) => e.key.startsWith(\"Arrow\"),\n enter: (e) => e.key === \"Enter\",\n esc: (e) => e.key.startsWith(\"Esc\"),\n tab: (e) => e.key === \"Tab\",\n space: (e) => e.key === \"\u00A0\" || e.key === \"Space\" || e.key === \" \",\n delete: (e) => e.key === \"Delete\" || e.key === \"Backspace\",\n digit: (e) => /^\\d$/.test(e.key),\n letter: (e) => /^\\p{L}$/gu.test(e.key),\n char: (e) => /^\\S$/.test(e.key),\n};\n\n// create delayed fns\nconst throttle = (fn, limit) => {\n let pause, planned,\n block = (e) => {\n pause = true;\n setTimeout(() => {\n pause = false;\n // if event happened during blocked time, it schedules call by the end\n if (planned) return (planned = false), block(e), fn(e);\n }, limit);\n };\n return (e) => {\n if (pause) return (planned = true);\n block(e);\n return fn(e);\n };\n};\n\nconst debounce = (fn, wait) => {\n let timeout;\n return (e) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n timeout = null;\n fn(e);\n }, wait);\n };\n};\n\n// set attr\nexport const attr = (el, name, v) => {\n if (v == null || v === false) el.removeAttribute(name);\n else el.setAttribute(name, v === true ? \"\" : typeof v === \"number\" || typeof v === \"string\" ? v : \"\");\n}\n\nexport const dashcase = (str) => {\n return str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n}\n", "import sprae from \"../core.js\";\nimport { dir, parse } from \"../core.js\";\nimport { attr } from './default.js';\n\n\ndir('value', (el, state, expr) => {\n const update =\n (el.type === \"text\" || el.type === \"\") ?\n (value) => el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)) :\n (el.tagName === \"TEXTAREA\" || el.type === \"text\" || el.type === \"\") ?\n (value, from, to) => (\n // we retain selection in input\n (from = el.selectionStart),\n (to = el.selectionEnd),\n el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)),\n from && el.setSelectionRange(from, to)\n ) :\n (el.type === \"checkbox\") ?\n (value) => (el.checked = value, attr(el, \"checked\", value)) :\n (el.type === \"select-one\") ?\n (value) => {\n for (let o of el.options)\n o.value == value ? o.setAttribute(\"selected\", '') : o.removeAttribute(\"selected\");\n el.value = value;\n } :\n (el.type === 'select-multiple') ? (value) => {\n for (let o of el.options) o.removeAttribute('selected')\n for (let v of value) el.querySelector(`[value=\"${v}\"]`).setAttribute('selected', '')\n } :\n (value) => (el.value = value);\n\n // bind ui back to value\n let set = setter(expr)\n const handleChange = el.type === 'checkbox' ? () => set(state, el.checked) :\n el.type === 'select-multiple' ? () => set(state, [...el.selectedOptions].map(o => o.value)) :\n () => set(state, el.selectedIndex < 0 ? null : el.value)\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually via `.oninput = somethingElse` - it saves 5 loc vs addEventListener\n\n if (el.type?.startsWith('select')) {\n // select element also must observe any added/removed options or changed values (outside of sprae)\n new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });\n\n // select options must be initialized before calling an update\n sprae(el, state)\n }\n\n return update\n})\n\n// create expression setter, reflecting value back to state\nexport const setter = expr => {\n // catch wrong assigns like `123 =...`, `foo?.bar =...`\n try {\n const set = parse(`${expr}=__`);\n // FIXME: if there's a simpler way to set value in justin?\n return (state, value) => {\n state.__ = value\n set(state, value)\n delete state.__\n }\n }\n catch (e) { }\n}\n", "import { dir } from \"../core.js\";\n\ndir('fx', _ => _ => _)\n", "import { dir } from \"../core.js\";\nimport { attr, dashcase } from './default.js'\n\ndir('aria', (el) => value => {\n for (let key in value) attr(el, 'aria-' + dashcase(key), value[key] == null ? null : value[key] + '')\n})\n", "import { dir } from \"../core.js\";\n\ndir('data', el => value => {for (let key in value) el.dataset[key] = value[key];})\n", "import sprae from './core.js'\n\n// default directives\nimport './directive/if.js'\nimport './directive/each.js'\nimport './directive/ref.js'\nimport './directive/with.js'\nimport './directive/text.js'\nimport './directive/class.js'\nimport './directive/style.js'\nimport './directive/value.js'\nimport './directive/fx.js'\nimport './directive/default.js'\nimport './directive/aria.js'\nimport './directive/data.js'\n\n// default compiler (indirect new Function to avoid detector)\nsprae.use({ compile: expr => sprae.constructor(`with (arguments[0]) { return ${expr} };`) })\n\nexport default sprae\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["del", "name", "el", "attr", "dir", "keys", "
|
|
3
|
+
"sources": ["../signal.js", "../store.js", "../core.js", "../directive/if.js", "../directive/each.js", "../directive/default.js", "../directive/value.js", "../directive/ref.js", "../directive/with.js", "../directive/text.js", "../directive/class.js", "../directive/style.js", "../directive/fx.js", "../directive/aria.js", "../directive/data.js", "../sprae.js"],
|
|
4
|
+
"sourcesContent": ["// ulive copy, stable minimal implementation\nlet current;\n\nexport let signal = (v, s, obs = new Set) => (\n s = {\n get value() {\n current?.deps.push(obs.add(current));\n return v\n },\n set value(val) {\n if (val === v) return\n v = val;\n for (let sub of obs) sub(); // notify effects\n },\n peek() { return v },\n },\n s.toJSON = s.then = s.toString = s.valueOf = () => s.value,\n s\n),\n effect = (fn, teardown, fx, deps) => (\n fx = (prev) => {\n teardown?.call?.();\n prev = current, current = fx;\n try { teardown = fn(); } finally { current = prev; }\n },\n deps = fx.deps = [],\n\n fx(),\n (dep) => { teardown?.call?.(); while (dep = deps.pop()) dep.delete(fx); }\n ),\n computed = (fn, s = signal(), c, e) => (\n c = {\n get value() {\n e ||= effect(() => s.value = fn());\n return s.value\n },\n peek: s.peek\n },\n c.toJSON = c.then = c.toString = c.valueOf = () => c.value,\n c\n ),\n batch = fn => fn(),\n untracked = batch\n\n// signals adapter - allows switching signals implementation and not depend on core\n\nexport function use(s) {\n signal = s.signal\n effect = s.effect\n computed = s.computed\n batch = s.batch || batch\n untracked = s.untracked || batch\n}\n", "// signals-based proxy\nimport { signal, computed, batch, untracked } from './signal.js'\n\nexport const _signals = Symbol('signals'), _change = Symbol('change');\n\n// object store is not lazy\nexport default function store(values, parent) {\n if (!values) return values\n\n // ignore existing state as argument\n if (values[_signals]) return values;\n\n // redirect for optimized array store\n if (Array.isArray(values)) return list(values)\n\n // ignore non-objects or custom objects\n if (values.constructor !== Object || values[Symbol.toStringTag]) return values;\n\n // NOTE: if you decide to unlazy values, think about large arrays - init upfront can be costly\n let signals = { ...parent?.[_signals] }, _len = signal(Object.values(values).length)\n\n // proxy conducts prop access to signals\n const state = new Proxy(signals, {\n get: (_, key) => key === _change ? _len : key === _signals ? signals : signals[key]?.valueOf(),\n set: (_, key, v, s) => (s = signals[key], set(signals, key, v), s ?? (++_len.value), 1), // bump length for new signal\n deleteProperty: (_, key) => (signals[key] && (del(signals, key), _len.value--), 1),\n ownKeys() {\n // subscribe to length when object is spread\n _len.value\n return Reflect.ownKeys(signals);\n },\n })\n\n // init signals for values\n for (let key in values) {\n const desc = Object.getOwnPropertyDescriptor(values, key)\n\n // getter turns into computed\n if (desc?.get) {\n // stash setter\n (signals[key] = computed(desc.get.bind(state)))._set = desc.set?.bind(state);\n }\n else {\n // init blank signal - make sure we don't take prototype one\n signals[key] = undefined\n set(signals, key, values[key]);\n }\n }\n\n return state\n}\n\n// length changing methods\nconst mut = { push: 1, pop: 1, shift: 1, unshift: 1, splice: 1 }\n\n// array store - signals are lazy since arrays can be very large & expensive\nexport function list(values) {\n // track last accessed property to find out if .length was directly accessed from expression or via .push/etc method\n let lastProp\n\n // ignore existing state as argument\n if (values[_signals]) return values;\n\n // .length signal is stored separately, since it cannot be replaced on array\n let _len = signal(values.length),\n // gotta fill with null since proto methods like .reduce may fail\n signals = Array(values.length).fill();\n\n // proxy conducts prop access to signals\n const state = new Proxy(signals, {\n get(_, key) {\n // covers Symbol.isConcatSpreadable etc.\n if (typeof key === 'symbol') return key === _change ? _len : key === _signals ? signals : signals[key]\n\n // if .length is read within .push/etc - peek signal to avoid recursive subscription\n if (key === 'length') return mut[lastProp] ? _len.peek() : _len.value;\n\n lastProp = key;\n\n if (signals[key]) return signals[key].valueOf()\n\n // I hope reading values here won't diverge from signals\n if (key < signals.length) return (signals[key] = signal(store(values[key]))).value\n },\n\n set(_, key, v) {\n // .length\n if (key === 'length') {\n // force cleaning up tail\n for (let i = v, l = signals.length; i < l; i++) delete state[i]\n // .length = N directly\n _len.value = signals.length = v;\n return true\n }\n\n set(signals, key, v)\n\n // force changing length, if eg. a=[]; a[1]=1 - need to come after setting the item\n if (key >= _len.peek()) _len.value = signals.length = Number(key) + 1\n\n return true\n },\n\n deleteProperty: (_, key) => (signals[key] && del(signals, key), 1),\n\n })\n\n return state\n}\n\n// set/update signal value\nfunction set(signals, key, v) {\n let s = signals[key]\n\n // untracked\n if (key[0] === '_') signals[key] = v\n // new property\n else if (!s) {\n // preserve signal value as is\n signals[key] = s = v?.peek ? v : signal(store(v))\n }\n // skip unchanged (although can be handled by last condition - we skip a few checks this way)\n else if (v === s.peek());\n // stashed _set for value with getter/setter\n else if (s._set) s._set(v)\n // patch array\n else if (Array.isArray(v) && Array.isArray(s.peek())) {\n const cur = s.peek()\n // if we update plain array (stored in signal) - take over value instead\n if (cur[_change]) {\n batch(() => {\n let i = 0, l = v.length;\n for (; i < l; i++) cur[i] = v[i]\n cur.length = l // forces deleting tail signals\n })\n }\n else {\n s.value = v\n }\n }\n // .x = y\n else {\n s.value = store(v)\n }\n}\n\n// delete signal\nfunction del(signals, key) {\n const s = signals[key], del = s[Symbol.dispose]\n if (del) delete s[Symbol.dispose]\n delete signals[key]\n del?.()\n}\n", "import { use, effect } from \"./signal.js\";\nimport store, { _signals } from './store.js';\n\n// polyfill\nconst _dispose = (Symbol.dispose ||= Symbol(\"dispose\"));\n\nexport const _state = Symbol(\"state\"), _on = Symbol('on'), _off = Symbol('off')\n\n// registered directives\nconst directive = {}\n\n/**\n * Register a directive with a parsed expression and evaluator.\n * @param {string} name - The name of the directive.\n * @param {(el: Element, state: Object, attrValue: string, attrName: string) => (value: any) => void} create - A function to create the directive.\n * @param {(expr: string) => (state: Object) => any} [p=parse] - Create evaluator from expression string.\n */\nexport const dir = (name, create, p = parse) => directive[name] = (el, expr, state, name, update, evaluate) => (\n evaluate = p(expr),\n update = create(el, state, expr, name, evaluate),\n () => update(evaluate(state))\n)\n\n/**\n * Applies directives to an HTML element and manages its reactive state.\n *\n * @param {Element} el - The target HTML element to apply directives to.\n * @param {Object} [values] - Initial values to populate the element's reactive state.\n * @returns {Object} The reactive state object associated with the element.\n */\nexport default function sprae(el, values) {\n // text nodes, comments etc\n if (!el?.childNodes) return\n\n // repeated call can be caused by :each with new objects with old keys needs an update\n if (_state in el) {\n // we rewrite signals instead of update, because user should have what he provided\n return Object.assign(el[_state], values)\n }\n\n // take over existing state instead of creating clone\n const state = store(values || {}), offs = [], fx = []\n\n init(el);\n\n // if element was spraed by inline :with instruction (meaning it has extended state) - skip, otherwise save _state\n if (!(_state in el)) {\n el[_state] = state\n\n // on/off all effects\n el[_off] = () => { while (offs.length) offs.pop()() }\n el[_on] = () => offs.push(...fx.map(f => effect(f)))\n\n // destroy\n el[_dispose] = () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = null)\n }\n\n return state;\n\n function init(el) {\n // ignore text nodes, comments etc\n if (!el.childNodes) return\n\n // init generic-name attributes second\n for (let i = 0; i < el.attributes?.length;) {\n let attr = el.attributes[i], update;\n\n if (attr.name[0] === ':') {\n el.removeAttribute(attr.name);\n\n // multiple attributes like :id:for=\"\"\n for (let name of attr.name.slice(1).split(':')) {\n update = (directive[name] || directive.default)(el, attr.value, state, name)\n\n fx.push(update), offs.push(effect(update)) // save & start effect\n\n // stop after :each, :if, :with?\n if (_state in el) return\n }\n } else i++;\n }\n\n for (let child of [...el.childNodes]) init(child);\n };\n}\n\n\nconst memo = {};\n/**\n * Parses an expression into an evaluator function, caching the result for reuse.\n *\n * @param {string} expr - The expression to parse and compile into a function.\n * @param {string} dir - The directive associated with the expression (used for error reporting).\n * @returns {Function} The compiled evaluator function for the expression.\n */\nexport const parse = (expr, dir) => {\n let fn\n\n if (fn = memo[expr = expr.trim()]) return fn\n\n // static-time errors\n try { fn = compile(expr) }\n catch (e) { err(e, dir, expr) }\n\n // runtime errors\n return memo[expr] = fn\n}\n\n/**\n * Branded sprae error with context about the directive and expression\n *\n * @param {Error} e - The original error object to enhance.\n * @param {string} dir - The directive where the error occurred.\n * @param {string} [expr=''] - The expression associated with the error, if any.\n * @throws {Error} The enhanced error object with a formatted message.\n */\nexport const err = (e, dir, expr = '') => {\n throw Object.assign(e, { message: `\u2234 ${e.message}\\n\\n${dir || ''}${expr ? `=\"${expr}\"\\n\\n` : \"\"}`, expr })\n}\n\n/**\n * Compiles an expression into an evaluator function.\n *\n * @type {(expr: string) => Function}\n */\nexport let compile\n\n// configure signals/compile\n// it's more compact than using sprae.signal = signal etc.\nsprae.use = s => {\n s.signal && use(s);\n s.compile && (compile = s.compile);\n}\n\n\n// instantiated <template> fragment holder, like persisting fragment but with minimal API surface\nexport const frag = (tpl) => {\n if (!tpl.nodeType) return tpl // existing tpl\n\n let content = tpl.content.cloneNode(true),\n attributes = [...tpl.attributes],\n ref = document.createTextNode(''),\n // ensure at least one node\n childNodes = (content.append(ref), [...content.childNodes])\n\n return {\n // get parentNode() { return childNodes[0].parentNode },\n childNodes,\n content,\n remove: () => content.append(...childNodes),\n replaceWith(el) {\n if (el === ref) return\n ref.before(el)\n content.append(...childNodes)\n },\n attributes,\n removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) },\n setAttributeNode() { }\n }\n}\n", "import sprae, { dir, _state, _on, _off, frag } from \"../core.js\";\n\n// :if is interchangeable with :each depending on order, :if :each or :each :if have different meanings\n// as for :if :with - :if must init first, since it is lazy, to avoid initializing component ahead of time by :with\n// we consider :with={x} :if={x} case insignificant\nconst _prevIf = Symbol(\"if\");\n\ndir('if', (el, state) => {\n const holder = document.createTextNode('')\n\n let next = el.nextElementSibling,\n curEl, ifEl, elseEl;\n\n el.replaceWith(holder)\n\n ifEl = el.content ? frag(el) : el\n ifEl[_state] = null // mark el as fake-spraed to holdon init, since we sprae rest when branch matches\n\n if (next?.hasAttribute(\":else\")) {\n next.removeAttribute(\":else\");\n // if next is :else :if - leave it for its own :if handler\n if (!next.hasAttribute(\":if\")) next.remove(), elseEl = next.content ? frag(next) : next, elseEl[_state] = null\n }\n\n return (value) => {\n const newEl = value ? ifEl : el[_prevIf] ? null : elseEl;\n if (next) next[_prevIf] = newEl === ifEl\n if (curEl != newEl) {\n // disable effects on child elements when element is not matched\n if (curEl) curEl.remove(), curEl[_off]?.();\n if (curEl = newEl) {\n holder.before(curEl.content || curEl)\n curEl[_state] === null && delete curEl[_state] // remove fake memo to sprae as new\n // enable effects if branch is matched\n curEl[_state] ? curEl[_on]() : sprae(curEl, state)\n }\n }\n };\n})\n", "import sprae, { _state, dir, frag, parse } from \"../core.js\";\nimport store, { _change, _signals } from \"../store.js\";\nimport { effect } from '../signal.js';\n\n\ndir('each', (tpl, state, expr) => {\n const [itemVar, idxVar = \"$\"] = expr.split(/\\s+in\\s+/)[0].split(/\\s*,\\s*/);\n\n // we need :if to be able to replace holder instead of tpl for :if :each case\n const holder = document.createTextNode(\"\");\n tpl.replaceWith(holder);\n tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template\n\n // we re-create items any time new items are produced\n let cur, keys, items, prevl = 0\n\n const update = () => {\n let i = 0, newItems = items, newl = newItems.length\n\n // plain array update, not store (signal with array) - updates full list\n if (cur && !cur[_change]) {\n for (let s of cur[_signals] || []) s[Symbol.dispose]()\n cur = null, prevl = 0\n }\n\n // delete\n if (newl < prevl) cur.length = newl\n\n // update, append, init\n else {\n // init\n if (!cur) cur = newItems\n // update\n else while (i < prevl) cur[i] = newItems[i++]\n\n // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n let idx = i,\n scope = store({\n [itemVar]: cur[_signals]?.[idx] || cur[idx],\n [idxVar]: keys ? keys[idx] : idx\n }, state),\n el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n\n holder.before(el.content || el);\n sprae(el, scope);\n\n // signal/holder disposal removes element\n ((cur[_signals] ||= [])[i] ||= {})[Symbol.dispose] = () => {\n el[Symbol.dispose]?.(), el.remove()\n };\n }\n }\n\n prevl = newl\n }\n\n return value => {\n keys = null\n if (typeof value === \"number\") items = Array.from({ length: value }, (_, i) => i + 1)\n else if (value?.constructor === Object) keys = Object.keys(value), items = Object.values(value)\n else items = value || []\n\n // whenever list changes, we rebind internal change effect\n let planned = 0\n return effect(() => {\n // subscribe to items change (.length) - we do it every time (not just in update) since preact unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n if (!planned++) update(), queueMicrotask(() => (planned > 1 && update(), planned = 0));\n })\n }\n },\n\n // redefine evaluator to take second part of expression\n expr => parse(expr.split(/\\s+in\\s+/)[1])\n)\n", "// generic property directive\nimport { dir, err } from \"../core.js\";\n\ndir('default', (target, state, expr, name) => {\n // simple prop\n if (!name.startsWith('on'))\n return name ?\n value => attr(target, name, value) :\n value => { for (let key in value) attr(target, dashcase(key), value[key]) };\n\n // bind event to a target\n // NOTE: if you decide to remove chain of events, thing again - that's unique feature of sprae, don't diminish your own value.\n // ona..onb\n const ctxs = name.split('..').map(e => {\n let ctx = { evt: '', target, test: () => true };\n ctx.evt = (e.startsWith('on') ? e.slice(2) : e).replace(/\\.(\\w+)?-?([-\\w]+)?/g,\n (_, mod, param = '') => (ctx.test = mods[mod]?.(ctx, ...param.split('-')) || ctx.test, '')\n );\n return ctx;\n });\n\n // add listener with the context\n const addListener = (fn, { evt, target, test, defer, stop, prevent, immediate, ...opts }) => {\n if (defer) fn = defer(fn)\n\n const cb = (e) => {\n try {\n test(e) && (stop && (immediate ? e.stopImmediatePropagation() : e.stopPropagation()), prevent && e.preventDefault(), fn?.call(state, e))\n } catch (error) { err(error, `:on${evt}`, fn) }\n };\n\n target.addEventListener(evt, cb, opts)\n return () => target.removeEventListener(evt, cb, opts)\n };\n\n // single event\n if (ctxs.length == 1) return v => addListener(v, ctxs[0])\n\n // events cycler\n let startFn, nextFn, off, idx = 0\n const nextListener = (fn) => {\n off = addListener((e) => (\n off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : (startFn && nextListener(startFn))\n ), ctxs[idx]);\n }\n\n return value => (\n startFn = value,\n !off && nextListener(startFn),\n () => startFn = null // nil startFn to autodispose chain\n )\n})\n\n// event modifiers\nconst mods = {\n // actions\n prevent(ctx) { ctx.prevent = true; },\n stop(ctx) { ctx.stop = true; },\n immediate(ctx) { ctx.immediate = true; },\n\n // options\n once(ctx) { ctx.once = true; },\n passive(ctx) { ctx.passive = true; },\n capture(ctx) { ctx.capture = true; },\n\n // target\n window(ctx) { ctx.target = window; },\n document(ctx) { ctx.target = document; },\n parent(ctx) { ctx.target = ctx.target.parentNode; },\n\n throttle(ctx, limit) { ctx.defer = (fn) => throttle(fn, limit ? Number(limit) || 0 : 108); },\n debounce(ctx, wait) { ctx.defer = (fn) => debounce(fn, wait ? Number(wait) || 0 : 108); },\n\n // test\n outside: (ctx) => (e) => {\n let target = ctx.target;\n if (target.contains(e.target)) return false;\n if (e.target.isConnected === false) return false;\n if (target.offsetWidth < 1 && target.offsetHeight < 1) return false;\n return true;\n },\n self: (ctx) => (e) => e.target === ctx.target,\n\n // keyboard\n ctrl: (_, ...param) => (e) => keys.ctrl(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n shift: (_, ...param) => (e) => keys.shift(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n alt: (_, ...param) => (e) => keys.alt(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n meta: (_, ...param) => (e) => keys.meta(e) && param.every((p) => (keys[p] ? keys[p](e) : e.key === p)),\n // NOTE: we don't expose up/left/right/down as too verbose: can and better be handled/differentiated at once\n arrow: () => keys.arrow,\n enter: () => keys.enter,\n esc: () => keys.esc,\n tab: () => keys.tab,\n space: () => keys.space,\n delete: () => keys.delete,\n digit: () => keys.digit,\n letter: () => keys.letter,\n char: () => keys.char,\n};\n\n// key testers\nconst keys = {\n ctrl: (e) => e.ctrlKey || e.key === \"Control\" || e.key === \"Ctrl\",\n shift: (e) => e.shiftKey || e.key === \"Shift\",\n alt: (e) => e.altKey || e.key === \"Alt\",\n meta: (e) => e.metaKey || e.key === \"Meta\" || e.key === \"Command\",\n arrow: (e) => e.key.startsWith(\"Arrow\"),\n enter: (e) => e.key === \"Enter\",\n esc: (e) => e.key.startsWith(\"Esc\"),\n tab: (e) => e.key === \"Tab\",\n space: (e) => e.key === \"\u00A0\" || e.key === \"Space\" || e.key === \" \",\n delete: (e) => e.key === \"Delete\" || e.key === \"Backspace\",\n digit: (e) => /^\\d$/.test(e.key),\n letter: (e) => /^\\p{L}$/gu.test(e.key),\n char: (e) => /^\\S$/.test(e.key),\n};\n\n// create delayed fns\nconst throttle = (fn, limit) => {\n let pause, planned,\n block = (e) => {\n pause = true;\n setTimeout(() => {\n pause = false;\n // if event happened during blocked time, it schedules call by the end\n if (planned) return (planned = false), block(e), fn(e);\n }, limit);\n };\n return (e) => {\n if (pause) return (planned = true);\n block(e);\n return fn(e);\n };\n};\n\nconst debounce = (fn, wait) => {\n let timeout;\n return (e) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n timeout = null;\n fn(e);\n }, wait);\n };\n};\n\n// set attr\nexport const attr = (el, name, v) => {\n if (v == null || v === false) el.removeAttribute(name);\n else el.setAttribute(name, v === true ? \"\" : typeof v === \"number\" || typeof v === \"string\" ? v : \"\");\n}\n\nexport const dashcase = (str) => {\n return str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n}\n", "import sprae from \"../core.js\";\nimport { dir, parse } from \"../core.js\";\nimport { attr } from './default.js';\n\n\ndir('value', (el, state, expr) => {\n const update =\n (el.type === \"text\" || el.type === \"\") ?\n (value) => el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)) :\n (el.tagName === \"TEXTAREA\" || el.type === \"text\" || el.type === \"\") ?\n (value, from, to) => (\n // we retain selection in input\n (from = el.selectionStart),\n (to = el.selectionEnd),\n el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)),\n from && el.setSelectionRange(from, to)\n ) :\n (el.type === \"checkbox\") ?\n (value) => (el.checked = value, attr(el, \"checked\", value)) :\n (el.type === \"select-one\") ?\n (value) => {\n for (let o of el.options)\n o.value == value ? o.setAttribute(\"selected\", '') : o.removeAttribute(\"selected\");\n el.value = value;\n } :\n (el.type === 'select-multiple') ? (value) => {\n for (let o of el.options) o.removeAttribute('selected')\n for (let v of value) el.querySelector(`[value=\"${v}\"]`).setAttribute('selected', '')\n } :\n (value) => (el.value = value);\n\n // make sure value exists in state\n ensure(state, expr)\n\n // bind ui back to value\n try {\n const set = setter(expr)\n const handleChange = el.type === 'checkbox' ? () => set(state, el.checked) :\n el.type === 'select-multiple' ? () => set(state, [...el.selectedOptions].map(o => o.value)) :\n () => set(state, el.selectedIndex < 0 ? null : el.value)\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually via `.oninput = somethingElse` - it saves 5 loc vs addEventListener\n\n if (el.type?.startsWith('select')) {\n // select element also must observe any added/removed options or changed values (outside of sprae)\n new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });\n\n // select options must be initialized before calling an update\n sprae(el, state)\n }\n } catch {}\n\n return update\n})\n\n// create expression setter, reflecting value back to state\nexport const setter = (expr, set = parse(`${expr}=__`)) => (\n // FIXME: if there's a simpler way to set value in justin?\n (state, value) => (\n state.__ = value,\n set(state, value),\n delete state.__\n )\n)\n\n// make sure state contains first element of path, eg. `a` from `a.b[c]`\nexport const ensure = (state, expr, name = expr.match(/^\\w+(?=\\s*(?:\\.|\\[|$))/)) => name && (state[name[0]] ||= null)\n", "import { dir, parse } from \"../core.js\";\nimport { setter, ensure } from \"./value.js\";\n\ndir('ref', (el, state, expr, _, ev) => (\n ensure(state, expr),\n ev(state) == null ?\n (setter(expr)(state, el), _ => _) :\n v => v.call(null, el)\n))\n", "import sprae, { dir } from \"../core.js\";\nimport store, { _signals } from '../store.js';\n\ndir('with', (el, rootState, state) => (state=null, values => sprae(el, state ? values : state = store(values, rootState))))\n", "import { dir, frag } from \"../core.js\";\n\ndir('text', el => (\n // <template :text=\"a\"/> or previously initialized template\n el.content && el.replaceWith(el = frag(el).childNodes[0]),\n value => el.textContent = value == null ? \"\" : value\n))\n", "import { dir } from \"../core.js\";\n\ndir('class', (el, cur) => (\n cur = new Set,\n v => {\n let clsx = new Set;\n if (v) {\n if (typeof v === \"string\") v.split(' ').map(cls => clsx.add(cls));\n else if (Array.isArray(v)) v.map(v => v && clsx.add(v));\n else Object.entries(v).map(([k, v]) => v && clsx.add(k));\n }\n for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls); else el.classList.remove(cls);\n for (let cls of cur = clsx) el.classList.add(cls)\n })\n)\n", "import { dir } from \"../core.js\";\n\ndir('style', (el, initStyle) => (\n initStyle = el.getAttribute(\"style\"),\n v => {\n if (typeof v === \"string\") el.setAttribute(\"style\", initStyle + (initStyle.endsWith(';') ? '' : '; ') + v);\n else {\n if (initStyle) el.setAttribute(\"style\", initStyle);\n for (let k in v) k[0] == '-' ? (el.style.setProperty(k, v[k])) : el.style[k] = v[k]\n }\n })\n)\n", "import { dir } from \"../core.js\";\n\ndir('fx', _ => _ => _)\n", "import { dir } from \"../core.js\";\nimport { attr, dashcase } from './default.js'\n\ndir('aria', (el) => value => {\n for (let key in value) attr(el, 'aria-' + dashcase(key), value[key] == null ? null : value[key] + '')\n})\n", "import { dir } from \"../core.js\";\n\ndir('data', el => value => {for (let key in value) el.dataset[key] = value[key];})\n", "import sprae from './core.js'\n\n// default directives\nimport './directive/if.js'\nimport './directive/each.js'\nimport './directive/ref.js'\nimport './directive/with.js'\nimport './directive/text.js'\nimport './directive/class.js'\nimport './directive/style.js'\nimport './directive/value.js'\nimport './directive/fx.js'\nimport './directive/default.js'\nimport './directive/aria.js'\nimport './directive/data.js'\n\n// default compiler (indirect new Function to avoid detector)\nsprae.use({ compile: expr => sprae.constructor(`with (arguments[0]) { return ${expr} };`) })\n\nexport default sprae\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["del", "name", "el", "attr", "dir", "keys", "target", "set", "_", "v", "_"]
|
|
7
7
|
}
|
package/dist/sprae.min.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var O,w=(e,n,t=new Set)=>(n={get value(){return O?.deps.push(t.add(O)),e},set value(r){if(r!==e){e=r;for(let i of t)i()}},peek(){return e}},n.toJSON=n.then=n.toString=n.valueOf=()=>n.value,n),x=(e,n,t,r)=>(t=i=>{n?.call?.(),i=O,O=t;try{n=e()}finally{O=i}},r=t.deps=[],t(),i=>{for(n?.call?.();i=r.pop();)i.delete(t)}),R=(e,n=w(),t,r)=>(t={get value(){return r||(r=x(()=>n.value=e())),n.value},peek:n.peek},t.toJSON=t.then=t.toString=t.valueOf=()=>t.value,t),E=e=>e(),
|
|
1
|
+
var O,w=(e,n,t=new Set)=>(n={get value(){return O?.deps.push(t.add(O)),e},set value(r){if(r!==e){e=r;for(let i of t)i()}},peek(){return e}},n.toJSON=n.then=n.toString=n.valueOf=()=>n.value,n),x=(e,n,t,r)=>(t=i=>{n?.call?.(),i=O,O=t;try{n=e()}finally{O=i}},r=t.deps=[],t(),i=>{for(n?.call?.();i=r.pop();)i.delete(t)}),R=(e,n=w(),t,r)=>(t={get value(){return r||(r=x(()=>n.value=e())),n.value},peek:n.peek},t.toJSON=t.then=t.toString=t.valueOf=()=>t.value,t),E=e=>e(),Q=E;function U(e){w=e.signal,x=e.effect,R=e.computed,E=e.batch||E,Q=e.untracked||E}var A=Symbol("signals"),$=Symbol("change");function S(e,n){if(!e||e[A])return e;if(Array.isArray(e))return ee(e);if(e.constructor!==Object||e[Symbol.toStringTag])return e;let t={...n?.[A]},r=w(Object.values(e).length);const i=new Proxy(t,{get:(o,s)=>s===$?r:s===A?t:t[s]?.valueOf(),set:(o,s,u,l)=>(l=t[s],P(t,s,u),l??++r.value,1),deleteProperty:(o,s)=>(t[s]&&(q(t,s),r.value--),1),ownKeys(){return r.value,Reflect.ownKeys(t)}});for(let o in e){const s=Object.getOwnPropertyDescriptor(e,o);s?.get?(t[o]=R(s.get.bind(i)))._set=s.set?.bind(i):(t[o]=void 0,P(t,o,e[o]))}return i}var Y={push:1,pop:1,shift:1,unshift:1,splice:1};function ee(e){let n;if(e[A])return e;let t=w(e.length),r=Array(e.length).fill();const i=new Proxy(r,{get(o,s){if(typeof s=="symbol")return s===$?t:s===A?r:r[s];if(s==="length")return Y[n]?t.peek():t.value;if(n=s,r[s])return r[s].valueOf();if(s<r.length)return(r[s]=w(S(e[s]))).value},set(o,s,u){if(s==="length"){for(let l=u,p=r.length;l<p;l++)delete i[l];return t.value=r.length=u,!0}return P(r,s,u),s>=t.peek()&&(t.value=r.length=Number(s)+1),!0},deleteProperty:(o,s)=>(r[s]&&q(r,s),1)});return i}function P(e,n,t){let r=e[n];if(n[0]==="_")e[n]=t;else if(!r)e[n]=r=t?.peek?t:w(S(t));else if(t!==r.peek())if(r._set)r._set(t);else if(Array.isArray(t)&&Array.isArray(r.peek())){const i=r.peek();i[$]?E(()=>{let o=0,s=t.length;for(;o<s;o++)i[o]=t[o];i.length=s}):r.value=t}else r.value=S(t)}function q(e,n){const t=e[n],r=t[Symbol.dispose];r&&delete t[Symbol.dispose],delete e[n],r?.()}var F=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),h=Symbol("state"),C=Symbol("on"),T=Symbol("off"),D={},m=(e,n,t=K)=>D[e]=(r,i,o,s,u,l)=>(l=t(i),u=n(r,o,i,s,l),()=>u(l(o)));function v(e,n){if(!e?.childNodes)return;if(h in e)return Object.assign(e[h],n);const t=S(n||{}),r=[],i=[];return o(e),h in e||(e[h]=t,e[T]=()=>{for(;r.length;)r.pop()()},e[C]=()=>r.push(...i.map(s=>x(s))),e[F]=()=>(e[T](),e[T]=e[C]=e[F]=e[h]=null)),t;function o(s){if(s.childNodes){for(let u=0;u<s.attributes?.length;){let l=s.attributes[u],p;if(l.name[0]===":"){s.removeAttribute(l.name);for(let y of l.name.slice(1).split(":"))if(p=(D[y]||D.default)(s,l.value,t,y),i.push(p),r.push(x(p)),h in s)return}else u++}for(let u of[...s.childNodes])o(u)}}}var J={},K=(e,n)=>{let t;if(t=J[e=e.trim()])return t;try{t=B(e)}catch(r){V(r,n,e)}return J[e]=t},V=(e,n,t="")=>{throw Object.assign(e,{message:`\u2234 ${e.message}
|
|
2
2
|
|
|
3
|
-
${n}${t?`="${t}"
|
|
3
|
+
${n||""}${t?`="${t}"
|
|
4
4
|
|
|
5
|
-
`:""}`,expr:t})},B;v.use=e=>{e.signal&&
|
|
5
|
+
`:""}`,expr:t})},B;v.use=e=>{e.signal&&U(e),e.compile&&(B=e.compile)};var W=e=>{if(!e.nodeType)return e;let n=e.content.cloneNode(!0),t=[...e.attributes],r=document.createTextNode(""),i=(n.append(r),[...n.childNodes]);return{childNodes:i,content:n,remove:()=>n.append(...i),replaceWith(o){o!==r&&(r.before(o),n.append(...i))},attributes:t,removeAttribute(o){t.splice(t.findIndex(s=>s.name===o),1)},setAttributeNode(){}}},H=Symbol("if");m("if",(e,n)=>{const t=document.createTextNode("");let r=e.nextElementSibling,i,o,s;return e.replaceWith(t),o=e.content?W(e):e,o[h]=null,r?.hasAttribute(":else")&&(r.removeAttribute(":else"),r.hasAttribute(":if")||(r.remove(),s=r.content?W(r):r,s[h]=null)),u=>{const l=u?o:e[H]?null:s;r&&(r[H]=l===o),i!=l&&(i&&(i.remove(),i[T]?.()),(i=l)&&(t.before(i.content||i),i[h]===null&&delete i[h],i[h]?i[C]():v(i,n)))}}),m("each",(e,n,t)=>{const[r,i="$"]=t.split(/\s+in\s+/)[0].split(/\s*,\s*/),o=document.createTextNode("");e.replaceWith(o),e[h]=null;let s,u,l,p=0;const y=()=>{var a,c;let d=0,b=l,g=b.length;if(s&&!s[$]){for(let _ of s[A]||[])_[Symbol.dispose]();s=null,p=0}if(g<p)s.length=g;else{if(!s)s=b;else for(;d<p;)s[d]=b[d++];for(;d<g;d++){s[d]=b[d];let _=d,L=S({[r]:s[A]?.[_]||s[_],[i]:u?u[_]:_},n),k=e.content?W(e):e.cloneNode(!0);o.before(k.content||k),v(k,L),((c=s[a=A]||(s[a]=[]))[d]||(c[d]={}))[Symbol.dispose]=()=>{k[Symbol.dispose]?.(),k.remove()}}}p=g};return a=>{u=null,typeof a=="number"?l=Array.from({length:a},(d,b)=>b+1):a?.constructor===Object?(u=Object.keys(a),l=Object.values(a)):l=a||[];let c=0;return x(()=>{l[$]?.value,c++||(y(),queueMicrotask(()=>(c>1&&y(),c=0)))})}},e=>K(e.split(/\s+in\s+/)[1])),m("default",(e,n,t,r)=>{if(!r.startsWith("on"))return r?a=>j(e,r,a):a=>{for(let c in a)j(e,X(c),a[c])};const i=r.split("..").map(a=>{let c={evt:"",target:e,test:()=>!0};return c.evt=(a.startsWith("on")?a.slice(2):a).replace(/\.(\w+)?-?([-\w]+)?/g,(d,b,g="")=>(c.test=te[b]?.(c,...g.split("-"))||c.test,"")),c}),o=(a,{evt:c,target:d,test:b,defer:g,stop:_,prevent:L,immediate:k,...I})=>{g&&(a=g(a));const M=N=>{try{b(N)&&(_&&(k?N.stopImmediatePropagation():N.stopPropagation()),L&&N.preventDefault(),a?.call(n,N))}catch(G){V(G,`:on${c}`,a)}};return d.addEventListener(c,M,I),()=>d.removeEventListener(c,M,I)};if(i.length==1)return a=>o(a,i[0]);let s,u,l,p=0;const y=a=>{l=o(c=>(l(),u=a?.(c),(p=++p%i.length)?y(u):s&&y(s)),i[p])};return a=>(s=a,!l&&y(s),()=>s=null)});var te={prevent(e){e.prevent=!0},stop(e){e.stop=!0},immediate(e){e.immediate=!0},once(e){e.once=!0},passive(e){e.passive=!0},capture(e){e.capture=!0},window(e){e.target=window},document(e){e.target=document},parent(e){e.target=e.target.parentNode},throttle(e,n){e.defer=t=>re(t,n?Number(n)||0:108)},debounce(e,n){e.defer=t=>ne(t,n?Number(n)||0:108)},outside:e=>n=>{let t=e.target;return!(t.contains(n.target)||n.target.isConnected===!1||t.offsetWidth<1&&t.offsetHeight<1)},self:e=>n=>n.target===e.target,ctrl:(e,...n)=>t=>f.ctrl(t)&&n.every(r=>f[r]?f[r](t):t.key===r),shift:(e,...n)=>t=>f.shift(t)&&n.every(r=>f[r]?f[r](t):t.key===r),alt:(e,...n)=>t=>f.alt(t)&&n.every(r=>f[r]?f[r](t):t.key===r),meta:(e,...n)=>t=>f.meta(t)&&n.every(r=>f[r]?f[r](t):t.key===r),arrow:()=>f.arrow,enter:()=>f.enter,esc:()=>f.esc,tab:()=>f.tab,space:()=>f.space,delete:()=>f.delete,digit:()=>f.digit,letter:()=>f.letter,char:()=>f.char},f={ctrl:e=>e.ctrlKey||e.key==="Control"||e.key==="Ctrl",shift:e=>e.shiftKey||e.key==="Shift",alt:e=>e.altKey||e.key==="Alt",meta:e=>e.metaKey||e.key==="Meta"||e.key==="Command",arrow:e=>e.key.startsWith("Arrow"),enter:e=>e.key==="Enter",esc:e=>e.key.startsWith("Esc"),tab:e=>e.key==="Tab",space:e=>e.key==="\xA0"||e.key==="Space"||e.key===" ",delete:e=>e.key==="Delete"||e.key==="Backspace",digit:e=>/^\d$/.test(e.key),letter:e=>/^\p{L}$/gu.test(e.key),char:e=>/^\S$/.test(e.key)},re=(e,n)=>{let t,r,i=o=>{t=!0,setTimeout(()=>{if(t=!1,r)return r=!1,i(o),e(o)},n)};return o=>t?r=!0:(i(o),e(o))},ne=(e,n)=>{let t;return r=>{clearTimeout(t),t=setTimeout(()=>{t=null,e(r)},n)}},j=(e,n,t)=>{t==null||t===!1?e.removeAttribute(n):e.setAttribute(n,t===!0?"":typeof t=="number"||typeof t=="string"?t:"")},X=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(n,t)=>(t?"-":"")+n.toLowerCase());m("value",(e,n,t)=>{const r=e.type==="text"||e.type===""?i=>e.setAttribute("value",e.value=i??""):e.tagName==="TEXTAREA"||e.type==="text"||e.type===""?(i,o,s)=>(o=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=i??""),o&&e.setSelectionRange(o,s)):e.type==="checkbox"?i=>(e.checked=i,j(e,"checked",i)):e.type==="select-one"?i=>{for(let o of e.options)o.value==i?o.setAttribute("selected",""):o.removeAttribute("selected");e.value=i}:e.type==="select-multiple"?i=>{for(let o of e.options)o.removeAttribute("selected");for(let o of i)e.querySelector(`[value="${o}"]`).setAttribute("selected","")}:i=>e.value=i;z(n,t);try{const i=Z(t),o=e.type==="checkbox"?()=>i(n,e.checked):e.type==="select-multiple"?()=>i(n,[...e.selectedOptions].map(s=>s.value)):()=>i(n,e.selectedIndex<0?null:e.value);e.oninput=e.onchange=o,e.type?.startsWith("select")&&(new MutationObserver(o).observe(e,{childList:!0,subtree:!0,attributes:!0}),v(e,n))}catch{}return r});var Z=(e,n=K(`${e}=__`))=>(t,r)=>(t.__=r,n(t,r),delete t.__),z=(e,n,t=n.match(/^\w+(?=\s*(?:\.|\[|$))/))=>{var r;return t&&(e[r=t[0]]||(e[r]=null))};m("ref",(e,n,t,r,i)=>(z(n,t),i(n)==null?(Z(t)(n,e),o=>o):o=>o.call(null,e))),m("with",(e,n,t)=>(t=null,r=>v(e,t?r:t=S(r,n)))),m("text",e=>(e.content&&e.replaceWith(e=W(e).childNodes[0]),n=>e.textContent=n??"")),m("class",(e,n)=>(n=new Set,t=>{let r=new Set;t&&(typeof t=="string"?t.split(" ").map(i=>r.add(i)):Array.isArray(t)?t.map(i=>i&&r.add(i)):Object.entries(t).map(([i,o])=>o&&r.add(i)));for(let i of n)r.has(i)?r.delete(i):e.classList.remove(i);for(let i of n=r)e.classList.add(i)})),m("style",(e,n)=>(n=e.getAttribute("style"),t=>{if(typeof t=="string")e.setAttribute("style",n+(n.endsWith(";")?"":"; ")+t);else{n&&e.setAttribute("style",n);for(let r in t)r[0]=="-"?e.style.setProperty(r,t[r]):e.style[r]=t[r]}})),m("fx",e=>n=>n),m("aria",e=>n=>{for(let t in n)j(e,"aria-"+X(t),n[t]==null?null:n[t]+"")}),m("data",e=>n=>{for(let t in n)e.dataset[t]=n[t]}),v.use({compile:e=>v.constructor(`with (arguments[0]) { return ${e} };`)});var ie=v;export{ie as default};
|