sprae 1.0.0 → 2.0.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/sprae.js CHANGED
@@ -1,146 +1,595 @@
1
+ // node_modules/@preact/signals-core/dist/signals-core.module.js
2
+ function i2() {
3
+ throw new Error("Cycle detected");
4
+ }
5
+ function t() {
6
+ if (!(n > 1)) {
7
+ var i3, t2 = false;
8
+ while (void 0 !== r) {
9
+ var h2 = r;
10
+ r = void 0;
11
+ s++;
12
+ while (void 0 !== h2) {
13
+ var o2 = h2.o;
14
+ h2.o = void 0;
15
+ h2.f &= -3;
16
+ if (!(8 & h2.f) && d(h2))
17
+ try {
18
+ h2.c();
19
+ } catch (h3) {
20
+ if (!t2) {
21
+ i3 = h3;
22
+ t2 = true;
23
+ }
24
+ }
25
+ h2 = o2;
26
+ }
27
+ }
28
+ s = 0;
29
+ n--;
30
+ if (t2)
31
+ throw i3;
32
+ } else
33
+ n--;
34
+ }
35
+ function h(i3) {
36
+ if (n > 0)
37
+ return i3();
38
+ n++;
39
+ try {
40
+ return i3();
41
+ } finally {
42
+ t();
43
+ }
44
+ }
45
+ var o = void 0;
46
+ var r = void 0;
47
+ var n = 0;
48
+ var s = 0;
49
+ var f = 0;
50
+ function v(i3) {
51
+ if (void 0 !== o) {
52
+ var t2 = i3.n;
53
+ if (void 0 === t2 || t2.t !== o) {
54
+ o.s = t2 = { i: 0, S: i3, p: void 0, n: o.s, t: o, e: void 0, x: void 0, r: t2 };
55
+ i3.n = t2;
56
+ if (32 & o.f)
57
+ i3.S(t2);
58
+ return t2;
59
+ } else if (-1 === t2.i) {
60
+ t2.i = 0;
61
+ if (void 0 !== t2.p) {
62
+ t2.p.n = t2.n;
63
+ if (void 0 !== t2.n)
64
+ t2.n.p = t2.p;
65
+ t2.p = void 0;
66
+ t2.n = o.s;
67
+ o.s.p = t2;
68
+ o.s = t2;
69
+ }
70
+ return t2;
71
+ }
72
+ }
73
+ }
74
+ function e(i3) {
75
+ this.v = i3;
76
+ this.i = 0;
77
+ this.n = void 0;
78
+ this.t = void 0;
79
+ }
80
+ e.prototype.h = function() {
81
+ return true;
82
+ };
83
+ e.prototype.S = function(i3) {
84
+ if (this.t !== i3 && void 0 === i3.e) {
85
+ i3.x = this.t;
86
+ if (void 0 !== this.t)
87
+ this.t.e = i3;
88
+ this.t = i3;
89
+ }
90
+ };
91
+ e.prototype.U = function(i3) {
92
+ var t2 = i3.e, h2 = i3.x;
93
+ if (void 0 !== t2) {
94
+ t2.x = h2;
95
+ i3.e = void 0;
96
+ }
97
+ if (void 0 !== h2) {
98
+ h2.e = t2;
99
+ i3.x = void 0;
100
+ }
101
+ if (i3 === this.t)
102
+ this.t = h2;
103
+ };
104
+ e.prototype.subscribe = function(i3) {
105
+ var t2 = this;
106
+ return b(function() {
107
+ var h2 = t2.value, o2 = 32 & this.f;
108
+ this.f &= -33;
109
+ try {
110
+ i3(h2);
111
+ } finally {
112
+ this.f |= o2;
113
+ }
114
+ });
115
+ };
116
+ e.prototype.valueOf = function() {
117
+ return this.value;
118
+ };
119
+ e.prototype.toString = function() {
120
+ return this.value + "";
121
+ };
122
+ e.prototype.peek = function() {
123
+ return this.v;
124
+ };
125
+ Object.defineProperty(e.prototype, "value", { get: function() {
126
+ var i3 = v(this);
127
+ if (void 0 !== i3)
128
+ i3.i = this.i;
129
+ return this.v;
130
+ }, set: function(h2) {
131
+ if (h2 !== this.v) {
132
+ if (s > 100)
133
+ i2();
134
+ this.v = h2;
135
+ this.i++;
136
+ f++;
137
+ n++;
138
+ try {
139
+ for (var o2 = this.t; void 0 !== o2; o2 = o2.x)
140
+ o2.t.N();
141
+ } finally {
142
+ t();
143
+ }
144
+ }
145
+ } });
146
+ function u(i3) {
147
+ return new e(i3);
148
+ }
149
+ function d(i3) {
150
+ for (var t2 = i3.s; void 0 !== t2; t2 = t2.n)
151
+ if (t2.S.i !== t2.i || !t2.S.h() || t2.S.i !== t2.i)
152
+ return true;
153
+ return false;
154
+ }
155
+ function c(i3) {
156
+ for (var t2 = i3.s; void 0 !== t2; t2 = t2.n) {
157
+ var h2 = t2.S.n;
158
+ if (void 0 !== h2)
159
+ t2.r = h2;
160
+ t2.S.n = t2;
161
+ t2.i = -1;
162
+ }
163
+ }
164
+ function a(i3) {
165
+ var t2 = i3.s, h2 = void 0;
166
+ while (void 0 !== t2) {
167
+ var o2 = t2.n;
168
+ if (-1 === t2.i) {
169
+ t2.S.U(t2);
170
+ t2.n = void 0;
171
+ } else {
172
+ if (void 0 !== h2)
173
+ h2.p = t2;
174
+ t2.p = void 0;
175
+ t2.n = h2;
176
+ h2 = t2;
177
+ }
178
+ t2.S.n = t2.r;
179
+ if (void 0 !== t2.r)
180
+ t2.r = void 0;
181
+ t2 = o2;
182
+ }
183
+ i3.s = h2;
184
+ }
185
+ function l(i3) {
186
+ e.call(this, void 0);
187
+ this.x = i3;
188
+ this.s = void 0;
189
+ this.g = f - 1;
190
+ this.f = 4;
191
+ }
192
+ (l.prototype = new e()).h = function() {
193
+ this.f &= -3;
194
+ if (1 & this.f)
195
+ return false;
196
+ if (32 == (36 & this.f))
197
+ return true;
198
+ this.f &= -5;
199
+ if (this.g === f)
200
+ return true;
201
+ this.g = f;
202
+ this.f |= 1;
203
+ if (this.i > 0 && !d(this)) {
204
+ this.f &= -2;
205
+ return true;
206
+ }
207
+ var i3 = o;
208
+ try {
209
+ c(this);
210
+ o = this;
211
+ var t2 = this.x();
212
+ if (16 & this.f || this.v !== t2 || 0 === this.i) {
213
+ this.v = t2;
214
+ this.f &= -17;
215
+ this.i++;
216
+ }
217
+ } catch (i4) {
218
+ this.v = i4;
219
+ this.f |= 16;
220
+ this.i++;
221
+ }
222
+ o = i3;
223
+ a(this);
224
+ this.f &= -2;
225
+ return true;
226
+ };
227
+ l.prototype.S = function(i3) {
228
+ if (void 0 === this.t) {
229
+ this.f |= 36;
230
+ for (var t2 = this.s; void 0 !== t2; t2 = t2.n)
231
+ t2.S.S(t2);
232
+ }
233
+ e.prototype.S.call(this, i3);
234
+ };
235
+ l.prototype.U = function(i3) {
236
+ e.prototype.U.call(this, i3);
237
+ if (void 0 === this.t) {
238
+ this.f &= -33;
239
+ for (var t2 = this.s; void 0 !== t2; t2 = t2.n)
240
+ t2.S.U(t2);
241
+ }
242
+ };
243
+ l.prototype.N = function() {
244
+ if (!(2 & this.f)) {
245
+ this.f |= 6;
246
+ for (var i3 = this.t; void 0 !== i3; i3 = i3.x)
247
+ i3.t.N();
248
+ }
249
+ };
250
+ l.prototype.peek = function() {
251
+ if (!this.h())
252
+ i2();
253
+ if (16 & this.f)
254
+ throw this.v;
255
+ return this.v;
256
+ };
257
+ Object.defineProperty(l.prototype, "value", { get: function() {
258
+ if (1 & this.f)
259
+ i2();
260
+ var t2 = v(this);
261
+ this.h();
262
+ if (void 0 !== t2)
263
+ t2.i = this.i;
264
+ if (16 & this.f)
265
+ throw this.v;
266
+ return this.v;
267
+ } });
268
+ function w(i3) {
269
+ return new l(i3);
270
+ }
271
+ function y(i3) {
272
+ var h2 = i3.u;
273
+ i3.u = void 0;
274
+ if ("function" == typeof h2) {
275
+ n++;
276
+ var r2 = o;
277
+ o = void 0;
278
+ try {
279
+ h2();
280
+ } catch (t2) {
281
+ i3.f &= -2;
282
+ i3.f |= 8;
283
+ _(i3);
284
+ throw t2;
285
+ } finally {
286
+ o = r2;
287
+ t();
288
+ }
289
+ }
290
+ }
291
+ function _(i3) {
292
+ for (var t2 = i3.s; void 0 !== t2; t2 = t2.n)
293
+ t2.S.U(t2);
294
+ i3.x = void 0;
295
+ i3.s = void 0;
296
+ y(i3);
297
+ }
298
+ function g(i3) {
299
+ if (o !== this)
300
+ throw new Error("Out-of-order effect");
301
+ a(this);
302
+ o = i3;
303
+ this.f &= -2;
304
+ if (8 & this.f)
305
+ _(this);
306
+ t();
307
+ }
308
+ function p(i3) {
309
+ this.x = i3;
310
+ this.u = void 0;
311
+ this.s = void 0;
312
+ this.o = void 0;
313
+ this.f = 32;
314
+ }
315
+ p.prototype.c = function() {
316
+ var i3 = this.S();
317
+ try {
318
+ if (!(8 & this.f) && void 0 !== this.x)
319
+ this.u = this.x();
320
+ } finally {
321
+ i3();
322
+ }
323
+ };
324
+ p.prototype.S = function() {
325
+ if (1 & this.f)
326
+ i2();
327
+ this.f |= 1;
328
+ this.f &= -9;
329
+ y(this);
330
+ c(this);
331
+ n++;
332
+ var t2 = o;
333
+ o = this;
334
+ return g.bind(this, t2);
335
+ };
336
+ p.prototype.N = function() {
337
+ if (!(2 & this.f)) {
338
+ this.f |= 2;
339
+ this.o = r;
340
+ r = this;
341
+ }
342
+ };
343
+ p.prototype.d = function() {
344
+ this.f |= 8;
345
+ if (!(1 & this.f))
346
+ _(this);
347
+ };
348
+ function b(i3) {
349
+ var t2 = new p(i3);
350
+ t2.c();
351
+ return t2.d.bind(t2);
352
+ }
353
+
1
354
  // node_modules/sube/sube.js
2
355
  Symbol.observable ||= Symbol("observable");
3
356
  var observable = (arg) => arg && !!(arg[Symbol.observable] || arg[Symbol.asyncIterator] || arg.call && arg.set || arg.subscribe || arg.then);
4
357
  var registry = new FinalizationRegistry((unsub) => unsub.call?.());
5
358
  var unsubr = (sub) => sub && (() => sub.unsubscribe?.());
6
- var sube_default = (target, next, error, complete, stop, unsub) => target && (unsub = unsubr((target[Symbol.observable]?.() || target).subscribe?.(next, error, complete)) || target.set && target.call?.(stop, next) || (target.then?.((v) => (!stop && next(v), complete?.()), error) || (async (v) => {
359
+ var sube_default = (target, next, error, complete, stop, unsub) => target && (unsub = unsubr((target[Symbol.observable]?.() || target).subscribe?.(next, error, complete)) || target.set && target.call?.(stop, next) || (target.then?.((v2) => (!stop && next(v2), complete?.()), error) || (async (v2) => {
7
360
  try {
8
- for await (v of target) {
361
+ for await (v2 of target) {
9
362
  if (stop)
10
363
  return;
11
- next(v);
364
+ next(v2);
12
365
  }
13
366
  complete?.();
14
367
  } catch (err) {
15
368
  error?.(err);
16
369
  }
17
- })()) && ((_) => stop = 1), registry.register(target, unsub), unsub);
370
+ })()) && ((_2) => stop = 1), registry.register(target, unsub), unsub);
18
371
 
19
- // src/core.js
20
- var curEl;
21
- var curDir;
22
- function sprae(el2, initScope) {
23
- initScope ||= {};
24
- let updates = [], ready = false;
25
- const update = (values2) => {
26
- updates.forEach((update2) => update2(values2));
27
- };
28
- const rsube = (scope) => {
29
- let values2 = {};
30
- for (let k in scope) {
31
- let v = scope[k];
32
- if (observable(v = scope[k]))
33
- values2[k] = null, registry2.register(v, sube_default(v, (v2) => (values2[k] = v2, ready && update(values2))));
34
- else if (v?.constructor === Object)
35
- values2[k] = rsube(v);
36
- else
37
- values2[k] = v;
38
- }
39
- return values2;
40
- };
41
- const values = rsube(initScope);
42
- ready = true;
43
- for (let name in directives) {
44
- const sel = `[${name.replace(":", "\\:")}]`, initDirective = directives[name];
45
- const els = [...el2.querySelectorAll(sel)];
46
- if (el2.matches?.(sel))
47
- els.unshift(el2);
48
- let update2;
49
- for (let el3 of els)
50
- if (update2 = initDirective(el3, values))
51
- updates.push(update2);
52
- }
53
- ;
54
- update(values);
55
- values[Symbol.iterator] = function* () {
56
- yield proxy;
57
- yield (diff) => update(Object.assign(values, diff));
58
- };
59
- const proxy = new Proxy(values, {
60
- set: (s, k, v) => (values[k] = v, update(values), 1),
61
- deleteProperty: (s, k) => (values[k] = void 0, update(values), 1)
372
+ // node_modules/signal-struct/signal-struct.js
373
+ var isSignal = (v2) => v2 && v2.peek;
374
+ var isStruct = (v2) => v2[_struct];
375
+ var _struct = Symbol("signal-struct");
376
+ function SignalStruct(values) {
377
+ if (isStruct(values))
378
+ return values;
379
+ let state, signals;
380
+ if (isObject(values)) {
381
+ state = {}, signals = {};
382
+ for (let key in values)
383
+ signals[key] = defineSignal(state, key, values[key]);
384
+ } else
385
+ throw Error("Only array or object states are supported");
386
+ Object.defineProperty(state, _struct, { configurable: false, enumerable: false, value: true });
387
+ Object.seal(state);
388
+ return state;
389
+ }
390
+ function defineSignal(state, key, value) {
391
+ let isObservable, s2 = isSignal(value) ? value : isObject(value) ? u(SignalStruct(value)) : u((isObservable = observable(value)) ? void 0 : value);
392
+ if (isObservable)
393
+ sube_default(value, (v2) => s2.value = v2);
394
+ Object.defineProperty(state, key, {
395
+ get() {
396
+ return s2.value;
397
+ },
398
+ set: isSignal(value) ? (v2) => s2.value = v2 : isObject(value) ? (v2) => v2 ? Object.assign(s2.value, v2) : s2.value = v2 : (v2) => s2.value = v2,
399
+ enumerable: true,
400
+ configurable: false
62
401
  });
63
- return proxy;
402
+ return s2;
64
403
  }
65
- var directives = {};
66
- var directive = (name, initializer) => {
67
- const className = name.replace(":", "\u2234");
68
- return directives[name] = (el2, initValues) => {
69
- if (el2.classList.contains(className))
70
- return;
71
- el2.classList.add(className);
72
- let expr = el2.getAttribute(name);
73
- el2.removeAttribute(name);
74
- return initializer(el2, expr, initValues);
75
- };
76
- };
77
- var registry2 = new FinalizationRegistry((unsub) => unsub?.call?.());
78
- var evaluatorMemo = {};
79
- function parseExpr(expression) {
80
- if (evaluatorMemo[expression])
81
- return evaluatorMemo[expression];
82
- let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression) || /^(let|const)\s/.test(expression) ? `(() => { ${expression} })()` : expression;
83
- const safeFunction = () => {
84
- try {
85
- return new Function(["scope"], `let result; with (scope) { result = ${rightSideSafeExpression} }; return result;`);
86
- } catch (e) {
87
- return exprError(e, expression);
404
+ function isObject(v2) {
405
+ return v2 && v2.constructor === Object;
406
+ }
407
+
408
+ // src/core.js
409
+ var memo = /* @__PURE__ */ new WeakMap();
410
+ function sprae(container, values) {
411
+ if (!container.children)
412
+ return;
413
+ if (memo.has(container))
414
+ return memo.get(container);
415
+ values ||= {};
416
+ const state = SignalStruct(values);
417
+ const init = (el2) => {
418
+ let dir, stop;
419
+ if (el2.attributes) {
420
+ for (let i3 = 0; i3 < el2.attributes.length; ) {
421
+ let attr = el2.attributes[i3];
422
+ if (attr.name[0] === ":") {
423
+ dir = directives[attr.name] || directives.default;
424
+ el2.removeAttribute(attr.name);
425
+ if (stop = dir(el2, attr.value, state, attr.name.slice(1)) === false)
426
+ break;
427
+ } else
428
+ i3++;
429
+ }
88
430
  }
431
+ if (!stop)
432
+ for (let child of el2.children)
433
+ init(child);
89
434
  };
90
- return evaluatorMemo[expression] = safeFunction();
435
+ init(container);
436
+ memo.set(container, state);
437
+ return state;
91
438
  }
92
- function exprError(error, expression) {
93
- Object.assign(error, { expression });
94
- console.warn(`\u2234 ${error.message}
439
+ var directives = {};
95
440
 
96
- ${curDir}=${expression ? `"${expression}"
441
+ // node_modules/element-props/element-props.js
442
+ var prop = (el2, k, v2) => {
443
+ if (k.startsWith("on"))
444
+ k = k.toLowerCase();
445
+ if (el2[k] !== v2) {
446
+ el2[k] = v2;
447
+ }
448
+ if (v2 === false || v2 == null)
449
+ el2.removeAttribute(k);
450
+ else if (typeof v2 !== "function")
451
+ el2.setAttribute(
452
+ dashcase(k),
453
+ v2 === true ? "" : typeof v2 === "number" || typeof v2 === "string" ? v2 : k === "class" ? (Array.isArray(v2) ? v2 : Object.entries(v2).map(([k2, v3]) => v3 ? k2 : "")).filter(Boolean).join(" ") : k === "style" ? Object.entries(v2).map(([k2, v3]) => `${k2}: ${v3}`).join(";") : ""
454
+ );
455
+ };
456
+ var input = (el2) => [
457
+ el2.type === "checkbox" ? () => el2.checked : () => el2.value,
458
+ el2.type === "text" || el2.type === "" ? (value) => el2.value = value == null ? "" : value : el2.type === "checkbox" ? (value) => (el2.value = value ? "on" : "", prop(el2, "checked", value)) : el2.type === "select-one" ? (value) => ([...el2.options].map((el3) => el3.removeAttribute("selected")), el2.value = value, el2.selectedOptions[0]?.setAttribute("selected", "")) : (value) => el2.value = value
459
+ ];
460
+ var el = document.createElement("div");
461
+ var dashcase = (str) => {
462
+ el.dataset[str] = "";
463
+ let dashStr = el.attributes[0].name.slice(5);
464
+ delete el.dataset[str];
465
+ return dashStr;
466
+ };
97
467
 
98
- ` : ""}`, curEl);
99
- setTimeout(() => {
100
- throw error;
101
- }, 0);
102
- return Promise.resolve();
103
- }
468
+ // node_modules/swapdom/swap-inflate.js
469
+ var swap = (parent, a2, b2, end = null) => {
470
+ let i3 = 0, cur, next, bi, n2 = b2.length, m = a2.length, { remove, same, insert, replace } = swap;
471
+ while (i3 < n2 && i3 < m && same(a2[i3], b2[i3]))
472
+ i3++;
473
+ while (i3 < n2 && i3 < m && same(b2[n2 - 1], a2[m - 1]))
474
+ end = b2[--m, --n2];
475
+ if (i3 == m)
476
+ while (i3 < n2)
477
+ insert(end, b2[i3++], parent);
478
+ else {
479
+ cur = a2[i3];
480
+ while (i3 < n2) {
481
+ bi = b2[i3++], next = cur ? cur.nextSibling : end;
482
+ if (same(cur, bi))
483
+ cur = next;
484
+ else if (i3 < n2 && same(b2[i3], next))
485
+ replace(cur, bi, parent), cur = next;
486
+ else
487
+ insert(cur, bi, parent);
488
+ }
489
+ while (!same(cur, end))
490
+ next = cur.nextSibling, remove(cur, parent), cur = next;
491
+ }
492
+ return b2;
493
+ };
494
+ swap.same = (a2, b2) => a2 == b2;
495
+ swap.replace = (a2, b2, parent) => parent.replaceChild(b2, a2);
496
+ swap.insert = (a2, b2, parent) => parent.insertBefore(b2, a2);
497
+ swap.remove = (a2, parent) => parent.removeChild(a2);
498
+ var swap_inflate_default = swap;
104
499
 
105
- // src/directives/with.js
106
- directive(":with", (el2, expr, rootValues) => {
107
- let evaluate = parseExpr(expr);
108
- let subscope = Object.create(rootValues);
109
- Object.assign(subscope, evaluate(rootValues));
110
- let [subvalues, subupdate] = sprae(el2, subscope);
111
- return (values) => {
112
- let withValues = evaluate(values);
113
- subupdate(withValues);
114
- };
115
- });
500
+ // node_modules/primitive-pool/index.js
501
+ var cache = {};
502
+ var nullObj = {};
503
+ var undefinedObj = {};
504
+ var primitive_pool_default = (key) => {
505
+ if (key === null)
506
+ return nullObj;
507
+ if (key === void 0)
508
+ return undefinedObj;
509
+ if (typeof key === "number" || key instanceof Number)
510
+ return cache[key] || (cache[key] = new Number(key));
511
+ if (typeof key === "string" || key instanceof String)
512
+ return cache[key] || (cache[key] = new String(key));
513
+ if (typeof key === "boolean" || key instanceof Boolean)
514
+ return cache[key] || (cache[key] = new Boolean(key));
515
+ return key;
516
+ };
116
517
 
117
- // src/directives/each.js
118
- directive(":each", (el2, expr) => {
518
+ // src/directives.js
519
+ directives[":with"] = (el2, expr, rootState) => {
520
+ let evaluate = parseExpr(expr, "with", rootState);
521
+ const params = w(() => Object.assign({}, rootState, evaluate(rootState)));
522
+ let state = sprae(el2, params.value);
523
+ b((values = params.value) => h(() => Object.assign(state, values)));
524
+ };
525
+ directives[":if"] = (el2, expr, state) => {
526
+ let holder = document.createTextNode(""), clauses = [parseExpr(expr, ":if", state)], els = [el2], cur = el2;
527
+ while (cur = el2.nextElementSibling) {
528
+ if (cur.hasAttribute(":else")) {
529
+ cur.removeAttribute(":else");
530
+ if (expr = cur.getAttribute(":if")) {
531
+ cur.removeAttribute(":if"), cur.remove();
532
+ els.push(cur);
533
+ clauses.push(parseExpr(expr, ":else :if", state));
534
+ } else {
535
+ cur.remove();
536
+ els.push(cur);
537
+ clauses.push(() => 1);
538
+ }
539
+ } else
540
+ break;
541
+ }
542
+ el2.replaceWith(cur = holder);
543
+ let idx = w(() => clauses.findIndex((f2) => f2(state)));
544
+ b((i3 = idx.value) => els[i3] != cur && ((cur[_eachHolder] || cur).replaceWith(cur = els[i3] || holder), sprae(cur, state)));
545
+ return false;
546
+ };
547
+ var _eachHolder = Symbol(":each");
548
+ directives[":each"] = (tpl, expr, state) => {
119
549
  let each = parseForExpression(expr);
120
550
  if (!each)
121
551
  return exprError(new Error(), expr);
122
- const getItems = parseExpr(each.items);
123
- const holder = new Text();
124
- el2.replaceWith(holder);
125
- let els = [];
126
- return (state) => {
127
- els.forEach((el3) => el3.remove());
128
- els = [];
129
- let items = getItems(state);
130
- if (typeof items === "number")
131
- items = Array.from({ length: items }, (item, i) => i + 1);
132
- items?.forEach((item, i) => {
133
- const scope = { ...state };
134
- scope[each.item] = item;
135
- if (each.index)
136
- scope[each.index] = i;
137
- let itemEl = el2.cloneNode(true);
138
- els.push(itemEl);
139
- holder.before(itemEl);
140
- sprae(itemEl, scope);
141
- });
142
- };
143
- });
552
+ const getItems = parseExpr(each.items, ":each", state);
553
+ const holder = tpl[_eachHolder] = document.createTextNode("");
554
+ tpl.replaceWith(holder);
555
+ const items = w(() => {
556
+ let list = getItems(state);
557
+ if (typeof list === "number")
558
+ return Array.from({ length: list }, (_2, i3) => i3 + 1);
559
+ return list;
560
+ });
561
+ const scopes = /* @__PURE__ */ new WeakMap();
562
+ const itemEls = /* @__PURE__ */ new WeakMap();
563
+ let curEls = [];
564
+ b((list = items.value) => {
565
+ if (!list)
566
+ list = [];
567
+ let newEls = [], elScopes = [];
568
+ for (let item of list) {
569
+ let key = primitive_pool_default(item);
570
+ let el2 = itemEls.get(key);
571
+ if (!el2) {
572
+ el2 = tpl.cloneNode(true);
573
+ itemEls.set(key, el2);
574
+ }
575
+ newEls.push(el2);
576
+ if (!scopes.has(key)) {
577
+ let scope = Object.create(state);
578
+ scope[each.item] = item;
579
+ if (each.index)
580
+ scope[each.index] = i;
581
+ scopes.set(key, scope);
582
+ }
583
+ elScopes.push(scopes.get(key));
584
+ }
585
+ swap_inflate_default(holder.parentNode, curEls, newEls, holder);
586
+ curEls = newEls;
587
+ for (let i3 = 0; i3 < newEls.length; i3++) {
588
+ sprae(newEls[i3], elScopes[i3]);
589
+ }
590
+ });
591
+ return false;
592
+ };
144
593
  function parseForExpression(expression) {
145
594
  let forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
146
595
  let stripParensRE = /^\s*\(|\)\s*$/g;
@@ -160,158 +609,101 @@ function parseForExpression(expression) {
160
609
  }
161
610
  return res;
162
611
  }
163
-
164
- // src/directives/text.js
165
- directive(":text", (el2, expr) => {
166
- let evaluate = parseExpr(expr);
167
- return (state) => {
168
- let value = evaluate(state);
169
- el2.textContent = value == null ? "" : value;
170
- };
171
- });
172
-
173
- // src/directives/if.js
174
- directive(":if", (el2, expr) => {
175
- let cur = el2, els = [el2], clauses = [parseExpr(expr)], holder = new Text();
176
- while (cur = el2.nextElementSibling) {
177
- if (expr = cur.getAttribute(":else-if")) {
178
- cur.removeAttribute(":else-if");
179
- cur.classList.add("\u2234else-if");
180
- cur.remove();
181
- els.push(cur);
182
- clauses.push(parseExpr(expr));
183
- continue;
184
- }
185
- if (cur.hasAttribute(":else")) {
186
- cur.removeAttribute(":else");
187
- cur.classList.add("\u2234else");
188
- cur.remove();
189
- els.push(cur);
190
- clauses.push(() => 1);
191
- }
192
- break;
193
- }
194
- cur = els[0];
195
- return (state) => {
196
- let idx = clauses.findIndex((match) => match(state));
197
- if (idx >= 0)
198
- cur.replaceWith(cur = els[idx]);
199
- else
200
- cur.replaceWith(cur = holder);
612
+ directives["default"] = (el2, expr, state, name) => {
613
+ let evaluate = parseExpr(expr, ":" + name, state);
614
+ const update = (value) => prop(el2, name, value);
615
+ b(() => update(evaluate(state)));
616
+ };
617
+ directives[":aria"] = (el2, expr, state) => {
618
+ let evaluate = parseExpr(expr, ":aria", state);
619
+ const update = (value) => {
620
+ for (let key in value)
621
+ prop(el2, "aria" + key[0].toUpperCase() + key.slice(1), value[key] == null ? null : value[key] + "");
201
622
  };
202
- });
203
-
204
- // node_modules/element-props/element-props.js
205
- var prop = (el2, k, v) => {
206
- if (k.startsWith("on"))
207
- k = k.toLowerCase();
208
- if (el2[k] !== v) {
209
- el2[k] = v;
210
- }
211
- if (v === false || v == null)
212
- el2.removeAttribute(k);
213
- else if (typeof v !== "function")
214
- el2.setAttribute(
215
- dashcase(k),
216
- v === true ? "" : typeof v === "number" || typeof v === "string" ? v : k === "class" ? (Array.isArray(v) ? v : Object.entries(v).map(([k2, v2]) => v2 ? k2 : "")).filter(Boolean).join(" ") : k === "style" ? Object.entries(v).map(([k2, v2]) => `${k2}: ${v2}`).join(";") : ""
217
- );
623
+ b(() => update(evaluate(state)));
218
624
  };
219
- var input = (el2) => [
220
- el2.type === "checkbox" ? () => el2.checked : () => el2.value,
221
- el2.type === "text" || el2.type === "" ? (value) => el2.value = value == null ? "" : value : el2.type === "checkbox" ? (value) => (el2.value = value ? "on" : "", prop(el2, "checked", value)) : el2.type === "select-one" ? (value) => ([...el2.options].map((el3) => el3.removeAttribute("selected")), el2.value = value, el2.selectedOptions[0]?.setAttribute("selected", "")) : (value) => el2.value = value
222
- ];
223
- var el = document.createElement("div");
224
- var dashcase = (str) => {
225
- el.dataset[str] = "";
226
- let dashStr = el.attributes[0].name.slice(5);
227
- delete el.dataset[str];
228
- return dashStr;
625
+ directives[":data"] = (el2, expr, state) => {
626
+ let evaluate = parseExpr(expr, ":data", state);
627
+ const value = w(() => evaluate(state));
628
+ b((v2 = value.value) => {
629
+ for (let key in v2)
630
+ el2.dataset[key] = v2[key];
631
+ });
229
632
  };
230
-
231
- // src/directives/common.js
232
- common(`id`), common(`name`), common(`for`), common(`type`), common(`hidden`), common(`disabled`), common(`href`), common(`src`), common(`style`), common(`class`);
233
- function common(name) {
234
- directive(":" + name, (el2, expr) => {
235
- let evaluate = parseExpr(expr);
236
- return (state) => {
237
- let value = evaluate(state);
238
- prop(el2, name, value);
239
- };
633
+ directives[":on"] = (el2, expr, state) => {
634
+ let evaluate = parseExpr(expr, ":on", state);
635
+ let listeners = w(() => evaluate(state));
636
+ let prevListeners;
637
+ b((values = listeners.value) => {
638
+ for (let evt in prevListeners)
639
+ el2.removeEventListener(evt, prevListeners[evt]);
640
+ prevListeners = values;
641
+ for (let evt in prevListeners)
642
+ el2.addEventListener(evt, prevListeners[evt]);
240
643
  });
241
- }
242
-
243
- // src/directives/prop.js
244
- directive(":prop", (el2, expr) => {
245
- let evaluate = parseExpr(expr);
246
- return (state) => {
247
- let value = evaluate(state);
644
+ };
645
+ directives[":"] = (el2, expr, state) => {
646
+ let evaluate = parseExpr(expr, ":", state);
647
+ const update = (value) => {
648
+ if (!value)
649
+ return;
248
650
  for (let key in value)
249
651
  prop(el2, key, value[key]);
250
652
  };
251
- });
252
-
253
- // src/directives/data.js
254
- directive(":data", (el2, expr) => {
255
- let evaluate = parseExpr(expr);
256
- return (state) => {
257
- let value = evaluate(state);
258
- for (let key in value)
259
- el2.dataset[key] = value[key];
260
- };
261
- });
262
-
263
- // src/directives/aria.js
264
- directive(":aria", (el2, expr) => {
265
- let evaluate = parseExpr(expr);
266
- return (state) => {
267
- let value = evaluate(state);
268
- for (let key in value)
269
- prop(el2, "aria" + key[0].toUpperCase() + key.slice(1), value[key]);
653
+ b(() => update(evaluate(state)));
654
+ };
655
+ directives[":text"] = (el2, expr, state) => {
656
+ let evaluate = parseExpr(expr, ":text", state);
657
+ const update = (value) => {
658
+ el2.textContent = value == null ? "" : value;
270
659
  };
271
- });
272
-
273
- // src/directives/value.js
274
- directive(":value", (el2, expr) => {
275
- let evaluateGet = parseExpr(expr);
660
+ b(() => update(evaluate(state)));
661
+ };
662
+ directives[":value"] = (el2, expr, state) => {
663
+ let evaluate = parseExpr(expr, ":in", state);
276
664
  let [get, set] = input(el2);
277
- let evaluateSet = parseSetter(expr);
278
- let curState, onchange = (e) => evaluateSet(curState, get(el2));
279
- el2.addEventListener("input", onchange);
280
- el2.addEventListener("change", onchange);
281
- return (state) => {
282
- let value = evaluateGet(curState = state);
665
+ const update = (value) => {
283
666
  prop(el2, "value", value);
284
667
  set(value);
285
668
  };
286
- });
287
- var memo = {};
288
- function parseSetter(expr) {
289
- if (memo[expr])
290
- return memo[expr];
291
- return memo[expr] = new Function(
292
- ["scope", "value"],
293
- `with (scope) { ${expr} = value };`
294
- );
669
+ b(() => update(evaluate(state)));
670
+ };
671
+ var evaluatorMemo = {};
672
+ function parseExpr(expression, dir, scope) {
673
+ if (evaluatorMemo[expression])
674
+ return evaluatorMemo[expression];
675
+ let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression) || /^(let|const)\s/.test(expression) ? `(() => { ${expression} })()` : expression;
676
+ let evaluate;
677
+ try {
678
+ evaluate = new Function(["scope"], `let result; with (scope) { result = ${rightSideSafeExpression} }; return result;`);
679
+ } catch (e2) {
680
+ return exprError(e2, expression, dir, scope);
681
+ }
682
+ return evaluatorMemo[expression] = (state) => {
683
+ let result;
684
+ try {
685
+ result = evaluate(state);
686
+ } catch (e2) {
687
+ return exprError(e2, expression, dir, scope);
688
+ }
689
+ return result;
690
+ };
295
691
  }
692
+ function exprError(error, expression, dir, scope) {
693
+ Object.assign(error, { expression });
694
+ console.warn(`\u2234sprae: ${error.message}
296
695
 
297
- // src/directives/on.js
298
- directive(":on", (el2, expr) => {
299
- let evaluate = parseExpr(expr);
300
- let listeners = {};
301
- return (state) => {
302
- for (let evt in listeners)
303
- el2.removeEventListener(evt, listeners[evt]);
304
- listeners = evaluate(state);
305
- for (let evt in listeners)
306
- el2.addEventListener(evt, listeners[evt]);
307
- };
308
- });
696
+ ${dir}=${expression ? `"${expression}"
697
+
698
+ ` : ""}`, scope);
699
+ setTimeout(() => {
700
+ throw error;
701
+ }, 0);
702
+ }
309
703
 
310
704
  // src/index.js
311
705
  var src_default = sprae;
312
706
  export {
313
707
  src_default as default,
314
- directive,
315
- exprError,
316
- parseExpr
708
+ directives
317
709
  };