signalium 2.2.2 → 2.3.0

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 (91) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/development/config-B0MtLBgx.js.map +1 -1
  3. package/dist/cjs/development/{debug-DuXQhd5q.js → debug-gCDAvnLM.js} +237 -214
  4. package/dist/cjs/development/debug-gCDAvnLM.js.map +1 -0
  5. package/dist/cjs/development/debug.js +9 -3
  6. package/dist/cjs/development/debug.js.map +1 -1
  7. package/dist/cjs/development/index.js +8 -8
  8. package/dist/cjs/development/react/index.js +43 -38
  9. package/dist/cjs/development/react/index.js.map +1 -1
  10. package/dist/cjs/development/snapshot-Di0yziPX.js +147 -0
  11. package/dist/cjs/development/snapshot-Di0yziPX.js.map +1 -0
  12. package/dist/cjs/development/transform/index.js +137 -118
  13. package/dist/cjs/development/transform/index.js.map +1 -1
  14. package/dist/cjs/development/utils.js +5 -3
  15. package/dist/cjs/development/utils.js.map +1 -1
  16. package/dist/cjs/production/config-B0MtLBgx.js.map +1 -1
  17. package/dist/cjs/production/{contexts-DOH1tHd8.js → contexts-Wgq2NOVX.js} +156 -140
  18. package/dist/cjs/production/contexts-Wgq2NOVX.js.map +1 -0
  19. package/dist/cjs/production/debug.js +61 -66
  20. package/dist/cjs/production/debug.js.map +1 -1
  21. package/dist/cjs/production/index.js +8 -8
  22. package/dist/cjs/production/react/index.js +43 -38
  23. package/dist/cjs/production/react/index.js.map +1 -1
  24. package/dist/cjs/production/snapshot-YJJyLbxS.js +147 -0
  25. package/dist/cjs/production/snapshot-YJJyLbxS.js.map +1 -0
  26. package/dist/cjs/production/transform/index.js +137 -118
  27. package/dist/cjs/production/transform/index.js.map +1 -1
  28. package/dist/cjs/production/utils.js +5 -3
  29. package/dist/cjs/production/utils.js.map +1 -1
  30. package/dist/esm/development/config-CPQL7hX-.js.map +1 -1
  31. package/dist/esm/development/{debug-E2E1pZe5.js → debug-AoHfqs62.js} +221 -196
  32. package/dist/esm/development/debug-AoHfqs62.js.map +1 -0
  33. package/dist/esm/development/debug.js +1 -1
  34. package/dist/esm/development/index.js +6 -6
  35. package/dist/esm/development/react/index.js +43 -38
  36. package/dist/esm/development/react/index.js.map +1 -1
  37. package/dist/esm/development/snapshot-Bq0Um_hQ.js +148 -0
  38. package/dist/esm/development/snapshot-Bq0Um_hQ.js.map +1 -0
  39. package/dist/esm/development/transform/index.js +137 -118
  40. package/dist/esm/development/transform/index.js.map +1 -1
  41. package/dist/esm/development/utils.js +7 -4
  42. package/dist/esm/development/utils.js.map +1 -1
  43. package/dist/esm/internals/async.d.ts.map +1 -1
  44. package/dist/esm/internals/core-api.d.ts +2 -2
  45. package/dist/esm/internals/core-api.d.ts.map +1 -1
  46. package/dist/esm/internals/edge.d.ts +4 -4
  47. package/dist/esm/internals/edge.d.ts.map +1 -1
  48. package/dist/esm/internals/reactive.d.ts +14 -4
  49. package/dist/esm/internals/reactive.d.ts.map +1 -1
  50. package/dist/esm/internals/scheduling.d.ts.map +1 -1
  51. package/dist/esm/internals/signal.d.ts.map +1 -1
  52. package/dist/esm/internals/utils/snapshot.d.ts +29 -0
  53. package/dist/esm/internals/utils/snapshot.d.ts.map +1 -0
  54. package/dist/esm/production/config-CPQL7hX-.js.map +1 -1
  55. package/dist/esm/production/{contexts-Dj9Y86xW.js → contexts-X0gSj6rQ.js} +159 -143
  56. package/dist/esm/production/contexts-X0gSj6rQ.js.map +1 -0
  57. package/dist/esm/production/debug.js +51 -54
  58. package/dist/esm/production/debug.js.map +1 -1
  59. package/dist/esm/production/index.js +7 -7
  60. package/dist/esm/production/react/index.js +43 -38
  61. package/dist/esm/production/react/index.js.map +1 -1
  62. package/dist/esm/production/snapshot-CDS1d8mq.js +148 -0
  63. package/dist/esm/production/snapshot-CDS1d8mq.js.map +1 -0
  64. package/dist/esm/production/transform/index.js +137 -118
  65. package/dist/esm/production/transform/index.js.map +1 -1
  66. package/dist/esm/production/utils.js +7 -4
  67. package/dist/esm/production/utils.js.map +1 -1
  68. package/dist/esm/react/index.d.ts +1 -1
  69. package/dist/esm/react/index.d.ts.map +1 -1
  70. package/dist/esm/react/provider.d.ts.map +1 -1
  71. package/dist/esm/react/use-reactive.d.ts +1 -0
  72. package/dist/esm/react/use-reactive.d.ts.map +1 -1
  73. package/dist/esm/transform/callback.d.ts.map +1 -1
  74. package/dist/esm/transform/promise.d.ts.map +1 -1
  75. package/dist/esm/types.d.ts +5 -1
  76. package/dist/esm/types.d.ts.map +1 -1
  77. package/dist/esm/utils.d.ts +1 -0
  78. package/dist/esm/utils.d.ts.map +1 -1
  79. package/package.json +7 -5
  80. package/dist/cjs/development/core-api-C8J7lYBC.js +0 -55
  81. package/dist/cjs/development/core-api-C8J7lYBC.js.map +0 -1
  82. package/dist/cjs/development/debug-DuXQhd5q.js.map +0 -1
  83. package/dist/cjs/production/contexts-DOH1tHd8.js.map +0 -1
  84. package/dist/cjs/production/core-api-Cx2_AumW.js +0 -55
  85. package/dist/cjs/production/core-api-Cx2_AumW.js.map +0 -1
  86. package/dist/esm/development/core-api-CF5aK2Lx.js +0 -56
  87. package/dist/esm/development/core-api-CF5aK2Lx.js.map +0 -1
  88. package/dist/esm/development/debug-E2E1pZe5.js.map +0 -1
  89. package/dist/esm/production/contexts-Dj9Y86xW.js.map +0 -1
  90. package/dist/esm/production/core-api-D_uw3umM.js +0 -56
  91. package/dist/esm/production/core-api-D_uw3umM.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  const config = require("./config-B0MtLBgx.js");
3
3
  class WeakRefPolyfill {
4
+ value;
4
5
  constructor(value) {
5
6
  this.value = value;
6
7
  }
@@ -16,7 +17,14 @@ const setCurrentConsumer = (consumer) => {
16
17
  const getCurrentConsumer = () => {
17
18
  return CURRENT_CONSUMER;
18
19
  };
19
- let STATE_ID = 0;
20
+ const DEFAULT_EQUALS = (a, b) => a === b;
21
+ const FALSE_EQUALS = () => false;
22
+ const equalsFrom = (equals) => {
23
+ if (equals === false) {
24
+ return FALSE_EQUALS;
25
+ }
26
+ return equals ?? DEFAULT_EQUALS;
27
+ };
20
28
  class StateSignal {
21
29
  _value;
22
30
  _equals;
@@ -27,8 +35,6 @@ class StateSignal {
27
35
  constructor(value, equals = (a, b) => a === b, desc = "signal") {
28
36
  this._value = value;
29
37
  this._equals = equals;
30
- this._id = STATE_ID++;
31
- this._desc = desc;
32
38
  }
33
39
  get value() {
34
40
  this.consume();
@@ -59,7 +65,7 @@ class StateSignal {
59
65
  }
60
66
  dirtySignal(sub);
61
67
  }
62
- this._subs = /* @__PURE__ */ new Map();
68
+ this._subs.clear();
63
69
  scheduleListeners(this);
64
70
  }
65
71
  addListener(listener) {
@@ -80,13 +86,12 @@ function runListeners$1(signal2) {
80
86
  listener();
81
87
  }
82
88
  }
83
- const FALSE_EQUALS$1 = () => false;
84
89
  function signal(initialValue, opts) {
85
- const equals = opts?.equals === false ? FALSE_EQUALS$1 : opts?.equals ?? ((a, b) => a === b);
90
+ const equals = opts?.equals === false ? FALSE_EQUALS : opts?.equals ?? ((a, b) => a === b);
86
91
  return new StateSignal(initialValue, equals, opts?.desc);
87
92
  }
88
93
  const notifier = (opts) => {
89
- return new StateSignal(void 0, FALSE_EQUALS$1, opts?.desc);
94
+ return new StateSignal(void 0, FALSE_EQUALS, opts?.desc);
90
95
  };
91
96
  function watchSignal(signal2, parentIsSuspended) {
92
97
  if (parentIsSuspended) {
@@ -209,7 +214,8 @@ let PENDING_GC = /* @__PURE__ */ new Set();
209
214
  const microtask = () => Promise.resolve();
210
215
  let currentFlush = null;
211
216
  const scheduleFlush = (fn) => {
212
- if (currentFlush) return;
217
+ if (currentFlush)
218
+ return;
213
219
  let resolve;
214
220
  const promise = new Promise((r) => resolve = r);
215
221
  currentFlush = { promise, resolve };
@@ -242,7 +248,8 @@ const scheduleTracer = (tracer) => {
242
248
  };
243
249
  const scheduleGcSweep = (scope) => {
244
250
  PENDING_GC.add(scope);
245
- if (PENDING_GC.size > 1) return;
251
+ if (PENDING_GC.size > 1)
252
+ return;
246
253
  scheduleIdleCallback(() => {
247
254
  for (const scope2 of PENDING_GC) {
248
255
  scope2.sweepGc();
@@ -252,6 +259,8 @@ const scheduleGcSweep = (scope) => {
252
259
  };
253
260
  const flushWatchers = async () => {
254
261
  const flush = currentFlush;
262
+ if (!flush)
263
+ return;
255
264
  while (PENDING_ASYNC_PULLS.length > 0 || PENDING_PULLS.size > 0) {
256
265
  const asyncPulls = PENDING_ASYNC_PULLS;
257
266
  PENDING_ASYNC_PULLS = [];
@@ -289,19 +298,17 @@ const settled = async () => {
289
298
  };
290
299
  function dirtySignal(signal2) {
291
300
  const prevState = signal2._state;
292
- if (prevState === ReactiveFnState.Dirty) {
301
+ if (prevState === 2) {
293
302
  return;
294
303
  }
295
- signal2._state = ReactiveFnState.Dirty;
296
- if (prevState < ReactiveFnState.MaybeDirty) {
304
+ signal2._state = 2;
305
+ if (prevState < 3) {
297
306
  propagateDirty(signal2);
298
307
  }
299
308
  }
300
309
  function propagateDirty(signal2) {
301
310
  if (getCurrentConsumer() === signal2) {
302
- throw new Error(
303
- "A signal was dirtied after it was consumed by the current function. This can cause race conditions and infinite rerenders and is not allowed."
304
- );
311
+ throw new Error("A signal was dirtied after it was consumed by the current function. This can cause race conditions and infinite rerenders and is not allowed.");
305
312
  }
306
313
  if (isRelay(signal2)) {
307
314
  if (signal2.watchCount > 0) {
@@ -312,31 +319,32 @@ function propagateDirty(signal2) {
312
319
  schedulePull(signal2);
313
320
  }
314
321
  dirtySignalConsumers(signal2.subs);
315
- signal2.subs = /* @__PURE__ */ new Map();
322
+ signal2.subs.clear();
316
323
  }
317
324
  }
318
325
  function dirtySignalConsumers(map) {
319
326
  for (const [subRef, edge] of map) {
320
327
  const sub = subRef.deref();
321
- if (sub === void 0 || sub.computedCount !== edge.consumedAt) continue;
328
+ if (sub === void 0 || sub.computedCount !== edge.consumedAt)
329
+ continue;
322
330
  const dirtyState = sub._state;
323
331
  switch (dirtyState) {
324
- case ReactiveFnState.Clean:
325
- sub._state = ReactiveFnState.MaybeDirty;
332
+ case 0:
333
+ sub._state = 3;
326
334
  sub.dirtyHead = edge;
327
335
  edge.nextDirty = void 0;
328
336
  propagateDirty(sub);
329
337
  break;
330
- case ReactiveFnState.Pending:
331
- case ReactiveFnState.MaybeDirty:
332
- case ReactiveFnState.PendingDirty: {
338
+ case 1:
339
+ case 3:
340
+ case 4: {
333
341
  let subEdge = sub.dirtyHead;
334
342
  const ord = edge.ord;
335
343
  if (subEdge.ord > ord) {
336
344
  sub.dirtyHead = edge;
337
345
  edge.nextDirty = subEdge;
338
- if (dirtyState === ReactiveFnState.Pending || dirtyState === ReactiveFnState.PendingDirty) {
339
- sub._state = ReactiveFnState.MaybeDirty;
346
+ if (dirtyState === 1 || dirtyState === 4) {
347
+ sub._state = 3;
340
348
  propagateDirty(sub);
341
349
  }
342
350
  } else {
@@ -354,21 +362,25 @@ function dirtySignalConsumers(map) {
354
362
  }
355
363
  }
356
364
  let CURRENT_ORD = 0;
357
- var EdgeType = /* @__PURE__ */ ((EdgeType2) => {
358
- EdgeType2[EdgeType2["Signal"] = 0] = "Signal";
359
- EdgeType2[EdgeType2["Promise"] = 1] = "Promise";
360
- return EdgeType2;
361
- })(EdgeType || {});
365
+ class EdgeBase {
366
+ type;
367
+ dep;
368
+ ord;
369
+ updatedAt;
370
+ consumedAt;
371
+ nextDirty;
372
+ constructor(type, dep, updatedAt, consumedAt) {
373
+ this.type = type;
374
+ this.dep = dep;
375
+ this.ord = CURRENT_ORD++;
376
+ this.updatedAt = updatedAt;
377
+ this.consumedAt = consumedAt;
378
+ this.nextDirty = void 0;
379
+ }
380
+ }
362
381
  function createEdge(prevEdge, type, dep, updatedAt, consumedAt) {
363
382
  if (prevEdge === void 0) {
364
- return {
365
- type,
366
- dep,
367
- ord: CURRENT_ORD++,
368
- updatedAt,
369
- consumedAt,
370
- nextDirty: void 0
371
- };
383
+ return new EdgeBase(type, dep, updatedAt, consumedAt);
372
384
  }
373
385
  prevEdge.ord = CURRENT_ORD++;
374
386
  prevEdge.updatedAt = updatedAt;
@@ -396,14 +408,6 @@ function findAndRemoveDirty(sub, dep) {
396
408
  }
397
409
  return void 0;
398
410
  }
399
- const DEFAULT_EQUALS = (a, b) => a === b;
400
- const FALSE_EQUALS = () => false;
401
- const equalsFrom = (equals) => {
402
- if (equals === false) {
403
- return FALSE_EQUALS;
404
- }
405
- return equals ?? DEFAULT_EQUALS;
406
- };
407
411
  const GeneratorResultConstructor = (function* () {
408
412
  })().constructor;
409
413
  function isGeneratorResult(value) {
@@ -592,12 +596,15 @@ class ReactivePromiseImpl {
592
596
  let remaining = len;
593
597
  let rejected = false;
594
598
  const onFulfillAt = (i) => (v) => {
595
- if (rejected) return;
599
+ if (rejected)
600
+ return;
596
601
  results[i] = v;
597
- if (--remaining === 0) p._setValue(results);
602
+ if (--remaining === 0)
603
+ p._setValue(results);
598
604
  };
599
605
  const onReject = (r) => {
600
- if (rejected) return;
606
+ if (rejected)
607
+ return;
601
608
  rejected = true;
602
609
  p._setError(r);
603
610
  };
@@ -610,15 +617,18 @@ class ReactivePromiseImpl {
610
617
  const p = new ReactivePromiseImpl();
611
618
  const arr = arrayFrom(values);
612
619
  const len = arr.length;
613
- if (len === 0) return p;
620
+ if (len === 0)
621
+ return p;
614
622
  let settled2 = false;
615
623
  const onFulfill = (v) => {
616
- if (settled2) return;
624
+ if (settled2)
625
+ return;
617
626
  settled2 = true;
618
627
  p._setValue(v);
619
628
  };
620
629
  const onReject = (r) => {
621
- if (settled2) return;
630
+ if (settled2)
631
+ return;
622
632
  settled2 = true;
623
633
  p._setError(r);
624
634
  };
@@ -639,12 +649,14 @@ class ReactivePromiseImpl {
639
649
  const errors = new Array(len);
640
650
  let fulfilled = false;
641
651
  const onFulfill = (value) => {
642
- if (fulfilled) return;
652
+ if (fulfilled)
653
+ return;
643
654
  fulfilled = true;
644
655
  p._setValue(value);
645
656
  };
646
657
  const onRejectAt = (index) => (reason) => {
647
- if (fulfilled) return;
658
+ if (fulfilled)
659
+ return;
648
660
  errors[index] = reason;
649
661
  if (--pending === 0) {
650
662
  p._setError(new AggregateError(errors, "All promises were rejected in ReactivePromise.any"));
@@ -667,11 +679,13 @@ class ReactivePromiseImpl {
667
679
  let remaining = len;
668
680
  const onFulfillAt = (index) => (value) => {
669
681
  results[index] = { status: "fulfilled", value };
670
- if (--remaining === 0) p._setValue(results);
682
+ if (--remaining === 0)
683
+ p._setValue(results);
671
684
  };
672
685
  const onRejectAt = (index) => (reason) => {
673
686
  results[index] = { status: "rejected", reason };
674
- if (--remaining === 0) p._setValue(results);
687
+ if (--remaining === 0)
688
+ p._setValue(results);
675
689
  };
676
690
  for (let i = 0; i < len; i++) {
677
691
  thenLoop(arr[i], onFulfillAt(i), onRejectAt(i));
@@ -679,7 +693,8 @@ class ReactivePromiseImpl {
679
693
  return p;
680
694
  }
681
695
  static resolve(value) {
682
- if (value instanceof ReactivePromiseImpl) return value;
696
+ if (value instanceof ReactivePromiseImpl)
697
+ return value;
683
698
  return new ReactivePromiseImpl((resolve) => resolve(value));
684
699
  }
685
700
  static reject(reason) {
@@ -690,7 +705,7 @@ class ReactivePromiseImpl {
690
705
  p._equals = DEFAULT_EQUALS;
691
706
  p._initFlags(
692
707
  1
693
- /* Pending */
708
+ /* AsyncFlags.Pending */
694
709
  );
695
710
  const resolve = (value) => {
696
711
  if (value && typeof value.then === "function") {
@@ -709,7 +724,8 @@ class ReactivePromiseImpl {
709
724
  }
710
725
  _consumeFlags(flags) {
711
726
  const currentConsumer = getCurrentConsumer();
712
- if (currentConsumer === void 0) return;
727
+ if (currentConsumer === void 0)
728
+ return;
713
729
  if ((this._flags & 128) !== 0) {
714
730
  this._connect();
715
731
  }
@@ -725,7 +741,7 @@ class ReactivePromiseImpl {
725
741
  const { ref, computedCount, deps } = currentConsumer;
726
742
  const prevEdge = deps.get(signal2);
727
743
  if (prevEdge?.consumedAt !== computedCount) {
728
- const newEdge = createEdge(prevEdge, EdgeType.Signal, signal2, signal2.updatedCount, computedCount);
744
+ const newEdge = createEdge(prevEdge, 0, signal2, signal2.updatedCount, computedCount);
729
745
  signal2.subs.set(ref, newEdge);
730
746
  deps.set(signal2, newEdge);
731
747
  }
@@ -765,7 +781,7 @@ class ReactivePromiseImpl {
765
781
  }
766
782
  this._setFlags(
767
783
  1
768
- /* Pending */
784
+ /* AsyncFlags.Pending */
769
785
  );
770
786
  dirtySignalConsumers(this._awaitSubs);
771
787
  return this._awaitSubs = /* @__PURE__ */ new Map();
@@ -777,10 +793,10 @@ class ReactivePromiseImpl {
777
793
  this._promise = promise;
778
794
  const flags = this._flags;
779
795
  let awaitSubs = this._awaitSubs;
780
- if ((flags & 1) === 0) {
781
- awaitSubs = this._setPending();
782
- }
783
796
  try {
797
+ if ((flags & 1) === 0) {
798
+ awaitSubs = this._setPending();
799
+ }
784
800
  const nextValue = await promise;
785
801
  if (promise !== this._promise) {
786
802
  return;
@@ -857,7 +873,7 @@ class ReactivePromiseImpl {
857
873
  }
858
874
  }
859
875
  _scheduleSubs(awaitSubs, dirty) {
860
- const newState = dirty ? ReactiveFnState.Dirty : ReactiveFnState.PendingDirty;
876
+ const newState = dirty ? 2 : 4;
861
877
  for (const ref of awaitSubs.keys()) {
862
878
  const signal2 = ref.deref();
863
879
  if (signal2 === void 0) {
@@ -870,49 +886,49 @@ class ReactivePromiseImpl {
870
886
  get value() {
871
887
  this._consumeFlags(
872
888
  16
873
- /* Value */
889
+ /* AsyncFlags.Value */
874
890
  );
875
891
  return this._value;
876
892
  }
877
893
  get error() {
878
894
  this._consumeFlags(
879
895
  32
880
- /* Error */
896
+ /* AsyncFlags.Error */
881
897
  );
882
898
  return this._error;
883
899
  }
884
900
  get isPending() {
885
901
  this._consumeFlags(
886
902
  1
887
- /* Pending */
903
+ /* AsyncFlags.Pending */
888
904
  );
889
905
  return (this._flags & 1) !== 0;
890
906
  }
891
907
  get isRejected() {
892
908
  this._consumeFlags(
893
909
  2
894
- /* Rejected */
910
+ /* AsyncFlags.Rejected */
895
911
  );
896
912
  return (this._flags & 2) !== 0;
897
913
  }
898
914
  get isResolved() {
899
915
  this._consumeFlags(
900
916
  4
901
- /* Resolved */
917
+ /* AsyncFlags.Resolved */
902
918
  );
903
919
  return (this._flags & 4) !== 0;
904
920
  }
905
921
  get isReady() {
906
922
  this._consumeFlags(
907
923
  8
908
- /* Ready */
924
+ /* AsyncFlags.Ready */
909
925
  );
910
926
  return (this._flags & 8) !== 0;
911
927
  }
912
928
  get isSettled() {
913
929
  this._consumeFlags(
914
930
  6
915
- /* Settled */
931
+ /* AsyncFlags.Settled */
916
932
  );
917
933
  return (this._flags & 6) !== 0;
918
934
  }
@@ -928,13 +944,7 @@ class ReactivePromiseImpl {
928
944
  }
929
945
  ref = currentConsumer.ref;
930
946
  const prevEdge = this._awaitSubs.get(ref) ?? findAndRemoveDirty(currentConsumer, this);
931
- edge = createEdge(
932
- prevEdge,
933
- EdgeType.Promise,
934
- this,
935
- this._updatedCount,
936
- currentConsumer.computedCount
937
- );
947
+ edge = createEdge(prevEdge, 1, this, this._updatedCount, currentConsumer.computedCount);
938
948
  }
939
949
  const wrappedFulfilled = onfulfilled ? (value) => {
940
950
  try {
@@ -970,16 +980,13 @@ class ReactivePromiseImpl {
970
980
  return this.then(null, onrejected);
971
981
  }
972
982
  finally(onfinally) {
973
- return this.then(
974
- (value) => {
975
- onfinally?.();
976
- return value;
977
- },
978
- (reason) => {
979
- onfinally?.();
980
- throw reason;
981
- }
982
- );
983
+ return this.then((value) => {
984
+ onfinally?.();
985
+ return value;
986
+ }, (reason) => {
987
+ onfinally?.();
988
+ throw reason;
989
+ });
983
990
  }
984
991
  get [Symbol.toStringTag]() {
985
992
  return `ReactivePromise`;
@@ -1001,7 +1008,7 @@ function createPromise(promise, signal2) {
1001
1008
  p["_equals"] = signal2.def.equals;
1002
1009
  p["_initFlags"](
1003
1010
  1
1004
- /* Pending */
1011
+ /* AsyncFlags.Pending */
1005
1012
  );
1006
1013
  p["_setPromise"](promise);
1007
1014
  return p;
@@ -1018,11 +1025,14 @@ function createRelay(activate, scope, opts) {
1018
1025
  }
1019
1026
  const signal2 = p["_signal"];
1020
1027
  signal2.subs = /* @__PURE__ */ new Map();
1021
- signal2._state = ReactiveFnState.Dirty;
1028
+ signal2._state = 2;
1022
1029
  active = false;
1023
1030
  currentSub = void 0;
1024
1031
  };
1025
1032
  const state = {
1033
+ get isPending() {
1034
+ return (p["_flags"] & 1) !== 0;
1035
+ },
1026
1036
  get value() {
1027
1037
  return p["_value"];
1028
1038
  },
@@ -1060,7 +1070,7 @@ function createRelay(activate, scope, opts) {
1060
1070
  p["_equals"] = equalsFrom(opts?.equals);
1061
1071
  p["_initFlags"](
1062
1072
  128 | 1
1063
- /* Pending */
1073
+ /* AsyncFlags.Pending */
1064
1074
  );
1065
1075
  return p;
1066
1076
  }
@@ -1070,9 +1080,13 @@ function createTask(task, scope, opts) {
1070
1080
  p["_equals"] = equalsFrom(opts?.equals);
1071
1081
  p["_initFlags"](
1072
1082
  64
1073
- /* isRunnable */
1083
+ /* AsyncFlags.isRunnable */
1074
1084
  );
1085
+ const throwIfRunning = opts?.throwIfRunning === true;
1075
1086
  p["run"] = ((...args) => {
1087
+ if (throwIfRunning && (p["_flags"] & 1) !== 0) {
1088
+ throw new Error("Task is already running");
1089
+ }
1076
1090
  p._setPromise(fn(...args));
1077
1091
  return p;
1078
1092
  });
@@ -1092,7 +1106,7 @@ function getSignal(signal2) {
1092
1106
  }
1093
1107
  }
1094
1108
  const updatedAt = checkSignal(signal2);
1095
- const newEdge = createEdge(prevEdge, EdgeType.Signal, signal2, updatedAt, computedCount);
1109
+ const newEdge = createEdge(prevEdge, 0, signal2, updatedAt, computedCount);
1096
1110
  signal2.subs.set(ref, newEdge);
1097
1111
  deps.set(signal2, newEdge);
1098
1112
  } else {
@@ -1108,26 +1122,26 @@ function getSignal(signal2) {
1108
1122
  }
1109
1123
  function checkSignal(signal2) {
1110
1124
  const { ref, _state: state } = signal2;
1111
- if (state < ReactiveFnState.Dirty) {
1125
+ if (state < 2) {
1112
1126
  return signal2.updatedCount;
1113
1127
  }
1114
- if (state >= ReactiveFnState.MaybeDirty) {
1128
+ if (state >= 3) {
1115
1129
  let edge = signal2.dirtyHead;
1116
1130
  while (edge !== void 0) {
1117
- if (edge.type === EdgeType.Promise) {
1131
+ if (edge.type === 1) {
1118
1132
  const dep2 = edge.dep;
1119
1133
  if (dep2._getPending()) {
1120
1134
  const value = signal2._value;
1121
1135
  dep2["_awaitSubs"].set(ref, edge);
1122
1136
  value._setPending();
1123
- signal2._state = ReactiveFnState.Pending;
1137
+ signal2._state = 1;
1124
1138
  signal2.dirtyHead = edge;
1125
1139
  return signal2.updatedCount;
1126
1140
  } else if (edge.updatedAt === edge.dep._updatedCount) {
1127
1141
  dep2["_awaitSubs"].set(ref, edge);
1128
1142
  } else {
1129
1143
  signal2.dirtyHead = edge.nextDirty;
1130
- signal2._state = ReactiveFnState.Dirty;
1144
+ signal2._state = 2;
1131
1145
  break;
1132
1146
  }
1133
1147
  edge = edge.nextDirty;
@@ -1138,23 +1152,23 @@ function checkSignal(signal2) {
1138
1152
  dep.subs.set(ref, edge);
1139
1153
  if (edge.updatedAt !== updatedAt) {
1140
1154
  signal2.dirtyHead = edge.nextDirty;
1141
- signal2._state = ReactiveFnState.Dirty;
1155
+ signal2._state = 2;
1142
1156
  break;
1143
1157
  }
1144
1158
  edge = edge.nextDirty;
1145
1159
  }
1146
1160
  }
1147
1161
  const newState = signal2._state;
1148
- if (newState === ReactiveFnState.Dirty) {
1162
+ if (newState === 2) {
1149
1163
  if (signal2._isLazy) {
1150
1164
  signal2.updatedCount++;
1151
1165
  } else {
1152
1166
  runSignal(signal2);
1153
1167
  }
1154
- } else if (newState === ReactiveFnState.PendingDirty) {
1168
+ } else if (newState === 4) {
1155
1169
  signal2._value._clearPending();
1156
1170
  }
1157
- signal2._state = ReactiveFnState.Clean;
1171
+ signal2._state = 0;
1158
1172
  signal2.dirtyHead = void 0;
1159
1173
  return signal2.updatedCount;
1160
1174
  }
@@ -1323,56 +1337,56 @@ function hashDate(date, _seen) {
1323
1337
  return hashNumber(
1324
1338
  date.getTime(),
1325
1339
  14
1326
- /* DATE */
1340
+ /* HashType.DATE */
1327
1341
  );
1328
1342
  }
1329
1343
  function hashRegExp(regexp, _seen) {
1330
1344
  const h = hashStr(
1331
1345
  regexp.source + regexp.flags,
1332
1346
  15
1333
- /* REGEXP */
1347
+ /* HashType.REGEXP */
1334
1348
  );
1335
1349
  return (h ^ regexp.lastIndex) >>> 0;
1336
1350
  }
1337
1351
  const UNDEFINED = hashStr(
1338
1352
  "undefined",
1339
1353
  0
1340
- /* UNDEFINED */
1354
+ /* HashType.UNDEFINED */
1341
1355
  );
1342
1356
  const NULL = hashStr(
1343
1357
  "null",
1344
1358
  1
1345
- /* NULL */
1359
+ /* HashType.NULL */
1346
1360
  );
1347
1361
  const TRUE = hashStr(
1348
1362
  "true",
1349
1363
  2
1350
- /* TRUE */
1364
+ /* HashType.TRUE */
1351
1365
  );
1352
1366
  const FALSE = hashStr(
1353
1367
  "false",
1354
1368
  3
1355
- /* FALSE */
1369
+ /* HashType.FALSE */
1356
1370
  );
1357
1371
  const ARRAY = hashStr(
1358
1372
  "array",
1359
1373
  7
1360
- /* ARRAY */
1374
+ /* HashType.ARRAY */
1361
1375
  );
1362
1376
  const OBJECT = hashStr(
1363
1377
  "object",
1364
1378
  8
1365
- /* OBJECT */
1379
+ /* HashType.OBJECT */
1366
1380
  );
1367
1381
  const SET = hashStr(
1368
1382
  "set",
1369
1383
  13
1370
- /* SET */
1384
+ /* HashType.SET */
1371
1385
  );
1372
1386
  const MAP = hashStr(
1373
1387
  "map",
1374
1388
  12
1375
- /* MAP */
1389
+ /* HashType.MAP */
1376
1390
  );
1377
1391
  const getObjectProto = Object.getPrototypeOf;
1378
1392
  const PROTO_TO_HASH = /* @__PURE__ */ new Map([
@@ -1396,19 +1410,19 @@ function hashValue(node, seen = []) {
1396
1410
  return hashStr(
1397
1411
  String(node),
1398
1412
  4
1399
- /* NUMBER */
1413
+ /* HashType.NUMBER */
1400
1414
  );
1401
1415
  case "string":
1402
1416
  return hashStr(
1403
1417
  node,
1404
1418
  5
1405
- /* STRING */
1419
+ /* HashType.STRING */
1406
1420
  );
1407
1421
  case "bigint":
1408
1422
  return hashStr(
1409
1423
  node.toString(),
1410
1424
  6
1411
- /* BIGINT */
1425
+ /* HashType.BIGINT */
1412
1426
  );
1413
1427
  case "object": {
1414
1428
  if (node === null) {
@@ -1419,7 +1433,7 @@ function hashValue(node, seen = []) {
1419
1433
  return hashStr(
1420
1434
  String(index),
1421
1435
  11
1422
- /* CYCLE */
1436
+ /* HashType.CYCLE */
1423
1437
  );
1424
1438
  }
1425
1439
  const hashFn = PROTO_TO_HASH.get(getObjectProto(node));
@@ -1437,7 +1451,7 @@ function hashValue(node, seen = []) {
1437
1451
  return hashStr(
1438
1452
  node.toString(),
1439
1453
  10
1440
- /* SYMBOL */
1454
+ /* HashType.SYMBOL */
1441
1455
  );
1442
1456
  }
1443
1457
  }
@@ -1449,7 +1463,7 @@ function getObjectHash(obj) {
1449
1463
  id = hashNumber(
1450
1464
  nextHashMapId++,
1451
1465
  9
1452
- /* REFERENCE */
1466
+ /* HashType.REFERENCE */
1453
1467
  );
1454
1468
  objectToHashMap.set(obj, id);
1455
1469
  }
@@ -1466,25 +1480,16 @@ function hashReactiveFn(fn, args) {
1466
1480
  h = h << 13 | h >>> 19;
1467
1481
  return imul(h, 5) + 3864292196 >>> 0;
1468
1482
  }
1469
- var ReactiveFnState = /* @__PURE__ */ ((ReactiveFnState2) => {
1470
- ReactiveFnState2[ReactiveFnState2["Clean"] = 0] = "Clean";
1471
- ReactiveFnState2[ReactiveFnState2["Pending"] = 1] = "Pending";
1472
- ReactiveFnState2[ReactiveFnState2["Dirty"] = 2] = "Dirty";
1473
- ReactiveFnState2[ReactiveFnState2["MaybeDirty"] = 3] = "MaybeDirty";
1474
- ReactiveFnState2[ReactiveFnState2["PendingDirty"] = 4] = "PendingDirty";
1475
- return ReactiveFnState2;
1476
- })(ReactiveFnState || {});
1477
1483
  let ID = 0;
1478
1484
  function createReactiveDefinition(id, desc, compute, equals, isRelay2, paramKey, tracer) {
1479
- return {
1480
- id,
1481
- desc,
1485
+ const def = {
1482
1486
  compute,
1483
1487
  equals: equalsFrom(equals),
1484
1488
  isRelay: isRelay2,
1485
1489
  paramKey,
1486
- tracer
1490
+ tracer: void 0
1487
1491
  };
1492
+ return def;
1488
1493
  }
1489
1494
  class ReactiveSignal {
1490
1495
  // Bitmask containing state in the first 2 bits and boolean properties in the remaining bits
@@ -1553,22 +1558,33 @@ class ReactiveSignal {
1553
1558
  get listeners() {
1554
1559
  return this._listeners ?? (this._listeners = {
1555
1560
  updatedAt: 0,
1556
- current: /* @__PURE__ */ new Set(),
1561
+ current: /* @__PURE__ */ new Map(),
1557
1562
  cachedBoundAdd: this.addListener.bind(this)
1558
1563
  });
1559
1564
  }
1560
1565
  get value() {
1561
1566
  return getSignal(this);
1562
1567
  }
1563
- addListener(listener) {
1568
+ addListener(listener, opts) {
1564
1569
  const { current } = this.listeners;
1565
1570
  if (!current.has(listener)) {
1571
+ let effective = listener;
1572
+ if (opts?.skipInitial) {
1573
+ let initial = true;
1574
+ effective = () => {
1575
+ if (initial) {
1576
+ initial = false;
1577
+ return;
1578
+ }
1579
+ listener();
1580
+ };
1581
+ }
1566
1582
  if (!this._isListener) {
1567
1583
  watchSignal(this, this._isSuspended);
1568
1584
  this.flags |= 16;
1569
1585
  }
1570
1586
  schedulePull(this);
1571
- current.add(listener);
1587
+ current.set(listener, effective);
1572
1588
  }
1573
1589
  return () => {
1574
1590
  if (current.has(listener)) {
@@ -1577,6 +1593,7 @@ class ReactiveSignal {
1577
1593
  cancelPull(this);
1578
1594
  unwatchSignal(this, this._isSuspended);
1579
1595
  this.flags &= -17;
1596
+ this.listeners.updatedAt = 0;
1580
1597
  }
1581
1598
  }
1582
1599
  };
@@ -1624,7 +1641,7 @@ const runListeners = (signal2) => {
1624
1641
  return;
1625
1642
  }
1626
1643
  const { current } = listeners;
1627
- for (const listener of current) {
1644
+ for (const listener of current.values()) {
1628
1645
  listener();
1629
1646
  }
1630
1647
  };
@@ -1636,13 +1653,14 @@ function createReactiveSignal(def, args = [], key, scope) {
1636
1653
  }
1637
1654
  let CONTEXT_ID = 0;
1638
1655
  class ContextImpl {
1656
+ defaultValue;
1657
+ _key;
1658
+ _description;
1639
1659
  constructor(defaultValue, desc) {
1640
1660
  this.defaultValue = defaultValue;
1641
1661
  this._description = desc ?? `context:${CONTEXT_ID++}`;
1642
1662
  this._key = Symbol(this._description);
1643
1663
  }
1644
- _key;
1645
- _description;
1646
1664
  }
1647
1665
  const context = (initialValue, description) => {
1648
1666
  return new ContextImpl(initialValue, description);
@@ -1660,9 +1678,7 @@ function withContexts(contexts, fn) {
1660
1678
  const getContext = (context2) => {
1661
1679
  const scope = CURRENT_SCOPE ?? getCurrentConsumer()?.scope;
1662
1680
  if (scope === void 0) {
1663
- throw new Error(
1664
- "getContext must be used within a reactive function, a withContext, or within a framework-specific context provider."
1665
- );
1681
+ throw new Error("getContext must be used within a reactive function, a withContext, or within a framework-specific context provider.");
1666
1682
  }
1667
1683
  return scope.getContext(context2) ?? context2.defaultValue;
1668
1684
  };
@@ -1810,4 +1826,4 @@ exports.signal = signal;
1810
1826
  exports.unwatchSignal = unwatchSignal;
1811
1827
  exports.watchSignal = watchSignal;
1812
1828
  exports.withContexts = withContexts;
1813
- //# sourceMappingURL=contexts-DOH1tHd8.js.map
1829
+ //# sourceMappingURL=contexts-Wgq2NOVX.js.map