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
  }
@@ -23,23 +24,40 @@ let TRACER;
23
24
  const getTracerProxy = () => {
24
25
  return TRACER;
25
26
  };
26
- var TracerEventType = /* @__PURE__ */ ((TracerEventType2) => {
27
- TracerEventType2["StartUpdate"] = "StartUpdate";
28
- TracerEventType2["EndUpdate"] = "EndUpdate";
29
- TracerEventType2["StartLoading"] = "StartLoading";
30
- TracerEventType2["EndLoading"] = "EndLoading";
31
- TracerEventType2["Connected"] = "Connected";
32
- TracerEventType2["Disconnected"] = "Disconnected";
33
- TracerEventType2["ConsumeState"] = "ConsumeState";
34
- return TracerEventType2;
35
- })(TracerEventType || {});
36
- var SignalType = /* @__PURE__ */ ((SignalType2) => {
37
- SignalType2["State"] = "state";
38
- SignalType2["Reactive"] = "reactive";
39
- SignalType2["Watcher"] = "watcher";
40
- return SignalType2;
41
- })(SignalType || {});
27
+ exports.TracerEventType = void 0;
28
+ (function(TracerEventType) {
29
+ TracerEventType["StartUpdate"] = "StartUpdate";
30
+ TracerEventType["EndUpdate"] = "EndUpdate";
31
+ TracerEventType["StartLoading"] = "StartLoading";
32
+ TracerEventType["EndLoading"] = "EndLoading";
33
+ TracerEventType["Connected"] = "Connected";
34
+ TracerEventType["Disconnected"] = "Disconnected";
35
+ TracerEventType["ConsumeState"] = "ConsumeState";
36
+ })(exports.TracerEventType || (exports.TracerEventType = {}));
37
+ exports.SignalType = void 0;
38
+ (function(SignalType) {
39
+ SignalType["State"] = "state";
40
+ SignalType["Reactive"] = "reactive";
41
+ SignalType["Watcher"] = "watcher";
42
+ })(exports.SignalType || (exports.SignalType = {}));
42
43
  class VisualizerNode {
44
+ tracer;
45
+ depth;
46
+ type;
47
+ id;
48
+ value;
49
+ name;
50
+ params;
51
+ _setValue;
52
+ subscribers = [];
53
+ nextStateChildren = [];
54
+ stateChildren = [];
55
+ children = [];
56
+ updating = true;
57
+ loading = false;
58
+ version = 0;
59
+ updatingVersion = 0;
60
+ didConnect = false;
43
61
  constructor(tracer, depth, type, id, value, name, params, _setValue) {
44
62
  this.tracer = tracer;
45
63
  this.depth = depth;
@@ -51,15 +69,6 @@ class VisualizerNode {
51
69
  this._setValue = _setValue;
52
70
  this.tracer.maxDepth = Math.max(this.tracer.maxDepth, this.depth);
53
71
  }
54
- subscribers = [];
55
- nextStateChildren = [];
56
- stateChildren = [];
57
- children = [];
58
- updating = true;
59
- loading = false;
60
- version = 0;
61
- updatingVersion = 0;
62
- didConnect = false;
63
72
  get showParams() {
64
73
  return this.tracer.showParams;
65
74
  }
@@ -70,16 +79,14 @@ class VisualizerNode {
70
79
  return this.tracer.interactive;
71
80
  }
72
81
  setValue(value) {
73
- if (this.type !== "state") {
82
+ if (this.type !== exports.SignalType.State) {
74
83
  throw new Error("setValue is only allowed on state nodes");
75
84
  }
76
85
  this._setValue?.(value);
77
86
  this.notify();
78
87
  }
79
88
  connectChild(child) {
80
- let childLink = this.children.find(
81
- (link) => link.node.id === child.id || link.node.name === child.name && link.version !== this.updatingVersion
82
- );
89
+ let childLink = this.children.find((link) => link.node.id === child.id || link.node.name === child.name && link.version !== this.updatingVersion);
83
90
  let shouldSkip = false;
84
91
  if (childLink) {
85
92
  if (!child.didConnect) {
@@ -142,16 +149,7 @@ class VisualizerNode {
142
149
  this.nextStateChildren.push(existing);
143
150
  existing.notify();
144
151
  } else {
145
- const node = new VisualizerNode(
146
- this.tracer,
147
- this.depth + 1,
148
- "state",
149
- id,
150
- value,
151
- name,
152
- void 0,
153
- setValue
154
- );
152
+ const node = new VisualizerNode(this.tracer, this.depth + 1, exports.SignalType.State, id, value, name, void 0, setValue);
155
153
  node.updating = false;
156
154
  this.nextStateChildren.push(node);
157
155
  }
@@ -196,39 +194,39 @@ class TraceFlush {
196
194
  }
197
195
  }
198
196
  class Tracer {
197
+ showParams;
198
+ showValue;
199
+ interactive;
200
+ nodeMap = /* @__PURE__ */ new Map();
201
+ delay = 200;
202
+ maxDepth = 0;
203
+ initialized = false;
199
204
  constructor(id, immediate = false, showParams = true, showValue = true, interactive = true) {
200
205
  this.showParams = showParams;
201
206
  this.showValue = showValue;
202
207
  this.interactive = interactive;
203
208
  this.initialized = !immediate;
204
- const node = new VisualizerNode(this, 0, "watcher", id, "");
209
+ const node = new VisualizerNode(this, 0, exports.SignalType.Watcher, id, "");
205
210
  this.rootNode = node;
206
211
  this.nodeMap.set(id, node);
207
212
  }
208
- nodeMap = /* @__PURE__ */ new Map();
209
- delay = 200;
210
- maxDepth = 0;
211
- initialized = false;
212
213
  rootNode;
213
214
  eventQueue = [];
214
215
  currentFlush;
215
216
  emit(event) {
216
- if (event.type === "Connected" || event.type === "ConsumeState") {
217
+ if (event.type === exports.TracerEventType.Connected || event.type === exports.TracerEventType.ConsumeState) {
217
218
  const node = this.nodeMap.get(event.id);
218
- if (!node || event.type === "Connected" && !event.name) {
219
+ if (!node || event.type === exports.TracerEventType.Connected && !event.name) {
219
220
  return;
220
221
  }
221
222
  if (!this.nodeMap.has(event.childId)) {
222
- const name = event.type === "Connected" ? event.name : void 0;
223
- const params = event.type === "Connected" ? event.params : void 0;
224
- const nodeType = event.type === "Connected" ? event.nodeType : "state";
225
- this.nodeMap.set(
226
- event.childId,
227
- new VisualizerNode(this, node.depth + 1, nodeType, event.childId, "", name, params)
228
- );
223
+ const name = event.type === exports.TracerEventType.Connected ? event.name : void 0;
224
+ const params = event.type === exports.TracerEventType.Connected ? event.params : void 0;
225
+ const nodeType = event.type === exports.TracerEventType.Connected ? event.nodeType : exports.SignalType.State;
226
+ this.nodeMap.set(event.childId, new VisualizerNode(this, node.depth + 1, nodeType, event.childId, "", name, params));
229
227
  }
230
228
  }
231
- if (event.type === "StartLoading" || event.type === "EndLoading") {
229
+ if (event.type === exports.TracerEventType.StartLoading || event.type === exports.TracerEventType.EndLoading) {
232
230
  scheduleTracer(this);
233
231
  }
234
232
  if (this.initialized) {
@@ -242,28 +240,28 @@ class Tracer {
242
240
  if (!node) {
243
241
  return true;
244
242
  }
245
- let skipDelay = nextEvent?.type === "StartLoading";
246
- if (event.type === "Connected") {
243
+ let skipDelay = nextEvent?.type === exports.TracerEventType.StartLoading;
244
+ if (event.type === exports.TracerEventType.Connected) {
247
245
  let child = this.nodeMap.get(event.childId);
248
246
  if (!child) {
249
247
  throw new Error(`Child node ${event.childId} not found`);
250
248
  }
251
249
  skipDelay = node.connectChild(child);
252
- } else if (event.type === "Disconnected") {
250
+ } else if (event.type === exports.TracerEventType.Disconnected) {
253
251
  node.disconnectChild(event.childId);
254
- } else if (event.type === "StartUpdate") {
252
+ } else if (event.type === exports.TracerEventType.StartUpdate) {
255
253
  node.startUpdate();
256
- if (nextEvent && nextEvent.id === event.id && (nextEvent.type === "EndUpdate" || nextEvent.type === "StartLoading")) {
254
+ if (nextEvent && nextEvent.id === event.id && (nextEvent.type === exports.TracerEventType.EndUpdate || nextEvent.type === exports.TracerEventType.StartLoading)) {
257
255
  skipDelay = true;
258
256
  }
259
- } else if (event.type === "EndUpdate") {
257
+ } else if (event.type === exports.TracerEventType.EndUpdate) {
260
258
  node.endUpdate(event.value, event.preserveChildren);
261
- } else if (event.type === "StartLoading") {
259
+ } else if (event.type === exports.TracerEventType.StartLoading) {
262
260
  node.startLoading();
263
261
  skipDelay = true;
264
- } else if (event.type === "EndLoading") {
262
+ } else if (event.type === exports.TracerEventType.EndLoading) {
265
263
  node.endLoading(event.value);
266
- } else if (event.type === "ConsumeState") {
264
+ } else if (event.type === exports.TracerEventType.ConsumeState) {
267
265
  node.consumeState(event.childId, event.name, event.value, event.setValue);
268
266
  }
269
267
  return skipDelay;
@@ -329,6 +327,14 @@ const setCurrentConsumer = (consumer) => {
329
327
  const getCurrentConsumer = () => {
330
328
  return CURRENT_CONSUMER;
331
329
  };
330
+ const DEFAULT_EQUALS = (a, b) => a === b;
331
+ const FALSE_EQUALS = () => false;
332
+ const equalsFrom = (equals) => {
333
+ if (equals === false) {
334
+ return FALSE_EQUALS;
335
+ }
336
+ return equals ?? DEFAULT_EQUALS;
337
+ };
332
338
  let STATE_ID = 0;
333
339
  class StateSignal {
334
340
  _value;
@@ -340,8 +346,10 @@ class StateSignal {
340
346
  constructor(value, equals = (a, b) => a === b, desc = "signal") {
341
347
  this._value = value;
342
348
  this._equals = equals;
343
- this._id = STATE_ID++;
344
- this._desc = desc;
349
+ {
350
+ this._id = STATE_ID++;
351
+ this._desc = desc;
352
+ }
345
353
  }
346
354
  get value() {
347
355
  this.consume();
@@ -363,7 +371,7 @@ class StateSignal {
363
371
  {
364
372
  const tracer = getTracerProxy();
365
373
  tracer?.emit({
366
- type: TracerEventType.ConsumeState,
374
+ type: exports.TracerEventType.ConsumeState,
367
375
  id: currentConsumer.tracerMeta.id,
368
376
  name: this._desc,
369
377
  childId: this._id,
@@ -385,7 +393,7 @@ class StateSignal {
385
393
  }
386
394
  dirtySignal(sub);
387
395
  }
388
- this._subs = /* @__PURE__ */ new Map();
396
+ this._subs.clear();
389
397
  scheduleListeners(this);
390
398
  }
391
399
  addListener(listener) {
@@ -406,13 +414,12 @@ function runListeners$1(signal2) {
406
414
  listener();
407
415
  }
408
416
  }
409
- const FALSE_EQUALS$1 = () => false;
410
417
  function signal(initialValue, opts) {
411
- const equals = opts?.equals === false ? FALSE_EQUALS$1 : opts?.equals ?? ((a, b) => a === b);
418
+ const equals = opts?.equals === false ? FALSE_EQUALS : opts?.equals ?? ((a, b) => a === b);
412
419
  return new StateSignal(initialValue, equals, opts?.desc);
413
420
  }
414
421
  const notifier = (opts) => {
415
- return new StateSignal(void 0, FALSE_EQUALS$1, opts?.desc);
422
+ return new StateSignal(void 0, FALSE_EQUALS, opts?.desc);
416
423
  };
417
424
  function watchSignal(signal2, parentIsSuspended) {
418
425
  if (parentIsSuspended) {
@@ -536,7 +543,8 @@ let PENDING_GC = /* @__PURE__ */ new Set();
536
543
  const microtask = () => Promise.resolve();
537
544
  let currentFlush = null;
538
545
  const scheduleFlush = (fn) => {
539
- if (currentFlush) return;
546
+ if (currentFlush)
547
+ return;
540
548
  let resolve;
541
549
  const promise = new Promise((r) => resolve = r);
542
550
  currentFlush = { promise, resolve };
@@ -573,7 +581,8 @@ const scheduleTracer = (tracer) => {
573
581
  };
574
582
  const scheduleGcSweep = (scope) => {
575
583
  PENDING_GC.add(scope);
576
- if (PENDING_GC.size > 1) return;
584
+ if (PENDING_GC.size > 1)
585
+ return;
577
586
  scheduleIdleCallback(() => {
578
587
  for (const scope2 of PENDING_GC) {
579
588
  scope2.sweepGc();
@@ -583,6 +592,8 @@ const scheduleGcSweep = (scope) => {
583
592
  };
584
593
  const flushWatchers = async () => {
585
594
  const flush = currentFlush;
595
+ if (!flush)
596
+ return;
586
597
  while (PENDING_ASYNC_PULLS.length > 0 || PENDING_PULLS.size > 0) {
587
598
  const asyncPulls = PENDING_ASYNC_PULLS;
588
599
  PENDING_ASYNC_PULLS = [];
@@ -626,19 +637,17 @@ const settled = async () => {
626
637
  };
627
638
  function dirtySignal(signal2) {
628
639
  const prevState = signal2._state;
629
- if (prevState === ReactiveFnState.Dirty) {
640
+ if (prevState === 2) {
630
641
  return;
631
642
  }
632
- signal2._state = ReactiveFnState.Dirty;
633
- if (prevState < ReactiveFnState.MaybeDirty) {
643
+ signal2._state = 2;
644
+ if (prevState < 3) {
634
645
  propagateDirty(signal2);
635
646
  }
636
647
  }
637
648
  function propagateDirty(signal2) {
638
649
  if (getCurrentConsumer() === signal2) {
639
- throw new Error(
640
- "A signal was dirtied after it was consumed by the current function. This can cause race conditions and infinite rerenders and is not allowed."
641
- );
650
+ 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.");
642
651
  }
643
652
  if (isRelay(signal2)) {
644
653
  if (signal2.watchCount > 0) {
@@ -649,31 +658,32 @@ function propagateDirty(signal2) {
649
658
  schedulePull(signal2);
650
659
  }
651
660
  dirtySignalConsumers(signal2.subs);
652
- signal2.subs = /* @__PURE__ */ new Map();
661
+ signal2.subs.clear();
653
662
  }
654
663
  }
655
664
  function dirtySignalConsumers(map) {
656
665
  for (const [subRef, edge] of map) {
657
666
  const sub = subRef.deref();
658
- if (sub === void 0 || sub.computedCount !== edge.consumedAt) continue;
667
+ if (sub === void 0 || sub.computedCount !== edge.consumedAt)
668
+ continue;
659
669
  const dirtyState = sub._state;
660
670
  switch (dirtyState) {
661
- case ReactiveFnState.Clean:
662
- sub._state = ReactiveFnState.MaybeDirty;
671
+ case 0:
672
+ sub._state = 3;
663
673
  sub.dirtyHead = edge;
664
674
  edge.nextDirty = void 0;
665
675
  propagateDirty(sub);
666
676
  break;
667
- case ReactiveFnState.Pending:
668
- case ReactiveFnState.MaybeDirty:
669
- case ReactiveFnState.PendingDirty: {
677
+ case 1:
678
+ case 3:
679
+ case 4: {
670
680
  let subEdge = sub.dirtyHead;
671
681
  const ord = edge.ord;
672
682
  if (subEdge.ord > ord) {
673
683
  sub.dirtyHead = edge;
674
684
  edge.nextDirty = subEdge;
675
- if (dirtyState === ReactiveFnState.Pending || dirtyState === ReactiveFnState.PendingDirty) {
676
- sub._state = ReactiveFnState.MaybeDirty;
685
+ if (dirtyState === 1 || dirtyState === 4) {
686
+ sub._state = 3;
677
687
  propagateDirty(sub);
678
688
  }
679
689
  } else {
@@ -694,21 +704,25 @@ function dirtySignalConsumers(map) {
694
704
  }
695
705
  }
696
706
  let CURRENT_ORD = 0;
697
- var EdgeType = /* @__PURE__ */ ((EdgeType2) => {
698
- EdgeType2[EdgeType2["Signal"] = 0] = "Signal";
699
- EdgeType2[EdgeType2["Promise"] = 1] = "Promise";
700
- return EdgeType2;
701
- })(EdgeType || {});
707
+ class EdgeBase {
708
+ type;
709
+ dep;
710
+ ord;
711
+ updatedAt;
712
+ consumedAt;
713
+ nextDirty;
714
+ constructor(type, dep, updatedAt, consumedAt) {
715
+ this.type = type;
716
+ this.dep = dep;
717
+ this.ord = CURRENT_ORD++;
718
+ this.updatedAt = updatedAt;
719
+ this.consumedAt = consumedAt;
720
+ this.nextDirty = void 0;
721
+ }
722
+ }
702
723
  function createEdge(prevEdge, type, dep, updatedAt, consumedAt) {
703
724
  if (prevEdge === void 0) {
704
- return {
705
- type,
706
- dep,
707
- ord: CURRENT_ORD++,
708
- updatedAt,
709
- consumedAt,
710
- nextDirty: void 0
711
- };
725
+ return new EdgeBase(type, dep, updatedAt, consumedAt);
712
726
  }
713
727
  prevEdge.ord = CURRENT_ORD++;
714
728
  prevEdge.updatedAt = updatedAt;
@@ -736,14 +750,6 @@ function findAndRemoveDirty(sub, dep) {
736
750
  }
737
751
  return void 0;
738
752
  }
739
- const DEFAULT_EQUALS = (a, b) => a === b;
740
- const FALSE_EQUALS = () => false;
741
- const equalsFrom = (equals) => {
742
- if (equals === false) {
743
- return FALSE_EQUALS;
744
- }
745
- return equals ?? DEFAULT_EQUALS;
746
- };
747
753
  const GeneratorResultConstructor = (function* () {
748
754
  })().constructor;
749
755
  function isGeneratorResult(value) {
@@ -932,12 +938,15 @@ class ReactivePromiseImpl {
932
938
  let remaining = len;
933
939
  let rejected = false;
934
940
  const onFulfillAt = (i) => (v) => {
935
- if (rejected) return;
941
+ if (rejected)
942
+ return;
936
943
  results[i] = v;
937
- if (--remaining === 0) p._setValue(results);
944
+ if (--remaining === 0)
945
+ p._setValue(results);
938
946
  };
939
947
  const onReject = (r) => {
940
- if (rejected) return;
948
+ if (rejected)
949
+ return;
941
950
  rejected = true;
942
951
  p._setError(r);
943
952
  };
@@ -950,15 +959,18 @@ class ReactivePromiseImpl {
950
959
  const p = new ReactivePromiseImpl();
951
960
  const arr = arrayFrom(values);
952
961
  const len = arr.length;
953
- if (len === 0) return p;
962
+ if (len === 0)
963
+ return p;
954
964
  let settled2 = false;
955
965
  const onFulfill = (v) => {
956
- if (settled2) return;
966
+ if (settled2)
967
+ return;
957
968
  settled2 = true;
958
969
  p._setValue(v);
959
970
  };
960
971
  const onReject = (r) => {
961
- if (settled2) return;
972
+ if (settled2)
973
+ return;
962
974
  settled2 = true;
963
975
  p._setError(r);
964
976
  };
@@ -979,12 +991,14 @@ class ReactivePromiseImpl {
979
991
  const errors = new Array(len);
980
992
  let fulfilled = false;
981
993
  const onFulfill = (value) => {
982
- if (fulfilled) return;
994
+ if (fulfilled)
995
+ return;
983
996
  fulfilled = true;
984
997
  p._setValue(value);
985
998
  };
986
999
  const onRejectAt = (index) => (reason) => {
987
- if (fulfilled) return;
1000
+ if (fulfilled)
1001
+ return;
988
1002
  errors[index] = reason;
989
1003
  if (--pending === 0) {
990
1004
  p._setError(new AggregateError(errors, "All promises were rejected in ReactivePromise.any"));
@@ -1007,11 +1021,13 @@ class ReactivePromiseImpl {
1007
1021
  let remaining = len;
1008
1022
  const onFulfillAt = (index) => (value) => {
1009
1023
  results[index] = { status: "fulfilled", value };
1010
- if (--remaining === 0) p._setValue(results);
1024
+ if (--remaining === 0)
1025
+ p._setValue(results);
1011
1026
  };
1012
1027
  const onRejectAt = (index) => (reason) => {
1013
1028
  results[index] = { status: "rejected", reason };
1014
- if (--remaining === 0) p._setValue(results);
1029
+ if (--remaining === 0)
1030
+ p._setValue(results);
1015
1031
  };
1016
1032
  for (let i = 0; i < len; i++) {
1017
1033
  thenLoop(arr[i], onFulfillAt(i), onRejectAt(i));
@@ -1019,7 +1035,8 @@ class ReactivePromiseImpl {
1019
1035
  return p;
1020
1036
  }
1021
1037
  static resolve(value) {
1022
- if (value instanceof ReactivePromiseImpl) return value;
1038
+ if (value instanceof ReactivePromiseImpl)
1039
+ return value;
1023
1040
  return new ReactivePromiseImpl((resolve) => resolve(value));
1024
1041
  }
1025
1042
  static reject(reason) {
@@ -1030,7 +1047,7 @@ class ReactivePromiseImpl {
1030
1047
  p._equals = DEFAULT_EQUALS;
1031
1048
  p._initFlags(
1032
1049
  1
1033
- /* Pending */
1050
+ /* AsyncFlags.Pending */
1034
1051
  );
1035
1052
  const resolve = (value) => {
1036
1053
  if (value && typeof value.then === "function") {
@@ -1049,7 +1066,7 @@ class ReactivePromiseImpl {
1049
1066
  const tracer = getTracerProxy();
1050
1067
  if (tracer !== void 0 && this._signal !== void 0 && (baseFlags & 1) !== 0) {
1051
1068
  tracer.emit({
1052
- type: TracerEventType.StartLoading,
1069
+ type: exports.TracerEventType.StartLoading,
1053
1070
  id: this._signal.tracerMeta.id
1054
1071
  });
1055
1072
  }
@@ -1058,7 +1075,8 @@ class ReactivePromiseImpl {
1058
1075
  }
1059
1076
  _consumeFlags(flags) {
1060
1077
  const currentConsumer = getCurrentConsumer();
1061
- if (currentConsumer === void 0) return;
1078
+ if (currentConsumer === void 0)
1079
+ return;
1062
1080
  if ((this._flags & 128) !== 0) {
1063
1081
  this._connect();
1064
1082
  }
@@ -1074,7 +1092,7 @@ class ReactivePromiseImpl {
1074
1092
  const { ref, computedCount, deps } = currentConsumer;
1075
1093
  const prevEdge = deps.get(signal2);
1076
1094
  if (prevEdge?.consumedAt !== computedCount) {
1077
- const newEdge = createEdge(prevEdge, EdgeType.Signal, signal2, signal2.updatedCount, computedCount);
1095
+ const newEdge = createEdge(prevEdge, 0, signal2, signal2.updatedCount, computedCount);
1078
1096
  signal2.subs.set(ref, newEdge);
1079
1097
  deps.set(signal2, newEdge);
1080
1098
  }
@@ -1109,12 +1127,12 @@ class ReactivePromiseImpl {
1109
1127
  if (tracer !== void 0 && this._signal !== void 0) {
1110
1128
  if (setTrue & 1 && allChanged & 1) {
1111
1129
  tracer.emit({
1112
- type: TracerEventType.StartLoading,
1130
+ type: exports.TracerEventType.StartLoading,
1113
1131
  id: this._signal.tracerMeta.id
1114
1132
  });
1115
1133
  } else if (setFalse & 1 && allChanged & 1) {
1116
1134
  tracer.emit({
1117
- type: TracerEventType.EndLoading,
1135
+ type: exports.TracerEventType.EndLoading,
1118
1136
  id: this._signal.tracerMeta.id,
1119
1137
  value: isRelay$1(this) ? "..." : this._value
1120
1138
  });
@@ -1131,7 +1149,7 @@ class ReactivePromiseImpl {
1131
1149
  }
1132
1150
  this._setFlags(
1133
1151
  1
1134
- /* Pending */
1152
+ /* AsyncFlags.Pending */
1135
1153
  );
1136
1154
  dirtySignalConsumers(this._awaitSubs);
1137
1155
  return this._awaitSubs = /* @__PURE__ */ new Map();
@@ -1143,10 +1161,10 @@ class ReactivePromiseImpl {
1143
1161
  this._promise = promise;
1144
1162
  const flags = this._flags;
1145
1163
  let awaitSubs = this._awaitSubs;
1146
- if ((flags & 1) === 0) {
1147
- awaitSubs = this._setPending();
1148
- }
1149
1164
  try {
1165
+ if ((flags & 1) === 0) {
1166
+ awaitSubs = this._setPending();
1167
+ }
1150
1168
  const nextValue = await promise;
1151
1169
  if (promise !== this._promise) {
1152
1170
  return;
@@ -1223,7 +1241,7 @@ class ReactivePromiseImpl {
1223
1241
  }
1224
1242
  }
1225
1243
  _scheduleSubs(awaitSubs, dirty) {
1226
- const newState = dirty ? ReactiveFnState.Dirty : ReactiveFnState.PendingDirty;
1244
+ const newState = dirty ? 2 : 4;
1227
1245
  for (const ref of awaitSubs.keys()) {
1228
1246
  const signal2 = ref.deref();
1229
1247
  if (signal2 === void 0) {
@@ -1236,49 +1254,49 @@ class ReactivePromiseImpl {
1236
1254
  get value() {
1237
1255
  this._consumeFlags(
1238
1256
  16
1239
- /* Value */
1257
+ /* AsyncFlags.Value */
1240
1258
  );
1241
1259
  return this._value;
1242
1260
  }
1243
1261
  get error() {
1244
1262
  this._consumeFlags(
1245
1263
  32
1246
- /* Error */
1264
+ /* AsyncFlags.Error */
1247
1265
  );
1248
1266
  return this._error;
1249
1267
  }
1250
1268
  get isPending() {
1251
1269
  this._consumeFlags(
1252
1270
  1
1253
- /* Pending */
1271
+ /* AsyncFlags.Pending */
1254
1272
  );
1255
1273
  return (this._flags & 1) !== 0;
1256
1274
  }
1257
1275
  get isRejected() {
1258
1276
  this._consumeFlags(
1259
1277
  2
1260
- /* Rejected */
1278
+ /* AsyncFlags.Rejected */
1261
1279
  );
1262
1280
  return (this._flags & 2) !== 0;
1263
1281
  }
1264
1282
  get isResolved() {
1265
1283
  this._consumeFlags(
1266
1284
  4
1267
- /* Resolved */
1285
+ /* AsyncFlags.Resolved */
1268
1286
  );
1269
1287
  return (this._flags & 4) !== 0;
1270
1288
  }
1271
1289
  get isReady() {
1272
1290
  this._consumeFlags(
1273
1291
  8
1274
- /* Ready */
1292
+ /* AsyncFlags.Ready */
1275
1293
  );
1276
1294
  return (this._flags & 8) !== 0;
1277
1295
  }
1278
1296
  get isSettled() {
1279
1297
  this._consumeFlags(
1280
1298
  6
1281
- /* Settled */
1299
+ /* AsyncFlags.Settled */
1282
1300
  );
1283
1301
  return (this._flags & 6) !== 0;
1284
1302
  }
@@ -1294,13 +1312,7 @@ class ReactivePromiseImpl {
1294
1312
  }
1295
1313
  ref = currentConsumer.ref;
1296
1314
  const prevEdge = this._awaitSubs.get(ref) ?? findAndRemoveDirty(currentConsumer, this);
1297
- edge = createEdge(
1298
- prevEdge,
1299
- EdgeType.Promise,
1300
- this,
1301
- this._updatedCount,
1302
- currentConsumer.computedCount
1303
- );
1315
+ edge = createEdge(prevEdge, 1, this, this._updatedCount, currentConsumer.computedCount);
1304
1316
  }
1305
1317
  const wrappedFulfilled = onfulfilled ? (value) => {
1306
1318
  try {
@@ -1336,16 +1348,13 @@ class ReactivePromiseImpl {
1336
1348
  return this.then(null, onrejected);
1337
1349
  }
1338
1350
  finally(onfinally) {
1339
- return this.then(
1340
- (value) => {
1341
- onfinally?.();
1342
- return value;
1343
- },
1344
- (reason) => {
1345
- onfinally?.();
1346
- throw reason;
1347
- }
1348
- );
1351
+ return this.then((value) => {
1352
+ onfinally?.();
1353
+ return value;
1354
+ }, (reason) => {
1355
+ onfinally?.();
1356
+ throw reason;
1357
+ });
1349
1358
  }
1350
1359
  get [Symbol.toStringTag]() {
1351
1360
  return `ReactivePromise`;
@@ -1367,7 +1376,7 @@ function createPromise(promise, signal2) {
1367
1376
  p["_equals"] = signal2.def.equals;
1368
1377
  p["_initFlags"](
1369
1378
  1
1370
- /* Pending */
1379
+ /* AsyncFlags.Pending */
1371
1380
  );
1372
1381
  p["_setPromise"](promise);
1373
1382
  return p;
@@ -1384,11 +1393,14 @@ function createRelay(activate, scope, opts) {
1384
1393
  }
1385
1394
  const signal2 = p["_signal"];
1386
1395
  signal2.subs = /* @__PURE__ */ new Map();
1387
- signal2._state = ReactiveFnState.Dirty;
1396
+ signal2._state = 2;
1388
1397
  active = false;
1389
1398
  currentSub = void 0;
1390
1399
  };
1391
1400
  const state = {
1401
+ get isPending() {
1402
+ return (p["_flags"] & 1) !== 0;
1403
+ },
1392
1404
  get value() {
1393
1405
  return p["_value"];
1394
1406
  },
@@ -1426,7 +1438,7 @@ function createRelay(activate, scope, opts) {
1426
1438
  p["_equals"] = equalsFrom(opts?.equals);
1427
1439
  p["_initFlags"](
1428
1440
  128 | 1
1429
- /* Pending */
1441
+ /* AsyncFlags.Pending */
1430
1442
  );
1431
1443
  return p;
1432
1444
  }
@@ -1436,9 +1448,13 @@ function createTask(task, scope, opts) {
1436
1448
  p["_equals"] = equalsFrom(opts?.equals);
1437
1449
  p["_initFlags"](
1438
1450
  64
1439
- /* isRunnable */
1451
+ /* AsyncFlags.isRunnable */
1440
1452
  );
1453
+ const throwIfRunning = opts?.throwIfRunning === true;
1441
1454
  p["run"] = ((...args) => {
1455
+ if (throwIfRunning && (p["_flags"] & 1) !== 0) {
1456
+ throw new Error("Task is already running");
1457
+ }
1442
1458
  p._setPromise(fn(...args));
1443
1459
  return p;
1444
1460
  });
@@ -1455,12 +1471,12 @@ function getSignal(signal2) {
1455
1471
  if (prevEdge === void 0) {
1456
1472
  {
1457
1473
  getTracerProxy()?.emit({
1458
- type: TracerEventType.Connected,
1474
+ type: exports.TracerEventType.Connected,
1459
1475
  id: currentConsumer.tracerMeta.id,
1460
1476
  childId: signal2.tracerMeta.id,
1461
1477
  name: signal2.tracerMeta.desc,
1462
1478
  params: signal2.tracerMeta.params,
1463
- nodeType: SignalType.Reactive
1479
+ nodeType: exports.SignalType.Reactive
1464
1480
  });
1465
1481
  }
1466
1482
  if (currentConsumer.watchCount > 0) {
@@ -1468,7 +1484,7 @@ function getSignal(signal2) {
1468
1484
  }
1469
1485
  }
1470
1486
  const updatedAt = checkSignal(signal2);
1471
- const newEdge = createEdge(prevEdge, EdgeType.Signal, signal2, updatedAt, computedCount);
1487
+ const newEdge = createEdge(prevEdge, 0, signal2, updatedAt, computedCount);
1472
1488
  signal2.subs.set(ref, newEdge);
1473
1489
  deps.set(signal2, newEdge);
1474
1490
  } else {
@@ -1484,26 +1500,26 @@ function getSignal(signal2) {
1484
1500
  }
1485
1501
  function checkSignal(signal2) {
1486
1502
  const { ref, _state: state } = signal2;
1487
- if (state < ReactiveFnState.Dirty) {
1503
+ if (state < 2) {
1488
1504
  return signal2.updatedCount;
1489
1505
  }
1490
- if (state >= ReactiveFnState.MaybeDirty) {
1506
+ if (state >= 3) {
1491
1507
  let edge = signal2.dirtyHead;
1492
1508
  while (edge !== void 0) {
1493
- if (edge.type === EdgeType.Promise) {
1509
+ if (edge.type === 1) {
1494
1510
  const dep2 = edge.dep;
1495
1511
  if (dep2._getPending()) {
1496
1512
  const value = signal2._value;
1497
1513
  dep2["_awaitSubs"].set(ref, edge);
1498
1514
  value._setPending();
1499
- signal2._state = ReactiveFnState.Pending;
1515
+ signal2._state = 1;
1500
1516
  signal2.dirtyHead = edge;
1501
1517
  return signal2.updatedCount;
1502
1518
  } else if (edge.updatedAt === edge.dep._updatedCount) {
1503
1519
  dep2["_awaitSubs"].set(ref, edge);
1504
1520
  } else {
1505
1521
  signal2.dirtyHead = edge.nextDirty;
1506
- signal2._state = ReactiveFnState.Dirty;
1522
+ signal2._state = 2;
1507
1523
  break;
1508
1524
  }
1509
1525
  edge = edge.nextDirty;
@@ -1514,23 +1530,23 @@ function checkSignal(signal2) {
1514
1530
  dep.subs.set(ref, edge);
1515
1531
  if (edge.updatedAt !== updatedAt) {
1516
1532
  signal2.dirtyHead = edge.nextDirty;
1517
- signal2._state = ReactiveFnState.Dirty;
1533
+ signal2._state = 2;
1518
1534
  break;
1519
1535
  }
1520
1536
  edge = edge.nextDirty;
1521
1537
  }
1522
1538
  }
1523
1539
  const newState = signal2._state;
1524
- if (newState === ReactiveFnState.Dirty) {
1540
+ if (newState === 2) {
1525
1541
  if (signal2._isLazy) {
1526
1542
  signal2.updatedCount++;
1527
1543
  } else {
1528
1544
  runSignal(signal2);
1529
1545
  }
1530
- } else if (newState === ReactiveFnState.PendingDirty) {
1546
+ } else if (newState === 4) {
1531
1547
  signal2._value._clearPending();
1532
1548
  }
1533
- signal2._state = ReactiveFnState.Clean;
1549
+ signal2._state = 0;
1534
1550
  signal2.dirtyHead = void 0;
1535
1551
  if (getTracerProxy() !== void 0 && signal2.tracerMeta?.tracer) {
1536
1552
  scheduleTracer(signal2.tracerMeta.tracer);
@@ -1542,7 +1558,7 @@ function runSignal(signal2) {
1542
1558
  {
1543
1559
  tracer = getTracerProxy();
1544
1560
  tracer?.emit({
1545
- type: TracerEventType.StartUpdate,
1561
+ type: exports.TracerEventType.StartUpdate,
1546
1562
  id: signal2.tracerMeta.id
1547
1563
  });
1548
1564
  }
@@ -1581,7 +1597,7 @@ function runSignal(signal2) {
1581
1597
  setCurrentConsumer(prevConsumer);
1582
1598
  {
1583
1599
  tracer?.emit({
1584
- type: TracerEventType.EndUpdate,
1600
+ type: exports.TracerEventType.EndUpdate,
1585
1601
  id: signal2.tracerMeta.id,
1586
1602
  value: isRelay(signal2) ? "..." : signal2._value
1587
1603
  });
@@ -1717,56 +1733,56 @@ function hashDate(date, _seen) {
1717
1733
  return hashNumber(
1718
1734
  date.getTime(),
1719
1735
  14
1720
- /* DATE */
1736
+ /* HashType.DATE */
1721
1737
  );
1722
1738
  }
1723
1739
  function hashRegExp(regexp, _seen) {
1724
1740
  const h = hashStr(
1725
1741
  regexp.source + regexp.flags,
1726
1742
  15
1727
- /* REGEXP */
1743
+ /* HashType.REGEXP */
1728
1744
  );
1729
1745
  return (h ^ regexp.lastIndex) >>> 0;
1730
1746
  }
1731
1747
  const UNDEFINED = hashStr(
1732
1748
  "undefined",
1733
1749
  0
1734
- /* UNDEFINED */
1750
+ /* HashType.UNDEFINED */
1735
1751
  );
1736
1752
  const NULL = hashStr(
1737
1753
  "null",
1738
1754
  1
1739
- /* NULL */
1755
+ /* HashType.NULL */
1740
1756
  );
1741
1757
  const TRUE = hashStr(
1742
1758
  "true",
1743
1759
  2
1744
- /* TRUE */
1760
+ /* HashType.TRUE */
1745
1761
  );
1746
1762
  const FALSE = hashStr(
1747
1763
  "false",
1748
1764
  3
1749
- /* FALSE */
1765
+ /* HashType.FALSE */
1750
1766
  );
1751
1767
  const ARRAY = hashStr(
1752
1768
  "array",
1753
1769
  7
1754
- /* ARRAY */
1770
+ /* HashType.ARRAY */
1755
1771
  );
1756
1772
  const OBJECT = hashStr(
1757
1773
  "object",
1758
1774
  8
1759
- /* OBJECT */
1775
+ /* HashType.OBJECT */
1760
1776
  );
1761
1777
  const SET = hashStr(
1762
1778
  "set",
1763
1779
  13
1764
- /* SET */
1780
+ /* HashType.SET */
1765
1781
  );
1766
1782
  const MAP = hashStr(
1767
1783
  "map",
1768
1784
  12
1769
- /* MAP */
1785
+ /* HashType.MAP */
1770
1786
  );
1771
1787
  const getObjectProto = Object.getPrototypeOf;
1772
1788
  const PROTO_TO_HASH = /* @__PURE__ */ new Map([
@@ -1790,19 +1806,19 @@ function hashValue(node, seen = []) {
1790
1806
  return hashStr(
1791
1807
  String(node),
1792
1808
  4
1793
- /* NUMBER */
1809
+ /* HashType.NUMBER */
1794
1810
  );
1795
1811
  case "string":
1796
1812
  return hashStr(
1797
1813
  node,
1798
1814
  5
1799
- /* STRING */
1815
+ /* HashType.STRING */
1800
1816
  );
1801
1817
  case "bigint":
1802
1818
  return hashStr(
1803
1819
  node.toString(),
1804
1820
  6
1805
- /* BIGINT */
1821
+ /* HashType.BIGINT */
1806
1822
  );
1807
1823
  case "object": {
1808
1824
  if (node === null) {
@@ -1813,7 +1829,7 @@ function hashValue(node, seen = []) {
1813
1829
  return hashStr(
1814
1830
  String(index),
1815
1831
  11
1816
- /* CYCLE */
1832
+ /* HashType.CYCLE */
1817
1833
  );
1818
1834
  }
1819
1835
  const hashFn = PROTO_TO_HASH.get(getObjectProto(node));
@@ -1831,7 +1847,7 @@ function hashValue(node, seen = []) {
1831
1847
  return hashStr(
1832
1848
  node.toString(),
1833
1849
  10
1834
- /* SYMBOL */
1850
+ /* HashType.SYMBOL */
1835
1851
  );
1836
1852
  }
1837
1853
  }
@@ -1843,7 +1859,7 @@ function getObjectHash(obj) {
1843
1859
  id = hashNumber(
1844
1860
  nextHashMapId++,
1845
1861
  9
1846
- /* REFERENCE */
1862
+ /* HashType.REFERENCE */
1847
1863
  );
1848
1864
  objectToHashMap.set(obj, id);
1849
1865
  }
@@ -1877,8 +1893,10 @@ function isPlainArray(arr) {
1877
1893
  return Array.isArray(arr);
1878
1894
  }
1879
1895
  function stringifyValue(value) {
1880
- if (value === null) return "null";
1881
- if (value === void 0) return "undefined";
1896
+ if (value === null)
1897
+ return "null";
1898
+ if (value === void 0)
1899
+ return "undefined";
1882
1900
  switch (typeof value) {
1883
1901
  case "number":
1884
1902
  case "boolean":
@@ -1910,25 +1928,21 @@ function stringifyValue(value) {
1910
1928
  return getObjectId(value);
1911
1929
  }
1912
1930
  }
1913
- var ReactiveFnState = /* @__PURE__ */ ((ReactiveFnState2) => {
1914
- ReactiveFnState2[ReactiveFnState2["Clean"] = 0] = "Clean";
1915
- ReactiveFnState2[ReactiveFnState2["Pending"] = 1] = "Pending";
1916
- ReactiveFnState2[ReactiveFnState2["Dirty"] = 2] = "Dirty";
1917
- ReactiveFnState2[ReactiveFnState2["MaybeDirty"] = 3] = "MaybeDirty";
1918
- ReactiveFnState2[ReactiveFnState2["PendingDirty"] = 4] = "PendingDirty";
1919
- return ReactiveFnState2;
1920
- })(ReactiveFnState || {});
1921
1931
  let ID = 0;
1922
1932
  function createReactiveDefinition(id, desc, compute, equals, isRelay2, paramKey, tracer) {
1923
- return {
1924
- id,
1925
- desc,
1933
+ const def = {
1926
1934
  compute,
1927
1935
  equals: equalsFrom(equals),
1928
1936
  isRelay: isRelay2,
1929
1937
  paramKey,
1930
- tracer
1938
+ tracer: void 0
1931
1939
  };
1940
+ {
1941
+ def.id = id;
1942
+ def.desc = desc;
1943
+ def.tracer = tracer;
1944
+ }
1945
+ return def;
1932
1946
  }
1933
1947
  class ReactiveSignal {
1934
1948
  // Bitmask containing state in the first 2 bits and boolean properties in the remaining bits
@@ -2005,22 +2019,33 @@ class ReactiveSignal {
2005
2019
  get listeners() {
2006
2020
  return this._listeners ?? (this._listeners = {
2007
2021
  updatedAt: 0,
2008
- current: /* @__PURE__ */ new Set(),
2022
+ current: /* @__PURE__ */ new Map(),
2009
2023
  cachedBoundAdd: this.addListener.bind(this)
2010
2024
  });
2011
2025
  }
2012
2026
  get value() {
2013
2027
  return getSignal(this);
2014
2028
  }
2015
- addListener(listener) {
2029
+ addListener(listener, opts) {
2016
2030
  const { current } = this.listeners;
2017
2031
  if (!current.has(listener)) {
2032
+ let effective = listener;
2033
+ if (opts?.skipInitial) {
2034
+ let initial = true;
2035
+ effective = () => {
2036
+ if (initial) {
2037
+ initial = false;
2038
+ return;
2039
+ }
2040
+ listener();
2041
+ };
2042
+ }
2018
2043
  if (!this._isListener) {
2019
2044
  watchSignal(this, this._isSuspended);
2020
2045
  this.flags |= 16;
2021
2046
  }
2022
2047
  schedulePull(this);
2023
- current.add(listener);
2048
+ current.set(listener, effective);
2024
2049
  }
2025
2050
  return () => {
2026
2051
  if (current.has(listener)) {
@@ -2029,6 +2054,7 @@ class ReactiveSignal {
2029
2054
  cancelPull(this);
2030
2055
  unwatchSignal(this, this._isSuspended);
2031
2056
  this.flags &= -17;
2057
+ this.listeners.updatedAt = 0;
2032
2058
  }
2033
2059
  }
2034
2060
  };
@@ -2076,7 +2102,7 @@ const runListeners = (signal2) => {
2076
2102
  return;
2077
2103
  }
2078
2104
  const { current } = listeners;
2079
- for (const listener of current) {
2105
+ for (const listener of current.values()) {
2080
2106
  listener();
2081
2107
  }
2082
2108
  };
@@ -2088,13 +2114,14 @@ function createReactiveSignal(def, args = [], key, scope) {
2088
2114
  }
2089
2115
  let CONTEXT_ID = 0;
2090
2116
  class ContextImpl {
2117
+ defaultValue;
2118
+ _key;
2119
+ _description;
2091
2120
  constructor(defaultValue, desc) {
2092
2121
  this.defaultValue = defaultValue;
2093
2122
  this._description = desc ?? `context:${CONTEXT_ID++}`;
2094
2123
  this._key = Symbol(this._description);
2095
2124
  }
2096
- _key;
2097
- _description;
2098
2125
  }
2099
2126
  const context = (initialValue, description) => {
2100
2127
  return new ContextImpl(initialValue, description);
@@ -2112,9 +2139,7 @@ function withContexts(contexts, fn) {
2112
2139
  const getContext = (context2) => {
2113
2140
  const scope = CURRENT_SCOPE ?? getCurrentConsumer()?.scope;
2114
2141
  if (scope === void 0) {
2115
- throw new Error(
2116
- "getContext must be used within a reactive function, a withContext, or within a framework-specific context provider."
2117
- );
2142
+ throw new Error("getContext must be used within a reactive function, a withContext, or within a framework-specific context provider.");
2118
2143
  }
2119
2144
  return scope.getContext(context2) ?? context2.defaultValue;
2120
2145
  };
@@ -2233,9 +2258,7 @@ const getScopeOwner = (obj) => {
2233
2258
  };
2234
2259
  exports.ReactivePromise = ReactivePromise;
2235
2260
  exports.SignalScope = SignalScope;
2236
- exports.SignalType = SignalType;
2237
2261
  exports.Tracer = Tracer;
2238
- exports.TracerEventType = TracerEventType;
2239
2262
  exports.VisualizerNode = VisualizerNode;
2240
2263
  exports.callback = callback;
2241
2264
  exports.clearGlobalContexts = clearGlobalContexts;
@@ -2271,4 +2294,4 @@ exports.signal = signal;
2271
2294
  exports.unwatchSignal = unwatchSignal;
2272
2295
  exports.watchSignal = watchSignal;
2273
2296
  exports.withContexts = withContexts;
2274
- //# sourceMappingURL=debug-DuXQhd5q.js.map
2297
+ //# sourceMappingURL=debug-gCDAvnLM.js.map