sprae 2.14.2 → 3.0.1
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 -4
- package/r&d.md +24 -24
- package/readme.md +5 -87
- package/sprae.js +216 -566
- package/sprae.min.js +1 -1
- package/src/core.js +12 -6
- package/src/directives.js +8 -5
- package/src/state.js +113 -0
- package/test/dom.js +935 -0
- package/test/index.html +2 -1
- package/test/state.js +274 -0
- package/test/test.js +2 -922
- package/todo.md +4 -4
package/sprae.js
CHANGED
|
@@ -1,503 +1,150 @@
|
|
|
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;
|
|
100
|
-
}
|
|
101
|
-
if (void 0 !== h2) {
|
|
102
|
-
h2.e = t2;
|
|
103
|
-
i2.x = 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);
|
|
104
37
|
}
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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;
|
|
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;
|
|
118
43
|
}
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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))
|
|
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();
|
|
204
59
|
return true;
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
};
|
|
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
66
|
};
|
|
333
|
-
|
|
334
|
-
if (
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
150
|
// src/weakish-map.js
|
|
@@ -552,18 +199,20 @@ primary["if"] = (el, expr) => {
|
|
|
552
199
|
break;
|
|
553
200
|
}
|
|
554
201
|
el.replaceWith(cur = holder);
|
|
555
|
-
return (
|
|
556
|
-
let
|
|
557
|
-
if (els[
|
|
202
|
+
return (state2) => {
|
|
203
|
+
let i = clauses.findIndex((f) => f(state2));
|
|
204
|
+
if (els[i] != cur) {
|
|
558
205
|
;
|
|
559
|
-
(cur[_each] || cur).replaceWith(cur = els[
|
|
560
|
-
sprae(cur,
|
|
206
|
+
(cur[_each] || cur).replaceWith(cur = els[i] || holder);
|
|
207
|
+
sprae(cur, state2);
|
|
561
208
|
}
|
|
562
209
|
};
|
|
563
210
|
};
|
|
564
211
|
primary["with"] = (el, expr, rootState) => {
|
|
565
212
|
let evaluate = parseExpr(el, expr, "with");
|
|
566
|
-
|
|
213
|
+
const localState = evaluate(rootState);
|
|
214
|
+
let state2 = state(localState, rootState);
|
|
215
|
+
sprae(el, state2);
|
|
567
216
|
};
|
|
568
217
|
var _each = Symbol(":each");
|
|
569
218
|
primary["each"] = (tpl, expr) => {
|
|
@@ -576,17 +225,18 @@ primary["each"] = (tpl, expr) => {
|
|
|
576
225
|
const keyExpr = tpl.getAttribute(":key");
|
|
577
226
|
const itemKey = keyExpr ? parseExpr(null, keyExpr) : null;
|
|
578
227
|
tpl.removeAttribute(":key");
|
|
228
|
+
const refExpr = tpl.getAttribute(":ref");
|
|
579
229
|
const scopes = new WeakishMap();
|
|
580
230
|
const itemEls = new WeakishMap();
|
|
581
231
|
let curEls = [];
|
|
582
|
-
return (
|
|
583
|
-
let list = evaluate(
|
|
232
|
+
return (state2) => {
|
|
233
|
+
let list = evaluate(state2);
|
|
584
234
|
if (!list)
|
|
585
235
|
list = [];
|
|
586
236
|
else if (typeof list === "number")
|
|
587
|
-
list = Array.from({ length: list }, (
|
|
237
|
+
list = Array.from({ length: list }, (_, i) => [i, i + 1]);
|
|
588
238
|
else if (Array.isArray(list))
|
|
589
|
-
list = list.map((item,
|
|
239
|
+
list = list.map((item, i) => [i + 1, item]);
|
|
590
240
|
else if (typeof list === "object")
|
|
591
241
|
list = Object.entries(list);
|
|
592
242
|
else
|
|
@@ -600,7 +250,7 @@ primary["each"] = (tpl, expr) => {
|
|
|
600
250
|
(el = itemEls.get(key)) || itemEls.set(key, el = tpl.cloneNode(true));
|
|
601
251
|
newEls.push(el);
|
|
602
252
|
if (key == null || !(scope = scopes.get(key))) {
|
|
603
|
-
scope =
|
|
253
|
+
scope = state({ [each[0]]: item, [refExpr || ""]: null, [each[1]]: idx }, state2);
|
|
604
254
|
if (key != null)
|
|
605
255
|
scopes.set(key, scope);
|
|
606
256
|
} else
|
|
@@ -609,8 +259,8 @@ primary["each"] = (tpl, expr) => {
|
|
|
609
259
|
}
|
|
610
260
|
domdiff_default(holder.parentNode, curEls, newEls, holder);
|
|
611
261
|
curEls = newEls;
|
|
612
|
-
for (let
|
|
613
|
-
sprae(newEls[
|
|
262
|
+
for (let i = 0; i < newEls.length; i++) {
|
|
263
|
+
sprae(newEls[i], elScopes[i]);
|
|
614
264
|
}
|
|
615
265
|
};
|
|
616
266
|
};
|
|
@@ -632,20 +282,20 @@ function parseForExpression(expression) {
|
|
|
632
282
|
];
|
|
633
283
|
return [item, "", items];
|
|
634
284
|
}
|
|
635
|
-
secondary["ref"] = (el, expr,
|
|
636
|
-
|
|
285
|
+
secondary["ref"] = (el, expr, state2) => {
|
|
286
|
+
state2[expr] = el;
|
|
637
287
|
};
|
|
638
288
|
secondary["id"] = (el, expr) => {
|
|
639
289
|
let evaluate = parseExpr(el, expr, ":id");
|
|
640
|
-
const update = (
|
|
641
|
-
return (
|
|
290
|
+
const update = (v) => el.id = v || v === 0 ? v : "";
|
|
291
|
+
return (state2) => update(evaluate(state2));
|
|
642
292
|
};
|
|
643
293
|
secondary["class"] = (el, expr) => {
|
|
644
294
|
let evaluate = parseExpr(el, expr, ":class");
|
|
645
295
|
let initClassName = el.className;
|
|
646
|
-
return (
|
|
647
|
-
let
|
|
648
|
-
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(" ");
|
|
649
299
|
el.className = [initClassName, className].filter(Boolean).join(" ");
|
|
650
300
|
};
|
|
651
301
|
};
|
|
@@ -654,28 +304,28 @@ secondary["style"] = (el, expr) => {
|
|
|
654
304
|
let initStyle = el.getAttribute("style") || "";
|
|
655
305
|
if (!initStyle.endsWith(";"))
|
|
656
306
|
initStyle += "; ";
|
|
657
|
-
return (
|
|
658
|
-
let
|
|
659
|
-
if (typeof
|
|
660
|
-
el.setAttribute("style", initStyle +
|
|
307
|
+
return (state2) => {
|
|
308
|
+
let v = evaluate(state2);
|
|
309
|
+
if (typeof v === "string")
|
|
310
|
+
el.setAttribute("style", initStyle + v);
|
|
661
311
|
else {
|
|
662
312
|
el.setAttribute("style", initStyle);
|
|
663
|
-
for (let k in
|
|
664
|
-
el.style.setProperty(k,
|
|
313
|
+
for (let k in v)
|
|
314
|
+
el.style.setProperty(k, v[k]);
|
|
665
315
|
}
|
|
666
316
|
};
|
|
667
317
|
};
|
|
668
318
|
secondary["text"] = (el, expr) => {
|
|
669
319
|
let evaluate = parseExpr(el, expr, ":text");
|
|
670
|
-
return (
|
|
671
|
-
let value = evaluate(
|
|
320
|
+
return (state2) => {
|
|
321
|
+
let value = evaluate(state2);
|
|
672
322
|
el.textContent = value == null ? "" : value;
|
|
673
323
|
};
|
|
674
324
|
};
|
|
675
325
|
secondary["data"] = (el, expr) => {
|
|
676
326
|
let evaluate = parseExpr(el, expr, ":data");
|
|
677
|
-
return (
|
|
678
|
-
let value = evaluate(
|
|
327
|
+
return (state2) => {
|
|
328
|
+
let value = evaluate(state2);
|
|
679
329
|
for (let key in value)
|
|
680
330
|
el.dataset[key] = value[key];
|
|
681
331
|
};
|
|
@@ -686,13 +336,13 @@ secondary["aria"] = (el, expr) => {
|
|
|
686
336
|
for (let key in value)
|
|
687
337
|
attr(el, "aria-" + dashcase(key), value[key] == null ? null : value[key] + "");
|
|
688
338
|
};
|
|
689
|
-
return (
|
|
339
|
+
return (state2) => update(evaluate(state2));
|
|
690
340
|
};
|
|
691
341
|
secondary[""] = (el, expr) => {
|
|
692
342
|
let evaluate = parseExpr(el, expr, ":");
|
|
693
343
|
if (evaluate)
|
|
694
|
-
return (
|
|
695
|
-
let value = evaluate(
|
|
344
|
+
return (state2) => {
|
|
345
|
+
let value = evaluate(state2);
|
|
696
346
|
for (let key in value)
|
|
697
347
|
attr(el, dashcase(key), value[key]);
|
|
698
348
|
};
|
|
@@ -706,12 +356,12 @@ secondary["value"] = (el, expr) => {
|
|
|
706
356
|
el.value = value;
|
|
707
357
|
el.selectedOptions[0]?.setAttribute("selected", "");
|
|
708
358
|
} : (value) => el.value = value;
|
|
709
|
-
return (
|
|
359
|
+
return (state2) => update(evaluate(state2));
|
|
710
360
|
};
|
|
711
361
|
secondary["on"] = (el, expr) => {
|
|
712
362
|
let evaluate = parseExpr(el, expr, ":on");
|
|
713
|
-
return (
|
|
714
|
-
let listeners = evaluate(
|
|
363
|
+
return (state2) => {
|
|
364
|
+
let listeners = evaluate(state2);
|
|
715
365
|
let offs = [];
|
|
716
366
|
for (let evt in listeners)
|
|
717
367
|
offs.push(on(el, evt, listeners[evt]));
|
|
@@ -721,25 +371,25 @@ secondary["on"] = (el, expr) => {
|
|
|
721
371
|
};
|
|
722
372
|
};
|
|
723
373
|
};
|
|
724
|
-
var directives_default = (el, expr,
|
|
374
|
+
var directives_default = (el, expr, state2, name) => {
|
|
725
375
|
let evt = name.startsWith("on") && name.slice(2);
|
|
726
376
|
let evaluate = parseExpr(el, expr, ":" + name);
|
|
727
377
|
if (!evaluate)
|
|
728
378
|
return;
|
|
729
379
|
if (evt)
|
|
730
|
-
return (
|
|
731
|
-
let value = evaluate(
|
|
380
|
+
return (state3) => {
|
|
381
|
+
let value = evaluate(state3) || (() => {
|
|
732
382
|
});
|
|
733
383
|
return on(el, evt, value);
|
|
734
384
|
};
|
|
735
|
-
return (
|
|
385
|
+
return (state3) => attr(el, name, evaluate(state3));
|
|
736
386
|
};
|
|
737
387
|
var on = (target, evt, origFn) => {
|
|
738
388
|
if (!origFn)
|
|
739
389
|
return;
|
|
740
|
-
let ctxs = evt.split("..").map((
|
|
390
|
+
let ctxs = evt.split("..").map((e) => {
|
|
741
391
|
let ctx = { evt: "", target, test: () => true };
|
|
742
|
-
ctx.evt = (
|
|
392
|
+
ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
|
|
743
393
|
/\.(\w+)?-?([-\w]+)?/g,
|
|
744
394
|
(match, mod, param = "") => (ctx.test = mods[mod]?.(ctx, ...param.split("-")) || ctx.test, "")
|
|
745
395
|
);
|
|
@@ -749,10 +399,10 @@ var on = (target, evt, origFn) => {
|
|
|
749
399
|
return addListenerWithMods(origFn, ctxs[0]);
|
|
750
400
|
const onFn = (fn, cur = 0) => {
|
|
751
401
|
let off;
|
|
752
|
-
let curListener = (
|
|
402
|
+
let curListener = (e) => {
|
|
753
403
|
if (cur)
|
|
754
404
|
off();
|
|
755
|
-
let nextFn = fn.call(target,
|
|
405
|
+
let nextFn = fn.call(target, e);
|
|
756
406
|
if (typeof nextFn !== "function")
|
|
757
407
|
nextFn = () => {
|
|
758
408
|
};
|
|
@@ -766,7 +416,7 @@ var on = (target, evt, origFn) => {
|
|
|
766
416
|
function addListenerWithMods(fn, { evt: evt2, target: target2, test, defer, stop, prevent, ...opts }) {
|
|
767
417
|
if (defer)
|
|
768
418
|
fn = defer(fn);
|
|
769
|
-
let cb = (
|
|
419
|
+
let cb = (e) => test(e) && (stop && e.stopPropagation(), prevent && e.preventDefault(), fn.call(target2, e));
|
|
770
420
|
target2.addEventListener(evt2, cb, opts);
|
|
771
421
|
return () => target2.removeEventListener(evt2, cb, opts);
|
|
772
422
|
}
|
|
@@ -795,7 +445,7 @@ var mods = {
|
|
|
795
445
|
ctx.target = document;
|
|
796
446
|
},
|
|
797
447
|
toggle(ctx) {
|
|
798
|
-
ctx.defer = (fn, out) => (
|
|
448
|
+
ctx.defer = (fn, out) => (e) => out ? (out.call?.(ctx.target, e), out = null) : out = fn();
|
|
799
449
|
},
|
|
800
450
|
throttle(ctx, limit) {
|
|
801
451
|
ctx.defer = (fn) => throttle(fn, limit ? Number(limit) || 0 : 108);
|
|
@@ -803,21 +453,21 @@ var mods = {
|
|
|
803
453
|
debounce(ctx, wait) {
|
|
804
454
|
ctx.defer = (fn) => debounce(fn, wait ? Number(wait) || 0 : 108);
|
|
805
455
|
},
|
|
806
|
-
outside: (ctx) => (
|
|
456
|
+
outside: (ctx) => (e) => {
|
|
807
457
|
let target = ctx.target;
|
|
808
|
-
if (target.contains(
|
|
458
|
+
if (target.contains(e.target))
|
|
809
459
|
return false;
|
|
810
|
-
if (
|
|
460
|
+
if (e.target.isConnected === false)
|
|
811
461
|
return false;
|
|
812
462
|
if (target.offsetWidth < 1 && target.offsetHeight < 1)
|
|
813
463
|
return false;
|
|
814
464
|
return true;
|
|
815
465
|
},
|
|
816
|
-
self: (ctx) => (
|
|
817
|
-
ctrl: (ctx, ...param) => (
|
|
818
|
-
shift: (ctx, ...param) => (
|
|
819
|
-
alt: (ctx, ...param) => (
|
|
820
|
-
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),
|
|
821
471
|
arrow: (ctx) => keys.arrow,
|
|
822
472
|
enter: (ctx) => keys.enter,
|
|
823
473
|
escape: (ctx) => keys.escape,
|
|
@@ -830,52 +480,52 @@ var mods = {
|
|
|
830
480
|
character: (ctx) => keys.character
|
|
831
481
|
};
|
|
832
482
|
var keys = {
|
|
833
|
-
ctrl: (
|
|
834
|
-
shift: (
|
|
835
|
-
alt: (
|
|
836
|
-
meta: (
|
|
837
|
-
arrow: (
|
|
838
|
-
enter: (
|
|
839
|
-
escape: (
|
|
840
|
-
tab: (
|
|
841
|
-
space: (
|
|
842
|
-
backspace: (
|
|
843
|
-
delete: (
|
|
844
|
-
digit: (
|
|
845
|
-
letter: (
|
|
846
|
-
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)
|
|
847
497
|
};
|
|
848
498
|
var throttle = (fn, limit) => {
|
|
849
|
-
let pause, planned, block = (
|
|
499
|
+
let pause, planned, block = (e) => {
|
|
850
500
|
pause = true;
|
|
851
501
|
setTimeout(() => {
|
|
852
502
|
pause = false;
|
|
853
503
|
if (planned)
|
|
854
|
-
return planned = false, block(
|
|
504
|
+
return planned = false, block(e), fn(e);
|
|
855
505
|
}, limit);
|
|
856
506
|
};
|
|
857
|
-
return (
|
|
507
|
+
return (e) => {
|
|
858
508
|
if (pause)
|
|
859
509
|
return planned = true;
|
|
860
|
-
block(
|
|
861
|
-
return fn(
|
|
510
|
+
block(e);
|
|
511
|
+
return fn(e);
|
|
862
512
|
};
|
|
863
513
|
};
|
|
864
514
|
var debounce = (fn, wait) => {
|
|
865
515
|
let timeout;
|
|
866
|
-
return (
|
|
516
|
+
return (e) => {
|
|
867
517
|
clearTimeout(timeout);
|
|
868
518
|
timeout = setTimeout(() => {
|
|
869
519
|
timeout = null;
|
|
870
|
-
fn(
|
|
520
|
+
fn(e);
|
|
871
521
|
}, wait);
|
|
872
522
|
};
|
|
873
523
|
};
|
|
874
|
-
var attr = (el, name,
|
|
875
|
-
if (
|
|
524
|
+
var attr = (el, name, v) => {
|
|
525
|
+
if (v == null || v === false)
|
|
876
526
|
el.removeAttribute(name);
|
|
877
527
|
else
|
|
878
|
-
el.setAttribute(name,
|
|
528
|
+
el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
|
|
879
529
|
};
|
|
880
530
|
var evaluatorMemo = {};
|
|
881
531
|
function parseExpr(el, expression, dir) {
|
|
@@ -884,16 +534,16 @@ function parseExpr(el, expression, dir) {
|
|
|
884
534
|
let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression) || /\b(let|const)\s/.test(expression) && !dir.startsWith(":on") ? `(() => {${expression}})()` : expression;
|
|
885
535
|
try {
|
|
886
536
|
evaluate = evaluatorMemo[expression] = new Function(`__scope`, `with (__scope) { return ${rightSideSafeExpression.trim()} };`);
|
|
887
|
-
} catch (
|
|
888
|
-
return exprError(
|
|
537
|
+
} catch (e) {
|
|
538
|
+
return exprError(e, el, expression, dir);
|
|
889
539
|
}
|
|
890
540
|
}
|
|
891
|
-
return (
|
|
541
|
+
return (state2) => {
|
|
892
542
|
let result;
|
|
893
543
|
try {
|
|
894
|
-
result = evaluate.call(el,
|
|
895
|
-
} catch (
|
|
896
|
-
return exprError(
|
|
544
|
+
result = evaluate.call(el, state2);
|
|
545
|
+
} catch (e) {
|
|
546
|
+
return exprError(e, el, expression, dir);
|
|
897
547
|
}
|
|
898
548
|
return result;
|
|
899
549
|
};
|
|
@@ -905,7 +555,7 @@ function exprError(error, element, expression, dir) {
|
|
|
905
555
|
${dir}=${expression ? `"${expression}"
|
|
906
556
|
|
|
907
557
|
` : ""}`, element);
|
|
908
|
-
|
|
558
|
+
queueMicrotask(() => {
|
|
909
559
|
throw error;
|
|
910
560
|
}, 0);
|
|
911
561
|
}
|
|
@@ -914,16 +564,17 @@ function dashcase(str) {
|
|
|
914
564
|
}
|
|
915
565
|
|
|
916
566
|
// src/core.js
|
|
567
|
+
sprae.globals = sandbox;
|
|
917
568
|
var memo = /* @__PURE__ */ new WeakMap();
|
|
918
569
|
function sprae(container, values) {
|
|
919
570
|
if (!container.children)
|
|
920
571
|
return;
|
|
921
572
|
if (memo.has(container)) {
|
|
922
|
-
let
|
|
923
|
-
|
|
924
|
-
return
|
|
573
|
+
let state3 = memo.get(container);
|
|
574
|
+
batch(() => Object.assign(state3, values));
|
|
575
|
+
return state3;
|
|
925
576
|
}
|
|
926
|
-
const
|
|
577
|
+
const state2 = state(values || {});
|
|
927
578
|
const updates = [];
|
|
928
579
|
const init = (el, parent = el.parentNode) => {
|
|
929
580
|
for (let name in primary) {
|
|
@@ -931,16 +582,16 @@ function sprae(container, values) {
|
|
|
931
582
|
if (el.hasAttribute?.(attrName)) {
|
|
932
583
|
let expr = el.getAttribute(attrName);
|
|
933
584
|
el.removeAttribute(attrName);
|
|
934
|
-
updates.push(primary[name](el, expr,
|
|
585
|
+
updates.push(primary[name](el, expr, state2, name));
|
|
935
586
|
if (memo.has(el) || el.parentNode !== parent)
|
|
936
587
|
return false;
|
|
937
588
|
}
|
|
938
589
|
}
|
|
939
590
|
if (el.attributes) {
|
|
940
|
-
for (let
|
|
941
|
-
let attr2 = el.attributes[
|
|
591
|
+
for (let i = 0; i < el.attributes.length; ) {
|
|
592
|
+
let attr2 = el.attributes[i];
|
|
942
593
|
if (attr2.name[0] !== ":") {
|
|
943
|
-
|
|
594
|
+
i++;
|
|
944
595
|
continue;
|
|
945
596
|
}
|
|
946
597
|
el.removeAttribute(attr2.name);
|
|
@@ -948,30 +599,29 @@ function sprae(container, values) {
|
|
|
948
599
|
let attrNames = attr2.name.slice(1).split(":");
|
|
949
600
|
for (let attrName of attrNames) {
|
|
950
601
|
let dir = secondary[attrName] || directives_default;
|
|
951
|
-
updates.push(dir(el, expr,
|
|
602
|
+
updates.push(dir(el, expr, state2, attrName));
|
|
952
603
|
if (memo.has(el) || el.parentNode !== parent)
|
|
953
604
|
return false;
|
|
954
605
|
}
|
|
955
606
|
}
|
|
956
607
|
}
|
|
957
|
-
for (let
|
|
608
|
+
for (let i = 0, child; child = el.children[i]; i++) {
|
|
958
609
|
if (init(child, el) === false)
|
|
959
|
-
|
|
610
|
+
i--;
|
|
960
611
|
}
|
|
961
612
|
};
|
|
962
613
|
init(container);
|
|
963
614
|
for (let update of updates)
|
|
964
615
|
if (update) {
|
|
965
616
|
let teardown;
|
|
966
|
-
|
|
617
|
+
fx(() => {
|
|
967
618
|
if (typeof teardown === "function")
|
|
968
619
|
teardown();
|
|
969
|
-
teardown = update(
|
|
620
|
+
teardown = update(state2);
|
|
970
621
|
});
|
|
971
622
|
}
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
return state;
|
|
623
|
+
memo.set(container, state2);
|
|
624
|
+
return state2;
|
|
975
625
|
}
|
|
976
626
|
|
|
977
627
|
// src/index.js
|