solid-js 2.0.0-beta.1 → 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 +431 -283
- package/dist/dev.js +411 -286
- package/dist/server.cjs +701 -281
- package/dist/server.js +684 -284
- package/dist/solid.cjs +423 -255
- package/dist/solid.js +403 -258
- package/package.json +67 -39
- package/types/client/component.d.ts +64 -19
- package/types/client/core.d.ts +110 -34
- package/types/client/flow.d.ts +176 -42
- package/types/client/hydration.d.ts +514 -36
- package/types/index.d.ts +9 -12
- package/types/server/component.d.ts +11 -11
- package/types/server/core.d.ts +19 -14
- package/types/server/flow.d.ts +76 -21
- package/types/server/hydration.d.ts +34 -9
- package/types/server/index.d.ts +5 -7
- package/types/server/shared.d.ts +5 -1
- package/types/server/signals.d.ts +44 -19
- 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
|
@@ -28,38 +28,82 @@ function runWithObserver(comp, fn) {
|
|
|
28
28
|
function getObserver() {
|
|
29
29
|
return Observer;
|
|
30
30
|
}
|
|
31
|
-
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) {
|
|
32
89
|
if (typeof first === "function") {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
let value = second;
|
|
37
|
-
return [() => value, v => {
|
|
38
|
-
return value = typeof v === "function" ? v(value) : v;
|
|
39
|
-
}];
|
|
40
|
-
}
|
|
41
|
-
const memoOpts = third?.deferStream || ssrSource ? {
|
|
42
|
-
deferStream: third?.deferStream,
|
|
43
|
-
ssrSource
|
|
90
|
+
const opts = second?.deferStream || second?.ssrSource ? {
|
|
91
|
+
deferStream: second?.deferStream,
|
|
92
|
+
ssrSource: second?.ssrSource
|
|
44
93
|
} : undefined;
|
|
45
|
-
const memo = createMemo(
|
|
46
|
-
|
|
47
|
-
return [() => value, v => {
|
|
48
|
-
return value = typeof v === "function" ? v(value) : v;
|
|
49
|
-
}];
|
|
50
|
-
}, undefined, memoOpts);
|
|
51
|
-
return [() => memo()[0](), v => memo()[1](v)];
|
|
94
|
+
const memo = createMemo(prev => first(prev), opts);
|
|
95
|
+
return [memo, () => undefined];
|
|
52
96
|
}
|
|
53
97
|
return [() => first, v => {
|
|
54
98
|
return first = typeof v === "function" ? v(first) : v;
|
|
55
99
|
}];
|
|
56
100
|
}
|
|
57
|
-
function createMemo(compute,
|
|
101
|
+
function createMemo(compute, options) {
|
|
58
102
|
const ctx = sharedConfig.context;
|
|
59
103
|
const owner = signals.createOwner();
|
|
60
104
|
const comp = {
|
|
61
105
|
owner,
|
|
62
|
-
value:
|
|
106
|
+
value: undefined,
|
|
63
107
|
compute: compute,
|
|
64
108
|
error: undefined,
|
|
65
109
|
computed: false,
|
|
@@ -70,21 +114,22 @@ function createMemo(compute, value, options) {
|
|
|
70
114
|
}));
|
|
71
115
|
function update() {
|
|
72
116
|
if (comp.disposed) return;
|
|
117
|
+
const run = () => signals.runWithOwner(owner, () => runWithObserver(comp, () => comp.compute(comp.value)));
|
|
73
118
|
try {
|
|
74
119
|
comp.error = undefined;
|
|
75
|
-
const result =
|
|
120
|
+
const result = run();
|
|
76
121
|
comp.computed = true;
|
|
77
|
-
processResult(comp, result, owner, ctx, options?.deferStream, options?.ssrSource);
|
|
122
|
+
processResult(comp, result, owner, ctx, options?.deferStream, options?.ssrSource, run);
|
|
78
123
|
} catch (err) {
|
|
79
124
|
if (err instanceof signals.NotReadyError) {
|
|
80
|
-
err
|
|
125
|
+
subscribePendingRetry(err, update);
|
|
81
126
|
}
|
|
82
127
|
comp.error = err;
|
|
83
128
|
comp.computed = true;
|
|
84
129
|
}
|
|
85
130
|
}
|
|
86
131
|
const ssrSource = options?.ssrSource;
|
|
87
|
-
if (ssrSource === "
|
|
132
|
+
if (ssrSource === "client") {
|
|
88
133
|
comp.computed = true;
|
|
89
134
|
} else if (!options?.lazy) {
|
|
90
135
|
update();
|
|
@@ -159,76 +204,128 @@ function createDeepProxy(target, patches, basePath = []) {
|
|
|
159
204
|
};
|
|
160
205
|
return new Proxy(target, handler);
|
|
161
206
|
}
|
|
162
|
-
function processResult(comp, result, owner, ctx, deferStream, ssrSource) {
|
|
207
|
+
function processResult(comp, result, owner, ctx, deferStream, ssrSource, rerun) {
|
|
163
208
|
if (comp.disposed) return;
|
|
164
209
|
const id = owner.id;
|
|
165
|
-
const uninitialized = comp.value === undefined;
|
|
166
210
|
const noHydrate = signals.getContext(NoHydrateContext, owner);
|
|
167
211
|
if (result instanceof Promise) {
|
|
168
|
-
result.
|
|
169
|
-
|
|
170
|
-
result.v = v;
|
|
171
|
-
if (comp.disposed) return;
|
|
172
|
-
comp.value = v;
|
|
212
|
+
if (result.s === 1) {
|
|
213
|
+
comp.value = result.v;
|
|
173
214
|
comp.error = undefined;
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (
|
|
177
|
-
comp.error =
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (result.s === 2) {
|
|
218
|
+
comp.error = result.v;
|
|
219
|
+
return;
|
|
178
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);
|
|
179
235
|
return;
|
|
180
236
|
}
|
|
181
237
|
const iterator = result?.[Symbol.asyncIterator];
|
|
182
238
|
if (typeof iterator === "function") {
|
|
183
|
-
const iter = iterator.call(result);
|
|
184
239
|
if (ssrSource === "hybrid") {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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;
|
|
190
258
|
comp.error = undefined;
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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);
|
|
196
265
|
} else {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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");
|
|
203
276
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
if (!servedFirst) {
|
|
210
|
-
servedFirst = true;
|
|
211
|
-
return firstNext.then(r => {
|
|
212
|
-
if (!r.done && !comp.disposed) comp.value = r.value;
|
|
213
|
-
return r;
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
return iter.next().then(r => r);
|
|
217
|
-
}
|
|
218
|
-
})
|
|
277
|
+
iter = nextIterator.call(source);
|
|
278
|
+
return iter.next().then(value => {
|
|
279
|
+
firstResult = value;
|
|
280
|
+
return Promise.resolve();
|
|
281
|
+
});
|
|
219
282
|
};
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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);
|
|
223
313
|
}
|
|
314
|
+
comp.error = new signals.NotReadyError(deferred.promise);
|
|
224
315
|
}
|
|
225
316
|
return;
|
|
226
317
|
}
|
|
227
318
|
comp.value = result;
|
|
228
319
|
}
|
|
229
|
-
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) {
|
|
230
327
|
const ssrSource = options?.ssrSource;
|
|
231
|
-
if (ssrSource === "client"
|
|
328
|
+
if (ssrSource === "client") {
|
|
232
329
|
signals.createOwner();
|
|
233
330
|
return;
|
|
234
331
|
}
|
|
@@ -236,7 +333,7 @@ function serverEffect(compute, effectFn, value, options) {
|
|
|
236
333
|
const owner = signals.createOwner();
|
|
237
334
|
const comp = {
|
|
238
335
|
owner,
|
|
239
|
-
value:
|
|
336
|
+
value: undefined,
|
|
240
337
|
compute: compute,
|
|
241
338
|
error: undefined,
|
|
242
339
|
computed: true,
|
|
@@ -248,19 +345,19 @@ function serverEffect(compute, effectFn, value, options) {
|
|
|
248
345
|
}));
|
|
249
346
|
}
|
|
250
347
|
try {
|
|
251
|
-
const result = signals.runWithOwner(owner, () => runWithObserver(comp, () => compute(
|
|
348
|
+
const result = signals.runWithOwner(owner, () => runWithObserver(comp, () => compute(undefined)));
|
|
252
349
|
if (ssrSource) {
|
|
253
350
|
processResult(comp, result, owner, ctx, options?.deferStream, ssrSource);
|
|
254
351
|
}
|
|
255
|
-
effectFn?.(ssrSource ? comp.value ?? result : result,
|
|
352
|
+
effectFn?.(ssrSource ? comp.value ?? result : result, undefined);
|
|
256
353
|
} catch (err) {
|
|
257
354
|
}
|
|
258
355
|
}
|
|
259
|
-
function createEffect(compute, effect,
|
|
260
|
-
serverEffect(compute, undefined,
|
|
356
|
+
function createEffect(compute, effect, options) {
|
|
357
|
+
serverEffect(compute, undefined, options);
|
|
261
358
|
}
|
|
262
|
-
function createRenderEffect(compute, effectFn,
|
|
263
|
-
serverEffect(compute, effectFn,
|
|
359
|
+
function createRenderEffect(compute, effectFn, options) {
|
|
360
|
+
serverEffect(compute, effectFn, options);
|
|
264
361
|
}
|
|
265
362
|
function createTrackedEffect(compute, options) {
|
|
266
363
|
const o = signals.getOwner();
|
|
@@ -271,8 +368,8 @@ function createReaction(effectFn, options) {
|
|
|
271
368
|
tracking();
|
|
272
369
|
};
|
|
273
370
|
}
|
|
274
|
-
function createOptimistic(first, second
|
|
275
|
-
return createSignal(first, second
|
|
371
|
+
function createOptimistic(first, second) {
|
|
372
|
+
return createSignal(first, second);
|
|
276
373
|
}
|
|
277
374
|
function setProperty(state, property, value) {
|
|
278
375
|
if (state[property] === value) return;
|
|
@@ -282,7 +379,7 @@ function setProperty(state, property, value) {
|
|
|
282
379
|
}
|
|
283
380
|
function createStore(first, second) {
|
|
284
381
|
if (typeof first === "function") {
|
|
285
|
-
const store = createProjection(first, second
|
|
382
|
+
const store = createProjection(first, second);
|
|
286
383
|
return [store, fn => fn(store)];
|
|
287
384
|
}
|
|
288
385
|
const state = first;
|
|
@@ -305,11 +402,11 @@ function createPendingProxy(state, source) {
|
|
|
305
402
|
pending = false;
|
|
306
403
|
}];
|
|
307
404
|
}
|
|
308
|
-
function createProjection(fn, initialValue
|
|
405
|
+
function createProjection(fn, initialValue, options) {
|
|
309
406
|
const ctx = sharedConfig.context;
|
|
310
407
|
const owner = signals.createOwner();
|
|
311
408
|
const [state] = createStore(initialValue);
|
|
312
|
-
if (options?.ssrSource === "
|
|
409
|
+
if (options?.ssrSource === "client") {
|
|
313
410
|
return state;
|
|
314
411
|
}
|
|
315
412
|
let disposed = false;
|
|
@@ -320,100 +417,131 @@ function createProjection(fn, initialValue = {}, options) {
|
|
|
320
417
|
const useProxy = ssrSource !== "hybrid";
|
|
321
418
|
const patches = [];
|
|
322
419
|
const draft = useProxy ? createDeepProxy(state, patches) : state;
|
|
323
|
-
const
|
|
420
|
+
const runProjection = () => signals.runWithOwner(owner, () => fn(draft));
|
|
421
|
+
const result = runProjection();
|
|
324
422
|
const iteratorFn = result?.[Symbol.asyncIterator];
|
|
325
423
|
if (typeof iteratorFn === "function") {
|
|
326
|
-
const iter = iteratorFn.call(result);
|
|
327
424
|
if (ssrSource === "hybrid") {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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");
|
|
333
435
|
}
|
|
334
|
-
|
|
335
|
-
|
|
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);
|
|
336
445
|
}
|
|
337
|
-
promise.v = state;
|
|
338
446
|
markReady();
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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);
|
|
342
452
|
return pending;
|
|
343
453
|
} else {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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, () => {
|
|
347
473
|
patches.length = 0;
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
}
|
|
474
|
+
const resolved = firstResult;
|
|
475
|
+
if (resolved && !resolved.done && resolved.value !== undefined && resolved.value !== draft) {
|
|
476
|
+
Object.assign(state, resolved.value);
|
|
352
477
|
}
|
|
353
478
|
markReady(JSON.parse(JSON.stringify(state)));
|
|
354
|
-
|
|
479
|
+
return undefined;
|
|
480
|
+
}, error => {
|
|
355
481
|
markReady();
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
done
|
|
366
|
-
|
|
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
|
|
367
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
|
+
}
|
|
368
516
|
return {
|
|
369
|
-
done:
|
|
517
|
+
done: true,
|
|
370
518
|
value: undefined
|
|
371
519
|
};
|
|
372
520
|
});
|
|
521
|
+
},
|
|
522
|
+
return(value) {
|
|
523
|
+
return iter.return?.(value);
|
|
373
524
|
}
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
};
|
|
379
|
-
const flushed = patches.splice(0);
|
|
380
|
-
if (!r.done) {
|
|
381
|
-
if (r.value !== undefined && r.value !== draft) {
|
|
382
|
-
Object.assign(state, r.value);
|
|
383
|
-
}
|
|
384
|
-
return {
|
|
385
|
-
done: false,
|
|
386
|
-
value: flushed
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
return {
|
|
390
|
-
done: true,
|
|
391
|
-
value: undefined
|
|
392
|
-
};
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
})
|
|
396
|
-
};
|
|
397
|
-
if (ctx?.async && !signals.getContext(NoHydrateContext) && owner.id) ctx.serialize(owner.id, tapped, options?.deferStream);
|
|
398
|
-
const [pending, markReady] = createPendingProxy(state, firstReady);
|
|
525
|
+
})
|
|
526
|
+
};
|
|
527
|
+
ctx.serialize(owner.id, tapped, options?.deferStream);
|
|
528
|
+
}
|
|
399
529
|
return pending;
|
|
400
530
|
}
|
|
401
531
|
}
|
|
402
532
|
if (result instanceof Promise) {
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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);
|
|
408
538
|
}
|
|
409
|
-
if (v !== undefined && v !== state) {
|
|
410
|
-
Object.assign(state, v);
|
|
411
|
-
}
|
|
412
|
-
promise.v = state;
|
|
413
539
|
markReady();
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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);
|
|
417
545
|
return pending;
|
|
418
546
|
}
|
|
419
547
|
if (result !== undefined && result !== state && result !== draft) {
|
|
@@ -441,7 +569,7 @@ function deep(store) {
|
|
|
441
569
|
}
|
|
442
570
|
function mapArray(list, mapFn, options = {}) {
|
|
443
571
|
const parent = signals.createOwner();
|
|
444
|
-
return () => {
|
|
572
|
+
return createMemo(() => {
|
|
445
573
|
const items = list();
|
|
446
574
|
let s = [];
|
|
447
575
|
if (items && items.length) {
|
|
@@ -458,54 +586,93 @@ function mapArray(list, mapFn, options = {}) {
|
|
|
458
586
|
})];
|
|
459
587
|
}
|
|
460
588
|
return s;
|
|
461
|
-
};
|
|
589
|
+
});
|
|
462
590
|
}
|
|
463
591
|
function repeat(count, mapFn, options = {}) {
|
|
464
592
|
const owner = signals.createOwner();
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
const
|
|
472
|
-
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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
|
+
});
|
|
482
610
|
}
|
|
483
611
|
const ErrorContext = {
|
|
484
612
|
id: Symbol("ErrorContext"),
|
|
485
613
|
defaultValue: null
|
|
486
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
|
+
}
|
|
487
635
|
function createErrorBoundary(fn, fallback) {
|
|
488
636
|
const ctx = sharedConfig.context;
|
|
489
|
-
const owner = signals.createOwner();
|
|
490
637
|
const parent = signals.getOwner();
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
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 () => {
|
|
494
658
|
let result;
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
result = fallback(err, () => {});
|
|
498
|
-
});
|
|
659
|
+
let handled = false;
|
|
660
|
+
if (ctx) owner.dispose(false);
|
|
499
661
|
try {
|
|
500
|
-
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);
|
|
501
668
|
} catch (err) {
|
|
502
|
-
if (
|
|
503
|
-
result =
|
|
669
|
+
if (err instanceof signals.NotReadyError) throw err;
|
|
670
|
+
result = handled ? result : handleError(err);
|
|
504
671
|
}
|
|
505
|
-
return
|
|
506
|
-
}
|
|
672
|
+
return result;
|
|
673
|
+
};
|
|
507
674
|
}
|
|
508
|
-
function
|
|
675
|
+
function createLoadingBoundary$1(fn, fallback, options) {
|
|
509
676
|
try {
|
|
510
677
|
const result = fn();
|
|
511
678
|
return () => result;
|
|
@@ -516,6 +683,10 @@ function createLoadBoundary(fn, fallback) {
|
|
|
516
683
|
throw err;
|
|
517
684
|
}
|
|
518
685
|
}
|
|
686
|
+
function createRevealOrder(fn, _options) {
|
|
687
|
+
const o = signals.createOwner();
|
|
688
|
+
return signals.runWithOwner(o, fn);
|
|
689
|
+
}
|
|
519
690
|
function untrack(fn) {
|
|
520
691
|
return fn();
|
|
521
692
|
}
|
|
@@ -568,10 +739,10 @@ function useContext(context) {
|
|
|
568
739
|
return signals.getContext(context);
|
|
569
740
|
}
|
|
570
741
|
function children(fn) {
|
|
571
|
-
const c = createMemo(fn,
|
|
742
|
+
const c = createMemo(fn, {
|
|
572
743
|
lazy: true
|
|
573
744
|
});
|
|
574
|
-
const memo = createMemo(() => signals.flatten(c()),
|
|
745
|
+
const memo = createMemo(() => signals.flatten(c()), {
|
|
575
746
|
lazy: true
|
|
576
747
|
});
|
|
577
748
|
memo.toArray = () => {
|
|
@@ -581,7 +752,9 @@ function children(fn) {
|
|
|
581
752
|
return memo;
|
|
582
753
|
}
|
|
583
754
|
function ssrRunInScope(fn) {
|
|
584
|
-
|
|
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);
|
|
585
758
|
}
|
|
586
759
|
|
|
587
760
|
function enableHydration() {}
|
|
@@ -638,6 +811,159 @@ function createUniqueId() {
|
|
|
638
811
|
return signals.getNextChildId(o);
|
|
639
812
|
}
|
|
640
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
|
+
});
|
|
965
|
+
}
|
|
966
|
+
|
|
641
967
|
function For(props) {
|
|
642
968
|
const options = "fallback" in props ? {
|
|
643
969
|
keyed: props.keyed,
|
|
@@ -645,7 +971,7 @@ function For(props) {
|
|
|
645
971
|
} : {
|
|
646
972
|
keyed: props.keyed
|
|
647
973
|
};
|
|
648
|
-
return
|
|
974
|
+
return mapArray(() => props.each, props.children, options);
|
|
649
975
|
}
|
|
650
976
|
function Repeat(props) {
|
|
651
977
|
const options = "fallback" in props ? {
|
|
@@ -698,106 +1024,180 @@ function Errored(props) {
|
|
|
698
1024
|
return typeof f === "function" && f.length ? f(err, reset) : f;
|
|
699
1025
|
});
|
|
700
1026
|
}
|
|
701
|
-
|
|
702
|
-
function ssrHandleError(err) {
|
|
703
|
-
if (err instanceof signals.NotReadyError) {
|
|
704
|
-
return err.source;
|
|
705
|
-
}
|
|
706
|
-
const handler = signals.getContext(ErrorContext);
|
|
707
|
-
if (handler) {
|
|
708
|
-
handler(err);
|
|
709
|
-
return;
|
|
710
|
-
}
|
|
711
|
-
throw err;
|
|
712
|
-
}
|
|
713
1027
|
function Loading(props) {
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
}
|
|
1028
|
+
return createLoadingBoundary(() => props.children, () => props.fallback);
|
|
1029
|
+
}
|
|
1030
|
+
function Reveal(props) {
|
|
718
1031
|
const o = signals.createOwner();
|
|
719
1032
|
const id = o.id;
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
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();
|
|
737
1089
|
}
|
|
738
1090
|
});
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
return result;
|
|
1091
|
+
collapsedByParent = reg.collapseFallback;
|
|
1092
|
+
heldByParent = reg.held;
|
|
742
1093
|
}
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
return ret;
|
|
1094
|
+
function notifyParentIfDone() {
|
|
1095
|
+
if (notifiedParentDone) return;
|
|
1096
|
+
if (parentGroup && resolved.size === keys.length) {
|
|
1097
|
+
notifiedParentDone = true;
|
|
1098
|
+
parentGroup.onResolved(id);
|
|
1099
|
+
}
|
|
750
1100
|
}
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
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;
|
|
764
1156
|
}
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
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();
|
|
770
1182
|
}
|
|
771
|
-
|
|
772
|
-
}
|
|
773
|
-
|
|
1183
|
+
notifyParentIfDone();
|
|
1184
|
+
},
|
|
1185
|
+
onMinimallyResolved(key) {
|
|
1186
|
+
markMinimallyResolved(key);
|
|
774
1187
|
}
|
|
775
|
-
})
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
if (modules) ctx.serialize(id + "_assets", modules);
|
|
782
|
-
ctx.serialize(id, "$$f");
|
|
783
|
-
return signals.runWithOwner(fallbackOwner, () => props.fallback);
|
|
784
|
-
}
|
|
785
|
-
function NoHydration(props) {
|
|
786
|
-
const o = signals.createOwner();
|
|
787
|
-
return signals.runWithOwner(o, () => {
|
|
788
|
-
signals.setContext(NoHydrateContext, true);
|
|
789
|
-
return props.children;
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
function Hydration(props) {
|
|
793
|
-
if (!signals.getContext(NoHydrateContext)) return props.children;
|
|
794
|
-
const o = signals.createOwner({
|
|
795
|
-
id: props.id ?? ""
|
|
796
|
-
});
|
|
797
|
-
return signals.runWithOwner(o, () => {
|
|
798
|
-
signals.setContext(NoHydrateContext, false);
|
|
799
|
-
return props.children;
|
|
1188
|
+
});
|
|
1189
|
+
const result = props.children;
|
|
1190
|
+
if (parentGroup && keys.length === 0) {
|
|
1191
|
+
parentGroup.onResolved(id);
|
|
1192
|
+
}
|
|
1193
|
+
return result;
|
|
800
1194
|
});
|
|
1195
|
+
function markMinimallyResolved(key) {
|
|
1196
|
+
if (minimallyResolved.has(key)) return;
|
|
1197
|
+
minimallyResolved.add(key);
|
|
1198
|
+
updateSelfMinimallyResolved();
|
|
1199
|
+
if (order === "together") checkTogetherRelease();
|
|
1200
|
+
}
|
|
801
1201
|
}
|
|
802
1202
|
|
|
803
1203
|
const DEV = undefined;
|
|
@@ -806,6 +1206,10 @@ Object.defineProperty(exports, "$PROXY", {
|
|
|
806
1206
|
enumerable: true,
|
|
807
1207
|
get: function () { return signals.$PROXY; }
|
|
808
1208
|
});
|
|
1209
|
+
Object.defineProperty(exports, "$REFRESH", {
|
|
1210
|
+
enumerable: true,
|
|
1211
|
+
get: function () { return signals.$REFRESH; }
|
|
1212
|
+
});
|
|
809
1213
|
Object.defineProperty(exports, "$TRACK", {
|
|
810
1214
|
enumerable: true,
|
|
811
1215
|
get: function () { return signals.$TRACK; }
|
|
@@ -822,6 +1226,14 @@ Object.defineProperty(exports, "createRoot", {
|
|
|
822
1226
|
enumerable: true,
|
|
823
1227
|
get: function () { return signals.createRoot; }
|
|
824
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
|
+
});
|
|
825
1237
|
Object.defineProperty(exports, "flatten", {
|
|
826
1238
|
enumerable: true,
|
|
827
1239
|
get: function () { return signals.flatten; }
|
|
@@ -834,6 +1246,10 @@ Object.defineProperty(exports, "getOwner", {
|
|
|
834
1246
|
enumerable: true,
|
|
835
1247
|
get: function () { return signals.getOwner; }
|
|
836
1248
|
});
|
|
1249
|
+
Object.defineProperty(exports, "isDisposed", {
|
|
1250
|
+
enumerable: true,
|
|
1251
|
+
get: function () { return signals.isDisposed; }
|
|
1252
|
+
});
|
|
837
1253
|
Object.defineProperty(exports, "isEqual", {
|
|
838
1254
|
enumerable: true,
|
|
839
1255
|
get: function () { return signals.isEqual; }
|
|
@@ -876,6 +1292,7 @@ exports.Match = Match;
|
|
|
876
1292
|
exports.NoHydrateContext = NoHydrateContext;
|
|
877
1293
|
exports.NoHydration = NoHydration;
|
|
878
1294
|
exports.Repeat = Repeat;
|
|
1295
|
+
exports.Reveal = Reveal;
|
|
879
1296
|
exports.Show = Show;
|
|
880
1297
|
exports.Switch = Switch;
|
|
881
1298
|
exports.action = action;
|
|
@@ -884,12 +1301,15 @@ exports.createComponent = createComponent;
|
|
|
884
1301
|
exports.createContext = createContext;
|
|
885
1302
|
exports.createDeepProxy = createDeepProxy;
|
|
886
1303
|
exports.createEffect = createEffect;
|
|
1304
|
+
exports.createErrorBoundary = createErrorBoundary;
|
|
1305
|
+
exports.createLoadingBoundary = createLoadingBoundary;
|
|
887
1306
|
exports.createMemo = createMemo;
|
|
888
1307
|
exports.createOptimistic = createOptimistic;
|
|
889
1308
|
exports.createOptimisticStore = createOptimisticStore;
|
|
890
1309
|
exports.createProjection = createProjection;
|
|
891
1310
|
exports.createReaction = createReaction;
|
|
892
1311
|
exports.createRenderEffect = createRenderEffect;
|
|
1312
|
+
exports.createRevealOrder = createRevealOrder;
|
|
893
1313
|
exports.createSignal = createSignal;
|
|
894
1314
|
exports.createStore = createStore;
|
|
895
1315
|
exports.createTrackedEffect = createTrackedEffect;
|