sprae 10.12.2 → 10.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/core.js CHANGED
@@ -1,9 +1,10 @@
1
- import { use } from "./signal.js";
1
+ import { use, effect } from "./signal.js";
2
2
  import store, { _signals } from './store.js';
3
3
 
4
4
  // polyfill
5
5
  const _dispose = (Symbol.dispose ||= Symbol("dispose"));
6
6
 
7
+
7
8
  // reserved directives - order matters!
8
9
  export const directive = {};
9
10
 
@@ -51,12 +52,12 @@ export default function sprae(el, values) {
51
52
  // multiple attributes like :id:for=""
52
53
  let names = attr.name.slice(1).split(':')
53
54
 
54
- // NOTE: secondary directives don't stop flow nor extend state, so no need to check
55
55
  for (let name of names) {
56
56
  let dir = directive[name] || directive.default
57
57
  let evaluate = (dir.parse || parse)(attr.value)
58
- let dispose = dir(el, evaluate, state, name);
59
- if (dispose) disposes.push(dispose);
58
+ let fn = dir(el, evaluate, state, name);
59
+ if (fn) disposes.push(effect(fn))
60
+ disposes.push(() => el.setAttributeNode(attr)) // recover attribute
60
61
  }
61
62
 
62
63
  // stop if element was spraed by internal directive
@@ -72,7 +73,7 @@ export default function sprae(el, values) {
72
73
  }
73
74
 
74
75
 
75
- // compiler
76
+ // parse expression into evaluator fn
76
77
  const evalMemo = {};
77
78
  export const parse = (expr, dir, fn) => {
78
79
  if (fn = evalMemo[expr = expr.trim()]) return fn
@@ -120,6 +121,7 @@ export const frag = (tpl) => {
120
121
  content.append(...childNodes)
121
122
  },
122
123
  attributes,
123
- removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) }
124
+ removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) },
125
+ setAttributeNode() { }
124
126
  }
125
127
  }
package/directive/aria.js CHANGED
@@ -1,10 +1,9 @@
1
1
  import { directive } from "../core.js";
2
2
  import { attr, dashcase } from './default.js'
3
- import { effect } from "../signal.js";
4
3
 
5
4
  directive['aria'] = (el, evaluate, state) => {
6
5
  const update = (value) => {
7
6
  for (let key in value) attr(el, 'aria-' + dashcase(key), value[key] == null ? null : value[key] + '');
8
7
  }
9
- return effect(() => update(evaluate(state)))
8
+ return () => update(evaluate(state))
10
9
  }
@@ -1,9 +1,8 @@
1
1
  import { directive } from "../core.js";
2
- import { effect } from "../signal.js";
3
2
 
4
3
  directive.class = (el, evaluate, state) => {
5
4
  let cur = new Set
6
- return effect(() => {
5
+ return () => {
7
6
  let v = evaluate(state);
8
7
  let clsx = new Set;
9
8
  if (v) {
@@ -13,5 +12,5 @@ directive.class = (el, evaluate, state) => {
13
12
  }
14
13
  for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls); else el.classList.remove(cls);
15
14
  for (let cls of cur = clsx) el.classList.add(cls)
16
- });
15
+ };
17
16
  };
package/directive/data.js CHANGED
@@ -1,9 +1,8 @@
1
1
  import { directive } from "../core.js";
2
- import { effect } from "../signal.js";
3
2
 
4
3
  directive['data'] = (el, evaluate, state) => {
5
- return effect(() => {
4
+ return () => {
6
5
  let value = evaluate(state)
7
6
  for (let key in value) el.dataset[key] = value[key];
8
- })
7
+ }
9
8
  }
@@ -1,14 +1,13 @@
1
1
  import { directive, err } from "../core.js";
2
- import { effect } from "../signal.js";
3
2
 
4
3
  // set generic property directive
5
4
  directive.default = (target, evaluate, state, name) => {
6
5
  // simple prop
7
- if (!name.startsWith('on')) return effect(() => {
6
+ if (!name.startsWith('on')) return () => {
8
7
  let value = evaluate(state);
9
8
  if (name) attr(target, name, value)
10
9
  else for (let key in value) attr(target, dashcase(key), value[key]);
11
- });
10
+ };
12
11
 
13
12
  // bind event to a target
14
13
  // NOTE: if you decide to remove chain of events, thing again - that's unique feature of sprae, don't diminish your own value.
@@ -22,7 +21,7 @@ directive.default = (target, evaluate, state, name) => {
22
21
  });
23
22
 
24
23
  // single event
25
- if (ctxs.length == 1) return effect(() => addListener(evaluate(state), ctxs[0]))
24
+ if (ctxs.length == 1) return () => addListener(evaluate(state), ctxs[0])
26
25
 
27
26
  // events cycler
28
27
  let startFn, nextFn, off, idx = 0
@@ -32,11 +31,11 @@ directive.default = (target, evaluate, state, name) => {
32
31
  ), ctxs[idx]);
33
32
  }
34
33
 
35
- return effect(() => (
34
+ return () => (
36
35
  startFn = evaluate(state),
37
36
  !off && nextListener(startFn),
38
37
  () => startFn = null // nil startFn to autodispose chain
39
- ))
38
+ )
40
39
 
41
40
  // add listener with the context
42
41
  function addListener(fn, { evt, target, test, defer, stop, prevent, immediate, ...opts }) {
@@ -153,5 +152,5 @@ const debounce = (fn, wait) => {
153
152
  };
154
153
 
155
154
  export const dashcase = (str) => {
156
- return str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, (match, i) => (i?'-':'') + match.toLowerCase());
155
+ return str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());
157
156
  }
package/directive/each.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import sprae, { directive, frag, parse } from "../core.js";
2
2
  import store, { _change, _signals } from "../store.js";
3
- import { effect, untracked, computed } from '../signal.js';
3
+ import { untracked, computed } from '../signal.js';
4
4
 
5
5
 
6
6
  directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
@@ -73,7 +73,7 @@ directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
73
73
  }
74
74
 
75
75
  let planned = 0
76
- return effect(() => {
76
+ return () => {
77
77
  // subscribe to items change (.length) - we do it every time (not just on init) since preact unsubscribes unused signals
78
78
  items.value[_change]?.value
79
79
 
@@ -82,7 +82,7 @@ directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
82
82
  update()
83
83
  queueMicrotask(() => (planned && update(), planned = 0))
84
84
  } else planned++
85
- })
85
+ }
86
86
  }
87
87
 
88
88
 
package/directive/fx.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { directive } from "../core.js";
2
- import { effect } from "../signal.js";
3
2
 
4
3
  directive.fx = (el, evaluate, state) => {
5
- return effect(() => evaluate(state));
4
+ return () => evaluate(state);
6
5
  };
package/directive/if.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import sprae, { directive, memo, frag } from "../core.js";
2
- import { effect } from "../signal.js";
3
2
 
4
3
  // :if is interchangeable with :each depending on order, :if :each or :each :if have different meanings
5
4
  // as for :if :with - :if must init first, since it is lazy, to avoid initializing component ahead of time by :with
@@ -21,17 +20,17 @@ directive.if = (el, evaluate, state) => {
21
20
  if (!next.hasAttribute(":if")) next.remove(), elseEl = next.content ? frag(next) : next, memo.set(elseEl, null)
22
21
  }
23
22
 
24
- return effect(() => {
23
+ return () => {
25
24
  const newEl = evaluate(state) ? ifEl : el[_prevIf] ? null : elseEl;
26
25
  if (next) next[_prevIf] = newEl === ifEl
27
26
  if (curEl != newEl) {
28
- // disable effects on removed elements to avoid internal effects from triggering on possibly null values
29
- if (curEl) curEl.remove(), curEl[Symbol.dispose]?.()
27
+ // disable effects on child elements to avoid internal effects from triggering on value changes when element's not matched
28
+ if (curEl) curEl.remove(), curEl[Symbol.dispose]?.();
30
29
  if (curEl = newEl) {
31
30
  holder.before(curEl.content || curEl)
32
31
  memo.get(curEl) === null && memo.delete(curEl) // remove fake memo to sprae as new
33
32
  sprae(curEl, state)
34
33
  }
35
34
  }
36
- });
35
+ };
37
36
  };
@@ -1,15 +1,14 @@
1
1
  import { directive } from "../core.js";
2
- import { effect } from "../signal.js";
3
2
 
4
3
  directive.style = (el, evaluate, state) => {
5
4
  let initStyle = el.getAttribute("style");
6
5
 
7
- return effect(() => {
6
+ return () => {
8
7
  let v = evaluate(state);
9
8
  if (typeof v === "string") el.setAttribute("style", initStyle + (initStyle.endsWith(';') ? '' : '; ') + v);
10
9
  else {
11
10
  if (initStyle) el.setAttribute("style", initStyle);
12
11
  for (let k in v) k[0] == '-' ? (el.style.setProperty(k, v[k])) : el.style[k] = v[k]
13
12
  }
14
- });
13
+ };
15
14
  };
package/directive/text.js CHANGED
@@ -1,13 +1,12 @@
1
1
  import { directive, frag } from "../core.js";
2
- import { effect } from "../signal.js";
3
2
 
4
3
  // set text content
5
4
  directive.text = (el, evaluate, state) => {
6
5
  // <template :text="a"/> or previously initialized template
7
6
  if (el.content) el.replaceWith(el = frag(el).childNodes[0])
8
7
 
9
- return effect(() => {
8
+ return () => {
10
9
  let value = evaluate(state);
11
10
  el.textContent = value == null ? "" : value;
12
- });
11
+ };
13
12
  };
@@ -1,7 +1,6 @@
1
1
  import sprae from "../core.js";
2
2
  import { directive, parse } from "../core.js";
3
3
  import { attr } from './default.js';
4
- import { effect } from "../signal.js";
5
4
 
6
5
  // connect expr to element value
7
6
  directive.value = (el, [getValue, setValue], state) => {
@@ -38,7 +37,7 @@ directive.value = (el, [getValue, setValue], state) => {
38
37
 
39
38
  el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually - it saves 5 loc
40
39
 
41
- return effect(() => update(getValue(state)));
40
+ return () => update(getValue(state));
42
41
  };
43
42
 
44
43
  directive.value.parse = expr => {
package/directive/with.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import sprae, { directive } from "../core.js";
2
2
  import store, { _signals } from '../store.js';
3
- import { effect } from "../signal.js";
4
3
 
5
4
  directive.with = (el, evaluate, rootState) => {
6
5
  let state
7
- return effect(() => {
6
+ return () => {
8
7
  let values = evaluate(rootState);
9
8
  sprae(el, state ? values : state = store(values, rootState))
10
- })
9
+ }
11
10
  };
package/dist/sprae.js CHANGED
@@ -171,8 +171,9 @@ function sprae(el, values) {
171
171
  for (let name of names) {
172
172
  let dir = directive[name] || directive.default;
173
173
  let evaluate = (dir.parse || parse)(attr2.value);
174
- let dispose = dir(el2, evaluate, state, name);
175
- if (dispose) disposes.push(dispose);
174
+ let fn = dir(el2, evaluate, state, name);
175
+ if (fn) disposes.push(effect(fn));
176
+ disposes.push(() => el2.setAttributeNode(attr2));
176
177
  }
177
178
  if (memo.has(el2)) return el2[_dispose] && disposes.push(el2[_dispose]);
178
179
  if (el2.parentNode !== parent) return;
@@ -219,6 +220,8 @@ var frag = (tpl) => {
219
220
  attributes,
220
221
  removeAttribute(name) {
221
222
  attributes.splice(attributes.findIndex((a) => a.name === name), 1);
223
+ },
224
+ setAttributeNode() {
222
225
  }
223
226
  };
224
227
  };
@@ -234,7 +237,7 @@ directive.if = (el, evaluate, state) => {
234
237
  next.removeAttribute(":else");
235
238
  if (!next.hasAttribute(":if")) next.remove(), elseEl = next.content ? frag(next) : next, memo.set(elseEl, null);
236
239
  }
237
- return effect(() => {
240
+ return () => {
238
241
  const newEl = evaluate(state) ? ifEl : el[_prevIf] ? null : elseEl;
239
242
  if (next) next[_prevIf] = newEl === ifEl;
240
243
  if (curEl != newEl) {
@@ -245,7 +248,7 @@ directive.if = (el, evaluate, state) => {
245
248
  sprae(curEl, state);
246
249
  }
247
250
  }
248
- });
251
+ };
249
252
  };
250
253
 
251
254
  // directive/each.js
@@ -297,13 +300,13 @@ directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
297
300
  });
298
301
  };
299
302
  let planned = 0;
300
- return effect(() => {
303
+ return () => {
301
304
  items.value[_change]?.value;
302
305
  if (!planned) {
303
306
  update();
304
307
  queueMicrotask(() => (planned && update(), planned = 0));
305
308
  } else planned++;
306
- });
309
+ };
307
310
  };
308
311
  directive.each.parse = (expr) => {
309
312
  let [leftSide, itemsExpr] = expr.split(/\s+in\s+/);
@@ -320,10 +323,10 @@ directive.ref.parse = (expr) => expr;
320
323
  // directive/with.js
321
324
  directive.with = (el, evaluate, rootState) => {
322
325
  let state;
323
- return effect(() => {
326
+ return () => {
324
327
  let values = evaluate(rootState);
325
328
  sprae(el, state ? values : state = store(values, rootState));
326
- });
329
+ };
327
330
  };
328
331
 
329
332
  // directive/html.js
@@ -338,16 +341,16 @@ directive.html = (el, evaluate, state) => {
338
341
  // directive/text.js
339
342
  directive.text = (el, evaluate, state) => {
340
343
  if (el.content) el.replaceWith(el = frag(el).childNodes[0]);
341
- return effect(() => {
344
+ return () => {
342
345
  let value = evaluate(state);
343
346
  el.textContent = value == null ? "" : value;
344
- });
347
+ };
345
348
  };
346
349
 
347
350
  // directive/class.js
348
351
  directive.class = (el, evaluate, state) => {
349
352
  let cur = /* @__PURE__ */ new Set();
350
- return effect(() => {
353
+ return () => {
351
354
  let v = evaluate(state);
352
355
  let clsx = /* @__PURE__ */ new Set();
353
356
  if (v) {
@@ -358,29 +361,29 @@ directive.class = (el, evaluate, state) => {
358
361
  for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls);
359
362
  else el.classList.remove(cls);
360
363
  for (let cls of cur = clsx) el.classList.add(cls);
361
- });
364
+ };
362
365
  };
363
366
 
364
367
  // directive/style.js
365
368
  directive.style = (el, evaluate, state) => {
366
369
  let initStyle = el.getAttribute("style");
367
- return effect(() => {
370
+ return () => {
368
371
  let v = evaluate(state);
369
372
  if (typeof v === "string") el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
370
373
  else {
371
374
  if (initStyle) el.setAttribute("style", initStyle);
372
375
  for (let k in v) k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
373
376
  }
374
- });
377
+ };
375
378
  };
376
379
 
377
380
  // directive/default.js
378
381
  directive.default = (target, evaluate, state, name) => {
379
- if (!name.startsWith("on")) return effect(() => {
382
+ if (!name.startsWith("on")) return () => {
380
383
  let value = evaluate(state);
381
384
  if (name) attr(target, name, value);
382
385
  else for (let key in value) attr(target, dashcase(key), value[key]);
383
- });
386
+ };
384
387
  const ctxs = name.split("..").map((e) => {
385
388
  let ctx = { evt: "", target, test: () => true };
386
389
  ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
@@ -389,12 +392,12 @@ directive.default = (target, evaluate, state, name) => {
389
392
  );
390
393
  return ctx;
391
394
  });
392
- if (ctxs.length == 1) return effect(() => addListener(evaluate(state), ctxs[0]));
395
+ if (ctxs.length == 1) return () => addListener(evaluate(state), ctxs[0]);
393
396
  let startFn, nextFn, off, idx = 0;
394
397
  const nextListener = (fn) => {
395
398
  off = addListener((e) => (off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : startFn && nextListener(startFn)), ctxs[idx]);
396
399
  };
397
- return effect(() => (startFn = evaluate(state), !off && nextListener(startFn), () => startFn = null));
400
+ return () => (startFn = evaluate(state), !off && nextListener(startFn), () => startFn = null);
398
401
  function addListener(fn, { evt, target: target2, test, defer, stop, prevent, immediate, ...opts }) {
399
402
  if (defer) fn = defer(fn);
400
403
  const cb = (e) => {
@@ -531,7 +534,7 @@ directive.value = (el, [getValue, setValue], state) => {
531
534
  if (el.type?.startsWith("select")) sprae(el, state);
532
535
  const handleChange = el.type === "checkbox" ? (e) => setValue(state, el.checked) : el.type === "select-multiple" ? (e) => setValue(state, [...el.selectedOptions].map((o) => o.value)) : (e) => setValue(state, el.value);
533
536
  el.oninput = el.onchange = handleChange;
534
- return effect(() => update(getValue(state)));
537
+ return () => update(getValue(state));
535
538
  };
536
539
  directive.value.parse = (expr) => {
537
540
  let evaluate = [parse(expr)];
@@ -550,7 +553,7 @@ directive.value.parse = (expr) => {
550
553
 
551
554
  // directive/fx.js
552
555
  directive.fx = (el, evaluate, state) => {
553
- return effect(() => evaluate(state));
556
+ return () => evaluate(state);
554
557
  };
555
558
 
556
559
  // sprae.js
package/dist/sprae.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../signal.js", "../store.js", "../core.js", "../directive/if.js", "../directive/each.js", "../directive/ref.js", "../directive/with.js", "../directive/html.js", "../directive/text.js", "../directive/class.js", "../directive/style.js", "../directive/default.js", "../directive/value.js", "../directive/fx.js", "../sprae.js"],
4
- "sourcesContent": ["// ulive copy, stable minimal implementation\nlet current, batched;\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) batched ? batched.add(sub) : 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) => {\n let fxs = batched;\n if (!fxs) batched = new Set;\n try { fn(); }\n finally {\n if (!fxs) {\n fxs = batched;\n batched = null;\n for (const fx of fxs) fx();\n }\n }\n },\n untracked = (fn, prev, v) => (prev = current, current = null, v = fn(), current = prev, v);\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 || (fn => fn())\n untracked = s.untracked || batch\n}\n", "// signals-based proxy\nimport { signal, computed, effect, batch, untracked } from './signal.js'\n\nexport const _signals = Symbol('signals'), _change = Symbol('length');\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 // console.log('get', key)\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 // console.log('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]) untracked(() => {\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 } from \"./signal.js\";\nimport store, { _signals } from './store.js';\n\n// polyfill\nconst _dispose = (Symbol.dispose ||= Symbol(\"dispose\"));\n\n// reserved directives - order matters!\nexport const directive = {};\n\n// every element that's in cache === directly spraed and un subsequent sprae is just updated (like each)\nexport const memo = new WeakMap();\n\n// sprae element: apply directives\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 (memo.has(el)) {\n // we rewrite signals instead of update, because user should have what he provided\n return Object.assign(memo.get(el), values)\n }\n\n // take over existing state instead of creating clone\n const state = store(values || {}), disposes = []\n\n init(el);\n\n // if element was spraed by :with or :each instruction - skip, otherwise save\n if (!memo.has(el)) memo.set(el, state);\n\n // disposer unspraes all internal elements\n el[_dispose] = () => {\n while (disposes.length) disposes.pop()();\n memo.delete(el);\n el[_dispose] = null;\n }\n\n return state;\n\n function init(el, parent = el.parentNode) {\n if (!el.childNodes) return // ignore text nodes, comments etc\n\n // init generic-name attributes second\n for (let i = 0; i < el.attributes?.length;) {\n let attr = el.attributes[i];\n\n if (attr.name[0] === ':') {\n el.removeAttribute(attr.name);\n\n // multiple attributes like :id:for=\"\"\n let names = attr.name.slice(1).split(':')\n\n // NOTE: secondary directives don't stop flow nor extend state, so no need to check\n for (let name of names) {\n let dir = directive[name] || directive.default\n let evaluate = (dir.parse || parse)(attr.value)\n let dispose = dir(el, evaluate, state, name);\n if (dispose) disposes.push(dispose);\n }\n\n // stop if element was spraed by internal directive\n if (memo.has(el)) return el[_dispose] && disposes.push(el[_dispose])\n\n // stop if element is skipped (detached) like in case of :if or :each\n if (el.parentNode !== parent) return\n } else i++;\n }\n\n for (let child of [...el.childNodes]) init(child, el);\n };\n}\n\n\n// compiler\nconst evalMemo = {};\nexport const parse = (expr, dir, fn) => {\n if (fn = evalMemo[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 evalMemo[expr] = fn\n}\n\n// wrapped call\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\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 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 }\n}\n", "import sprae, { directive, memo, frag } from \"../core.js\";\nimport { effect } from \"../signal.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\");\ndirective.if = (el, evaluate, state) => {\n let next = el.nextElementSibling,\n holder = document.createTextNode(''),\n curEl, ifEl, elseEl;\n\n el.replaceWith(holder)\n\n ifEl = el.content ? frag(el) : el\n memo.set(ifEl, null) // mark all el as fake-spraed, because we have to sprae for real on insert\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, memo.set(elseEl, null)\n }\n\n return effect(() => {\n const newEl = evaluate(state) ? ifEl : el[_prevIf] ? null : elseEl;\n if (next) next[_prevIf] = newEl === ifEl\n if (curEl != newEl) {\n // disable effects on removed elements to avoid internal effects from triggering on possibly null values\n if (curEl) curEl.remove(), curEl[Symbol.dispose]?.()\n if (curEl = newEl) {\n holder.before(curEl.content || curEl)\n memo.get(curEl) === null && memo.delete(curEl) // remove fake memo to sprae as new\n sprae(curEl, state)\n }\n }\n });\n};\n", "import sprae, { directive, frag, parse } from \"../core.js\";\nimport store, { _change, _signals } from \"../store.js\";\nimport { effect, untracked, computed } from '../signal.js';\n\n\ndirective.each = (tpl, [itemVar, idxVar, evaluate], state) => {\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\n // we re-create items any time new items are produced\n let cur, keys, prevl = 0\n\n // separate computed effect reduces number of needed updates for the effect\n const items = computed(() => {\n keys = null\n let items = evaluate(state)\n if (typeof items === \"number\") items = Array.from({ length: items }, (_, i) => i + 1)\n if (items?.constructor === Object) keys = Object.keys(items), items = Object.values(items)\n return items || []\n })\n\n const update = () => {\n // NOTE: untracked avoids rerendering full list whenever internal items or props change\n untracked(() => {\n let i = 0, newItems = items.value, 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) {\n cur.length = newl\n }\n // update, append, init\n else {\n // init\n if (!cur) {\n cur = newItems\n }\n // update\n else {\n for (; i < prevl; i++) {\n cur[i] = newItems[i]\n }\n }\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\n let planned = 0\n return effect(() => {\n // subscribe to items change (.length) - we do it every time (not just on init) since preact unsubscribes unused signals\n items.value[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n if (!planned) {\n update()\n queueMicrotask(() => (planned && update(), planned = 0))\n } else planned++\n })\n}\n\n\n// redefine parser to exclude `[a in] b`\ndirective.each.parse = (expr) => {\n let [leftSide, itemsExpr] = expr.split(/\\s+in\\s+/);\n let [itemVar, idxVar = \"$\"] = leftSide.split(/\\s*,\\s*/);\n\n return [itemVar, idxVar, parse(itemsExpr)]\n}\n", "import { directive } from \"../core.js\";\nimport { _change, _signals } from \"../store.js\";\n\n// ref must be last within primaries, since that must be skipped by :each, but before secondaries\ndirective.ref = (el, expr, state) => {\n state[expr] = el\n}\n\ndirective.ref.parse = expr => expr\n", "import sprae, { directive } from \"../core.js\";\nimport store, { _signals } from '../store.js';\nimport { effect } from \"../signal.js\";\n\ndirective.with = (el, evaluate, rootState) => {\n let state\n return effect(() => {\n let values = evaluate(rootState);\n sprae(el, state ? values : state = store(values, rootState))\n })\n};\n", "import sprae, { directive } from \"../core.js\";\n\ndirective.html = (el, evaluate, state) => {\n let tpl = evaluate(state);\n\n if (!tpl) return\n\n let content = (tpl.content || tpl).cloneNode(true);\n el.replaceChildren(content);\n sprae(el, state);\n};\n", "import { directive, frag } from \"../core.js\";\nimport { effect } from \"../signal.js\";\n\n// set text content\ndirective.text = (el, evaluate, state) => {\n // <template :text=\"a\"/> or previously initialized template\n if (el.content) el.replaceWith(el = frag(el).childNodes[0])\n\n return effect(() => {\n let value = evaluate(state);\n el.textContent = value == null ? \"\" : value;\n });\n};\n", "import { directive } from \"../core.js\";\nimport { effect } from \"../signal.js\";\n\ndirective.class = (el, evaluate, state) => {\n let cur = new Set\n return effect(() => {\n let v = evaluate(state);\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 { directive } from \"../core.js\";\nimport { effect } from \"../signal.js\";\n\ndirective.style = (el, evaluate, state) => {\n let initStyle = el.getAttribute(\"style\");\n\n return effect(() => {\n let v = evaluate(state);\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 { directive, err } from \"../core.js\";\nimport { effect } from \"../signal.js\";\n\n// set generic property directive\ndirective.default = (target, evaluate, state, name) => {\n // simple prop\n if (!name.startsWith('on')) return effect(() => {\n let value = evaluate(state);\n if (name) attr(target, name, value)\n else for (let key in value) attr(target, dashcase(key), value[key]);\n });\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 (match, mod, param = '') => (ctx.test = mods[mod]?.(ctx, ...param.split('-')) || ctx.test, '')\n );\n return ctx;\n });\n\n // single event\n if (ctxs.length == 1) return effect(() => addListener(evaluate(state), 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 effect(() => (\n startFn = evaluate(state),\n !off && nextListener(startFn),\n () => startFn = null // nil startFn to autodispose chain\n ))\n\n // add listener with the context\n function 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?.(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};\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\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// 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\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\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 { directive, parse } from \"../core.js\";\nimport { attr } from './default.js';\nimport { effect } from \"../signal.js\";\n\n// connect expr to element value\ndirective.value = (el, [getValue, setValue], state) => {\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 // select options must be initialized before calling an update\n if (el.type?.startsWith('select')) sprae(el, state)\n\n // bind ui back to value\n const handleChange = el.type === 'checkbox' ? e => setValue(state, el.checked) : el.type === 'select-multiple' ? e => setValue(state, [...el.selectedOptions].map(o => o.value)) : e => setValue(state, el.value)\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually - it saves 5 loc\n\n return effect(() => update(getValue(state)));\n};\n\ndirective.value.parse = expr => {\n let evaluate = [parse(expr)]\n // catch wrong assigns like `123 = arguments[1]`, `foo?.bar = arguments[1]`\n try {\n const set = parse(`${expr}=__;`);\n // FIXME: if there's a simpler way to set value in justin?\n evaluate.push((state, value) => {\n state.__ = value\n let result = set(state, value)\n delete state.__\n return result\n })\n }\n catch (e) { }\n return evaluate\n}\n", "import { directive } from \"../core.js\";\nimport { effect } from \"../signal.js\";\n\ndirective.fx = (el, evaluate, state) => {\n return effect(() => evaluate(state));\n};\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/html.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'\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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",
4
+ "sourcesContent": ["// ulive copy, stable minimal implementation\nlet current, batched;\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) batched ? batched.add(sub) : 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) => {\n let fxs = batched;\n if (!fxs) batched = new Set;\n try { fn(); }\n finally {\n if (!fxs) {\n fxs = batched;\n batched = null;\n for (const fx of fxs) fx();\n }\n }\n },\n untracked = (fn, prev, v) => (prev = current, current = null, v = fn(), current = prev, v);\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 || (fn => fn())\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('length');\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 // console.log('get', key)\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 // console.log('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]) untracked(() => {\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\n\n// reserved directives - order matters!\nexport const directive = {};\n\n// every element that's in cache === directly spraed and un subsequent sprae is just updated (like each)\nexport const memo = new WeakMap();\n\n// sprae element: apply directives\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 (memo.has(el)) {\n // we rewrite signals instead of update, because user should have what he provided\n return Object.assign(memo.get(el), values)\n }\n\n // take over existing state instead of creating clone\n const state = store(values || {}), disposes = []\n\n init(el);\n\n // if element was spraed by :with or :each instruction - skip, otherwise save\n if (!memo.has(el)) memo.set(el, state);\n\n // disposer unspraes all internal elements\n el[_dispose] = () => {\n while (disposes.length) disposes.pop()();\n memo.delete(el);\n el[_dispose] = null;\n }\n\n return state;\n\n function init(el, parent = el.parentNode) {\n if (!el.childNodes) return // ignore text nodes, comments etc\n\n // init generic-name attributes second\n for (let i = 0; i < el.attributes?.length;) {\n let attr = el.attributes[i];\n\n if (attr.name[0] === ':') {\n el.removeAttribute(attr.name);\n\n // multiple attributes like :id:for=\"\"\n let names = attr.name.slice(1).split(':')\n\n for (let name of names) {\n let dir = directive[name] || directive.default\n let evaluate = (dir.parse || parse)(attr.value)\n let fn = dir(el, evaluate, state, name);\n if (fn) disposes.push(effect(fn))\n disposes.push(() => el.setAttributeNode(attr)) // recover attribute\n }\n\n // stop if element was spraed by internal directive\n if (memo.has(el)) return el[_dispose] && disposes.push(el[_dispose])\n\n // stop if element is skipped (detached) like in case of :if or :each\n if (el.parentNode !== parent) return\n } else i++;\n }\n\n for (let child of [...el.childNodes]) init(child, el);\n };\n}\n\n\n// parse expression into evaluator fn\nconst evalMemo = {};\nexport const parse = (expr, dir, fn) => {\n if (fn = evalMemo[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 evalMemo[expr] = fn\n}\n\n// wrapped call\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\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 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, { directive, memo, 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\");\ndirective.if = (el, evaluate, state) => {\n let next = el.nextElementSibling,\n holder = document.createTextNode(''),\n curEl, ifEl, elseEl;\n\n el.replaceWith(holder)\n\n ifEl = el.content ? frag(el) : el\n memo.set(ifEl, null) // mark all el as fake-spraed, because we have to sprae for real on insert\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, memo.set(elseEl, null)\n }\n\n return () => {\n const newEl = evaluate(state) ? ifEl : el[_prevIf] ? null : elseEl;\n if (next) next[_prevIf] = newEl === ifEl\n if (curEl != newEl) {\n // disable effects on child elements to avoid internal effects from triggering on value changes when element's not matched\n if (curEl) curEl.remove(), curEl[Symbol.dispose]?.();\n if (curEl = newEl) {\n holder.before(curEl.content || curEl)\n memo.get(curEl) === null && memo.delete(curEl) // remove fake memo to sprae as new\n sprae(curEl, state)\n }\n }\n };\n};\n", "import sprae, { directive, frag, parse } from \"../core.js\";\nimport store, { _change, _signals } from \"../store.js\";\nimport { untracked, computed } from '../signal.js';\n\n\ndirective.each = (tpl, [itemVar, idxVar, evaluate], state) => {\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\n // we re-create items any time new items are produced\n let cur, keys, prevl = 0\n\n // separate computed effect reduces number of needed updates for the effect\n const items = computed(() => {\n keys = null\n let items = evaluate(state)\n if (typeof items === \"number\") items = Array.from({ length: items }, (_, i) => i + 1)\n if (items?.constructor === Object) keys = Object.keys(items), items = Object.values(items)\n return items || []\n })\n\n const update = () => {\n // NOTE: untracked avoids rerendering full list whenever internal items or props change\n untracked(() => {\n let i = 0, newItems = items.value, 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) {\n cur.length = newl\n }\n // update, append, init\n else {\n // init\n if (!cur) {\n cur = newItems\n }\n // update\n else {\n for (; i < prevl; i++) {\n cur[i] = newItems[i]\n }\n }\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\n let planned = 0\n return () => {\n // subscribe to items change (.length) - we do it every time (not just on init) since preact unsubscribes unused signals\n items.value[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n if (!planned) {\n update()\n queueMicrotask(() => (planned && update(), planned = 0))\n } else planned++\n }\n}\n\n\n// redefine parser to exclude `[a in] b`\ndirective.each.parse = (expr) => {\n let [leftSide, itemsExpr] = expr.split(/\\s+in\\s+/);\n let [itemVar, idxVar = \"$\"] = leftSide.split(/\\s*,\\s*/);\n\n return [itemVar, idxVar, parse(itemsExpr)]\n}\n", "import { directive } from \"../core.js\";\nimport { _change, _signals } from \"../store.js\";\n\n// ref must be last within primaries, since that must be skipped by :each, but before secondaries\ndirective.ref = (el, expr, state) => {\n state[expr] = el\n}\n\ndirective.ref.parse = expr => expr\n", "import sprae, { directive } from \"../core.js\";\nimport store, { _signals } from '../store.js';\n\ndirective.with = (el, evaluate, rootState) => {\n let state\n return () => {\n let values = evaluate(rootState);\n sprae(el, state ? values : state = store(values, rootState))\n }\n};\n", "import sprae, { directive } from \"../core.js\";\n\ndirective.html = (el, evaluate, state) => {\n let tpl = evaluate(state);\n\n if (!tpl) return\n\n let content = (tpl.content || tpl).cloneNode(true);\n el.replaceChildren(content);\n sprae(el, state);\n};\n", "import { directive, frag } from \"../core.js\";\n\n// set text content\ndirective.text = (el, evaluate, state) => {\n // <template :text=\"a\"/> or previously initialized template\n if (el.content) el.replaceWith(el = frag(el).childNodes[0])\n\n return () => {\n let value = evaluate(state);\n el.textContent = value == null ? \"\" : value;\n };\n};\n", "import { directive } from \"../core.js\";\n\ndirective.class = (el, evaluate, state) => {\n let cur = new Set\n return () => {\n let v = evaluate(state);\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 { directive } from \"../core.js\";\n\ndirective.style = (el, evaluate, state) => {\n let initStyle = el.getAttribute(\"style\");\n\n return () => {\n let v = evaluate(state);\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 { directive, err } from \"../core.js\";\n\n// set generic property directive\ndirective.default = (target, evaluate, state, name) => {\n // simple prop\n if (!name.startsWith('on')) return () => {\n let value = evaluate(state);\n if (name) attr(target, name, value)\n else for (let key in value) attr(target, dashcase(key), value[key]);\n };\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 (match, mod, param = '') => (ctx.test = mods[mod]?.(ctx, ...param.split('-')) || ctx.test, '')\n );\n return ctx;\n });\n\n // single event\n if (ctxs.length == 1) return () => addListener(evaluate(state), 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 () => (\n startFn = evaluate(state),\n !off && nextListener(startFn),\n () => startFn = null // nil startFn to autodispose chain\n )\n\n // add listener with the context\n function 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?.(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};\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\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// 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\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\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 { directive, parse } from \"../core.js\";\nimport { attr } from './default.js';\n\n// connect expr to element value\ndirective.value = (el, [getValue, setValue], state) => {\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 // select options must be initialized before calling an update\n if (el.type?.startsWith('select')) sprae(el, state)\n\n // bind ui back to value\n const handleChange = el.type === 'checkbox' ? e => setValue(state, el.checked) : el.type === 'select-multiple' ? e => setValue(state, [...el.selectedOptions].map(o => o.value)) : e => setValue(state, el.value)\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually - it saves 5 loc\n\n return () => update(getValue(state));\n};\n\ndirective.value.parse = expr => {\n let evaluate = [parse(expr)]\n // catch wrong assigns like `123 = arguments[1]`, `foo?.bar = arguments[1]`\n try {\n const set = parse(`${expr}=__;`);\n // FIXME: if there's a simpler way to set value in justin?\n evaluate.push((state, value) => {\n state.__ = value\n let result = set(state, value)\n delete state.__\n return result\n })\n }\n catch (e) { }\n return evaluate\n}\n", "import { directive } from \"../core.js\";\n\ndirective.fx = (el, evaluate, state) => {\n return () => evaluate(state);\n};\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/html.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'\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
6
  "names": ["del", "el", "attr", "keys", "items", "v", "target", "set"]
7
7
  }