solid-js 1.4.8 → 1.5.0-beta.2
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/dist/dev.cjs +119 -134
- package/dist/dev.js +119 -134
- package/dist/server.cjs +98 -49
- package/dist/server.js +98 -49
- package/dist/solid.cjs +119 -132
- package/dist/solid.js +119 -132
- package/h/jsx-runtime/types/jsx.d.ts +8 -1401
- package/h/types/hyperscript.d.ts +17 -0
- package/html/types/lit.d.ts +37 -0
- package/package.json +103 -41
- package/store/dist/dev.cjs +40 -22
- package/store/dist/dev.js +41 -23
- package/store/dist/store.cjs +40 -22
- package/store/dist/store.js +40 -22
- package/store/types/index.d.ts +4 -4
- package/store/types/mutable.d.ts +1 -1
- package/store/types/server.d.ts +1 -1
- package/store/types/store.d.ts +1 -1
- package/types/index.d.ts +8 -8
- package/types/jsx.d.ts +196 -1580
- package/types/reactive/array.d.ts +1 -1
- package/types/reactive/observable.d.ts +1 -1
- package/types/reactive/signal.d.ts +69 -34
- package/types/render/Suspense.d.ts +1 -1
- package/types/render/component.d.ts +22 -7
- package/types/render/flow.d.ts +2 -2
- package/types/render/index.d.ts +4 -4
- package/types/server/index.d.ts +3 -3
- package/types/server/reactive.d.ts +8 -3
- package/types/server/rendering.d.ts +11 -6
- package/universal/dist/dev.cjs +0 -0
- package/universal/dist/dev.js +0 -0
- package/universal/dist/universal.cjs +0 -0
- package/universal/dist/universal.js +0 -0
- package/universal/types/index.d.ts +1 -1
- package/web/dist/dev.cjs +3 -3
- package/web/dist/dev.js +3 -3
- package/web/dist/server.cjs +66 -90
- package/web/dist/server.js +66 -90
- package/web/dist/web.cjs +3 -3
- package/web/dist/web.js +3 -3
- package/web/types/client.d.ts +1 -1
- package/web/types/core.d.ts +3 -3
- package/web/types/index.d.ts +8 -9
- package/web/types/jsx.d.ts +1 -1
- package/web/types/server-mock.d.ts +4 -2
- package/web/types/server.d.ts +70 -0
- package/h/README.md +0 -99
- package/h/jsx-runtime/package.json +0 -8
- package/h/package.json +0 -8
- package/html/README.md +0 -84
- package/html/package.json +0 -8
- package/store/README.md +0 -23
- package/store/package.json +0 -35
- package/universal/README.md +0 -102
- package/universal/package.json +0 -18
- package/web/README.md +0 -7
- package/web/package.json +0 -35
package/dist/server.cjs
CHANGED
|
@@ -7,6 +7,17 @@ const $PROXY = Symbol("solid-proxy");
|
|
|
7
7
|
const $DEVCOMP = Symbol("solid-dev-component");
|
|
8
8
|
const DEV = {};
|
|
9
9
|
const ERROR = Symbol("error");
|
|
10
|
+
const BRANCH = Symbol("branch");
|
|
11
|
+
function castError(err) {
|
|
12
|
+
if (err instanceof Error || typeof err === "string") return err;
|
|
13
|
+
return new Error("Unknown error");
|
|
14
|
+
}
|
|
15
|
+
function handleError(err) {
|
|
16
|
+
err = castError(err);
|
|
17
|
+
const fns = lookup(Owner, ERROR);
|
|
18
|
+
if (!fns) throw err;
|
|
19
|
+
for (const f of fns) f(err);
|
|
20
|
+
}
|
|
10
21
|
const UNOWNED = {
|
|
11
22
|
context: null,
|
|
12
23
|
owner: null
|
|
@@ -24,9 +35,7 @@ function createRoot(fn, detachedOwner) {
|
|
|
24
35
|
try {
|
|
25
36
|
result = fn(() => {});
|
|
26
37
|
} catch (err) {
|
|
27
|
-
|
|
28
|
-
if (!fns) throw err;
|
|
29
|
-
fns.forEach(f => f(err));
|
|
38
|
+
handleError(err);
|
|
30
39
|
} finally {
|
|
31
40
|
Owner = owner;
|
|
32
41
|
}
|
|
@@ -45,9 +54,7 @@ function createComputed(fn, value) {
|
|
|
45
54
|
try {
|
|
46
55
|
fn(value);
|
|
47
56
|
} catch (err) {
|
|
48
|
-
|
|
49
|
-
if (!fns) throw err;
|
|
50
|
-
fns.forEach(f => f(err));
|
|
57
|
+
handleError(err);
|
|
51
58
|
} finally {
|
|
52
59
|
Owner = Owner.owner;
|
|
53
60
|
}
|
|
@@ -68,9 +75,7 @@ function createMemo(fn, value) {
|
|
|
68
75
|
try {
|
|
69
76
|
v = fn(value);
|
|
70
77
|
} catch (err) {
|
|
71
|
-
|
|
72
|
-
if (!fns) throw err;
|
|
73
|
-
fns.forEach(f => f(err));
|
|
78
|
+
handleError(err);
|
|
74
79
|
} finally {
|
|
75
80
|
Owner = Owner.owner;
|
|
76
81
|
}
|
|
@@ -100,11 +105,25 @@ function on(deps, fn, options = {}) {
|
|
|
100
105
|
};
|
|
101
106
|
}
|
|
102
107
|
function onMount(fn) {}
|
|
103
|
-
function onCleanup(fn) {
|
|
108
|
+
function onCleanup(fn) {
|
|
109
|
+
let node;
|
|
110
|
+
if (Owner && (node = lookup(Owner, BRANCH))) {
|
|
111
|
+
if (!node.cleanups) node.cleanups = [fn];else node.cleanups.push(fn);
|
|
112
|
+
}
|
|
113
|
+
return fn;
|
|
114
|
+
}
|
|
115
|
+
function cleanNode(node) {
|
|
116
|
+
if (node.cleanups) {
|
|
117
|
+
for (let i = 0; i < node.cleanups.length; i++) node.cleanups[i]();
|
|
118
|
+
node.cleanups = undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
104
121
|
function onError(fn) {
|
|
105
|
-
if (Owner
|
|
106
|
-
|
|
107
|
-
|
|
122
|
+
if (Owner) {
|
|
123
|
+
if (Owner.context === null) Owner.context = {
|
|
124
|
+
[ERROR]: [fn]
|
|
125
|
+
};else if (!Owner.context[ERROR]) Owner.context[ERROR] = [fn];else Owner.context[ERROR].push(fn);
|
|
126
|
+
}
|
|
108
127
|
}
|
|
109
128
|
function getListener() {
|
|
110
129
|
return null;
|
|
@@ -132,6 +151,8 @@ function runWithOwner(o, fn) {
|
|
|
132
151
|
Owner = o;
|
|
133
152
|
try {
|
|
134
153
|
return fn();
|
|
154
|
+
} catch (err) {
|
|
155
|
+
handleError(err);
|
|
135
156
|
} finally {
|
|
136
157
|
Owner = prev;
|
|
137
158
|
}
|
|
@@ -177,31 +198,33 @@ function mapArray(list, mapFn, options = {}) {
|
|
|
177
198
|
} else if (options.fallback) s = [options.fallback()];
|
|
178
199
|
return () => s;
|
|
179
200
|
}
|
|
180
|
-
function getSymbol() {
|
|
181
|
-
const SymbolCopy = Symbol;
|
|
182
|
-
return SymbolCopy.observable || "@@observable";
|
|
183
|
-
}
|
|
184
201
|
function observable(input) {
|
|
185
|
-
const $$observable = getSymbol();
|
|
186
202
|
return {
|
|
187
203
|
subscribe(observer) {
|
|
188
204
|
if (!(observer instanceof Object) || observer == null) {
|
|
189
205
|
throw new TypeError("Expected the observer to be an object.");
|
|
190
206
|
}
|
|
191
|
-
const handler = "
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
207
|
+
const handler = typeof observer === "function" ? observer : observer.next && observer.next.bind(observer);
|
|
208
|
+
if (!handler) {
|
|
209
|
+
return {
|
|
210
|
+
unsubscribe() {}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const dispose = createRoot(disposer => {
|
|
214
|
+
createEffect(() => {
|
|
215
|
+
const v = input();
|
|
216
|
+
untrack(() => handler(v));
|
|
217
|
+
});
|
|
218
|
+
return disposer;
|
|
197
219
|
});
|
|
220
|
+
if (getOwner()) onCleanup(dispose);
|
|
198
221
|
return {
|
|
199
222
|
unsubscribe() {
|
|
200
|
-
|
|
223
|
+
dispose();
|
|
201
224
|
}
|
|
202
225
|
};
|
|
203
226
|
},
|
|
204
|
-
[
|
|
227
|
+
[Symbol.observable || "@@observable"]() {
|
|
205
228
|
return this;
|
|
206
229
|
}
|
|
207
230
|
};
|
|
@@ -209,9 +232,11 @@ function observable(input) {
|
|
|
209
232
|
function from(producer) {
|
|
210
233
|
const [s, set] = createSignal(undefined);
|
|
211
234
|
if ("subscribe" in producer) {
|
|
212
|
-
producer.subscribe(v => set(() => v));
|
|
235
|
+
const unsub = producer.subscribe(v => set(() => v));
|
|
236
|
+
onCleanup(() => "unsubscribe" in unsub ? unsub.unsubscribe() : unsub());
|
|
213
237
|
} else {
|
|
214
|
-
producer(set);
|
|
238
|
+
const clean = producer(set);
|
|
239
|
+
onCleanup(clean);
|
|
215
240
|
}
|
|
216
241
|
return s;
|
|
217
242
|
}
|
|
@@ -226,7 +251,7 @@ function resolveSSRNode(node) {
|
|
|
226
251
|
for (let i = 0, len = node.length; i < len; i++) mapped += resolveSSRNode(node[i]);
|
|
227
252
|
return mapped;
|
|
228
253
|
}
|
|
229
|
-
if (t === "object") return
|
|
254
|
+
if (t === "object") return node.t;
|
|
230
255
|
if (t === "function") return resolveSSRNode(node());
|
|
231
256
|
return String(node);
|
|
232
257
|
}
|
|
@@ -315,16 +340,16 @@ function Switch(props) {
|
|
|
315
340
|
function Match(props) {
|
|
316
341
|
return props;
|
|
317
342
|
}
|
|
318
|
-
const NoErrors = {};
|
|
319
343
|
function resetErrorBoundaries() {}
|
|
320
344
|
function ErrorBoundary(props) {
|
|
321
|
-
let error
|
|
322
|
-
res
|
|
345
|
+
let error,
|
|
346
|
+
res,
|
|
347
|
+
clean,
|
|
348
|
+
sync = true;
|
|
323
349
|
const ctx = sharedConfig.context;
|
|
324
350
|
const id = ctx.id + ctx.count;
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
if (error !== NoErrors) {
|
|
351
|
+
function displayFallback() {
|
|
352
|
+
cleanNode(clean);
|
|
328
353
|
ctx.writeResource(id, error, true);
|
|
329
354
|
setHydrateContext({ ...ctx,
|
|
330
355
|
count: 0
|
|
@@ -332,7 +357,23 @@ function ErrorBoundary(props) {
|
|
|
332
357
|
const f = props.fallback;
|
|
333
358
|
return typeof f === "function" && f.length ? f(error, () => {}) : f;
|
|
334
359
|
}
|
|
335
|
-
|
|
360
|
+
onError(err => {
|
|
361
|
+
error = err;
|
|
362
|
+
!sync && ctx.replace("e" + id, displayFallback);
|
|
363
|
+
sync = true;
|
|
364
|
+
});
|
|
365
|
+
onCleanup(() => cleanNode(clean));
|
|
366
|
+
createMemo(() => {
|
|
367
|
+
Owner.context = {
|
|
368
|
+
[BRANCH]: clean = {}
|
|
369
|
+
};
|
|
370
|
+
return res = props.children;
|
|
371
|
+
});
|
|
372
|
+
if (error) return displayFallback();
|
|
373
|
+
sync = false;
|
|
374
|
+
return {
|
|
375
|
+
t: `<!e${id}>${resolveSSRNode(res)}<!/e${id}>`
|
|
376
|
+
};
|
|
336
377
|
}
|
|
337
378
|
const SuspenseContext = createContext();
|
|
338
379
|
let resourceContext = null;
|
|
@@ -412,7 +453,7 @@ function createResource(source, fetcher, options = {}) {
|
|
|
412
453
|
return res;
|
|
413
454
|
}).catch(err => {
|
|
414
455
|
read.loading = false;
|
|
415
|
-
read.error = error = err;
|
|
456
|
+
read.error = error = castError(err);
|
|
416
457
|
p = null;
|
|
417
458
|
notifySuspense(contexts);
|
|
418
459
|
});
|
|
@@ -439,6 +480,7 @@ function lazy(fn) {
|
|
|
439
480
|
return p;
|
|
440
481
|
};
|
|
441
482
|
const contexts = new Set();
|
|
483
|
+
setTimeout(load);
|
|
442
484
|
const wrap = props => {
|
|
443
485
|
load();
|
|
444
486
|
const id = sharedConfig.context.id.slice(0, -1);
|
|
@@ -462,10 +504,11 @@ function lazy(fn) {
|
|
|
462
504
|
return wrap;
|
|
463
505
|
}
|
|
464
506
|
function suspenseComplete(c) {
|
|
507
|
+
if (c.complete) return true;
|
|
465
508
|
for (const r of c.resources.values()) {
|
|
466
509
|
if (r.loading) return false;
|
|
467
510
|
}
|
|
468
|
-
return true;
|
|
511
|
+
return c.complete = true;
|
|
469
512
|
}
|
|
470
513
|
function notifySuspense(contexts) {
|
|
471
514
|
for (const c of contexts) {
|
|
@@ -488,9 +531,15 @@ function SuspenseList(props) {
|
|
|
488
531
|
}
|
|
489
532
|
function Suspense(props) {
|
|
490
533
|
let done;
|
|
534
|
+
let clean;
|
|
491
535
|
const ctx = sharedConfig.context;
|
|
492
536
|
const id = ctx.id + ctx.count;
|
|
493
537
|
const o = Owner;
|
|
538
|
+
if (o) {
|
|
539
|
+
if (o.context) o.context[BRANCH] = clean = {};else o.context = {
|
|
540
|
+
[BRANCH]: clean = {}
|
|
541
|
+
};
|
|
542
|
+
}
|
|
494
543
|
const value = ctx.suspense[id] || (ctx.suspense[id] = {
|
|
495
544
|
resources: new Map(),
|
|
496
545
|
completed: () => {
|
|
@@ -498,7 +547,8 @@ function Suspense(props) {
|
|
|
498
547
|
if (suspenseComplete(value)) {
|
|
499
548
|
done(resolveSSRNode(res));
|
|
500
549
|
}
|
|
501
|
-
}
|
|
550
|
+
},
|
|
551
|
+
complete: false
|
|
502
552
|
});
|
|
503
553
|
function runSuspense() {
|
|
504
554
|
setHydrateContext({ ...ctx,
|
|
@@ -508,36 +558,35 @@ function Suspense(props) {
|
|
|
508
558
|
return createComponent(SuspenseContext.Provider, {
|
|
509
559
|
value,
|
|
510
560
|
get children() {
|
|
561
|
+
clean && cleanNode(clean);
|
|
511
562
|
return props.children;
|
|
512
563
|
}
|
|
513
564
|
});
|
|
514
565
|
});
|
|
515
566
|
}
|
|
516
567
|
const res = runSuspense();
|
|
517
|
-
if (suspenseComplete(value))
|
|
518
|
-
ctx.writeResource(id, null);
|
|
519
|
-
return res;
|
|
520
|
-
}
|
|
568
|
+
if (suspenseComplete(value)) return res;
|
|
521
569
|
onError(err => {
|
|
522
|
-
if (!done || !done(undefined, err))
|
|
570
|
+
if (!done || !done(undefined, err)) {
|
|
571
|
+
if (o) runWithOwner(o.owner, () => {
|
|
572
|
+
throw err;
|
|
573
|
+
});else throw err;
|
|
574
|
+
}
|
|
523
575
|
});
|
|
524
576
|
done = ctx.async ? ctx.registerFragment(id) : undefined;
|
|
525
|
-
if (ctx.
|
|
577
|
+
if (ctx.async) {
|
|
526
578
|
setHydrateContext(undefined);
|
|
527
579
|
const res = {
|
|
528
580
|
t: `<span id="pl-${id}">${resolveSSRNode(props.fallback)}</span>`
|
|
529
581
|
};
|
|
530
582
|
setHydrateContext(ctx);
|
|
531
583
|
return res;
|
|
532
|
-
} else if (ctx.async) {
|
|
533
|
-
return {
|
|
534
|
-
t: `<![${id}]>`
|
|
535
|
-
};
|
|
536
584
|
}
|
|
537
585
|
setHydrateContext({ ...ctx,
|
|
538
586
|
count: 0,
|
|
539
587
|
id: ctx.id + "0.f"
|
|
540
588
|
});
|
|
589
|
+
ctx.writeResource(id, "$$f");
|
|
541
590
|
return props.fallback;
|
|
542
591
|
}
|
|
543
592
|
|
package/dist/server.js
CHANGED
|
@@ -3,6 +3,17 @@ const $PROXY = Symbol("solid-proxy");
|
|
|
3
3
|
const $DEVCOMP = Symbol("solid-dev-component");
|
|
4
4
|
const DEV = {};
|
|
5
5
|
const ERROR = Symbol("error");
|
|
6
|
+
const BRANCH = Symbol("branch");
|
|
7
|
+
function castError(err) {
|
|
8
|
+
if (err instanceof Error || typeof err === "string") return err;
|
|
9
|
+
return new Error("Unknown error");
|
|
10
|
+
}
|
|
11
|
+
function handleError(err) {
|
|
12
|
+
err = castError(err);
|
|
13
|
+
const fns = lookup(Owner, ERROR);
|
|
14
|
+
if (!fns) throw err;
|
|
15
|
+
for (const f of fns) f(err);
|
|
16
|
+
}
|
|
6
17
|
const UNOWNED = {
|
|
7
18
|
context: null,
|
|
8
19
|
owner: null
|
|
@@ -20,9 +31,7 @@ function createRoot(fn, detachedOwner) {
|
|
|
20
31
|
try {
|
|
21
32
|
result = fn(() => {});
|
|
22
33
|
} catch (err) {
|
|
23
|
-
|
|
24
|
-
if (!fns) throw err;
|
|
25
|
-
fns.forEach(f => f(err));
|
|
34
|
+
handleError(err);
|
|
26
35
|
} finally {
|
|
27
36
|
Owner = owner;
|
|
28
37
|
}
|
|
@@ -41,9 +50,7 @@ function createComputed(fn, value) {
|
|
|
41
50
|
try {
|
|
42
51
|
fn(value);
|
|
43
52
|
} catch (err) {
|
|
44
|
-
|
|
45
|
-
if (!fns) throw err;
|
|
46
|
-
fns.forEach(f => f(err));
|
|
53
|
+
handleError(err);
|
|
47
54
|
} finally {
|
|
48
55
|
Owner = Owner.owner;
|
|
49
56
|
}
|
|
@@ -64,9 +71,7 @@ function createMemo(fn, value) {
|
|
|
64
71
|
try {
|
|
65
72
|
v = fn(value);
|
|
66
73
|
} catch (err) {
|
|
67
|
-
|
|
68
|
-
if (!fns) throw err;
|
|
69
|
-
fns.forEach(f => f(err));
|
|
74
|
+
handleError(err);
|
|
70
75
|
} finally {
|
|
71
76
|
Owner = Owner.owner;
|
|
72
77
|
}
|
|
@@ -96,11 +101,25 @@ function on(deps, fn, options = {}) {
|
|
|
96
101
|
};
|
|
97
102
|
}
|
|
98
103
|
function onMount(fn) {}
|
|
99
|
-
function onCleanup(fn) {
|
|
104
|
+
function onCleanup(fn) {
|
|
105
|
+
let node;
|
|
106
|
+
if (Owner && (node = lookup(Owner, BRANCH))) {
|
|
107
|
+
if (!node.cleanups) node.cleanups = [fn];else node.cleanups.push(fn);
|
|
108
|
+
}
|
|
109
|
+
return fn;
|
|
110
|
+
}
|
|
111
|
+
function cleanNode(node) {
|
|
112
|
+
if (node.cleanups) {
|
|
113
|
+
for (let i = 0; i < node.cleanups.length; i++) node.cleanups[i]();
|
|
114
|
+
node.cleanups = undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
100
117
|
function onError(fn) {
|
|
101
|
-
if (Owner
|
|
102
|
-
|
|
103
|
-
|
|
118
|
+
if (Owner) {
|
|
119
|
+
if (Owner.context === null) Owner.context = {
|
|
120
|
+
[ERROR]: [fn]
|
|
121
|
+
};else if (!Owner.context[ERROR]) Owner.context[ERROR] = [fn];else Owner.context[ERROR].push(fn);
|
|
122
|
+
}
|
|
104
123
|
}
|
|
105
124
|
function getListener() {
|
|
106
125
|
return null;
|
|
@@ -128,6 +147,8 @@ function runWithOwner(o, fn) {
|
|
|
128
147
|
Owner = o;
|
|
129
148
|
try {
|
|
130
149
|
return fn();
|
|
150
|
+
} catch (err) {
|
|
151
|
+
handleError(err);
|
|
131
152
|
} finally {
|
|
132
153
|
Owner = prev;
|
|
133
154
|
}
|
|
@@ -173,31 +194,33 @@ function mapArray(list, mapFn, options = {}) {
|
|
|
173
194
|
} else if (options.fallback) s = [options.fallback()];
|
|
174
195
|
return () => s;
|
|
175
196
|
}
|
|
176
|
-
function getSymbol() {
|
|
177
|
-
const SymbolCopy = Symbol;
|
|
178
|
-
return SymbolCopy.observable || "@@observable";
|
|
179
|
-
}
|
|
180
197
|
function observable(input) {
|
|
181
|
-
const $$observable = getSymbol();
|
|
182
198
|
return {
|
|
183
199
|
subscribe(observer) {
|
|
184
200
|
if (!(observer instanceof Object) || observer == null) {
|
|
185
201
|
throw new TypeError("Expected the observer to be an object.");
|
|
186
202
|
}
|
|
187
|
-
const handler = "
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
203
|
+
const handler = typeof observer === "function" ? observer : observer.next && observer.next.bind(observer);
|
|
204
|
+
if (!handler) {
|
|
205
|
+
return {
|
|
206
|
+
unsubscribe() {}
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
const dispose = createRoot(disposer => {
|
|
210
|
+
createEffect(() => {
|
|
211
|
+
const v = input();
|
|
212
|
+
untrack(() => handler(v));
|
|
213
|
+
});
|
|
214
|
+
return disposer;
|
|
193
215
|
});
|
|
216
|
+
if (getOwner()) onCleanup(dispose);
|
|
194
217
|
return {
|
|
195
218
|
unsubscribe() {
|
|
196
|
-
|
|
219
|
+
dispose();
|
|
197
220
|
}
|
|
198
221
|
};
|
|
199
222
|
},
|
|
200
|
-
[
|
|
223
|
+
[Symbol.observable || "@@observable"]() {
|
|
201
224
|
return this;
|
|
202
225
|
}
|
|
203
226
|
};
|
|
@@ -205,9 +228,11 @@ function observable(input) {
|
|
|
205
228
|
function from(producer) {
|
|
206
229
|
const [s, set] = createSignal(undefined);
|
|
207
230
|
if ("subscribe" in producer) {
|
|
208
|
-
producer.subscribe(v => set(() => v));
|
|
231
|
+
const unsub = producer.subscribe(v => set(() => v));
|
|
232
|
+
onCleanup(() => "unsubscribe" in unsub ? unsub.unsubscribe() : unsub());
|
|
209
233
|
} else {
|
|
210
|
-
producer(set);
|
|
234
|
+
const clean = producer(set);
|
|
235
|
+
onCleanup(clean);
|
|
211
236
|
}
|
|
212
237
|
return s;
|
|
213
238
|
}
|
|
@@ -222,7 +247,7 @@ function resolveSSRNode(node) {
|
|
|
222
247
|
for (let i = 0, len = node.length; i < len; i++) mapped += resolveSSRNode(node[i]);
|
|
223
248
|
return mapped;
|
|
224
249
|
}
|
|
225
|
-
if (t === "object") return
|
|
250
|
+
if (t === "object") return node.t;
|
|
226
251
|
if (t === "function") return resolveSSRNode(node());
|
|
227
252
|
return String(node);
|
|
228
253
|
}
|
|
@@ -311,16 +336,16 @@ function Switch(props) {
|
|
|
311
336
|
function Match(props) {
|
|
312
337
|
return props;
|
|
313
338
|
}
|
|
314
|
-
const NoErrors = {};
|
|
315
339
|
function resetErrorBoundaries() {}
|
|
316
340
|
function ErrorBoundary(props) {
|
|
317
|
-
let error
|
|
318
|
-
res
|
|
341
|
+
let error,
|
|
342
|
+
res,
|
|
343
|
+
clean,
|
|
344
|
+
sync = true;
|
|
319
345
|
const ctx = sharedConfig.context;
|
|
320
346
|
const id = ctx.id + ctx.count;
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
if (error !== NoErrors) {
|
|
347
|
+
function displayFallback() {
|
|
348
|
+
cleanNode(clean);
|
|
324
349
|
ctx.writeResource(id, error, true);
|
|
325
350
|
setHydrateContext({ ...ctx,
|
|
326
351
|
count: 0
|
|
@@ -328,7 +353,23 @@ function ErrorBoundary(props) {
|
|
|
328
353
|
const f = props.fallback;
|
|
329
354
|
return typeof f === "function" && f.length ? f(error, () => {}) : f;
|
|
330
355
|
}
|
|
331
|
-
|
|
356
|
+
onError(err => {
|
|
357
|
+
error = err;
|
|
358
|
+
!sync && ctx.replace("e" + id, displayFallback);
|
|
359
|
+
sync = true;
|
|
360
|
+
});
|
|
361
|
+
onCleanup(() => cleanNode(clean));
|
|
362
|
+
createMemo(() => {
|
|
363
|
+
Owner.context = {
|
|
364
|
+
[BRANCH]: clean = {}
|
|
365
|
+
};
|
|
366
|
+
return res = props.children;
|
|
367
|
+
});
|
|
368
|
+
if (error) return displayFallback();
|
|
369
|
+
sync = false;
|
|
370
|
+
return {
|
|
371
|
+
t: `<!e${id}>${resolveSSRNode(res)}<!/e${id}>`
|
|
372
|
+
};
|
|
332
373
|
}
|
|
333
374
|
const SuspenseContext = createContext();
|
|
334
375
|
let resourceContext = null;
|
|
@@ -408,7 +449,7 @@ function createResource(source, fetcher, options = {}) {
|
|
|
408
449
|
return res;
|
|
409
450
|
}).catch(err => {
|
|
410
451
|
read.loading = false;
|
|
411
|
-
read.error = error = err;
|
|
452
|
+
read.error = error = castError(err);
|
|
412
453
|
p = null;
|
|
413
454
|
notifySuspense(contexts);
|
|
414
455
|
});
|
|
@@ -435,6 +476,7 @@ function lazy(fn) {
|
|
|
435
476
|
return p;
|
|
436
477
|
};
|
|
437
478
|
const contexts = new Set();
|
|
479
|
+
setTimeout(load);
|
|
438
480
|
const wrap = props => {
|
|
439
481
|
load();
|
|
440
482
|
const id = sharedConfig.context.id.slice(0, -1);
|
|
@@ -458,10 +500,11 @@ function lazy(fn) {
|
|
|
458
500
|
return wrap;
|
|
459
501
|
}
|
|
460
502
|
function suspenseComplete(c) {
|
|
503
|
+
if (c.complete) return true;
|
|
461
504
|
for (const r of c.resources.values()) {
|
|
462
505
|
if (r.loading) return false;
|
|
463
506
|
}
|
|
464
|
-
return true;
|
|
507
|
+
return c.complete = true;
|
|
465
508
|
}
|
|
466
509
|
function notifySuspense(contexts) {
|
|
467
510
|
for (const c of contexts) {
|
|
@@ -484,9 +527,15 @@ function SuspenseList(props) {
|
|
|
484
527
|
}
|
|
485
528
|
function Suspense(props) {
|
|
486
529
|
let done;
|
|
530
|
+
let clean;
|
|
487
531
|
const ctx = sharedConfig.context;
|
|
488
532
|
const id = ctx.id + ctx.count;
|
|
489
533
|
const o = Owner;
|
|
534
|
+
if (o) {
|
|
535
|
+
if (o.context) o.context[BRANCH] = clean = {};else o.context = {
|
|
536
|
+
[BRANCH]: clean = {}
|
|
537
|
+
};
|
|
538
|
+
}
|
|
490
539
|
const value = ctx.suspense[id] || (ctx.suspense[id] = {
|
|
491
540
|
resources: new Map(),
|
|
492
541
|
completed: () => {
|
|
@@ -494,7 +543,8 @@ function Suspense(props) {
|
|
|
494
543
|
if (suspenseComplete(value)) {
|
|
495
544
|
done(resolveSSRNode(res));
|
|
496
545
|
}
|
|
497
|
-
}
|
|
546
|
+
},
|
|
547
|
+
complete: false
|
|
498
548
|
});
|
|
499
549
|
function runSuspense() {
|
|
500
550
|
setHydrateContext({ ...ctx,
|
|
@@ -504,36 +554,35 @@ function Suspense(props) {
|
|
|
504
554
|
return createComponent(SuspenseContext.Provider, {
|
|
505
555
|
value,
|
|
506
556
|
get children() {
|
|
557
|
+
clean && cleanNode(clean);
|
|
507
558
|
return props.children;
|
|
508
559
|
}
|
|
509
560
|
});
|
|
510
561
|
});
|
|
511
562
|
}
|
|
512
563
|
const res = runSuspense();
|
|
513
|
-
if (suspenseComplete(value))
|
|
514
|
-
ctx.writeResource(id, null);
|
|
515
|
-
return res;
|
|
516
|
-
}
|
|
564
|
+
if (suspenseComplete(value)) return res;
|
|
517
565
|
onError(err => {
|
|
518
|
-
if (!done || !done(undefined, err))
|
|
566
|
+
if (!done || !done(undefined, err)) {
|
|
567
|
+
if (o) runWithOwner(o.owner, () => {
|
|
568
|
+
throw err;
|
|
569
|
+
});else throw err;
|
|
570
|
+
}
|
|
519
571
|
});
|
|
520
572
|
done = ctx.async ? ctx.registerFragment(id) : undefined;
|
|
521
|
-
if (ctx.
|
|
573
|
+
if (ctx.async) {
|
|
522
574
|
setHydrateContext(undefined);
|
|
523
575
|
const res = {
|
|
524
576
|
t: `<span id="pl-${id}">${resolveSSRNode(props.fallback)}</span>`
|
|
525
577
|
};
|
|
526
578
|
setHydrateContext(ctx);
|
|
527
579
|
return res;
|
|
528
|
-
} else if (ctx.async) {
|
|
529
|
-
return {
|
|
530
|
-
t: `<![${id}]>`
|
|
531
|
-
};
|
|
532
580
|
}
|
|
533
581
|
setHydrateContext({ ...ctx,
|
|
534
582
|
count: 0,
|
|
535
583
|
id: ctx.id + "0.f"
|
|
536
584
|
});
|
|
585
|
+
ctx.writeResource(id, "$$f");
|
|
537
586
|
return props.fallback;
|
|
538
587
|
}
|
|
539
588
|
|