solid-js 2.0.0-beta.0 → 2.0.0-beta.10
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/CHEATSHEET.md +640 -0
- package/README.md +42 -188
- package/dist/dev.cjs +451 -283
- package/dist/dev.js +428 -286
- package/dist/server.cjs +735 -279
- package/dist/server.js +715 -282
- package/dist/solid.cjs +443 -255
- package/dist/solid.js +420 -258
- package/package.json +67 -39
- package/types/client/component.d.ts +65 -19
- package/types/client/core.d.ts +110 -34
- package/types/client/flow.d.ts +176 -42
- package/types/client/hydration.d.ts +525 -31
- package/types/index.d.ts +9 -12
- package/types/server/component.d.ts +12 -11
- package/types/server/core.d.ts +19 -14
- package/types/server/flow.d.ts +76 -21
- package/types/server/hydration.d.ts +49 -7
- package/types/server/index.d.ts +5 -7
- package/types/server/shared.d.ts +9 -4
- package/types/server/signals.d.ts +45 -18
- package/types/types.d.ts +15 -0
- package/types-cjs/client/component.d.cts +120 -0
- package/types-cjs/client/core.d.cts +141 -0
- package/types-cjs/client/flow.d.cts +234 -0
- package/types-cjs/client/hydration.d.cts +570 -0
- package/types-cjs/index.d.cts +17 -0
- package/types-cjs/package.json +3 -0
- package/types-cjs/server/component.d.cts +67 -0
- package/types-cjs/server/core.d.cts +49 -0
- package/types-cjs/server/flow.d.cts +115 -0
- package/types-cjs/server/hydration.d.cts +63 -0
- package/types-cjs/server/index.d.cts +10 -0
- package/types-cjs/server/shared.d.cts +50 -0
- package/types-cjs/server/signals.d.cts +87 -0
- package/types-cjs/types.d.cts +15 -0
- package/jsx-runtime.d.ts +0 -1
- package/types/jsx.d.ts +0 -4129
package/dist/server.cjs
CHANGED
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
var signals = require('@solidjs/signals');
|
|
4
4
|
|
|
5
|
+
const NoHydrateContext = {
|
|
6
|
+
id: Symbol("NoHydrateContext"),
|
|
7
|
+
defaultValue: false
|
|
8
|
+
};
|
|
5
9
|
const sharedConfig = {
|
|
6
10
|
getNextContextId() {
|
|
7
11
|
const o = signals.getOwner();
|
|
8
12
|
if (!o) throw new Error(`getNextContextId cannot be used under non-hydrating context`);
|
|
13
|
+
if (signals.getContext(NoHydrateContext)) return undefined;
|
|
9
14
|
return signals.getNextChildId(o);
|
|
10
15
|
}
|
|
11
16
|
};
|
|
@@ -23,38 +28,82 @@ function runWithObserver(comp, fn) {
|
|
|
23
28
|
function getObserver() {
|
|
24
29
|
return Observer;
|
|
25
30
|
}
|
|
26
|
-
function
|
|
31
|
+
function createDeferredPromise() {
|
|
32
|
+
let settled = false;
|
|
33
|
+
let resolvePromise;
|
|
34
|
+
let rejectPromise;
|
|
35
|
+
const promise = new Promise((resolve, reject) => {
|
|
36
|
+
resolvePromise = resolve;
|
|
37
|
+
rejectPromise = reject;
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
promise,
|
|
41
|
+
resolve(value) {
|
|
42
|
+
if (settled) return;
|
|
43
|
+
settled = true;
|
|
44
|
+
promise.s = 1;
|
|
45
|
+
promise.v = value;
|
|
46
|
+
resolvePromise(value);
|
|
47
|
+
},
|
|
48
|
+
reject(error) {
|
|
49
|
+
if (settled) return;
|
|
50
|
+
settled = true;
|
|
51
|
+
promise.s = 2;
|
|
52
|
+
promise.v = error;
|
|
53
|
+
rejectPromise(error);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function subscribePendingRetry(error, retry) {
|
|
58
|
+
if (!(error instanceof signals.NotReadyError)) return false;
|
|
59
|
+
error.source?.then(() => retry(), () => retry());
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
function settleServerAsync(initial, rerun, deferred, onSuccess, onError, isDisposed) {
|
|
63
|
+
let first = true;
|
|
64
|
+
const attempt = () => {
|
|
65
|
+
if (isDisposed()) return;
|
|
66
|
+
let current;
|
|
67
|
+
try {
|
|
68
|
+
current = first ? initial : rerun();
|
|
69
|
+
first = false;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
if (subscribePendingRetry(error, attempt)) return;
|
|
72
|
+
onError(error);
|
|
73
|
+
deferred.reject(error);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
Promise.resolve(current).then(value => {
|
|
77
|
+
if (isDisposed()) return;
|
|
78
|
+
deferred.resolve(onSuccess(value));
|
|
79
|
+
}, error => {
|
|
80
|
+
if (isDisposed()) return;
|
|
81
|
+
if (subscribePendingRetry(error, attempt)) return;
|
|
82
|
+
onError(error);
|
|
83
|
+
deferred.reject(error);
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
attempt();
|
|
87
|
+
}
|
|
88
|
+
function createSignal(first, second) {
|
|
27
89
|
if (typeof first === "function") {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
let value = second;
|
|
32
|
-
return [() => value, v => {
|
|
33
|
-
return value = typeof v === "function" ? v(value) : v;
|
|
34
|
-
}];
|
|
35
|
-
}
|
|
36
|
-
const memoOpts = third?.deferStream || ssrSource ? {
|
|
37
|
-
deferStream: third?.deferStream,
|
|
38
|
-
ssrSource
|
|
90
|
+
const opts = second?.deferStream || second?.ssrSource ? {
|
|
91
|
+
deferStream: second?.deferStream,
|
|
92
|
+
ssrSource: second?.ssrSource
|
|
39
93
|
} : undefined;
|
|
40
|
-
const memo = createMemo(
|
|
41
|
-
|
|
42
|
-
return [() => value, v => {
|
|
43
|
-
return value = typeof v === "function" ? v(value) : v;
|
|
44
|
-
}];
|
|
45
|
-
}, undefined, memoOpts);
|
|
46
|
-
return [() => memo()[0](), v => memo()[1](v)];
|
|
94
|
+
const memo = createMemo(prev => first(prev), opts);
|
|
95
|
+
return [memo, () => undefined];
|
|
47
96
|
}
|
|
48
97
|
return [() => first, v => {
|
|
49
98
|
return first = typeof v === "function" ? v(first) : v;
|
|
50
99
|
}];
|
|
51
100
|
}
|
|
52
|
-
function createMemo(compute,
|
|
101
|
+
function createMemo(compute, options) {
|
|
53
102
|
const ctx = sharedConfig.context;
|
|
54
103
|
const owner = signals.createOwner();
|
|
55
104
|
const comp = {
|
|
56
105
|
owner,
|
|
57
|
-
value:
|
|
106
|
+
value: undefined,
|
|
58
107
|
compute: compute,
|
|
59
108
|
error: undefined,
|
|
60
109
|
computed: false,
|
|
@@ -65,21 +114,22 @@ function createMemo(compute, value, options) {
|
|
|
65
114
|
}));
|
|
66
115
|
function update() {
|
|
67
116
|
if (comp.disposed) return;
|
|
117
|
+
const run = () => signals.runWithOwner(owner, () => runWithObserver(comp, () => comp.compute(comp.value)));
|
|
68
118
|
try {
|
|
69
119
|
comp.error = undefined;
|
|
70
|
-
const result =
|
|
120
|
+
const result = run();
|
|
71
121
|
comp.computed = true;
|
|
72
|
-
processResult(comp, result, owner, ctx, options?.deferStream, options?.ssrSource);
|
|
122
|
+
processResult(comp, result, owner, ctx, options?.deferStream, options?.ssrSource, run);
|
|
73
123
|
} catch (err) {
|
|
74
124
|
if (err instanceof signals.NotReadyError) {
|
|
75
|
-
err
|
|
125
|
+
subscribePendingRetry(err, update);
|
|
76
126
|
}
|
|
77
127
|
comp.error = err;
|
|
78
128
|
comp.computed = true;
|
|
79
129
|
}
|
|
80
130
|
}
|
|
81
131
|
const ssrSource = options?.ssrSource;
|
|
82
|
-
if (ssrSource === "
|
|
132
|
+
if (ssrSource === "client") {
|
|
83
133
|
comp.computed = true;
|
|
84
134
|
} else if (!options?.lazy) {
|
|
85
135
|
update();
|
|
@@ -154,75 +204,128 @@ function createDeepProxy(target, patches, basePath = []) {
|
|
|
154
204
|
};
|
|
155
205
|
return new Proxy(target, handler);
|
|
156
206
|
}
|
|
157
|
-
function processResult(comp, result, owner, ctx, deferStream, ssrSource) {
|
|
207
|
+
function processResult(comp, result, owner, ctx, deferStream, ssrSource, rerun) {
|
|
158
208
|
if (comp.disposed) return;
|
|
159
209
|
const id = owner.id;
|
|
160
|
-
const
|
|
210
|
+
const noHydrate = signals.getContext(NoHydrateContext, owner);
|
|
161
211
|
if (result instanceof Promise) {
|
|
162
|
-
result.
|
|
163
|
-
|
|
164
|
-
result.v = v;
|
|
165
|
-
if (comp.disposed) return;
|
|
166
|
-
comp.value = v;
|
|
212
|
+
if (result.s === 1) {
|
|
213
|
+
comp.value = result.v;
|
|
167
214
|
comp.error = undefined;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (
|
|
171
|
-
comp.error =
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (result.s === 2) {
|
|
218
|
+
comp.error = result.v;
|
|
219
|
+
return;
|
|
172
220
|
}
|
|
221
|
+
const deferred = createDeferredPromise();
|
|
222
|
+
if (ctx?.async && ctx.serialize && id && !noHydrate) ctx.serialize(id, deferred.promise, deferStream);
|
|
223
|
+
settleServerAsync(result, () => rerun ? rerun() : result, deferred, value => {
|
|
224
|
+
result.s = 1;
|
|
225
|
+
result.v = value;
|
|
226
|
+
comp.value = value;
|
|
227
|
+
comp.error = undefined;
|
|
228
|
+
return value;
|
|
229
|
+
}, error => {
|
|
230
|
+
result.s = 2;
|
|
231
|
+
result.v = error;
|
|
232
|
+
comp.error = error;
|
|
233
|
+
}, () => comp.disposed);
|
|
234
|
+
comp.error = new signals.NotReadyError(deferred.promise);
|
|
173
235
|
return;
|
|
174
236
|
}
|
|
175
237
|
const iterator = result?.[Symbol.asyncIterator];
|
|
176
238
|
if (typeof iterator === "function") {
|
|
177
|
-
const iter = iterator.call(result);
|
|
178
239
|
if (ssrSource === "hybrid") {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
240
|
+
let currentResult = result;
|
|
241
|
+
let iter;
|
|
242
|
+
const deferred = createDeferredPromise();
|
|
243
|
+
const runFirst = () => {
|
|
244
|
+
const source = currentResult ?? (rerun ? rerun() : result);
|
|
245
|
+
currentResult = undefined;
|
|
246
|
+
const nextIterator = source?.[Symbol.asyncIterator];
|
|
247
|
+
if (typeof nextIterator !== "function") {
|
|
248
|
+
throw new Error("Expected async iterator while retrying server createMemo");
|
|
249
|
+
}
|
|
250
|
+
iter = nextIterator.call(source);
|
|
251
|
+
return iter.next().then(value => {
|
|
252
|
+
if (!value.done) closeAsyncIterator(iter);
|
|
253
|
+
return value.value;
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
settleServerAsync(runFirst(), runFirst, deferred, value => {
|
|
257
|
+
comp.value = value;
|
|
184
258
|
comp.error = undefined;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
259
|
+
return value;
|
|
260
|
+
}, error => {
|
|
261
|
+
comp.error = error;
|
|
262
|
+
}, () => comp.disposed);
|
|
263
|
+
if (ctx?.async && ctx.serialize && id && !noHydrate) ctx.serialize(id, deferred.promise, deferStream);
|
|
264
|
+
comp.error = new signals.NotReadyError(deferred.promise);
|
|
190
265
|
} else {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
266
|
+
let currentResult = result;
|
|
267
|
+
let iter;
|
|
268
|
+
let firstResult;
|
|
269
|
+
const deferred = createDeferredPromise();
|
|
270
|
+
const runFirst = () => {
|
|
271
|
+
const source = currentResult ?? (rerun ? rerun() : result);
|
|
272
|
+
currentResult = undefined;
|
|
273
|
+
const nextIterator = source?.[Symbol.asyncIterator];
|
|
274
|
+
if (typeof nextIterator !== "function") {
|
|
275
|
+
throw new Error("Expected async iterator while retrying server createMemo");
|
|
197
276
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
if (!servedFirst) {
|
|
204
|
-
servedFirst = true;
|
|
205
|
-
return firstNext.then(r => {
|
|
206
|
-
if (!r.done && !comp.disposed) comp.value = r.value;
|
|
207
|
-
return r;
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
return iter.next().then(r => r);
|
|
211
|
-
}
|
|
212
|
-
})
|
|
277
|
+
iter = nextIterator.call(source);
|
|
278
|
+
return iter.next().then(value => {
|
|
279
|
+
firstResult = value;
|
|
280
|
+
return Promise.resolve();
|
|
281
|
+
});
|
|
213
282
|
};
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
283
|
+
settleServerAsync(runFirst(), runFirst, deferred, () => {
|
|
284
|
+
const resolved = firstResult;
|
|
285
|
+
if (resolved && !resolved.done) {
|
|
286
|
+
comp.value = resolved.value;
|
|
287
|
+
}
|
|
288
|
+
comp.error = undefined;
|
|
289
|
+
return undefined;
|
|
290
|
+
}, error => {
|
|
291
|
+
comp.error = error;
|
|
292
|
+
}, () => comp.disposed);
|
|
293
|
+
if (ctx?.async && ctx.serialize && id && !noHydrate) {
|
|
294
|
+
let tappedFirst = true;
|
|
295
|
+
const tapped = {
|
|
296
|
+
[Symbol.asyncIterator]: () => ({
|
|
297
|
+
next() {
|
|
298
|
+
if (tappedFirst) {
|
|
299
|
+
tappedFirst = false;
|
|
300
|
+
return deferred.promise.then(() => firstResult?.done ? {
|
|
301
|
+
done: true,
|
|
302
|
+
value: undefined
|
|
303
|
+
} : firstResult);
|
|
304
|
+
}
|
|
305
|
+
return iter.next().then(r => r);
|
|
306
|
+
},
|
|
307
|
+
return(value) {
|
|
308
|
+
return iter.return?.(value);
|
|
309
|
+
}
|
|
310
|
+
})
|
|
311
|
+
};
|
|
312
|
+
ctx.serialize(id, tapped, deferStream);
|
|
217
313
|
}
|
|
314
|
+
comp.error = new signals.NotReadyError(deferred.promise);
|
|
218
315
|
}
|
|
219
316
|
return;
|
|
220
317
|
}
|
|
221
318
|
comp.value = result;
|
|
222
319
|
}
|
|
223
|
-
function
|
|
320
|
+
function closeAsyncIterator(iter, value) {
|
|
321
|
+
const returned = iter.return?.(value);
|
|
322
|
+
if (returned && typeof returned.then === "function") {
|
|
323
|
+
returned.then(undefined, () => {});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function serverEffect(compute, effectFn, options) {
|
|
224
327
|
const ssrSource = options?.ssrSource;
|
|
225
|
-
if (ssrSource === "client"
|
|
328
|
+
if (ssrSource === "client") {
|
|
226
329
|
signals.createOwner();
|
|
227
330
|
return;
|
|
228
331
|
}
|
|
@@ -230,7 +333,7 @@ function serverEffect(compute, effectFn, value, options) {
|
|
|
230
333
|
const owner = signals.createOwner();
|
|
231
334
|
const comp = {
|
|
232
335
|
owner,
|
|
233
|
-
value:
|
|
336
|
+
value: undefined,
|
|
234
337
|
compute: compute,
|
|
235
338
|
error: undefined,
|
|
236
339
|
computed: true,
|
|
@@ -242,19 +345,19 @@ function serverEffect(compute, effectFn, value, options) {
|
|
|
242
345
|
}));
|
|
243
346
|
}
|
|
244
347
|
try {
|
|
245
|
-
const result = signals.runWithOwner(owner, () => runWithObserver(comp, () => compute(
|
|
348
|
+
const result = signals.runWithOwner(owner, () => runWithObserver(comp, () => compute(undefined)));
|
|
246
349
|
if (ssrSource) {
|
|
247
350
|
processResult(comp, result, owner, ctx, options?.deferStream, ssrSource);
|
|
248
351
|
}
|
|
249
|
-
effectFn?.(ssrSource ? comp.value ?? result : result,
|
|
352
|
+
effectFn?.(ssrSource ? comp.value ?? result : result, undefined);
|
|
250
353
|
} catch (err) {
|
|
251
354
|
}
|
|
252
355
|
}
|
|
253
|
-
function createEffect(compute, effect,
|
|
254
|
-
serverEffect(compute, undefined,
|
|
356
|
+
function createEffect(compute, effect, options) {
|
|
357
|
+
serverEffect(compute, undefined, options);
|
|
255
358
|
}
|
|
256
|
-
function createRenderEffect(compute, effectFn,
|
|
257
|
-
serverEffect(compute, effectFn,
|
|
359
|
+
function createRenderEffect(compute, effectFn, options) {
|
|
360
|
+
serverEffect(compute, effectFn, options);
|
|
258
361
|
}
|
|
259
362
|
function createTrackedEffect(compute, options) {
|
|
260
363
|
const o = signals.getOwner();
|
|
@@ -265,8 +368,8 @@ function createReaction(effectFn, options) {
|
|
|
265
368
|
tracking();
|
|
266
369
|
};
|
|
267
370
|
}
|
|
268
|
-
function createOptimistic(first, second
|
|
269
|
-
return createSignal(first, second
|
|
371
|
+
function createOptimistic(first, second) {
|
|
372
|
+
return createSignal(first, second);
|
|
270
373
|
}
|
|
271
374
|
function setProperty(state, property, value) {
|
|
272
375
|
if (state[property] === value) return;
|
|
@@ -276,7 +379,7 @@ function setProperty(state, property, value) {
|
|
|
276
379
|
}
|
|
277
380
|
function createStore(first, second) {
|
|
278
381
|
if (typeof first === "function") {
|
|
279
|
-
const store = createProjection(first, second
|
|
382
|
+
const store = createProjection(first, second);
|
|
280
383
|
return [store, fn => fn(store)];
|
|
281
384
|
}
|
|
282
385
|
const state = first;
|
|
@@ -299,11 +402,11 @@ function createPendingProxy(state, source) {
|
|
|
299
402
|
pending = false;
|
|
300
403
|
}];
|
|
301
404
|
}
|
|
302
|
-
function createProjection(fn, initialValue
|
|
405
|
+
function createProjection(fn, initialValue, options) {
|
|
303
406
|
const ctx = sharedConfig.context;
|
|
304
407
|
const owner = signals.createOwner();
|
|
305
408
|
const [state] = createStore(initialValue);
|
|
306
|
-
if (options?.ssrSource === "
|
|
409
|
+
if (options?.ssrSource === "client") {
|
|
307
410
|
return state;
|
|
308
411
|
}
|
|
309
412
|
let disposed = false;
|
|
@@ -314,100 +417,131 @@ function createProjection(fn, initialValue = {}, options) {
|
|
|
314
417
|
const useProxy = ssrSource !== "hybrid";
|
|
315
418
|
const patches = [];
|
|
316
419
|
const draft = useProxy ? createDeepProxy(state, patches) : state;
|
|
317
|
-
const
|
|
420
|
+
const runProjection = () => signals.runWithOwner(owner, () => fn(draft));
|
|
421
|
+
const result = runProjection();
|
|
318
422
|
const iteratorFn = result?.[Symbol.asyncIterator];
|
|
319
423
|
if (typeof iteratorFn === "function") {
|
|
320
|
-
const iter = iteratorFn.call(result);
|
|
321
424
|
if (ssrSource === "hybrid") {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
425
|
+
let currentResult = result;
|
|
426
|
+
let iter;
|
|
427
|
+
const deferred = createDeferredPromise();
|
|
428
|
+
const [pending, markReady] = createPendingProxy(state, deferred.promise);
|
|
429
|
+
const runFirst = () => {
|
|
430
|
+
const source = currentResult ?? runProjection();
|
|
431
|
+
currentResult = undefined;
|
|
432
|
+
const nextIterator = source?.[Symbol.asyncIterator];
|
|
433
|
+
if (typeof nextIterator !== "function") {
|
|
434
|
+
throw new Error("Expected async iterator while retrying server createProjection");
|
|
327
435
|
}
|
|
328
|
-
|
|
329
|
-
|
|
436
|
+
iter = nextIterator.call(source);
|
|
437
|
+
return iter.next().then(r => {
|
|
438
|
+
if (!r.done) closeAsyncIterator(iter);
|
|
439
|
+
return r.value;
|
|
440
|
+
});
|
|
441
|
+
};
|
|
442
|
+
settleServerAsync(runFirst(), runFirst, deferred, value => {
|
|
443
|
+
if (value !== undefined && value !== state) {
|
|
444
|
+
Object.assign(state, value);
|
|
330
445
|
}
|
|
331
|
-
promise.v = state;
|
|
332
446
|
markReady();
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
447
|
+
return state;
|
|
448
|
+
}, error => {
|
|
449
|
+
markReady();
|
|
450
|
+
}, () => disposed);
|
|
451
|
+
if (ctx?.async && !signals.getContext(NoHydrateContext) && owner.id) ctx.serialize(owner.id, deferred.promise, options?.deferStream);
|
|
336
452
|
return pending;
|
|
337
453
|
} else {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
454
|
+
let currentResult = result;
|
|
455
|
+
let iter;
|
|
456
|
+
let firstResult;
|
|
457
|
+
const deferred = createDeferredPromise();
|
|
458
|
+
const [pending, markReady] = createPendingProxy(state, deferred.promise);
|
|
459
|
+
const runFirst = () => {
|
|
460
|
+
const source = currentResult ?? runProjection();
|
|
461
|
+
currentResult = undefined;
|
|
462
|
+
const nextIterator = source?.[Symbol.asyncIterator];
|
|
463
|
+
if (typeof nextIterator !== "function") {
|
|
464
|
+
throw new Error("Expected async iterator while retrying server createProjection");
|
|
465
|
+
}
|
|
466
|
+
iter = nextIterator.call(source);
|
|
467
|
+
return iter.next().then(value => {
|
|
468
|
+
firstResult = value;
|
|
469
|
+
return Promise.resolve();
|
|
470
|
+
});
|
|
471
|
+
};
|
|
472
|
+
settleServerAsync(runFirst(), runFirst, deferred, () => {
|
|
341
473
|
patches.length = 0;
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
}
|
|
474
|
+
const resolved = firstResult;
|
|
475
|
+
if (resolved && !resolved.done && resolved.value !== undefined && resolved.value !== draft) {
|
|
476
|
+
Object.assign(state, resolved.value);
|
|
346
477
|
}
|
|
347
478
|
markReady(JSON.parse(JSON.stringify(state)));
|
|
348
|
-
|
|
479
|
+
return undefined;
|
|
480
|
+
}, error => {
|
|
349
481
|
markReady();
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
done
|
|
360
|
-
|
|
482
|
+
}, () => disposed);
|
|
483
|
+
if (ctx?.async && !signals.getContext(NoHydrateContext) && owner.id) {
|
|
484
|
+
let tappedFirst = true;
|
|
485
|
+
const tapped = {
|
|
486
|
+
[Symbol.asyncIterator]: () => ({
|
|
487
|
+
next() {
|
|
488
|
+
if (tappedFirst) {
|
|
489
|
+
tappedFirst = false;
|
|
490
|
+
return deferred.promise.then(() => {
|
|
491
|
+
if (firstResult?.done) return {
|
|
492
|
+
done: true,
|
|
493
|
+
value: undefined
|
|
494
|
+
};
|
|
495
|
+
return {
|
|
496
|
+
done: false,
|
|
497
|
+
value: JSON.parse(JSON.stringify(state))
|
|
498
|
+
};
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
return iter.next().then(r => {
|
|
502
|
+
if (disposed) return {
|
|
503
|
+
done: true,
|
|
504
|
+
value: undefined
|
|
361
505
|
};
|
|
506
|
+
const flushed = patches.splice(0);
|
|
507
|
+
if (!r.done) {
|
|
508
|
+
if (r.value !== undefined && r.value !== draft) {
|
|
509
|
+
Object.assign(state, r.value);
|
|
510
|
+
}
|
|
511
|
+
return {
|
|
512
|
+
done: false,
|
|
513
|
+
value: flushed
|
|
514
|
+
};
|
|
515
|
+
}
|
|
362
516
|
return {
|
|
363
|
-
done:
|
|
517
|
+
done: true,
|
|
364
518
|
value: undefined
|
|
365
519
|
};
|
|
366
520
|
});
|
|
521
|
+
},
|
|
522
|
+
return(value) {
|
|
523
|
+
return iter.return?.(value);
|
|
367
524
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
};
|
|
373
|
-
const flushed = patches.splice(0);
|
|
374
|
-
if (!r.done) {
|
|
375
|
-
if (r.value !== undefined && r.value !== draft) {
|
|
376
|
-
Object.assign(state, r.value);
|
|
377
|
-
}
|
|
378
|
-
return {
|
|
379
|
-
done: false,
|
|
380
|
-
value: flushed
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
return {
|
|
384
|
-
done: true,
|
|
385
|
-
value: undefined
|
|
386
|
-
};
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
})
|
|
390
|
-
};
|
|
391
|
-
if (ctx?.async && !ctx.noHydrate && owner.id) ctx.serialize(owner.id, tapped, options?.deferStream);
|
|
392
|
-
const [pending, markReady] = createPendingProxy(state, firstReady);
|
|
525
|
+
})
|
|
526
|
+
};
|
|
527
|
+
ctx.serialize(owner.id, tapped, options?.deferStream);
|
|
528
|
+
}
|
|
393
529
|
return pending;
|
|
394
530
|
}
|
|
395
531
|
}
|
|
396
532
|
if (result instanceof Promise) {
|
|
397
|
-
const
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
533
|
+
const deferred = createDeferredPromise();
|
|
534
|
+
const [pending, markReady] = createPendingProxy(state, deferred.promise);
|
|
535
|
+
settleServerAsync(result, () => runProjection(), deferred, value => {
|
|
536
|
+
if (value !== undefined && value !== state) {
|
|
537
|
+
Object.assign(state, value);
|
|
402
538
|
}
|
|
403
|
-
if (v !== undefined && v !== state) {
|
|
404
|
-
Object.assign(state, v);
|
|
405
|
-
}
|
|
406
|
-
promise.v = state;
|
|
407
539
|
markReady();
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
540
|
+
return state;
|
|
541
|
+
}, error => {
|
|
542
|
+
markReady();
|
|
543
|
+
}, () => disposed);
|
|
544
|
+
if (ctx?.async && !signals.getContext(NoHydrateContext) && owner.id) ctx.serialize(owner.id, deferred.promise, options?.deferStream);
|
|
411
545
|
return pending;
|
|
412
546
|
}
|
|
413
547
|
if (result !== undefined && result !== state && result !== draft) {
|
|
@@ -434,68 +568,111 @@ function deep(store) {
|
|
|
434
568
|
return store;
|
|
435
569
|
}
|
|
436
570
|
function mapArray(list, mapFn, options = {}) {
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
return () => {
|
|
571
|
+
const parent = signals.createOwner();
|
|
572
|
+
return createMemo(() => {
|
|
440
573
|
const items = list();
|
|
441
574
|
let s = [];
|
|
442
575
|
if (items && items.length) {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
}
|
|
449
|
-
} else if (options.fallback)
|
|
576
|
+
signals.runWithOwner(parent, () => {
|
|
577
|
+
for (let i = 0, len = items.length; i < len; i++) {
|
|
578
|
+
const o = signals.createOwner();
|
|
579
|
+
s.push(signals.runWithOwner(o, () => mapFn(() => items[i], () => i)));
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
} else if (options.fallback) {
|
|
583
|
+
s = [signals.runWithOwner(parent, () => {
|
|
584
|
+
const fo = signals.createOwner();
|
|
585
|
+
return signals.runWithOwner(fo, () => options.fallback());
|
|
586
|
+
})];
|
|
587
|
+
}
|
|
450
588
|
return s;
|
|
451
|
-
};
|
|
589
|
+
});
|
|
452
590
|
}
|
|
453
591
|
function repeat(count, mapFn, options = {}) {
|
|
454
592
|
const owner = signals.createOwner();
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
const
|
|
462
|
-
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
593
|
+
return createMemo(() => {
|
|
594
|
+
const len = count();
|
|
595
|
+
const offset = options.from?.() || 0;
|
|
596
|
+
if (!len) {
|
|
597
|
+
if (!options.fallback) return [];
|
|
598
|
+
return [signals.runWithOwner(owner, () => {
|
|
599
|
+
const fallbackOwner = signals.createOwner();
|
|
600
|
+
return signals.runWithOwner(fallbackOwner, () => options.fallback());
|
|
601
|
+
})];
|
|
602
|
+
}
|
|
603
|
+
return signals.runWithOwner(owner, () => Array.from({
|
|
604
|
+
length: len
|
|
605
|
+
}, (_, i) => {
|
|
606
|
+
const itemOwner = signals.createOwner();
|
|
607
|
+
return signals.runWithOwner(itemOwner, () => mapFn(i + offset));
|
|
608
|
+
}));
|
|
609
|
+
});
|
|
472
610
|
}
|
|
473
611
|
const ErrorContext = {
|
|
474
612
|
id: Symbol("ErrorContext"),
|
|
475
613
|
defaultValue: null
|
|
476
614
|
};
|
|
615
|
+
function runWithBoundaryErrorContext(owner, render, onError, context, boundaryId) {
|
|
616
|
+
const prevCtx = sharedConfig.context;
|
|
617
|
+
const prevBoundary = context?._currentBoundaryId;
|
|
618
|
+
if (context) {
|
|
619
|
+
sharedConfig.context = context;
|
|
620
|
+
if (boundaryId !== undefined) context._currentBoundaryId = boundaryId;
|
|
621
|
+
}
|
|
622
|
+
try {
|
|
623
|
+
return signals.runWithOwner(owner, () => {
|
|
624
|
+
const parentHandler = signals.getContext(ErrorContext);
|
|
625
|
+
signals.setContext(ErrorContext, err => onError(err, parentHandler));
|
|
626
|
+
return render();
|
|
627
|
+
});
|
|
628
|
+
} finally {
|
|
629
|
+
if (context) {
|
|
630
|
+
if (boundaryId !== undefined) context._currentBoundaryId = prevBoundary;
|
|
631
|
+
sharedConfig.context = prevCtx;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
477
635
|
function createErrorBoundary(fn, fallback) {
|
|
478
636
|
const ctx = sharedConfig.context;
|
|
479
|
-
const owner = signals.createOwner();
|
|
480
637
|
const parent = signals.getOwner();
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
638
|
+
const owner = signals.createOwner();
|
|
639
|
+
const resolve = () => {
|
|
640
|
+
const resolved = ctx.resolve(signals.runWithOwner(signals.createOwner(), fn));
|
|
641
|
+
if (resolved?.p?.length) throw new signals.NotReadyError(Promise.all(resolved.p));
|
|
642
|
+
return resolved;
|
|
643
|
+
};
|
|
644
|
+
const renderFallback = err => ctx ? signals.runWithOwner(parent, () => {
|
|
645
|
+
const fallbackOwner = signals.createOwner();
|
|
646
|
+
return signals.runWithOwner(fallbackOwner, () => fallback(err, () => {}));
|
|
647
|
+
}) : fallback(err, () => {});
|
|
648
|
+
const serializeError = err => {
|
|
649
|
+
if (ctx && owner.id && !signals.runWithOwner(owner, () => signals.getContext(NoHydrateContext))) {
|
|
650
|
+
ctx.serialize(owner.id, err);
|
|
651
|
+
}
|
|
652
|
+
};
|
|
653
|
+
const handleError = err => {
|
|
654
|
+
serializeError(err);
|
|
655
|
+
return renderFallback(err);
|
|
656
|
+
};
|
|
657
|
+
return () => {
|
|
484
658
|
let result;
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
result = fallback(err, () => {});
|
|
488
|
-
});
|
|
659
|
+
let handled = false;
|
|
660
|
+
if (ctx) owner.dispose(false);
|
|
489
661
|
try {
|
|
490
|
-
result =
|
|
662
|
+
result = ctx ? runWithBoundaryErrorContext(owner, resolve, err => {
|
|
663
|
+
if (err instanceof signals.NotReadyError) throw err;
|
|
664
|
+
handled = true;
|
|
665
|
+
result = handleError(err);
|
|
666
|
+
throw err;
|
|
667
|
+
}) : signals.runWithOwner(owner, fn);
|
|
491
668
|
} catch (err) {
|
|
492
|
-
if (
|
|
493
|
-
result =
|
|
669
|
+
if (err instanceof signals.NotReadyError) throw err;
|
|
670
|
+
result = handled ? result : handleError(err);
|
|
494
671
|
}
|
|
495
|
-
return
|
|
496
|
-
}
|
|
672
|
+
return result;
|
|
673
|
+
};
|
|
497
674
|
}
|
|
498
|
-
function
|
|
675
|
+
function createLoadingBoundary$1(fn, fallback, options) {
|
|
499
676
|
try {
|
|
500
677
|
const result = fn();
|
|
501
678
|
return () => result;
|
|
@@ -506,6 +683,10 @@ function createLoadBoundary(fn, fallback) {
|
|
|
506
683
|
throw err;
|
|
507
684
|
}
|
|
508
685
|
}
|
|
686
|
+
function createRevealOrder(fn, _options) {
|
|
687
|
+
const o = signals.createOwner();
|
|
688
|
+
return signals.runWithOwner(o, fn);
|
|
689
|
+
}
|
|
509
690
|
function untrack(fn) {
|
|
510
691
|
return fn();
|
|
511
692
|
}
|
|
@@ -558,10 +739,10 @@ function useContext(context) {
|
|
|
558
739
|
return signals.getContext(context);
|
|
559
740
|
}
|
|
560
741
|
function children(fn) {
|
|
561
|
-
const c = createMemo(fn,
|
|
742
|
+
const c = createMemo(fn, {
|
|
562
743
|
lazy: true
|
|
563
744
|
});
|
|
564
|
-
const memo = createMemo(() => signals.flatten(c()),
|
|
745
|
+
const memo = createMemo(() => signals.flatten(c()), {
|
|
565
746
|
lazy: true
|
|
566
747
|
});
|
|
567
748
|
memo.toArray = () => {
|
|
@@ -571,7 +752,9 @@ function children(fn) {
|
|
|
571
752
|
return memo;
|
|
572
753
|
}
|
|
573
754
|
function ssrRunInScope(fn) {
|
|
574
|
-
|
|
755
|
+
const owner = signals.getOwner();
|
|
756
|
+
if (!owner) return fn;
|
|
757
|
+
return Array.isArray(fn) ? fn.map(hole => () => signals.runWithOwner(owner, hole)) : () => signals.runWithOwner(owner, fn);
|
|
575
758
|
}
|
|
576
759
|
|
|
577
760
|
function enableHydration() {}
|
|
@@ -590,20 +773,23 @@ function lazy(fn, moduleUrl) {
|
|
|
590
773
|
return p;
|
|
591
774
|
};
|
|
592
775
|
const wrap = props => {
|
|
593
|
-
|
|
776
|
+
const noHydrate = signals.getContext(NoHydrateContext);
|
|
777
|
+
if (!noHydrate && !moduleUrl) {
|
|
594
778
|
throw new Error("lazy() used in SSR without a moduleUrl. " + "All lazy() components require a moduleUrl for correct hydration. " + "This is typically injected by the bundler plugin.");
|
|
595
779
|
}
|
|
596
|
-
if (!sharedConfig.context?.resolveAssets) {
|
|
780
|
+
if (!noHydrate && !sharedConfig.context?.resolveAssets) {
|
|
597
781
|
throw new Error(`lazy() called with moduleUrl "${moduleUrl}" but no asset manifest is set. ` + "Pass a manifest option to renderToStream/renderToString.");
|
|
598
782
|
}
|
|
599
783
|
load();
|
|
600
784
|
const ctx = sharedConfig.context;
|
|
601
|
-
if (!ctx?.registerAsset || !ctx.resolveAssets) return;
|
|
785
|
+
if (!ctx?.registerAsset || !ctx.resolveAssets || !moduleUrl) return;
|
|
602
786
|
const assets = ctx.resolveAssets(moduleUrl);
|
|
603
787
|
if (assets) {
|
|
604
788
|
for (let i = 0; i < assets.css.length; i++) ctx.registerAsset("style", assets.css[i]);
|
|
605
|
-
|
|
606
|
-
|
|
789
|
+
if (!noHydrate) {
|
|
790
|
+
for (let i = 0; i < assets.js.length; i++) ctx.registerAsset("module", assets.js[i]);
|
|
791
|
+
ctx.registerModule?.(moduleUrl, assets.js[0]);
|
|
792
|
+
}
|
|
607
793
|
}
|
|
608
794
|
if (ctx?.async) {
|
|
609
795
|
ctx.block(p.then(() => {
|
|
@@ -616,10 +802,166 @@ function lazy(fn, moduleUrl) {
|
|
|
616
802
|
});
|
|
617
803
|
};
|
|
618
804
|
wrap.preload = load;
|
|
805
|
+
wrap.moduleUrl = moduleUrl;
|
|
619
806
|
return wrap;
|
|
620
807
|
}
|
|
621
808
|
function createUniqueId() {
|
|
622
|
-
|
|
809
|
+
const o = signals.getOwner();
|
|
810
|
+
if (!o) throw new Error(`createUniqueId cannot be used outside of a reactive context`);
|
|
811
|
+
return signals.getNextChildId(o);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
const RevealGroupContext = {
|
|
815
|
+
id: Symbol("RevealGroupContext"),
|
|
816
|
+
defaultValue: null
|
|
817
|
+
};
|
|
818
|
+
function ssrHandleError(err) {
|
|
819
|
+
if (err instanceof signals.NotReadyError) {
|
|
820
|
+
return err.source;
|
|
821
|
+
}
|
|
822
|
+
const handler = signals.getContext(ErrorContext);
|
|
823
|
+
if (handler) {
|
|
824
|
+
handler(err);
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
throw err;
|
|
828
|
+
}
|
|
829
|
+
function createLoadingBoundary(fn, fallback, options) {
|
|
830
|
+
const currentCtx = sharedConfig.context;
|
|
831
|
+
if (!currentCtx) {
|
|
832
|
+
return createLoadingBoundary$1(fn, fallback);
|
|
833
|
+
}
|
|
834
|
+
const ctx = currentCtx;
|
|
835
|
+
const parent = signals.getOwner();
|
|
836
|
+
const parentHandler = parent && signals.runWithOwner(parent, () => signals.getContext(ErrorContext));
|
|
837
|
+
const revealGroup = parent && signals.runWithOwner(parent, () => signals.getContext(RevealGroupContext));
|
|
838
|
+
const o = signals.createOwner();
|
|
839
|
+
const id = o.id;
|
|
840
|
+
o.id = id + "00";
|
|
841
|
+
let done;
|
|
842
|
+
let handledRenderError;
|
|
843
|
+
let retryPromise;
|
|
844
|
+
let serializeBuffer = [];
|
|
845
|
+
const bufferedCtx = Object.create(ctx);
|
|
846
|
+
bufferedCtx.serialize = (id, value, deferStream) => {
|
|
847
|
+
serializeBuffer.push([id, value, deferStream]);
|
|
848
|
+
};
|
|
849
|
+
bufferedCtx._currentBoundaryId = id;
|
|
850
|
+
function flushSerializeBuffer() {
|
|
851
|
+
for (const args of serializeBuffer) ctx.serialize(args[0], args[1], args[2]);
|
|
852
|
+
serializeBuffer = [];
|
|
853
|
+
}
|
|
854
|
+
function commitBoundaryState() {
|
|
855
|
+
flushSerializeBuffer();
|
|
856
|
+
const modules = ctx.getBoundaryModules?.(id);
|
|
857
|
+
if (modules) ctx.serialize(id + "_assets", modules);
|
|
858
|
+
}
|
|
859
|
+
function runLoadingPhase(render) {
|
|
860
|
+
handledRenderError = undefined;
|
|
861
|
+
return runWithBoundaryErrorContext(o, render, (err, parentHandler) => {
|
|
862
|
+
handledRenderError = err;
|
|
863
|
+
if (done?.(undefined, err)) throw err;
|
|
864
|
+
if (parentHandler) {
|
|
865
|
+
parentHandler(err);
|
|
866
|
+
return;
|
|
867
|
+
}
|
|
868
|
+
throw err;
|
|
869
|
+
}, bufferedCtx, id);
|
|
870
|
+
}
|
|
871
|
+
function finalizeError(err) {
|
|
872
|
+
if (handledRenderError === err) {
|
|
873
|
+
handledRenderError = undefined;
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
if (done?.(undefined, err)) return;
|
|
877
|
+
if (!parentHandler) throw err;
|
|
878
|
+
try {
|
|
879
|
+
signals.runWithOwner(parent, () => parentHandler(err));
|
|
880
|
+
} catch (caught) {
|
|
881
|
+
if (caught !== err) throw caught;
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
function runDiscovery() {
|
|
885
|
+
o.dispose(false);
|
|
886
|
+
serializeBuffer = [];
|
|
887
|
+
retryPromise = undefined;
|
|
888
|
+
return runLoadingPhase(() => {
|
|
889
|
+
try {
|
|
890
|
+
return ctx.resolve(fn());
|
|
891
|
+
} catch (err) {
|
|
892
|
+
if (err instanceof signals.NotReadyError) {
|
|
893
|
+
retryPromise = err.source;
|
|
894
|
+
return undefined;
|
|
895
|
+
}
|
|
896
|
+
throw err;
|
|
897
|
+
}
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
let ret = runDiscovery();
|
|
901
|
+
if (!retryPromise && !ret?.p?.length) {
|
|
902
|
+
commitBoundaryState();
|
|
903
|
+
return () => ret;
|
|
904
|
+
}
|
|
905
|
+
const regResult = revealGroup ? revealGroup.register(id) : null;
|
|
906
|
+
const collapseFallback = regResult?.collapseFallback ?? false;
|
|
907
|
+
if (collapseFallback && !ctx.async) {
|
|
908
|
+
commitBoundaryState();
|
|
909
|
+
ctx.serialize(id, "$$f");
|
|
910
|
+
return () => undefined;
|
|
911
|
+
}
|
|
912
|
+
const fallbackOwner = signals.createOwner({
|
|
913
|
+
id
|
|
914
|
+
});
|
|
915
|
+
const fallbackResult = signals.runWithOwner(fallbackOwner, () => {
|
|
916
|
+
if (!ctx.async) return fallback();
|
|
917
|
+
const tpl = collapseFallback ? [`<template id="pl-${id}">`, `</template><!--pl-${id}-->`] : [`<template id="pl-${id}"></template>`, `<!--pl-${id}-->`];
|
|
918
|
+
return ctx.ssr(tpl, ctx.escape(fallback()));
|
|
919
|
+
});
|
|
920
|
+
if (ctx.async) {
|
|
921
|
+
const regOpts = revealGroup ? {
|
|
922
|
+
revealGroup: revealGroup.id
|
|
923
|
+
} : undefined;
|
|
924
|
+
done = ctx.registerFragment(id, regOpts);
|
|
925
|
+
(async () => {
|
|
926
|
+
try {
|
|
927
|
+
while (retryPromise) {
|
|
928
|
+
await retryPromise.catch(() => {});
|
|
929
|
+
ret = runDiscovery();
|
|
930
|
+
}
|
|
931
|
+
commitBoundaryState();
|
|
932
|
+
while (ret.p.length) {
|
|
933
|
+
await Promise.all(ret.p).catch(() => {});
|
|
934
|
+
ret = runLoadingPhase(() => ctx.ssr(ret.t, ...ret.h));
|
|
935
|
+
}
|
|
936
|
+
flushSerializeBuffer();
|
|
937
|
+
done(ret.t[0]);
|
|
938
|
+
if (revealGroup) revealGroup.onResolved(id);
|
|
939
|
+
} catch (err) {
|
|
940
|
+
finalizeError(err);
|
|
941
|
+
}
|
|
942
|
+
})();
|
|
943
|
+
return () => fallbackResult;
|
|
944
|
+
}
|
|
945
|
+
commitBoundaryState();
|
|
946
|
+
ctx.serialize(id, "$$f");
|
|
947
|
+
return () => fallbackResult;
|
|
948
|
+
}
|
|
949
|
+
function NoHydration(props) {
|
|
950
|
+
const o = signals.createOwner();
|
|
951
|
+
return signals.runWithOwner(o, () => {
|
|
952
|
+
signals.setContext(NoHydrateContext, true);
|
|
953
|
+
return props.children;
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
function Hydration(props) {
|
|
957
|
+
if (!signals.getContext(NoHydrateContext)) return props.children;
|
|
958
|
+
const o = signals.createOwner({
|
|
959
|
+
id: props.id ?? ""
|
|
960
|
+
});
|
|
961
|
+
return signals.runWithOwner(o, () => {
|
|
962
|
+
signals.setContext(NoHydrateContext, false);
|
|
963
|
+
return props.children;
|
|
964
|
+
});
|
|
623
965
|
}
|
|
624
966
|
|
|
625
967
|
function For(props) {
|
|
@@ -629,7 +971,7 @@ function For(props) {
|
|
|
629
971
|
} : {
|
|
630
972
|
keyed: props.keyed
|
|
631
973
|
};
|
|
632
|
-
return
|
|
974
|
+
return mapArray(() => props.each, props.children, options);
|
|
633
975
|
}
|
|
634
976
|
function Repeat(props) {
|
|
635
977
|
const options = "fallback" in props ? {
|
|
@@ -682,89 +1024,180 @@ function Errored(props) {
|
|
|
682
1024
|
return typeof f === "function" && f.length ? f(err, reset) : f;
|
|
683
1025
|
});
|
|
684
1026
|
}
|
|
685
|
-
|
|
686
|
-
function ssrHandleError(err) {
|
|
687
|
-
if (err instanceof signals.NotReadyError) {
|
|
688
|
-
return err.source;
|
|
689
|
-
}
|
|
690
|
-
const handler = signals.getContext(ErrorContext);
|
|
691
|
-
if (handler) {
|
|
692
|
-
handler(err);
|
|
693
|
-
return;
|
|
694
|
-
}
|
|
695
|
-
throw err;
|
|
696
|
-
}
|
|
697
1027
|
function Loading(props) {
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
}
|
|
1028
|
+
return createLoadingBoundary(() => props.children, () => props.fallback);
|
|
1029
|
+
}
|
|
1030
|
+
function Reveal(props) {
|
|
702
1031
|
const o = signals.createOwner();
|
|
703
1032
|
const id = o.id;
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
1033
|
+
const order = props.order ?? "sequential";
|
|
1034
|
+
const collapsed = order === "sequential" && !!props.collapsed;
|
|
1035
|
+
if (!sharedConfig.context?.async) {
|
|
1036
|
+
const parent = signals.getOwner();
|
|
1037
|
+
const parentGroup = parent ? signals.runWithOwner(parent, () => signals.getContext(RevealGroupContext)) : null;
|
|
1038
|
+
let collapsedByParent = false;
|
|
1039
|
+
if (parentGroup) {
|
|
1040
|
+
const reg = parentGroup.register(id);
|
|
1041
|
+
collapsedByParent = reg.collapseFallback;
|
|
1042
|
+
if (order === "together" || collapsed) console.warn("Nested <Reveal> with collapsed/together won't coordinate correctly with renderToString. Use renderToStream for full support.");
|
|
1043
|
+
}
|
|
1044
|
+
let count = 0;
|
|
1045
|
+
return signals.runWithOwner(o, () => {
|
|
1046
|
+
signals.setContext(RevealGroupContext, {
|
|
1047
|
+
id,
|
|
1048
|
+
register(_key) {
|
|
1049
|
+
count++;
|
|
1050
|
+
const collapseFallback = collapsedByParent || order === "sequential" && collapsed && count > 1;
|
|
1051
|
+
return {
|
|
1052
|
+
collapseFallback,
|
|
1053
|
+
held: false
|
|
1054
|
+
};
|
|
1055
|
+
},
|
|
1056
|
+
onResolved() {}
|
|
1057
|
+
});
|
|
1058
|
+
return props.children;
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
const ctx = sharedConfig.context;
|
|
1062
|
+
const keys = [];
|
|
1063
|
+
const resolved = new Set();
|
|
1064
|
+
const minimallyResolved = new Set();
|
|
1065
|
+
const composites = new Map();
|
|
1066
|
+
const activated = new Set();
|
|
1067
|
+
const stash = [];
|
|
1068
|
+
const collapsedLeafKeys = [];
|
|
1069
|
+
let frontier = 0;
|
|
1070
|
+
let heldByParent = false;
|
|
1071
|
+
let collapsedByParent = false;
|
|
1072
|
+
let selfMinimallyResolved = false;
|
|
1073
|
+
let notifiedParentDone = false;
|
|
1074
|
+
const parent = signals.getOwner();
|
|
1075
|
+
const parentGroup = parent ? signals.runWithOwner(parent, () => signals.getContext(RevealGroupContext)) : null;
|
|
1076
|
+
if (parentGroup) {
|
|
1077
|
+
const reg = parentGroup.register(id, {
|
|
1078
|
+
onActivate: () => {
|
|
1079
|
+
if (!heldByParent) return;
|
|
1080
|
+
heldByParent = false;
|
|
1081
|
+
if (collapsedByParent) {
|
|
1082
|
+
collapsedByParent = false;
|
|
1083
|
+
if (collapsedLeafKeys.length) {
|
|
1084
|
+
ctx.revealFallbacks?.([...collapsedLeafKeys]);
|
|
1085
|
+
collapsedLeafKeys.length = 0;
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
if (order === "sequential") advanceFrontier();else if (order === "together") checkTogetherRelease();else naturalRelease();
|
|
721
1089
|
}
|
|
722
1090
|
});
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
return result;
|
|
1091
|
+
collapsedByParent = reg.collapseFallback;
|
|
1092
|
+
heldByParent = reg.held;
|
|
726
1093
|
}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
return ret;
|
|
1094
|
+
function notifyParentIfDone() {
|
|
1095
|
+
if (notifiedParentDone) return;
|
|
1096
|
+
if (parentGroup && resolved.size === keys.length) {
|
|
1097
|
+
notifiedParentDone = true;
|
|
1098
|
+
parentGroup.onResolved(id);
|
|
1099
|
+
}
|
|
734
1100
|
}
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
1101
|
+
function activateComposite(key) {
|
|
1102
|
+
if (activated.has(key)) return;
|
|
1103
|
+
activated.add(key);
|
|
1104
|
+
composites.get(key)();
|
|
1105
|
+
}
|
|
1106
|
+
function updateSelfMinimallyResolved() {
|
|
1107
|
+
if (selfMinimallyResolved) return;
|
|
1108
|
+
if (keys.length === 0) selfMinimallyResolved = true;else if (order === "together") selfMinimallyResolved = minimallyResolved.size === keys.length;else if (order === "sequential") selfMinimallyResolved = minimallyResolved.has(keys[0]);
|
|
1109
|
+
else selfMinimallyResolved = resolved.size > 0;
|
|
1110
|
+
if (selfMinimallyResolved) parentGroup?.onMinimallyResolved?.(id);
|
|
1111
|
+
}
|
|
1112
|
+
function advanceFrontier() {
|
|
1113
|
+
if (heldByParent) return;
|
|
1114
|
+
while (frontier < keys.length && resolved.has(keys[frontier])) {
|
|
1115
|
+
const k = keys[frontier];
|
|
1116
|
+
if (composites.has(k)) activateComposite(k);else ctx.revealFragments?.([k]);
|
|
1117
|
+
frontier++;
|
|
1118
|
+
}
|
|
1119
|
+
if (frontier < keys.length) {
|
|
1120
|
+
const k = keys[frontier];
|
|
1121
|
+
if (composites.has(k)) activateComposite(k);else if (order === "sequential" && collapsed) ctx.revealFallbacks?.([k]);
|
|
1122
|
+
}
|
|
1123
|
+
notifyParentIfDone();
|
|
1124
|
+
}
|
|
1125
|
+
function checkTogetherRelease() {
|
|
1126
|
+
if (order !== "together" || heldByParent) return;
|
|
1127
|
+
if (minimallyResolved.size < keys.length) return;
|
|
1128
|
+
if (stash.length) {
|
|
1129
|
+
ctx.revealFragments?.([...stash]);
|
|
1130
|
+
stash.length = 0;
|
|
1131
|
+
}
|
|
1132
|
+
composites.forEach((_, key) => activateComposite(key));
|
|
1133
|
+
notifyParentIfDone();
|
|
1134
|
+
}
|
|
1135
|
+
function naturalRelease() {
|
|
1136
|
+
if (stash.length) {
|
|
1137
|
+
ctx.revealFragments?.([...stash]);
|
|
1138
|
+
stash.length = 0;
|
|
1139
|
+
}
|
|
1140
|
+
composites.forEach((_, key) => activateComposite(key));
|
|
1141
|
+
notifyParentIfDone();
|
|
1142
|
+
}
|
|
1143
|
+
return signals.runWithOwner(o, () => {
|
|
1144
|
+
signals.setContext(RevealGroupContext, {
|
|
1145
|
+
id,
|
|
1146
|
+
register(key, options) {
|
|
1147
|
+
keys.push(key);
|
|
1148
|
+
const isComposite = !!options?.onActivate;
|
|
1149
|
+
if (isComposite) composites.set(key, options.onActivate);
|
|
1150
|
+
const selfCollapse = order === "sequential" && collapsed && keys.length > 1;
|
|
1151
|
+
const collapseFallback = collapsedByParent || selfCollapse;
|
|
1152
|
+
if (collapseFallback && !isComposite) collapsedLeafKeys.push(key);
|
|
1153
|
+
let held = heldByParent;
|
|
1154
|
+
if (!held) {
|
|
1155
|
+
if (order === "together") held = true;else if (order === "sequential" && keys.length > 1) held = true;
|
|
748
1156
|
}
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
1157
|
+
return {
|
|
1158
|
+
collapseFallback,
|
|
1159
|
+
held
|
|
1160
|
+
};
|
|
1161
|
+
},
|
|
1162
|
+
onResolved(key) {
|
|
1163
|
+
resolved.add(key);
|
|
1164
|
+
const isLeaf = !composites.has(key);
|
|
1165
|
+
if (isLeaf) {
|
|
1166
|
+
if (order === "together") {
|
|
1167
|
+
stash.push(key);
|
|
1168
|
+
} else if (order === "natural" && heldByParent) {
|
|
1169
|
+
stash.push(key);
|
|
1170
|
+
} else if (order === "natural") {
|
|
1171
|
+
ctx.revealFragments?.([key]);
|
|
1172
|
+
}
|
|
1173
|
+
markMinimallyResolved(key);
|
|
1174
|
+
if (order === "sequential" && !heldByParent) advanceFrontier();
|
|
1175
|
+
if (order === "natural") updateSelfMinimallyResolved();
|
|
1176
|
+
} else {
|
|
1177
|
+
if (!heldByParent) {
|
|
1178
|
+
if (order === "sequential") advanceFrontier();else if (order === "natural") activateComposite(key);
|
|
1179
|
+
}
|
|
1180
|
+
if (order === "together") checkTogetherRelease();
|
|
1181
|
+
if (order === "natural") updateSelfMinimallyResolved();
|
|
754
1182
|
}
|
|
755
|
-
|
|
756
|
-
}
|
|
757
|
-
|
|
1183
|
+
notifyParentIfDone();
|
|
1184
|
+
},
|
|
1185
|
+
onMinimallyResolved(key) {
|
|
1186
|
+
markMinimallyResolved(key);
|
|
758
1187
|
}
|
|
759
|
-
})
|
|
760
|
-
|
|
1188
|
+
});
|
|
1189
|
+
const result = props.children;
|
|
1190
|
+
if (parentGroup && keys.length === 0) {
|
|
1191
|
+
parentGroup.onResolved(id);
|
|
1192
|
+
}
|
|
1193
|
+
return result;
|
|
1194
|
+
});
|
|
1195
|
+
function markMinimallyResolved(key) {
|
|
1196
|
+
if (minimallyResolved.has(key)) return;
|
|
1197
|
+
minimallyResolved.add(key);
|
|
1198
|
+
updateSelfMinimallyResolved();
|
|
1199
|
+
if (order === "together") checkTogetherRelease();
|
|
761
1200
|
}
|
|
762
|
-
for (const args of serializeBuffer) origSerialize(args[0], args[1], args[2]);
|
|
763
|
-
serializeBuffer = [];
|
|
764
|
-
const modules = ctx.getBoundaryModules?.(id);
|
|
765
|
-
if (modules) ctx.serialize(id + "_assets", modules);
|
|
766
|
-
ctx.serialize(id, "$$f");
|
|
767
|
-
return signals.runWithOwner(fallbackOwner, () => props.fallback);
|
|
768
1201
|
}
|
|
769
1202
|
|
|
770
1203
|
const DEV = undefined;
|
|
@@ -773,6 +1206,10 @@ Object.defineProperty(exports, "$PROXY", {
|
|
|
773
1206
|
enumerable: true,
|
|
774
1207
|
get: function () { return signals.$PROXY; }
|
|
775
1208
|
});
|
|
1209
|
+
Object.defineProperty(exports, "$REFRESH", {
|
|
1210
|
+
enumerable: true,
|
|
1211
|
+
get: function () { return signals.$REFRESH; }
|
|
1212
|
+
});
|
|
776
1213
|
Object.defineProperty(exports, "$TRACK", {
|
|
777
1214
|
enumerable: true,
|
|
778
1215
|
get: function () { return signals.$TRACK; }
|
|
@@ -789,6 +1226,14 @@ Object.defineProperty(exports, "createRoot", {
|
|
|
789
1226
|
enumerable: true,
|
|
790
1227
|
get: function () { return signals.createRoot; }
|
|
791
1228
|
});
|
|
1229
|
+
Object.defineProperty(exports, "enableExternalSource", {
|
|
1230
|
+
enumerable: true,
|
|
1231
|
+
get: function () { return signals.enableExternalSource; }
|
|
1232
|
+
});
|
|
1233
|
+
Object.defineProperty(exports, "enforceLoadingBoundary", {
|
|
1234
|
+
enumerable: true,
|
|
1235
|
+
get: function () { return signals.enforceLoadingBoundary; }
|
|
1236
|
+
});
|
|
792
1237
|
Object.defineProperty(exports, "flatten", {
|
|
793
1238
|
enumerable: true,
|
|
794
1239
|
get: function () { return signals.flatten; }
|
|
@@ -801,6 +1246,10 @@ Object.defineProperty(exports, "getOwner", {
|
|
|
801
1246
|
enumerable: true,
|
|
802
1247
|
get: function () { return signals.getOwner; }
|
|
803
1248
|
});
|
|
1249
|
+
Object.defineProperty(exports, "isDisposed", {
|
|
1250
|
+
enumerable: true,
|
|
1251
|
+
get: function () { return signals.isDisposed; }
|
|
1252
|
+
});
|
|
804
1253
|
Object.defineProperty(exports, "isEqual", {
|
|
805
1254
|
enumerable: true,
|
|
806
1255
|
get: function () { return signals.isEqual; }
|
|
@@ -837,9 +1286,13 @@ exports.$DEVCOMP = $DEVCOMP;
|
|
|
837
1286
|
exports.DEV = DEV;
|
|
838
1287
|
exports.Errored = Errored;
|
|
839
1288
|
exports.For = For;
|
|
1289
|
+
exports.Hydration = Hydration;
|
|
840
1290
|
exports.Loading = Loading;
|
|
841
1291
|
exports.Match = Match;
|
|
1292
|
+
exports.NoHydrateContext = NoHydrateContext;
|
|
1293
|
+
exports.NoHydration = NoHydration;
|
|
842
1294
|
exports.Repeat = Repeat;
|
|
1295
|
+
exports.Reveal = Reveal;
|
|
843
1296
|
exports.Show = Show;
|
|
844
1297
|
exports.Switch = Switch;
|
|
845
1298
|
exports.action = action;
|
|
@@ -848,12 +1301,15 @@ exports.createComponent = createComponent;
|
|
|
848
1301
|
exports.createContext = createContext;
|
|
849
1302
|
exports.createDeepProxy = createDeepProxy;
|
|
850
1303
|
exports.createEffect = createEffect;
|
|
1304
|
+
exports.createErrorBoundary = createErrorBoundary;
|
|
1305
|
+
exports.createLoadingBoundary = createLoadingBoundary;
|
|
851
1306
|
exports.createMemo = createMemo;
|
|
852
1307
|
exports.createOptimistic = createOptimistic;
|
|
853
1308
|
exports.createOptimisticStore = createOptimisticStore;
|
|
854
1309
|
exports.createProjection = createProjection;
|
|
855
1310
|
exports.createReaction = createReaction;
|
|
856
1311
|
exports.createRenderEffect = createRenderEffect;
|
|
1312
|
+
exports.createRevealOrder = createRevealOrder;
|
|
857
1313
|
exports.createSignal = createSignal;
|
|
858
1314
|
exports.createStore = createStore;
|
|
859
1315
|
exports.createTrackedEffect = createTrackedEffect;
|