sprae 2.14.1 → 3.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,521 +1,181 @@
1
- // node_modules/@preact/signals-core/dist/signals-core.module.js
2
- function i() {
3
- throw new Error("Cycle detected");
4
- }
5
- function t() {
6
- if (!(s > 1)) {
7
- var i2, t2 = false;
8
- while (void 0 !== r) {
9
- var h2 = r;
10
- r = void 0;
11
- n++;
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
- i2 = h3;
22
- t2 = true;
23
- }
24
- }
25
- h2 = o2;
26
- }
27
- }
28
- n = 0;
29
- s--;
30
- if (t2)
31
- throw i2;
32
- } else
33
- s--;
34
- }
35
- function h(i2) {
36
- if (s > 0)
37
- return i2();
38
- s++;
39
- try {
40
- return i2();
41
- } finally {
42
- t();
43
- }
44
- }
45
- var o = void 0;
46
- var r = void 0;
47
- var s = 0;
48
- var n = 0;
49
- var f = 0;
50
- function v(i2) {
51
- if (void 0 !== o) {
52
- var t2 = i2.n;
53
- if (void 0 === t2 || t2.t !== o) {
54
- t2 = { i: 0, S: i2, p: o.s, n: void 0, t: o, e: void 0, x: void 0, r: t2 };
55
- if (void 0 !== o.s)
56
- o.s.n = t2;
57
- o.s = t2;
58
- i2.n = t2;
59
- if (32 & o.f)
60
- i2.S(t2);
61
- return t2;
62
- } else if (-1 === t2.i) {
63
- t2.i = 0;
64
- if (void 0 !== t2.n) {
65
- t2.n.p = t2.p;
66
- if (void 0 !== t2.p)
67
- t2.p.n = t2.n;
68
- t2.p = o.s;
69
- t2.n = void 0;
70
- o.s.n = t2;
71
- o.s = t2;
72
- }
73
- return t2;
74
- }
75
- }
76
- }
77
- function e(i2) {
78
- this.v = i2;
79
- this.i = 0;
80
- this.n = void 0;
81
- this.t = void 0;
82
- }
83
- e.prototype.h = function() {
84
- return true;
85
- };
86
- e.prototype.S = function(i2) {
87
- if (this.t !== i2 && void 0 === i2.e) {
88
- i2.x = this.t;
89
- if (void 0 !== this.t)
90
- this.t.e = i2;
91
- this.t = i2;
92
- }
93
- };
94
- e.prototype.U = function(i2) {
95
- if (void 0 !== this.t) {
96
- var t2 = i2.e, h2 = i2.x;
97
- if (void 0 !== t2) {
98
- t2.x = h2;
99
- i2.e = void 0;
1
+ // src/state.js
2
+ var currentFx;
3
+ var currentBatch;
4
+ var targetFxs = /* @__PURE__ */ new WeakMap();
5
+ var targetProxy = /* @__PURE__ */ new WeakMap();
6
+ var proxyTarget = /* @__PURE__ */ new WeakMap();
7
+ var _parent = Symbol("parent");
8
+ var sandbox = {
9
+ Array,
10
+ Object,
11
+ Number,
12
+ String,
13
+ Boolean,
14
+ Date,
15
+ console
16
+ };
17
+ var handler = {
18
+ has() {
19
+ return true;
20
+ },
21
+ get(target, prop) {
22
+ if (typeof prop === "symbol")
23
+ return target[prop];
24
+ if (!(prop in target))
25
+ return target[_parent]?.[prop];
26
+ if (Array.isArray(target) && prop in Array.prototype)
27
+ return target[prop];
28
+ let value = target[prop];
29
+ if (currentFx) {
30
+ let propFxs = targetFxs.get(target);
31
+ if (!propFxs)
32
+ targetFxs.set(target, propFxs = {});
33
+ if (!propFxs[prop])
34
+ propFxs[prop] = [currentFx];
35
+ else if (!propFxs[prop].includes(currentFx))
36
+ propFxs[prop].push(currentFx);
100
37
  }
101
- if (void 0 !== h2) {
102
- h2.e = t2;
103
- i2.x = void 0;
38
+ if (value && value.constructor === Object || Array.isArray(value)) {
39
+ let proxy = targetProxy.get(value);
40
+ if (!proxy)
41
+ targetProxy.set(value, proxy = new Proxy(value, handler));
42
+ return proxy;
104
43
  }
105
- if (i2 === this.t)
106
- this.t = h2;
107
- }
108
- };
109
- e.prototype.subscribe = function(i2) {
110
- var t2 = this;
111
- return p(function() {
112
- var h2 = t2.value, o2 = 32 & this.f;
113
- this.f &= -33;
114
- try {
115
- i2(h2);
116
- } finally {
117
- this.f |= o2;
118
- }
119
- });
120
- };
121
- e.prototype.valueOf = function() {
122
- return this.value;
123
- };
124
- e.prototype.toString = function() {
125
- return this.value + "";
126
- };
127
- e.prototype.peek = function() {
128
- return this.v;
129
- };
130
- Object.defineProperty(e.prototype, "value", { get: function() {
131
- var i2 = v(this);
132
- if (void 0 !== i2)
133
- i2.i = this.i;
134
- return this.v;
135
- }, set: function(h2) {
136
- if (h2 !== this.v) {
137
- if (n > 100)
138
- i();
139
- this.v = h2;
140
- this.i++;
141
- f++;
142
- s++;
143
- try {
144
- for (var o2 = this.t; void 0 !== o2; o2 = o2.x)
145
- o2.t.N();
146
- } finally {
147
- t();
148
- }
149
- }
150
- } });
151
- function u(i2) {
152
- return new e(i2);
153
- }
154
- function d(i2) {
155
- for (var t2 = i2.s; void 0 !== t2; t2 = t2.n)
156
- if (t2.S.i !== t2.i || !t2.S.h() || t2.S.i !== t2.i)
44
+ return value;
45
+ },
46
+ set(target, prop, value) {
47
+ if (!(prop in target) && (target[_parent] && prop in target[_parent]))
48
+ return target[_parent][prop] = value;
49
+ if (Array.isArray(target) && prop in Array.prototype)
50
+ return target[prop] = value;
51
+ const prev = target[prop];
52
+ if (Object.is(prev, value))
157
53
  return true;
158
- return false;
159
- }
160
- function c(i2) {
161
- for (var t2 = i2.s; void 0 !== t2; t2 = t2.n) {
162
- var h2 = t2.S.n;
163
- if (void 0 !== h2)
164
- t2.r = h2;
165
- t2.S.n = t2;
166
- t2.i = -1;
167
- if (void 0 === t2.n) {
168
- i2.s = t2;
169
- break;
170
- }
171
- }
172
- }
173
- function a(i2) {
174
- var t2 = i2.s, h2 = void 0;
175
- while (void 0 !== t2) {
176
- var o2 = t2.p;
177
- if (-1 === t2.i) {
178
- t2.S.U(t2);
179
- if (void 0 !== o2)
180
- o2.n = t2.n;
181
- if (void 0 !== t2.n)
182
- t2.n.p = o2;
183
- } else
184
- h2 = t2;
185
- t2.S.n = t2.r;
186
- if (void 0 !== t2.r)
187
- t2.r = void 0;
188
- t2 = o2;
189
- }
190
- i2.s = h2;
191
- }
192
- function l(i2) {
193
- e.call(this, void 0);
194
- this.x = i2;
195
- this.s = void 0;
196
- this.g = f - 1;
197
- this.f = 4;
198
- }
199
- (l.prototype = new e()).h = function() {
200
- this.f &= -3;
201
- if (1 & this.f)
202
- return false;
203
- if (32 == (36 & this.f))
204
- return true;
205
- this.f &= -5;
206
- if (this.g === f)
54
+ target[prop] = value;
55
+ let propFxs = targetFxs.get(target)?.[prop];
56
+ if (propFxs)
57
+ for (let fx2 of propFxs)
58
+ currentBatch ? currentBatch.add(fx2) : fx2.call();
207
59
  return true;
208
- this.g = f;
209
- this.f |= 1;
210
- if (this.i > 0 && !d(this)) {
211
- this.f &= -2;
60
+ },
61
+ deleteProperty(target, prop) {
62
+ target[prop] = void 0;
63
+ delete target[prop];
212
64
  return true;
213
65
  }
214
- var i2 = o;
215
- try {
216
- c(this);
217
- o = this;
218
- var t2 = this.x();
219
- if (16 & this.f || this.v !== t2 || 0 === this.i) {
220
- this.v = t2;
221
- this.f &= -17;
222
- this.i++;
223
- }
224
- } catch (i3) {
225
- this.v = i3;
226
- this.f |= 16;
227
- this.i++;
228
- }
229
- o = i2;
230
- a(this);
231
- this.f &= -2;
232
- return true;
233
66
  };
234
- l.prototype.S = function(i2) {
235
- if (void 0 === this.t) {
236
- this.f |= 36;
237
- for (var t2 = this.s; void 0 !== t2; t2 = t2.n)
238
- t2.S.S(t2);
239
- }
240
- e.prototype.S.call(this, i2);
241
- };
242
- l.prototype.U = function(i2) {
243
- if (void 0 !== this.t) {
244
- e.prototype.U.call(this, i2);
245
- if (void 0 === this.t) {
246
- this.f &= -33;
247
- for (var t2 = this.s; void 0 !== t2; t2 = t2.n)
248
- t2.S.U(t2);
249
- }
250
- }
251
- };
252
- l.prototype.N = function() {
253
- if (!(2 & this.f)) {
254
- this.f |= 6;
255
- for (var i2 = this.t; void 0 !== i2; i2 = i2.x)
256
- i2.t.N();
257
- }
258
- };
259
- l.prototype.peek = function() {
260
- if (!this.h())
261
- i();
262
- if (16 & this.f)
263
- throw this.v;
264
- return this.v;
265
- };
266
- Object.defineProperty(l.prototype, "value", { get: function() {
267
- if (1 & this.f)
268
- i();
269
- var t2 = v(this);
270
- this.h();
271
- if (void 0 !== t2)
272
- t2.i = this.i;
273
- if (16 & this.f)
274
- throw this.v;
275
- return this.v;
276
- } });
277
- function w(i2) {
278
- return new l(i2);
279
- }
280
- function y(i2) {
281
- var h2 = i2.u;
282
- i2.u = void 0;
283
- if ("function" == typeof h2) {
284
- s++;
285
- var r2 = o;
286
- o = void 0;
287
- try {
288
- h2();
289
- } catch (t2) {
290
- i2.f &= -2;
291
- i2.f |= 8;
292
- _(i2);
293
- throw t2;
294
- } finally {
295
- o = r2;
296
- t();
297
- }
298
- }
299
- }
300
- function _(i2) {
301
- for (var t2 = i2.s; void 0 !== t2; t2 = t2.n)
302
- t2.S.U(t2);
303
- i2.x = void 0;
304
- i2.s = void 0;
305
- y(i2);
306
- }
307
- function g(i2) {
308
- if (o !== this)
309
- throw new Error("Out-of-order effect");
310
- a(this);
311
- o = i2;
312
- this.f &= -2;
313
- if (8 & this.f)
314
- _(this);
315
- t();
316
- }
317
- function b(i2) {
318
- this.x = i2;
319
- this.u = void 0;
320
- this.s = void 0;
321
- this.o = void 0;
322
- this.f = 32;
323
- }
324
- b.prototype.c = function() {
325
- var i2 = this.S();
326
- try {
327
- if (!(8 & this.f) && void 0 !== this.x)
328
- this.u = this.x();
329
- } finally {
330
- i2();
331
- }
332
- };
333
- b.prototype.S = function() {
334
- if (1 & this.f)
335
- i();
336
- this.f |= 1;
337
- this.f &= -9;
338
- y(this);
339
- c(this);
340
- s++;
341
- var t2 = o;
342
- o = this;
343
- return g.bind(this, t2);
344
- };
345
- b.prototype.N = function() {
346
- if (!(2 & this.f)) {
347
- this.f |= 2;
348
- this.o = r;
349
- r = this;
350
- }
351
- };
352
- b.prototype.d = function() {
353
- this.f |= 8;
354
- if (!(1 & this.f))
355
- _(this);
67
+ var state = (obj, parent) => {
68
+ if (targetProxy.has(obj))
69
+ return targetProxy.get(obj);
70
+ if (proxyTarget.has(obj))
71
+ return obj;
72
+ let proxy = new Proxy(obj, handler);
73
+ targetProxy.set(obj, proxy);
74
+ proxyTarget.set(proxy, obj);
75
+ obj[_parent] = parent ? state(parent) : sandbox;
76
+ return proxy;
77
+ };
78
+ var fx = (fn) => {
79
+ const call = () => {
80
+ let prev = currentFx;
81
+ currentFx = call;
82
+ fn();
83
+ currentFx = prev;
84
+ };
85
+ call();
86
+ return call;
87
+ };
88
+ var batch = (fn) => {
89
+ let prevBatch = currentBatch;
90
+ currentBatch = /* @__PURE__ */ new Set();
91
+ fn();
92
+ for (let fx2 of currentBatch)
93
+ fx2.call();
94
+ currentBatch.clear();
95
+ currentBatch = prevBatch;
356
96
  };
357
- function p(i2) {
358
- var t2 = new b(i2);
359
- try {
360
- t2.c();
361
- } catch (i3) {
362
- t2.d();
363
- throw i3;
364
- }
365
- return t2.d.bind(t2);
366
- }
367
-
368
- // node_modules/sube/sube.js
369
- Symbol.observable ||= Symbol("observable");
370
- var observable = (arg) => arg && !!(arg[Symbol.observable] || arg[Symbol.asyncIterator] || arg.call && arg.set || arg.subscribe || arg.then);
371
- var registry = new FinalizationRegistry((unsub) => unsub.call?.());
372
- var unsubr = (sub) => sub && (() => sub.unsubscribe?.());
373
- 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) => {
374
- try {
375
- for await (v2 of target) {
376
- if (stop)
377
- return;
378
- next(v2);
379
- }
380
- complete?.();
381
- } catch (err) {
382
- error?.(err);
383
- }
384
- })()) && ((_2) => stop = 1), registry.register(target, unsub), unsub);
385
-
386
- // node_modules/signal-struct/signal-struct.js
387
- var isSignal = (v2) => v2 && v2.peek;
388
- var isStruct = (v2) => v2 && v2[_struct];
389
- var _struct = Symbol("signal-struct");
390
- signalStruct.isStruct = isStruct;
391
- function signalStruct(values, proto) {
392
- if (isStruct(values) && !proto)
393
- return values;
394
- if (isObject(values)) {
395
- const state = Object.create(proto || Object.getPrototypeOf(values)), signals = {}, descs = Object.getOwnPropertyDescriptors(values);
396
- for (let key in descs) {
397
- let desc = descs[key];
398
- if (desc.get) {
399
- let s2 = signals[key] = w(desc.get.bind(state));
400
- Object.defineProperty(state, key, {
401
- get() {
402
- return s2.value;
403
- },
404
- set: desc.set?.bind(state),
405
- configurable: false,
406
- enumerable: true
407
- });
408
- } else {
409
- let value = desc.value;
410
- let isObservable = observable(value), s2 = signals[key] = isSignal(value) ? value : u(
411
- isObservable ? void 0 : isObject(value) ? Object.seal(signalStruct(value)) : Array.isArray(value) ? signalStruct(value) : value
412
- );
413
- if (isObservable)
414
- sube_default(value, (v2) => s2.value = v2);
415
- Object.defineProperty(state, key, {
416
- get() {
417
- return s2.value;
418
- },
419
- set(v2) {
420
- if (isObject(v2)) {
421
- if (isObject(s2.value))
422
- try {
423
- Object.assign(s2.value, v2);
424
- return;
425
- } catch (e2) {
426
- }
427
- s2.value = Object.seal(signalStruct(v2));
428
- } else if (Array.isArray(v2))
429
- s2.value = signalStruct(v2);
430
- else
431
- s2.value = v2;
432
- },
433
- enumerable: true,
434
- configurable: false
435
- });
436
- }
437
- }
438
- Object.defineProperty(state, _struct, { configurable: false, enumerable: false, value: true });
439
- return state;
440
- }
441
- if (Array.isArray(values) && !isStruct(values[0])) {
442
- for (let i2 = 0; i2 < values.length; i2++)
443
- values[i2] = signalStruct(values[i2]);
444
- }
445
- return values;
446
- }
447
- function isObject(v2) {
448
- return v2 && v2.constructor === Object;
449
- }
450
97
 
451
98
  // src/domdiff.js
452
- function domdiff_default(parent, a2, b2, before) {
99
+ function domdiff_default(parent, a, b, before) {
453
100
  const aIdx = /* @__PURE__ */ new Map();
454
101
  const bIdx = /* @__PURE__ */ new Map();
455
- let i2;
102
+ let i;
456
103
  let j;
457
- for (i2 = 0; i2 < a2.length; i2++) {
458
- aIdx.set(a2[i2], i2);
104
+ for (i = 0; i < a.length; i++) {
105
+ aIdx.set(a[i], i);
459
106
  }
460
- for (i2 = 0; i2 < b2.length; i2++) {
461
- bIdx.set(b2[i2], i2);
107
+ for (i = 0; i < b.length; i++) {
108
+ bIdx.set(b[i], i);
462
109
  }
463
- for (i2 = j = 0; i2 !== a2.length || j !== b2.length; ) {
464
- var aElm = a2[i2], bElm = b2[j];
110
+ for (i = j = 0; i !== a.length || j !== b.length; ) {
111
+ var aElm = a[i], bElm = b[j];
465
112
  if (aElm === null) {
466
- i2++;
467
- } else if (b2.length <= j) {
468
- parent.removeChild(a2[i2]);
469
- i2++;
470
- } else if (a2.length <= i2) {
471
- parent.insertBefore(bElm, a2[i2] || before);
113
+ i++;
114
+ } else if (b.length <= j) {
115
+ parent.removeChild(a[i]);
116
+ i++;
117
+ } else if (a.length <= i) {
118
+ parent.insertBefore(bElm, a[i] || before);
472
119
  j++;
473
120
  } else if (aElm === bElm) {
474
- i2++;
121
+ i++;
475
122
  j++;
476
123
  } else {
477
124
  var curElmInNew = bIdx.get(aElm);
478
125
  var wantedElmInOld = aIdx.get(bElm);
479
126
  if (curElmInNew === void 0) {
480
- parent.removeChild(a2[i2]);
481
- i2++;
127
+ parent.removeChild(a[i]);
128
+ i++;
482
129
  } else if (wantedElmInOld === void 0) {
483
130
  parent.insertBefore(
484
131
  bElm,
485
- a2[i2] || before
132
+ a[i] || before
486
133
  );
487
134
  j++;
488
135
  } else {
489
136
  parent.insertBefore(
490
- a2[wantedElmInOld],
491
- a2[i2] || before
137
+ a[wantedElmInOld],
138
+ a[i] || before
492
139
  );
493
- a2[wantedElmInOld] = null;
494
- if (wantedElmInOld > i2 + 1)
495
- i2++;
140
+ a[wantedElmInOld] = null;
141
+ if (wantedElmInOld > i + 1)
142
+ i++;
496
143
  j++;
497
144
  }
498
145
  }
499
146
  }
500
- return b2;
147
+ return b;
501
148
  }
502
149
 
503
- // node_modules/primitive-pool/index.js
504
- var cache = {};
505
- var nullObj = {};
506
- var undefinedObj = {};
507
- var primitive_pool_default = (key) => {
508
- if (key === null)
509
- return nullObj;
510
- if (key === void 0)
511
- return undefinedObj;
512
- if (typeof key === "number" || key instanceof Number)
513
- return cache[key] || (cache[key] = new Number(key));
514
- if (typeof key === "string" || key instanceof String)
515
- return cache[key] || (cache[key] = new String(key));
516
- if (typeof key === "boolean" || key instanceof Boolean)
517
- return cache[key] || (cache[key] = new Boolean(key));
518
- return key;
150
+ // src/weakish-map.js
151
+ var refs = /* @__PURE__ */ new WeakMap();
152
+ var set = (value) => {
153
+ const ref = new WeakRef(value);
154
+ refs.set(value, ref);
155
+ return ref;
156
+ };
157
+ var get = (value) => refs.get(value) || set(value);
158
+ var WeakishMap = class extends Map {
159
+ #registry = new FinalizationRegistry((key) => super.delete(key));
160
+ get size() {
161
+ return [...this].length;
162
+ }
163
+ constructor(entries = []) {
164
+ super();
165
+ for (const [key, value] of entries)
166
+ this.set(key, value);
167
+ }
168
+ get(key) {
169
+ return super.get(key)?.deref();
170
+ }
171
+ set(key, value) {
172
+ let ref = super.get(key);
173
+ if (ref)
174
+ this.#registry.unregister(ref);
175
+ ref = get(value);
176
+ this.#registry.register(value, key, ref);
177
+ return super.set(key, ref);
178
+ }
519
179
  };
520
180
 
521
181
  // src/directives.js
@@ -539,18 +199,20 @@ primary["if"] = (el, expr) => {
539
199
  break;
540
200
  }
541
201
  el.replaceWith(cur = holder);
542
- return (state) => {
543
- let i2 = clauses.findIndex((f2) => f2(state));
544
- if (els[i2] != cur) {
202
+ return (state2) => {
203
+ let i = clauses.findIndex((f) => f(state2));
204
+ if (els[i] != cur) {
545
205
  ;
546
- (cur[_each] || cur).replaceWith(cur = els[i2] || holder);
547
- sprae(cur, state);
206
+ (cur[_each] || cur).replaceWith(cur = els[i] || holder);
207
+ sprae(cur, state2);
548
208
  }
549
209
  };
550
210
  };
551
211
  primary["with"] = (el, expr, rootState) => {
552
212
  let evaluate = parseExpr(el, expr, "with");
553
- sprae(el, signalStruct(evaluate(rootState), rootState));
213
+ const localState = evaluate(rootState);
214
+ let state2 = state(localState, rootState);
215
+ sprae(el, state2);
554
216
  };
555
217
  var _each = Symbol(":each");
556
218
  primary["each"] = (tpl, expr) => {
@@ -563,17 +225,18 @@ primary["each"] = (tpl, expr) => {
563
225
  const keyExpr = tpl.getAttribute(":key");
564
226
  const itemKey = keyExpr ? parseExpr(null, keyExpr) : null;
565
227
  tpl.removeAttribute(":key");
566
- const scopes = /* @__PURE__ */ new WeakMap();
567
- const itemEls = /* @__PURE__ */ new WeakMap();
228
+ const refExpr = tpl.getAttribute(":ref");
229
+ const scopes = new WeakishMap();
230
+ const itemEls = new WeakishMap();
568
231
  let curEls = [];
569
- return (state) => {
570
- let list = evaluate(state);
232
+ return (state2) => {
233
+ let list = evaluate(state2);
571
234
  if (!list)
572
235
  list = [];
573
236
  else if (typeof list === "number")
574
- list = Array.from({ length: list }, (_2, i2) => [i2, i2 + 1]);
237
+ list = Array.from({ length: list }, (_, i) => [i, i + 1]);
575
238
  else if (Array.isArray(list))
576
- list = list.map((item, i2) => [i2 + 1, item]);
239
+ list = list.map((item, i) => [i + 1, item]);
577
240
  else if (typeof list === "object")
578
241
  list = Object.entries(list);
579
242
  else
@@ -581,15 +244,13 @@ primary["each"] = (tpl, expr) => {
581
244
  let newEls = [], elScopes = [];
582
245
  for (let [idx, item] of list) {
583
246
  let el, scope, key = itemKey?.({ [each[0]]: item, [each[1]]: idx });
584
- if (isPrimitive(key))
585
- key = primitive_pool_default(key);
586
247
  if (key == null)
587
248
  el = tpl.cloneNode(true);
588
249
  else
589
250
  (el = itemEls.get(key)) || itemEls.set(key, el = tpl.cloneNode(true));
590
251
  newEls.push(el);
591
252
  if (key == null || !(scope = scopes.get(key))) {
592
- scope = signalStruct({ [each[0]]: item, [each[1]]: idx }, state);
253
+ scope = state({ [each[0]]: item, [refExpr || ""]: null, [each[1]]: idx }, state2);
593
254
  if (key != null)
594
255
  scopes.set(key, scope);
595
256
  } else
@@ -598,8 +259,8 @@ primary["each"] = (tpl, expr) => {
598
259
  }
599
260
  domdiff_default(holder.parentNode, curEls, newEls, holder);
600
261
  curEls = newEls;
601
- for (let i2 = 0; i2 < newEls.length; i2++) {
602
- sprae(newEls[i2], elScopes[i2]);
262
+ for (let i = 0; i < newEls.length; i++) {
263
+ sprae(newEls[i], elScopes[i]);
603
264
  }
604
265
  };
605
266
  };
@@ -621,20 +282,20 @@ function parseForExpression(expression) {
621
282
  ];
622
283
  return [item, "", items];
623
284
  }
624
- secondary["ref"] = (el, expr, state) => {
625
- state[expr] = el;
285
+ secondary["ref"] = (el, expr, state2) => {
286
+ state2[expr] = el;
626
287
  };
627
288
  secondary["id"] = (el, expr) => {
628
289
  let evaluate = parseExpr(el, expr, ":id");
629
- const update = (v2) => el.id = v2 || v2 === 0 ? v2 : "";
630
- return (state) => update(evaluate(state));
290
+ const update = (v) => el.id = v || v === 0 ? v : "";
291
+ return (state2) => update(evaluate(state2));
631
292
  };
632
293
  secondary["class"] = (el, expr) => {
633
294
  let evaluate = parseExpr(el, expr, ":class");
634
295
  let initClassName = el.className;
635
- return (state) => {
636
- let v2 = evaluate(state);
637
- let className = typeof v2 === "string" ? v2 : (Array.isArray(v2) ? v2 : Object.entries(v2).map(([k, v3]) => v3 ? k : "")).filter(Boolean).join(" ");
296
+ return (state2) => {
297
+ let v = evaluate(state2);
298
+ let className = typeof v === "string" ? v : (Array.isArray(v) ? v : Object.entries(v).map(([k, v2]) => v2 ? k : "")).filter(Boolean).join(" ");
638
299
  el.className = [initClassName, className].filter(Boolean).join(" ");
639
300
  };
640
301
  };
@@ -643,28 +304,28 @@ secondary["style"] = (el, expr) => {
643
304
  let initStyle = el.getAttribute("style") || "";
644
305
  if (!initStyle.endsWith(";"))
645
306
  initStyle += "; ";
646
- return (state) => {
647
- let v2 = evaluate(state);
648
- if (typeof v2 === "string")
649
- el.setAttribute("style", initStyle + v2);
307
+ return (state2) => {
308
+ let v = evaluate(state2);
309
+ if (typeof v === "string")
310
+ el.setAttribute("style", initStyle + v);
650
311
  else {
651
312
  el.setAttribute("style", initStyle);
652
- for (let k in v2)
653
- el.style.setProperty(k, v2[k]);
313
+ for (let k in v)
314
+ el.style.setProperty(k, v[k]);
654
315
  }
655
316
  };
656
317
  };
657
318
  secondary["text"] = (el, expr) => {
658
319
  let evaluate = parseExpr(el, expr, ":text");
659
- return (state) => {
660
- let value = evaluate(state);
320
+ return (state2) => {
321
+ let value = evaluate(state2);
661
322
  el.textContent = value == null ? "" : value;
662
323
  };
663
324
  };
664
325
  secondary["data"] = (el, expr) => {
665
326
  let evaluate = parseExpr(el, expr, ":data");
666
- return (state) => {
667
- let value = evaluate(state);
327
+ return (state2) => {
328
+ let value = evaluate(state2);
668
329
  for (let key in value)
669
330
  el.dataset[key] = value[key];
670
331
  };
@@ -675,13 +336,13 @@ secondary["aria"] = (el, expr) => {
675
336
  for (let key in value)
676
337
  attr(el, "aria-" + dashcase(key), value[key] == null ? null : value[key] + "");
677
338
  };
678
- return (state) => update(evaluate(state));
339
+ return (state2) => update(evaluate(state2));
679
340
  };
680
341
  secondary[""] = (el, expr) => {
681
342
  let evaluate = parseExpr(el, expr, ":");
682
343
  if (evaluate)
683
- return (state) => {
684
- let value = evaluate(state);
344
+ return (state2) => {
345
+ let value = evaluate(state2);
685
346
  for (let key in value)
686
347
  attr(el, dashcase(key), value[key]);
687
348
  };
@@ -695,12 +356,12 @@ secondary["value"] = (el, expr) => {
695
356
  el.value = value;
696
357
  el.selectedOptions[0]?.setAttribute("selected", "");
697
358
  } : (value) => el.value = value;
698
- return (state) => update(evaluate(state));
359
+ return (state2) => update(evaluate(state2));
699
360
  };
700
361
  secondary["on"] = (el, expr) => {
701
362
  let evaluate = parseExpr(el, expr, ":on");
702
- return (state) => {
703
- let listeners = evaluate(state);
363
+ return (state2) => {
364
+ let listeners = evaluate(state2);
704
365
  let offs = [];
705
366
  for (let evt in listeners)
706
367
  offs.push(on(el, evt, listeners[evt]));
@@ -710,25 +371,25 @@ secondary["on"] = (el, expr) => {
710
371
  };
711
372
  };
712
373
  };
713
- var directives_default = (el, expr, state, name) => {
374
+ var directives_default = (el, expr, state2, name) => {
714
375
  let evt = name.startsWith("on") && name.slice(2);
715
376
  let evaluate = parseExpr(el, expr, ":" + name);
716
377
  if (!evaluate)
717
378
  return;
718
379
  if (evt)
719
- return (state2) => {
720
- let value = evaluate(state2) || (() => {
380
+ return (state3) => {
381
+ let value = evaluate(state3) || (() => {
721
382
  });
722
383
  return on(el, evt, value);
723
384
  };
724
- return (state2) => attr(el, name, evaluate(state2));
385
+ return (state3) => attr(el, name, evaluate(state3));
725
386
  };
726
387
  var on = (target, evt, origFn) => {
727
388
  if (!origFn)
728
389
  return;
729
- let ctxs = evt.split("..").map((e2) => {
390
+ let ctxs = evt.split("..").map((e) => {
730
391
  let ctx = { evt: "", target, test: () => true };
731
- ctx.evt = (e2.startsWith("on") ? e2.slice(2) : e2).replace(
392
+ ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
732
393
  /\.(\w+)?-?([-\w]+)?/g,
733
394
  (match, mod, param = "") => (ctx.test = mods[mod]?.(ctx, ...param.split("-")) || ctx.test, "")
734
395
  );
@@ -738,10 +399,10 @@ var on = (target, evt, origFn) => {
738
399
  return addListenerWithMods(origFn, ctxs[0]);
739
400
  const onFn = (fn, cur = 0) => {
740
401
  let off;
741
- let curListener = (e2) => {
402
+ let curListener = (e) => {
742
403
  if (cur)
743
404
  off();
744
- let nextFn = fn.call(target, e2);
405
+ let nextFn = fn.call(target, e);
745
406
  if (typeof nextFn !== "function")
746
407
  nextFn = () => {
747
408
  };
@@ -755,7 +416,7 @@ var on = (target, evt, origFn) => {
755
416
  function addListenerWithMods(fn, { evt: evt2, target: target2, test, defer, stop, prevent, ...opts }) {
756
417
  if (defer)
757
418
  fn = defer(fn);
758
- let cb = (e2) => test(e2) && (stop && e2.stopPropagation(), prevent && e2.preventDefault(), fn.call(target2, e2));
419
+ let cb = (e) => test(e) && (stop && e.stopPropagation(), prevent && e.preventDefault(), fn.call(target2, e));
759
420
  target2.addEventListener(evt2, cb, opts);
760
421
  return () => target2.removeEventListener(evt2, cb, opts);
761
422
  }
@@ -784,7 +445,7 @@ var mods = {
784
445
  ctx.target = document;
785
446
  },
786
447
  toggle(ctx) {
787
- ctx.defer = (fn, out) => (e2) => out ? (out.call?.(ctx.target, e2), out = null) : out = fn();
448
+ ctx.defer = (fn, out) => (e) => out ? (out.call?.(ctx.target, e), out = null) : out = fn();
788
449
  },
789
450
  throttle(ctx, limit) {
790
451
  ctx.defer = (fn) => throttle(fn, limit ? Number(limit) || 0 : 108);
@@ -792,21 +453,21 @@ var mods = {
792
453
  debounce(ctx, wait) {
793
454
  ctx.defer = (fn) => debounce(fn, wait ? Number(wait) || 0 : 108);
794
455
  },
795
- outside: (ctx) => (e2) => {
456
+ outside: (ctx) => (e) => {
796
457
  let target = ctx.target;
797
- if (target.contains(e2.target))
458
+ if (target.contains(e.target))
798
459
  return false;
799
- if (e2.target.isConnected === false)
460
+ if (e.target.isConnected === false)
800
461
  return false;
801
462
  if (target.offsetWidth < 1 && target.offsetHeight < 1)
802
463
  return false;
803
464
  return true;
804
465
  },
805
- self: (ctx) => (e2) => e2.target === ctx.target,
806
- ctrl: (ctx, ...param) => (e2) => keys.ctrl(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
807
- shift: (ctx, ...param) => (e2) => keys.shift(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
808
- alt: (ctx, ...param) => (e2) => keys.alt(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
809
- meta: (ctx, ...param) => (e2) => keys.meta(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
466
+ self: (ctx) => (e) => e.target === ctx.target,
467
+ ctrl: (ctx, ...param) => (e) => keys.ctrl(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
468
+ shift: (ctx, ...param) => (e) => keys.shift(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
469
+ alt: (ctx, ...param) => (e) => keys.alt(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
470
+ meta: (ctx, ...param) => (e) => keys.meta(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
810
471
  arrow: (ctx) => keys.arrow,
811
472
  enter: (ctx) => keys.enter,
812
473
  escape: (ctx) => keys.escape,
@@ -819,70 +480,70 @@ var mods = {
819
480
  character: (ctx) => keys.character
820
481
  };
821
482
  var keys = {
822
- ctrl: (e2) => e2.ctrlKey || e2.key === "Control" || e2.key === "Ctrl",
823
- shift: (e2) => e2.shiftKey || e2.key === "Shift",
824
- alt: (e2) => e2.altKey || e2.key === "Alt",
825
- meta: (e2) => e2.metaKey || e2.key === "Meta" || e2.key === "Command",
826
- arrow: (e2) => e2.key.startsWith("Arrow"),
827
- enter: (e2) => e2.key === "Enter",
828
- escape: (e2) => e2.key.startsWith("Esc"),
829
- tab: (e2) => e2.key === "Tab",
830
- space: (e2) => e2.key === "\xA0" || e2.key === "Space" || e2.key === " ",
831
- backspace: (e2) => e2.key === "Backspace",
832
- delete: (e2) => e2.key === "Delete",
833
- digit: (e2) => /^\d$/.test(e2.key),
834
- letter: (e2) => /^[a-zA-Z]$/.test(e2.key),
835
- character: (e2) => /^\S$/.test(e2.key)
483
+ ctrl: (e) => e.ctrlKey || e.key === "Control" || e.key === "Ctrl",
484
+ shift: (e) => e.shiftKey || e.key === "Shift",
485
+ alt: (e) => e.altKey || e.key === "Alt",
486
+ meta: (e) => e.metaKey || e.key === "Meta" || e.key === "Command",
487
+ arrow: (e) => e.key.startsWith("Arrow"),
488
+ enter: (e) => e.key === "Enter",
489
+ escape: (e) => e.key.startsWith("Esc"),
490
+ tab: (e) => e.key === "Tab",
491
+ space: (e) => e.key === "\xA0" || e.key === "Space" || e.key === " ",
492
+ backspace: (e) => e.key === "Backspace",
493
+ delete: (e) => e.key === "Delete",
494
+ digit: (e) => /^\d$/.test(e.key),
495
+ letter: (e) => /^[a-zA-Z]$/.test(e.key),
496
+ character: (e) => /^\S$/.test(e.key)
836
497
  };
837
498
  var throttle = (fn, limit) => {
838
- let pause, planned, block = (e2) => {
499
+ let pause, planned, block = (e) => {
839
500
  pause = true;
840
501
  setTimeout(() => {
841
502
  pause = false;
842
503
  if (planned)
843
- return planned = false, block(e2), fn(e2);
504
+ return planned = false, block(e), fn(e);
844
505
  }, limit);
845
506
  };
846
- return (e2) => {
507
+ return (e) => {
847
508
  if (pause)
848
509
  return planned = true;
849
- block(e2);
850
- return fn(e2);
510
+ block(e);
511
+ return fn(e);
851
512
  };
852
513
  };
853
514
  var debounce = (fn, wait) => {
854
515
  let timeout;
855
- return (e2) => {
516
+ return (e) => {
856
517
  clearTimeout(timeout);
857
518
  timeout = setTimeout(() => {
858
519
  timeout = null;
859
- fn(e2);
520
+ fn(e);
860
521
  }, wait);
861
522
  };
862
523
  };
863
- var attr = (el, name, v2) => {
864
- if (v2 == null || v2 === false)
524
+ var attr = (el, name, v) => {
525
+ if (v == null || v === false)
865
526
  el.removeAttribute(name);
866
527
  else
867
- el.setAttribute(name, v2 === true ? "" : typeof v2 === "number" || typeof v2 === "string" ? v2 : "");
528
+ el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
868
529
  };
869
530
  var evaluatorMemo = {};
870
531
  function parseExpr(el, expression, dir) {
871
532
  let evaluate = evaluatorMemo[expression];
872
533
  if (!evaluate) {
873
- let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression) || /\b(let|const)\s/.test(expression) ? `(() => { ${expression} })()` : expression;
534
+ let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression) || /\b(let|const)\s/.test(expression) && !dir.startsWith(":on") ? `(() => {${expression}})()` : expression;
874
535
  try {
875
536
  evaluate = evaluatorMemo[expression] = new Function(`__scope`, `with (__scope) { return ${rightSideSafeExpression.trim()} };`);
876
- } catch (e2) {
877
- return exprError(e2, el, expression, dir);
537
+ } catch (e) {
538
+ return exprError(e, el, expression, dir);
878
539
  }
879
540
  }
880
- return (state) => {
541
+ return (state2) => {
881
542
  let result;
882
543
  try {
883
- result = evaluate.call(el, state);
884
- } catch (e2) {
885
- return exprError(e2, el, expression, dir);
544
+ result = evaluate.call(el, state2);
545
+ } catch (e) {
546
+ return exprError(e, el, expression, dir);
886
547
  }
887
548
  return result;
888
549
  };
@@ -894,28 +555,26 @@ function exprError(error, element, expression, dir) {
894
555
  ${dir}=${expression ? `"${expression}"
895
556
 
896
557
  ` : ""}`, element);
897
- setTimeout(() => {
558
+ queueMicrotask(() => {
898
559
  throw error;
899
560
  }, 0);
900
561
  }
901
562
  function dashcase(str) {
902
563
  return str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, (match) => "-" + match.toLowerCase());
903
564
  }
904
- function isPrimitive(obj) {
905
- return typeof obj === "string" || typeof obj === "boolean" || typeof obj === "number";
906
- }
907
565
 
908
566
  // src/core.js
567
+ sprae.sandbox = sandbox;
909
568
  var memo = /* @__PURE__ */ new WeakMap();
910
569
  function sprae(container, values) {
911
570
  if (!container.children)
912
571
  return;
913
572
  if (memo.has(container)) {
914
- let state2 = memo.get(container);
915
- h(() => Object.assign(state2, values));
916
- return state2;
573
+ let state3 = memo.get(container);
574
+ batch(() => Object.assign(state3, values));
575
+ return state3;
917
576
  }
918
- const state = signalStruct(values || {});
577
+ const state2 = state(values || {});
919
578
  const updates = [];
920
579
  const init = (el, parent = el.parentNode) => {
921
580
  for (let name in primary) {
@@ -923,16 +582,16 @@ function sprae(container, values) {
923
582
  if (el.hasAttribute?.(attrName)) {
924
583
  let expr = el.getAttribute(attrName);
925
584
  el.removeAttribute(attrName);
926
- updates.push(primary[name](el, expr, state, name));
585
+ updates.push(primary[name](el, expr, state2, name));
927
586
  if (memo.has(el) || el.parentNode !== parent)
928
587
  return false;
929
588
  }
930
589
  }
931
590
  if (el.attributes) {
932
- for (let i2 = 0; i2 < el.attributes.length; ) {
933
- let attr2 = el.attributes[i2];
591
+ for (let i = 0; i < el.attributes.length; ) {
592
+ let attr2 = el.attributes[i];
934
593
  if (attr2.name[0] !== ":") {
935
- i2++;
594
+ i++;
936
595
  continue;
937
596
  }
938
597
  el.removeAttribute(attr2.name);
@@ -940,30 +599,29 @@ function sprae(container, values) {
940
599
  let attrNames = attr2.name.slice(1).split(":");
941
600
  for (let attrName of attrNames) {
942
601
  let dir = secondary[attrName] || directives_default;
943
- updates.push(dir(el, expr, state, attrName));
602
+ updates.push(dir(el, expr, state2, attrName));
944
603
  if (memo.has(el) || el.parentNode !== parent)
945
604
  return false;
946
605
  }
947
606
  }
948
607
  }
949
- for (let i2 = 0, child; child = el.children[i2]; i2++) {
608
+ for (let i = 0, child; child = el.children[i]; i++) {
950
609
  if (init(child, el) === false)
951
- i2--;
610
+ i--;
952
611
  }
953
612
  };
954
613
  init(container);
955
614
  for (let update of updates)
956
615
  if (update) {
957
616
  let teardown;
958
- p(() => {
617
+ fx(() => {
959
618
  if (typeof teardown === "function")
960
619
  teardown();
961
- teardown = update(state);
620
+ teardown = update(state2);
962
621
  });
963
622
  }
964
- Object.seal(state);
965
- memo.set(container, state);
966
- return state;
623
+ memo.set(container, state2);
624
+ return state2;
967
625
  }
968
626
 
969
627
  // src/index.js