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/package.json +3 -5
- package/r&d.md +33 -30
- package/readme.md +6 -88
- package/sprae.js +248 -590
- package/sprae.min.js +1 -1
- package/src/core.js +12 -6
- package/src/directives.js +13 -16
- package/src/state.js +113 -0
- package/src/weakish-map.js +29 -0
- package/test/dom.js +935 -0
- package/test/index.html +2 -1
- package/test/state.js +274 -0
- package/test/test.js +2 -915
- package/todo.md +4 -4
package/sprae.js
CHANGED
|
@@ -1,521 +1,181 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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 (
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
235
|
-
if (
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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,
|
|
99
|
+
function domdiff_default(parent, a, b, before) {
|
|
453
100
|
const aIdx = /* @__PURE__ */ new Map();
|
|
454
101
|
const bIdx = /* @__PURE__ */ new Map();
|
|
455
|
-
let
|
|
102
|
+
let i;
|
|
456
103
|
let j;
|
|
457
|
-
for (
|
|
458
|
-
aIdx.set(
|
|
104
|
+
for (i = 0; i < a.length; i++) {
|
|
105
|
+
aIdx.set(a[i], i);
|
|
459
106
|
}
|
|
460
|
-
for (
|
|
461
|
-
bIdx.set(
|
|
107
|
+
for (i = 0; i < b.length; i++) {
|
|
108
|
+
bIdx.set(b[i], i);
|
|
462
109
|
}
|
|
463
|
-
for (
|
|
464
|
-
var aElm =
|
|
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
|
-
|
|
467
|
-
} else if (
|
|
468
|
-
parent.removeChild(
|
|
469
|
-
|
|
470
|
-
} else if (
|
|
471
|
-
parent.insertBefore(bElm,
|
|
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
|
-
|
|
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(
|
|
481
|
-
|
|
127
|
+
parent.removeChild(a[i]);
|
|
128
|
+
i++;
|
|
482
129
|
} else if (wantedElmInOld === void 0) {
|
|
483
130
|
parent.insertBefore(
|
|
484
131
|
bElm,
|
|
485
|
-
|
|
132
|
+
a[i] || before
|
|
486
133
|
);
|
|
487
134
|
j++;
|
|
488
135
|
} else {
|
|
489
136
|
parent.insertBefore(
|
|
490
|
-
|
|
491
|
-
|
|
137
|
+
a[wantedElmInOld],
|
|
138
|
+
a[i] || before
|
|
492
139
|
);
|
|
493
|
-
|
|
494
|
-
if (wantedElmInOld >
|
|
495
|
-
|
|
140
|
+
a[wantedElmInOld] = null;
|
|
141
|
+
if (wantedElmInOld > i + 1)
|
|
142
|
+
i++;
|
|
496
143
|
j++;
|
|
497
144
|
}
|
|
498
145
|
}
|
|
499
146
|
}
|
|
500
|
-
return
|
|
147
|
+
return b;
|
|
501
148
|
}
|
|
502
149
|
|
|
503
|
-
//
|
|
504
|
-
var
|
|
505
|
-
var
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
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 (
|
|
543
|
-
let
|
|
544
|
-
if (els[
|
|
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[
|
|
547
|
-
sprae(cur,
|
|
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
|
-
|
|
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
|
|
567
|
-
const
|
|
228
|
+
const refExpr = tpl.getAttribute(":ref");
|
|
229
|
+
const scopes = new WeakishMap();
|
|
230
|
+
const itemEls = new WeakishMap();
|
|
568
231
|
let curEls = [];
|
|
569
|
-
return (
|
|
570
|
-
let list = evaluate(
|
|
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 }, (
|
|
237
|
+
list = Array.from({ length: list }, (_, i) => [i, i + 1]);
|
|
575
238
|
else if (Array.isArray(list))
|
|
576
|
-
list = list.map((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 =
|
|
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
|
|
602
|
-
sprae(newEls[
|
|
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,
|
|
625
|
-
|
|
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 = (
|
|
630
|
-
return (
|
|
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 (
|
|
636
|
-
let
|
|
637
|
-
let className = typeof
|
|
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 (
|
|
647
|
-
let
|
|
648
|
-
if (typeof
|
|
649
|
-
el.setAttribute("style", initStyle +
|
|
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
|
|
653
|
-
el.style.setProperty(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 (
|
|
660
|
-
let value = evaluate(
|
|
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 (
|
|
667
|
-
let value = evaluate(
|
|
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 (
|
|
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 (
|
|
684
|
-
let value = evaluate(
|
|
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 (
|
|
359
|
+
return (state2) => update(evaluate(state2));
|
|
699
360
|
};
|
|
700
361
|
secondary["on"] = (el, expr) => {
|
|
701
362
|
let evaluate = parseExpr(el, expr, ":on");
|
|
702
|
-
return (
|
|
703
|
-
let listeners = evaluate(
|
|
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,
|
|
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 (
|
|
720
|
-
let value = evaluate(
|
|
380
|
+
return (state3) => {
|
|
381
|
+
let value = evaluate(state3) || (() => {
|
|
721
382
|
});
|
|
722
383
|
return on(el, evt, value);
|
|
723
384
|
};
|
|
724
|
-
return (
|
|
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((
|
|
390
|
+
let ctxs = evt.split("..").map((e) => {
|
|
730
391
|
let ctx = { evt: "", target, test: () => true };
|
|
731
|
-
ctx.evt = (
|
|
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 = (
|
|
402
|
+
let curListener = (e) => {
|
|
742
403
|
if (cur)
|
|
743
404
|
off();
|
|
744
|
-
let nextFn = fn.call(target,
|
|
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 = (
|
|
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) => (
|
|
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) => (
|
|
456
|
+
outside: (ctx) => (e) => {
|
|
796
457
|
let target = ctx.target;
|
|
797
|
-
if (target.contains(
|
|
458
|
+
if (target.contains(e.target))
|
|
798
459
|
return false;
|
|
799
|
-
if (
|
|
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) => (
|
|
806
|
-
ctrl: (ctx, ...param) => (
|
|
807
|
-
shift: (ctx, ...param) => (
|
|
808
|
-
alt: (ctx, ...param) => (
|
|
809
|
-
meta: (ctx, ...param) => (
|
|
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: (
|
|
823
|
-
shift: (
|
|
824
|
-
alt: (
|
|
825
|
-
meta: (
|
|
826
|
-
arrow: (
|
|
827
|
-
enter: (
|
|
828
|
-
escape: (
|
|
829
|
-
tab: (
|
|
830
|
-
space: (
|
|
831
|
-
backspace: (
|
|
832
|
-
delete: (
|
|
833
|
-
digit: (
|
|
834
|
-
letter: (
|
|
835
|
-
character: (
|
|
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 = (
|
|
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(
|
|
504
|
+
return planned = false, block(e), fn(e);
|
|
844
505
|
}, limit);
|
|
845
506
|
};
|
|
846
|
-
return (
|
|
507
|
+
return (e) => {
|
|
847
508
|
if (pause)
|
|
848
509
|
return planned = true;
|
|
849
|
-
block(
|
|
850
|
-
return fn(
|
|
510
|
+
block(e);
|
|
511
|
+
return fn(e);
|
|
851
512
|
};
|
|
852
513
|
};
|
|
853
514
|
var debounce = (fn, wait) => {
|
|
854
515
|
let timeout;
|
|
855
|
-
return (
|
|
516
|
+
return (e) => {
|
|
856
517
|
clearTimeout(timeout);
|
|
857
518
|
timeout = setTimeout(() => {
|
|
858
519
|
timeout = null;
|
|
859
|
-
fn(
|
|
520
|
+
fn(e);
|
|
860
521
|
}, wait);
|
|
861
522
|
};
|
|
862
523
|
};
|
|
863
|
-
var attr = (el, name,
|
|
864
|
-
if (
|
|
524
|
+
var attr = (el, name, v) => {
|
|
525
|
+
if (v == null || v === false)
|
|
865
526
|
el.removeAttribute(name);
|
|
866
527
|
else
|
|
867
|
-
el.setAttribute(name,
|
|
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) ? `(() => {
|
|
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 (
|
|
877
|
-
return exprError(
|
|
537
|
+
} catch (e) {
|
|
538
|
+
return exprError(e, el, expression, dir);
|
|
878
539
|
}
|
|
879
540
|
}
|
|
880
|
-
return (
|
|
541
|
+
return (state2) => {
|
|
881
542
|
let result;
|
|
882
543
|
try {
|
|
883
|
-
result = evaluate.call(el,
|
|
884
|
-
} catch (
|
|
885
|
-
return exprError(
|
|
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
|
-
|
|
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
|
|
915
|
-
|
|
916
|
-
return
|
|
573
|
+
let state3 = memo.get(container);
|
|
574
|
+
batch(() => Object.assign(state3, values));
|
|
575
|
+
return state3;
|
|
917
576
|
}
|
|
918
|
-
const
|
|
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,
|
|
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
|
|
933
|
-
let attr2 = el.attributes[
|
|
591
|
+
for (let i = 0; i < el.attributes.length; ) {
|
|
592
|
+
let attr2 = el.attributes[i];
|
|
934
593
|
if (attr2.name[0] !== ":") {
|
|
935
|
-
|
|
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,
|
|
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
|
|
608
|
+
for (let i = 0, child; child = el.children[i]; i++) {
|
|
950
609
|
if (init(child, el) === false)
|
|
951
|
-
|
|
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
|
-
|
|
617
|
+
fx(() => {
|
|
959
618
|
if (typeof teardown === "function")
|
|
960
619
|
teardown();
|
|
961
|
-
teardown = update(
|
|
620
|
+
teardown = update(state2);
|
|
962
621
|
});
|
|
963
622
|
}
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
return state;
|
|
623
|
+
memo.set(container, state2);
|
|
624
|
+
return state2;
|
|
967
625
|
}
|
|
968
626
|
|
|
969
627
|
// src/index.js
|