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.
Files changed (38) hide show
  1. package/CHEATSHEET.md +640 -0
  2. package/README.md +42 -188
  3. package/dist/dev.cjs +451 -283
  4. package/dist/dev.js +428 -286
  5. package/dist/server.cjs +735 -279
  6. package/dist/server.js +715 -282
  7. package/dist/solid.cjs +443 -255
  8. package/dist/solid.js +420 -258
  9. package/package.json +67 -39
  10. package/types/client/component.d.ts +65 -19
  11. package/types/client/core.d.ts +110 -34
  12. package/types/client/flow.d.ts +176 -42
  13. package/types/client/hydration.d.ts +525 -31
  14. package/types/index.d.ts +9 -12
  15. package/types/server/component.d.ts +12 -11
  16. package/types/server/core.d.ts +19 -14
  17. package/types/server/flow.d.ts +76 -21
  18. package/types/server/hydration.d.ts +49 -7
  19. package/types/server/index.d.ts +5 -7
  20. package/types/server/shared.d.ts +9 -4
  21. package/types/server/signals.d.ts +45 -18
  22. package/types/types.d.ts +15 -0
  23. package/types-cjs/client/component.d.cts +120 -0
  24. package/types-cjs/client/core.d.cts +141 -0
  25. package/types-cjs/client/flow.d.cts +234 -0
  26. package/types-cjs/client/hydration.d.cts +570 -0
  27. package/types-cjs/index.d.cts +17 -0
  28. package/types-cjs/package.json +3 -0
  29. package/types-cjs/server/component.d.cts +67 -0
  30. package/types-cjs/server/core.d.cts +49 -0
  31. package/types-cjs/server/flow.d.cts +115 -0
  32. package/types-cjs/server/hydration.d.cts +63 -0
  33. package/types-cjs/server/index.d.cts +10 -0
  34. package/types-cjs/server/shared.d.cts +50 -0
  35. package/types-cjs/server/signals.d.cts +87 -0
  36. package/types-cjs/types.d.cts +15 -0
  37. package/jsx-runtime.d.ts +0 -1
  38. 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 createSignal(first, second, third) {
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 ssrSource = third?.ssrSource;
29
- if (ssrSource === "initial" || ssrSource === "client") {
30
- signals.createOwner();
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(p => {
41
- let value = first(p ? p[0]() : second);
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, value, options) {
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: 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 = signals.runWithOwner(owner, () => runWithObserver(comp, () => comp.compute(comp.value)));
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.source?.then(() => update());
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 === "initial" || ssrSource === "client") {
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 uninitialized = comp.value === undefined;
210
+ const noHydrate = signals.getContext(NoHydrateContext, owner);
161
211
  if (result instanceof Promise) {
162
- result.then(v => {
163
- result.s = 1;
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
- if (ctx?.async && ctx.serialize && id) ctx.serialize(id, result, deferStream);
170
- if (uninitialized) {
171
- comp.error = new signals.NotReadyError(result);
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
- const promise = iter.next().then(v => {
180
- promise.s = 1;
181
- promise.v = v.value;
182
- if (comp.disposed) return;
183
- comp.value = v.value;
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
- if (ctx?.async && ctx.serialize && id) ctx.serialize(id, promise, deferStream);
187
- if (uninitialized) {
188
- comp.error = new signals.NotReadyError(promise);
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
- const firstNext = iter.next();
192
- const firstReady = firstNext.then(r => {
193
- if (comp.disposed) return;
194
- if (!r.done) {
195
- comp.value = r.value;
196
- comp.error = undefined;
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
- let servedFirst = false;
200
- const tapped = {
201
- [Symbol.asyncIterator]: () => ({
202
- next() {
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
- if (ctx?.async && ctx.serialize && id) ctx.serialize(id, tapped, deferStream);
215
- if (uninitialized) {
216
- comp.error = new signals.NotReadyError(firstReady);
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 serverEffect(compute, effectFn, value, options) {
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" || ssrSource === "initial") {
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: 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(value)));
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, value);
352
+ effectFn?.(ssrSource ? comp.value ?? result : result, undefined);
250
353
  } catch (err) {
251
354
  }
252
355
  }
253
- function createEffect(compute, effect, value, options) {
254
- serverEffect(compute, undefined, value, options);
356
+ function createEffect(compute, effect, options) {
357
+ serverEffect(compute, undefined, options);
255
358
  }
256
- function createRenderEffect(compute, effectFn, value, options) {
257
- serverEffect(compute, effectFn, value, options);
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, third) {
269
- return createSignal(first, second, third);
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 = {}, options) {
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 === "initial" || options?.ssrSource === "client") {
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 result = signals.runWithOwner(owner, () => fn(draft));
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
- const promise = iter.next().then(r => {
323
- promise.s = 1;
324
- if (disposed) {
325
- promise.v = state;
326
- return;
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
- if (r.value !== undefined && r.value !== state) {
329
- Object.assign(state, r.value);
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
- if (ctx?.async && !ctx.noHydrate && owner.id) ctx.serialize(owner.id, promise, options?.deferStream);
335
- const [pending, markReady] = createPendingProxy(state, promise);
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
- const firstNext = iter.next();
339
- const firstReady = firstNext.then(r => {
340
- if (disposed) return;
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
- if (!r.done) {
343
- if (r.value !== undefined && r.value !== draft) {
344
- Object.assign(state, r.value);
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
- let servedFirst = false;
352
- const tapped = {
353
- [Symbol.asyncIterator]: () => ({
354
- next() {
355
- if (!servedFirst) {
356
- servedFirst = true;
357
- return firstNext.then(r => {
358
- if (!r.done && !disposed) return {
359
- done: false,
360
- value: state
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: r.done,
517
+ done: true,
364
518
  value: undefined
365
519
  };
366
520
  });
521
+ },
522
+ return(value) {
523
+ return iter.return?.(value);
367
524
  }
368
- return iter.next().then(r => {
369
- if (disposed) return {
370
- done: true,
371
- value: undefined
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 promise = result.then(v => {
398
- promise.s = 1;
399
- if (disposed) {
400
- promise.v = state;
401
- return;
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
- if (ctx?.async && !ctx.noHydrate && owner.id) ctx.serialize(owner.id, promise, options?.deferStream);
410
- const [pending, markReady] = createPendingProxy(state, promise);
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 root = signals.getOwner();
438
- const id = signals.getNextChildId(root);
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
- for (let i = 0, len = items.length; i < len; i++) {
444
- const o = signals.createOwner({
445
- id: id + i
446
- });
447
- s.push(signals.runWithOwner(o, () => mapFn(() => items[i], () => i)));
448
- }
449
- } else if (options.fallback) s = [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
- const len = count();
456
- const offset = options.from?.() || 0;
457
- let s = [];
458
- if (len) {
459
- signals.runWithOwner(owner, () => {
460
- for (let i = 0; i < len; i++) {
461
- const itemOwner = signals.createOwner();
462
- s.push(signals.runWithOwner(itemOwner, () => mapFn(i + offset)));
463
- }
464
- });
465
- } else if (options.fallback) {
466
- s = [signals.runWithOwner(owner, () => {
467
- const fo = signals.createOwner();
468
- return signals.runWithOwner(fo, () => options.fallback());
469
- })];
470
- }
471
- return () => s;
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
- if (parent?.id != null) signals.getNextChildId(parent);
482
- owner.id = owner.id + "0";
483
- return signals.runWithOwner(owner, () => {
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
- signals.setContext(ErrorContext, err => {
486
- if (ctx && !ctx.noHydrate && owner.id) ctx.serialize(owner.id, err);
487
- result = fallback(err, () => {});
488
- });
659
+ let handled = false;
660
+ if (ctx) owner.dispose(false);
489
661
  try {
490
- result = fn();
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 (ctx && !ctx.noHydrate && owner.id) ctx.serialize(owner.id, err);
493
- result = fallback(err, () => {});
669
+ if (err instanceof signals.NotReadyError) throw err;
670
+ result = handled ? result : handleError(err);
494
671
  }
495
- return () => result;
496
- });
672
+ return result;
673
+ };
497
674
  }
498
- function createLoadBoundary(fn, fallback) {
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, undefined, {
742
+ const c = createMemo(fn, {
562
743
  lazy: true
563
744
  });
564
- const memo = createMemo(() => signals.flatten(c()), undefined, {
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
- return fn;
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
- if (!moduleUrl) {
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
- for (let i = 0; i < assets.js.length; i++) ctx.registerAsset("module", assets.js[i]);
606
- ctx.registerModule?.(moduleUrl, assets.js[0]);
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
- return sharedConfig.getNextContextId();
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 createMemo(mapArray(() => props.each, props.children, options));
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
- const ctx = sharedConfig.context;
699
- if (!ctx) {
700
- return createLoadBoundary(() => props.children, () => props.fallback);
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
- o.id = id + "00";
705
- let runPromise;
706
- let serializeBuffer = [];
707
- const origSerialize = ctx.serialize;
708
- function runInitially() {
709
- o.dispose(false);
710
- serializeBuffer = [];
711
- ctx.serialize = (id, p, deferStream) => {
712
- serializeBuffer.push([id, p, deferStream]);
713
- };
714
- const prevBoundary = ctx._currentBoundaryId;
715
- ctx._currentBoundaryId = id;
716
- const result = signals.runWithOwner(o, () => {
717
- try {
718
- return ctx.resolve(props.children);
719
- } catch (err) {
720
- runPromise = ssrHandleError(err);
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
- ctx._currentBoundaryId = prevBoundary;
724
- ctx.serialize = origSerialize;
725
- return result;
1091
+ collapsedByParent = reg.collapseFallback;
1092
+ heldByParent = reg.held;
726
1093
  }
727
- let ret = runInitially();
728
- if (!(runPromise || ret?.p?.length)) {
729
- for (const args of serializeBuffer) origSerialize(args[0], args[1], args[2]);
730
- serializeBuffer = [];
731
- const modules = ctx.getBoundaryModules?.(id);
732
- if (modules) ctx.serialize(id + "_assets", modules);
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
- const fallbackOwner = signals.createOwner({
736
- id
737
- });
738
- signals.getNextChildId(fallbackOwner);
739
- if (ctx.async) {
740
- const done = ctx.registerFragment(id);
741
- (async () => {
742
- try {
743
- while (runPromise) {
744
- o.dispose(false);
745
- await runPromise;
746
- runPromise = undefined;
747
- ret = runInitially();
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
- for (const args of serializeBuffer) origSerialize(args[0], args[1], args[2]);
750
- serializeBuffer = [];
751
- while (ret.p.length) {
752
- await Promise.all(ret.p);
753
- ret = signals.runWithOwner(o, () => ctx.ssr(ret.t, ...ret.h));
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
- done(ret.t[0]);
756
- } catch (err) {
757
- done(undefined, err);
1183
+ notifyParentIfDone();
1184
+ },
1185
+ onMinimallyResolved(key) {
1186
+ markMinimallyResolved(key);
758
1187
  }
759
- })();
760
- return signals.runWithOwner(fallbackOwner, () => ctx.ssr([`<template id="pl-${id}"></template>`, `<!--pl-${id}-->`], ctx.escape(props.fallback)));
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;