@fluixi/reactive 1.0.0-alpha.95 → 1.0.0-alpha.96

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 (69) hide show
  1. package/dist/cdn/reactive.cjs +14 -3
  2. package/dist/cdn/reactive.global.js +2 -2
  3. package/dist/cdn/reactive.mjs +14 -3
  4. package/dist/cdn/signal.cjs +1 -1
  5. package/dist/cdn/signal.global.js +2 -2
  6. package/dist/cdn/signal.mjs +1 -1
  7. package/dist/index.cjs +14 -3
  8. package/dist/index.mjs +14 -3
  9. package/dist/lib/index.cjs +15 -4
  10. package/dist/lib/index.mjs +15 -4
  11. package/dist/lib/observable/index.cjs +1 -1
  12. package/dist/lib/observable/index.mjs +1 -1
  13. package/dist/lib/signal/api.cjs +23 -3
  14. package/dist/lib/signal/api.mjs +23 -3
  15. package/dist/lib/signal/cached-resource.cjs +14 -3
  16. package/dist/lib/signal/cached-resource.mjs +14 -3
  17. package/dist/lib/signal/graph/children.cjs +1 -1
  18. package/dist/lib/signal/graph/children.mjs +1 -1
  19. package/dist/lib/signal/graph/compat.cjs +15 -4
  20. package/dist/lib/signal/graph/compat.mjs +15 -4
  21. package/dist/lib/signal/graph/core.cjs +2 -2
  22. package/dist/lib/signal/graph/core.mjs +2 -2
  23. package/dist/lib/signal/graph/debounced.cjs +13 -2
  24. package/dist/lib/signal/graph/debounced.mjs +13 -2
  25. package/dist/lib/signal/graph/derived.cjs +13 -2
  26. package/dist/lib/signal/graph/derived.mjs +13 -2
  27. package/dist/lib/signal/graph/error-boundary.cjs +13 -2
  28. package/dist/lib/signal/graph/error-boundary.mjs +13 -2
  29. package/dist/lib/signal/graph/index.cjs +2 -2
  30. package/dist/lib/signal/graph/index.mjs +2 -2
  31. package/dist/lib/signal/graph/observe.cjs +1 -1
  32. package/dist/lib/signal/graph/observe.mjs +1 -1
  33. package/dist/lib/signal/graph/resource.cjs +13 -2
  34. package/dist/lib/signal/graph/resource.mjs +13 -2
  35. package/dist/lib/signal/graph/runtime.cjs +23 -3
  36. package/dist/lib/signal/graph/runtime.d.ts +4 -1
  37. package/dist/lib/signal/graph/runtime.d.ts.map +1 -1
  38. package/dist/lib/signal/graph/runtime.js +23 -4
  39. package/dist/lib/signal/graph/runtime.mjs +23 -3
  40. package/dist/lib/signal/graph/signal-next.cjs +15 -4
  41. package/dist/lib/signal/graph/signal-next.mjs +15 -4
  42. package/dist/lib/signal/graph/state.cjs +1 -1
  43. package/dist/lib/signal/graph/state.mjs +1 -1
  44. package/dist/lib/signal/graph/suspense.cjs +13 -2
  45. package/dist/lib/signal/graph/suspense.mjs +13 -2
  46. package/dist/lib/signal/index-legacy.cjs +15 -4
  47. package/dist/lib/signal/index-legacy.mjs +15 -4
  48. package/dist/lib/signal/index.cjs +15 -4
  49. package/dist/lib/signal/index.mjs +15 -4
  50. package/dist/lib/signal/list.cjs +14 -3
  51. package/dist/lib/signal/list.mjs +14 -3
  52. package/dist/lib/signal/resource-api.cjs +13 -2
  53. package/dist/lib/signal/resource-api.mjs +13 -2
  54. package/dist/lib/signal/signal.cjs +13 -2
  55. package/dist/lib/signal/signal.mjs +13 -2
  56. package/dist/lib/signal/utilities.cjs +14 -3
  57. package/dist/lib/signal/utilities.mjs +14 -3
  58. package/dist/lib/store/api.cjs +1 -1
  59. package/dist/lib/store/api.mjs +1 -1
  60. package/dist/lib/store/index.cjs +2 -2
  61. package/dist/lib/store/index.mjs +2 -2
  62. package/dist/lib/store/store.cjs +1 -1
  63. package/dist/lib/store/store.mjs +1 -1
  64. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  65. package/dist/version.generated.cjs +2 -2
  66. package/dist/version.generated.d.ts +1 -1
  67. package/dist/version.generated.js +1 -1
  68. package/dist/version.generated.mjs +2 -2
  69. package/package.json +2 -2
@@ -44,7 +44,7 @@ __export(runtime_exports, {
44
44
  module.exports = __toCommonJS(runtime_exports);
45
45
 
46
46
  // src/version.generated.ts
47
- var VERSION = "1.0.0-alpha.95";
47
+ var VERSION = "1.0.0-alpha.96";
48
48
 
49
49
  // src/lib/signal/graph/state.ts
50
50
  var MAJOR = VERSION.split(".")[0];
@@ -286,6 +286,15 @@ var Watcher = class {
286
286
  if (wasEmpty) this._notifyFn();
287
287
  }
288
288
  };
289
+ function untrack(fn) {
290
+ if (G.untracked) return fn();
291
+ G.untracked = true;
292
+ try {
293
+ return fn();
294
+ } finally {
295
+ G.untracked = false;
296
+ }
297
+ }
289
298
 
290
299
  // src/lib/signal/graph/runtime.ts
291
300
  function createChildOwner(parent) {
@@ -409,7 +418,7 @@ function createRoot(fn) {
409
418
  const prev = G.owner;
410
419
  G.owner = owner;
411
420
  try {
412
- return fn(() => disposeOwner(owner));
421
+ return untrack(() => fn(() => disposeOwner(owner)));
413
422
  } finally {
414
423
  G.owner = prev;
415
424
  }
@@ -431,6 +440,8 @@ function flushSync() {
431
440
  if (G.flushing) return;
432
441
  G.flushing = true;
433
442
  let guard = 0;
443
+ let failed = false;
444
+ let first;
434
445
  try {
435
446
  while (G.queue.length) {
436
447
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -438,12 +449,21 @@ function flushSync() {
438
449
  G.queue = [];
439
450
  for (const e of batchOf) {
440
451
  e.queued = false;
441
- if (!e.disposed) e.run();
452
+ if (e.disposed) continue;
453
+ try {
454
+ e.run();
455
+ } catch (error) {
456
+ if (!failed) {
457
+ failed = true;
458
+ first = error;
459
+ }
460
+ }
442
461
  }
443
462
  }
444
463
  } finally {
445
464
  G.flushing = false;
446
465
  }
466
+ if (failed) throw first;
447
467
  }
448
468
  function afterWrite() {
449
469
  if (G.batchDepth === 0) flushSync();
@@ -58,7 +58,10 @@ export declare function setOwner(owner: Owner | null): Owner | null;
58
58
  export declare function runWithOwner<T>(owner: Owner | null, fn: () => T): T;
59
59
  /** Register a teardown for the current owner scope. */
60
60
  export declare function onCleanup(fn: () => void): void;
61
- /** Create a root reactive scope with explicit disposal (TC39 has no ownership). */
61
+ /**
62
+ * Create a root reactive scope with explicit disposal (TC39 has no ownership). Untracked: what
63
+ * runs in it belongs to it, so the computation that created it does not depend on its reads.
64
+ */
62
65
  export declare function createRoot<T>(fn: (dispose: () => void) => T): T;
63
66
  export declare function setScheduler(fn: ((run: () => void) => void) | null): void;
64
67
  /** Drain all pending effects now (synchronously). */
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/lib/signal/graph/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/lib/signal/graph/runtime.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@
18
18
  * watcher's notify only schedules, and the re-run, a tracked recompute, happens on
19
19
  * flush.
20
20
  */
21
- import { Computed, Watcher } from './core.js';
21
+ import { Computed, Watcher, untrack } from './core.js';
22
22
  import { G } from './state.js';
23
23
  import { reportReactiveContext, reportReactiveContextCreated, reportReactiveDispose, reportReactiveNode, } from './observe.js';
24
24
  /**
@@ -189,7 +189,10 @@ function disposeOwner(owner, final = true) {
189
189
  if (final)
190
190
  owner.disposed = true;
191
191
  }
192
- /** Create a root reactive scope with explicit disposal (TC39 has no ownership). */
192
+ /**
193
+ * Create a root reactive scope with explicit disposal (TC39 has no ownership). Untracked: what
194
+ * runs in it belongs to it, so the computation that created it does not depend on its reads.
195
+ */
193
196
  export function createRoot(fn) {
194
197
  const owner = makeOwner(G.owner);
195
198
  if (G.owner)
@@ -197,7 +200,7 @@ export function createRoot(fn) {
197
200
  const prev = G.owner;
198
201
  G.owner = owner;
199
202
  try {
200
- return fn(() => disposeOwner(owner));
203
+ return untrack(() => fn(() => disposeOwner(owner)));
201
204
  }
202
205
  finally {
203
206
  G.owner = prev;
@@ -227,6 +230,11 @@ export function flushSync() {
227
230
  return;
228
231
  G.flushing = true;
229
232
  let guard = 0;
233
+ // An effect that throws must not stop the rest: those queued after it would be dropped
234
+ // with their `queued` mark still set, so nothing could ever run them again. The first
235
+ // error is rethrown once the queue is drained.
236
+ let failed = false;
237
+ let first;
230
238
  try {
231
239
  while (G.queue.length) {
232
240
  if (++guard > 100000)
@@ -235,14 +243,25 @@ export function flushSync() {
235
243
  G.queue = [];
236
244
  for (const e of batchOf) {
237
245
  e.queued = false;
238
- if (!e.disposed)
246
+ if (e.disposed)
247
+ continue;
248
+ try {
239
249
  e.run();
250
+ }
251
+ catch (error) {
252
+ if (!failed) {
253
+ failed = true;
254
+ first = error;
255
+ }
256
+ }
240
257
  }
241
258
  }
242
259
  }
243
260
  finally {
244
261
  G.flushing = false;
245
262
  }
263
+ if (failed)
264
+ throw first;
246
265
  }
247
266
  /**
248
267
  * Run pending effects after a write completes, but only at the top level (not
@@ -1,5 +1,5 @@
1
1
  // src/version.generated.ts
2
- var VERSION = "1.0.0-alpha.95";
2
+ var VERSION = "1.0.0-alpha.96";
3
3
 
4
4
  // src/lib/signal/graph/state.ts
5
5
  var MAJOR = VERSION.split(".")[0];
@@ -241,6 +241,15 @@ var Watcher = class {
241
241
  if (wasEmpty) this._notifyFn();
242
242
  }
243
243
  };
244
+ function untrack(fn) {
245
+ if (G.untracked) return fn();
246
+ G.untracked = true;
247
+ try {
248
+ return fn();
249
+ } finally {
250
+ G.untracked = false;
251
+ }
252
+ }
244
253
 
245
254
  // src/lib/signal/graph/runtime.ts
246
255
  function createChildOwner(parent) {
@@ -364,7 +373,7 @@ function createRoot(fn) {
364
373
  const prev = G.owner;
365
374
  G.owner = owner;
366
375
  try {
367
- return fn(() => disposeOwner(owner));
376
+ return untrack(() => fn(() => disposeOwner(owner)));
368
377
  } finally {
369
378
  G.owner = prev;
370
379
  }
@@ -386,6 +395,8 @@ function flushSync() {
386
395
  if (G.flushing) return;
387
396
  G.flushing = true;
388
397
  let guard = 0;
398
+ let failed = false;
399
+ let first;
389
400
  try {
390
401
  while (G.queue.length) {
391
402
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -393,12 +404,21 @@ function flushSync() {
393
404
  G.queue = [];
394
405
  for (const e of batchOf) {
395
406
  e.queued = false;
396
- if (!e.disposed) e.run();
407
+ if (e.disposed) continue;
408
+ try {
409
+ e.run();
410
+ } catch (error) {
411
+ if (!failed) {
412
+ failed = true;
413
+ first = error;
414
+ }
415
+ }
397
416
  }
398
417
  }
399
418
  } finally {
400
419
  G.flushing = false;
401
420
  }
421
+ if (failed) throw first;
402
422
  }
403
423
  function afterWrite() {
404
424
  if (G.batchDepth === 0) flushSync();
@@ -1,4 +1,4 @@
1
- /*! @fluixi/reactive v1.0.0-alpha.95 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
1
+ /*! @fluixi/reactive v1.0.0-alpha.96 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
2
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -84,7 +84,7 @@ __export(signal_next_exports, {
84
84
  module.exports = __toCommonJS(signal_next_exports);
85
85
 
86
86
  // src/version.generated.ts
87
- var VERSION = "1.0.0-alpha.95";
87
+ var VERSION = "1.0.0-alpha.96";
88
88
 
89
89
  // src/lib/signal/graph/state.ts
90
90
  var MAJOR = VERSION.split(".")[0];
@@ -493,7 +493,7 @@ function createRoot(fn) {
493
493
  const prev = G.owner;
494
494
  G.owner = owner;
495
495
  try {
496
- return fn(() => disposeOwner(owner));
496
+ return untrack(() => fn(() => disposeOwner(owner)));
497
497
  } finally {
498
498
  G.owner = prev;
499
499
  }
@@ -515,6 +515,8 @@ function flushSync() {
515
515
  if (G.flushing) return;
516
516
  G.flushing = true;
517
517
  let guard = 0;
518
+ let failed = false;
519
+ let first;
518
520
  try {
519
521
  while (G.queue.length) {
520
522
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -522,12 +524,21 @@ function flushSync() {
522
524
  G.queue = [];
523
525
  for (const e of batchOf) {
524
526
  e.queued = false;
525
- if (!e.disposed) e.run();
527
+ if (e.disposed) continue;
528
+ try {
529
+ e.run();
530
+ } catch (error) {
531
+ if (!failed) {
532
+ failed = true;
533
+ first = error;
534
+ }
535
+ }
526
536
  }
527
537
  }
528
538
  } finally {
529
539
  G.flushing = false;
530
540
  }
541
+ if (failed) throw first;
531
542
  }
532
543
  function afterWrite() {
533
544
  if (G.batchDepth === 0) flushSync();
@@ -1,7 +1,7 @@
1
- /*! @fluixi/reactive v1.0.0-alpha.95 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
1
+ /*! @fluixi/reactive v1.0.0-alpha.96 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
2
 
3
3
  // src/version.generated.ts
4
- var VERSION = "1.0.0-alpha.95";
4
+ var VERSION = "1.0.0-alpha.96";
5
5
 
6
6
  // src/lib/signal/graph/state.ts
7
7
  var MAJOR = VERSION.split(".")[0];
@@ -410,7 +410,7 @@ function createRoot(fn) {
410
410
  const prev = G.owner;
411
411
  G.owner = owner;
412
412
  try {
413
- return fn(() => disposeOwner(owner));
413
+ return untrack(() => fn(() => disposeOwner(owner)));
414
414
  } finally {
415
415
  G.owner = prev;
416
416
  }
@@ -432,6 +432,8 @@ function flushSync() {
432
432
  if (G.flushing) return;
433
433
  G.flushing = true;
434
434
  let guard = 0;
435
+ let failed = false;
436
+ let first;
435
437
  try {
436
438
  while (G.queue.length) {
437
439
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -439,12 +441,21 @@ function flushSync() {
439
441
  G.queue = [];
440
442
  for (const e of batchOf) {
441
443
  e.queued = false;
442
- if (!e.disposed) e.run();
444
+ if (e.disposed) continue;
445
+ try {
446
+ e.run();
447
+ } catch (error) {
448
+ if (!failed) {
449
+ failed = true;
450
+ first = error;
451
+ }
452
+ }
443
453
  }
444
454
  }
445
455
  } finally {
446
456
  G.flushing = false;
447
457
  }
458
+ if (failed) throw first;
448
459
  }
449
460
  function afterWrite() {
450
461
  if (G.batchDepth === 0) flushSync();
@@ -27,7 +27,7 @@ __export(state_exports, {
27
27
  module.exports = __toCommonJS(state_exports);
28
28
 
29
29
  // src/version.generated.ts
30
- var VERSION = "1.0.0-alpha.95";
30
+ var VERSION = "1.0.0-alpha.96";
31
31
 
32
32
  // src/lib/signal/graph/state.ts
33
33
  var MAJOR = VERSION.split(".")[0];
@@ -1,5 +1,5 @@
1
1
  // src/version.generated.ts
2
- var VERSION = "1.0.0-alpha.95";
2
+ var VERSION = "1.0.0-alpha.96";
3
3
 
4
4
  // src/lib/signal/graph/state.ts
5
5
  var MAJOR = VERSION.split(".")[0];
@@ -27,7 +27,7 @@ __export(suspense_exports, {
27
27
  module.exports = __toCommonJS(suspense_exports);
28
28
 
29
29
  // src/version.generated.ts
30
- var VERSION = "1.0.0-alpha.95";
30
+ var VERSION = "1.0.0-alpha.96";
31
31
 
32
32
  // src/lib/signal/graph/state.ts
33
33
  var MAJOR = VERSION.split(".")[0];
@@ -225,6 +225,8 @@ function flushSync() {
225
225
  if (G.flushing) return;
226
226
  G.flushing = true;
227
227
  let guard = 0;
228
+ let failed = false;
229
+ let first;
228
230
  try {
229
231
  while (G.queue.length) {
230
232
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -232,12 +234,21 @@ function flushSync() {
232
234
  G.queue = [];
233
235
  for (const e of batchOf) {
234
236
  e.queued = false;
235
- if (!e.disposed) e.run();
237
+ if (e.disposed) continue;
238
+ try {
239
+ e.run();
240
+ } catch (error) {
241
+ if (!failed) {
242
+ failed = true;
243
+ first = error;
244
+ }
245
+ }
236
246
  }
237
247
  }
238
248
  } finally {
239
249
  G.flushing = false;
240
250
  }
251
+ if (failed) throw first;
241
252
  }
242
253
  function afterWrite() {
243
254
  if (G.batchDepth === 0) flushSync();
@@ -1,5 +1,5 @@
1
1
  // src/version.generated.ts
2
- var VERSION = "1.0.0-alpha.95";
2
+ var VERSION = "1.0.0-alpha.96";
3
3
 
4
4
  // src/lib/signal/graph/state.ts
5
5
  var MAJOR = VERSION.split(".")[0];
@@ -197,6 +197,8 @@ function flushSync() {
197
197
  if (G.flushing) return;
198
198
  G.flushing = true;
199
199
  let guard = 0;
200
+ let failed = false;
201
+ let first;
200
202
  try {
201
203
  while (G.queue.length) {
202
204
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -204,12 +206,21 @@ function flushSync() {
204
206
  G.queue = [];
205
207
  for (const e of batchOf) {
206
208
  e.queued = false;
207
- if (!e.disposed) e.run();
209
+ if (e.disposed) continue;
210
+ try {
211
+ e.run();
212
+ } catch (error) {
213
+ if (!failed) {
214
+ failed = true;
215
+ first = error;
216
+ }
217
+ }
208
218
  }
209
219
  }
210
220
  } finally {
211
221
  G.flushing = false;
212
222
  }
223
+ if (failed) throw first;
213
224
  }
214
225
  function afterWrite() {
215
226
  if (G.batchDepth === 0) flushSync();
@@ -1,4 +1,4 @@
1
- /*! @fluixi/reactive v1.0.0-alpha.95 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
1
+ /*! @fluixi/reactive v1.0.0-alpha.96 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
2
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -494,7 +494,7 @@ function makeArrayFlat(values) {
494
494
  }
495
495
 
496
496
  // src/version.generated.ts
497
- var VERSION = "1.0.0-alpha.95";
497
+ var VERSION = "1.0.0-alpha.96";
498
498
 
499
499
  // src/lib/signal/graph/state.ts
500
500
  var MAJOR = VERSION.split(".")[0];
@@ -816,7 +816,7 @@ function createRoot(fn) {
816
816
  const prev = G.owner;
817
817
  G.owner = owner;
818
818
  try {
819
- return fn(() => disposeOwner(owner));
819
+ return untrack(() => fn(() => disposeOwner(owner)));
820
820
  } finally {
821
821
  G.owner = prev;
822
822
  }
@@ -838,6 +838,8 @@ function flushSync() {
838
838
  if (G.flushing) return;
839
839
  G.flushing = true;
840
840
  let guard = 0;
841
+ let failed = false;
842
+ let first;
841
843
  try {
842
844
  while (G.queue.length) {
843
845
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -845,12 +847,21 @@ function flushSync() {
845
847
  G.queue = [];
846
848
  for (const e of batchOf) {
847
849
  e.queued = false;
848
- if (!e.disposed) e.run();
850
+ if (e.disposed) continue;
851
+ try {
852
+ e.run();
853
+ } catch (error) {
854
+ if (!failed) {
855
+ failed = true;
856
+ first = error;
857
+ }
858
+ }
849
859
  }
850
860
  }
851
861
  } finally {
852
862
  G.flushing = false;
853
863
  }
864
+ if (failed) throw first;
854
865
  }
855
866
  function afterWrite() {
856
867
  if (G.batchDepth === 0) flushSync();
@@ -1,4 +1,4 @@
1
- /*! @fluixi/reactive v1.0.0-alpha.95 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
1
+ /*! @fluixi/reactive v1.0.0-alpha.96 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
2
 
3
3
  // src/lib/predicates.ts
4
4
  function isFunction(value) {
@@ -392,7 +392,7 @@ function makeArrayFlat(values) {
392
392
  }
393
393
 
394
394
  // src/version.generated.ts
395
- var VERSION = "1.0.0-alpha.95";
395
+ var VERSION = "1.0.0-alpha.96";
396
396
 
397
397
  // src/lib/signal/graph/state.ts
398
398
  var MAJOR = VERSION.split(".")[0];
@@ -714,7 +714,7 @@ function createRoot(fn) {
714
714
  const prev = G.owner;
715
715
  G.owner = owner;
716
716
  try {
717
- return fn(() => disposeOwner(owner));
717
+ return untrack(() => fn(() => disposeOwner(owner)));
718
718
  } finally {
719
719
  G.owner = prev;
720
720
  }
@@ -736,6 +736,8 @@ function flushSync() {
736
736
  if (G.flushing) return;
737
737
  G.flushing = true;
738
738
  let guard = 0;
739
+ let failed = false;
740
+ let first;
739
741
  try {
740
742
  while (G.queue.length) {
741
743
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -743,12 +745,21 @@ function flushSync() {
743
745
  G.queue = [];
744
746
  for (const e of batchOf) {
745
747
  e.queued = false;
746
- if (!e.disposed) e.run();
748
+ if (e.disposed) continue;
749
+ try {
750
+ e.run();
751
+ } catch (error) {
752
+ if (!failed) {
753
+ failed = true;
754
+ first = error;
755
+ }
756
+ }
747
757
  }
748
758
  }
749
759
  } finally {
750
760
  G.flushing = false;
751
761
  }
762
+ if (failed) throw first;
752
763
  }
753
764
  function afterWrite() {
754
765
  if (G.batchDepth === 0) flushSync();
@@ -1,4 +1,4 @@
1
- /*! @fluixi/reactive v1.0.0-alpha.95 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
1
+ /*! @fluixi/reactive v1.0.0-alpha.96 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
2
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -106,7 +106,7 @@ __export(index_exports, {
106
106
  module.exports = __toCommonJS(index_exports);
107
107
 
108
108
  // src/version.generated.ts
109
- var VERSION = "1.0.0-alpha.95";
109
+ var VERSION = "1.0.0-alpha.96";
110
110
 
111
111
  // src/lib/signal/graph/state.ts
112
112
  var MAJOR = VERSION.split(".")[0];
@@ -561,7 +561,7 @@ function createRoot(fn) {
561
561
  const prev = G.owner;
562
562
  G.owner = owner;
563
563
  try {
564
- return fn(() => disposeOwner(owner));
564
+ return untrack(() => fn(() => disposeOwner(owner)));
565
565
  } finally {
566
566
  G.owner = prev;
567
567
  }
@@ -583,6 +583,8 @@ function flushSync() {
583
583
  if (G.flushing) return;
584
584
  G.flushing = true;
585
585
  let guard = 0;
586
+ let failed = false;
587
+ let first;
586
588
  try {
587
589
  while (G.queue.length) {
588
590
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -590,12 +592,21 @@ function flushSync() {
590
592
  G.queue = [];
591
593
  for (const e of batchOf) {
592
594
  e.queued = false;
593
- if (!e.disposed) e.run();
595
+ if (e.disposed) continue;
596
+ try {
597
+ e.run();
598
+ } catch (error) {
599
+ if (!failed) {
600
+ failed = true;
601
+ first = error;
602
+ }
603
+ }
594
604
  }
595
605
  }
596
606
  } finally {
597
607
  G.flushing = false;
598
608
  }
609
+ if (failed) throw first;
599
610
  }
600
611
  function afterWrite() {
601
612
  if (G.batchDepth === 0) flushSync();
@@ -1,7 +1,7 @@
1
- /*! @fluixi/reactive v1.0.0-alpha.95 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
1
+ /*! @fluixi/reactive v1.0.0-alpha.96 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
2
 
3
3
  // src/version.generated.ts
4
- var VERSION = "1.0.0-alpha.95";
4
+ var VERSION = "1.0.0-alpha.96";
5
5
 
6
6
  // src/lib/signal/graph/state.ts
7
7
  var MAJOR = VERSION.split(".")[0];
@@ -456,7 +456,7 @@ function createRoot(fn) {
456
456
  const prev = G.owner;
457
457
  G.owner = owner;
458
458
  try {
459
- return fn(() => disposeOwner(owner));
459
+ return untrack(() => fn(() => disposeOwner(owner)));
460
460
  } finally {
461
461
  G.owner = prev;
462
462
  }
@@ -478,6 +478,8 @@ function flushSync() {
478
478
  if (G.flushing) return;
479
479
  G.flushing = true;
480
480
  let guard = 0;
481
+ let failed = false;
482
+ let first;
481
483
  try {
482
484
  while (G.queue.length) {
483
485
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -485,12 +487,21 @@ function flushSync() {
485
487
  G.queue = [];
486
488
  for (const e of batchOf) {
487
489
  e.queued = false;
488
- if (!e.disposed) e.run();
490
+ if (e.disposed) continue;
491
+ try {
492
+ e.run();
493
+ } catch (error) {
494
+ if (!failed) {
495
+ failed = true;
496
+ first = error;
497
+ }
498
+ }
489
499
  }
490
500
  }
491
501
  } finally {
492
502
  G.flushing = false;
493
503
  }
504
+ if (failed) throw first;
494
505
  }
495
506
  function afterWrite() {
496
507
  if (G.batchDepth === 0) flushSync();