@fluixi/reactive 1.0.0-alpha.94 → 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 (70) hide show
  1. package/LICENSE +1 -1
  2. package/dist/cdn/reactive.cjs +14 -3
  3. package/dist/cdn/reactive.global.js +2 -2
  4. package/dist/cdn/reactive.mjs +14 -3
  5. package/dist/cdn/signal.cjs +1 -1
  6. package/dist/cdn/signal.global.js +2 -2
  7. package/dist/cdn/signal.mjs +1 -1
  8. package/dist/index.cjs +14 -3
  9. package/dist/index.mjs +14 -3
  10. package/dist/lib/index.cjs +15 -4
  11. package/dist/lib/index.mjs +15 -4
  12. package/dist/lib/observable/index.cjs +1 -1
  13. package/dist/lib/observable/index.mjs +1 -1
  14. package/dist/lib/signal/api.cjs +23 -3
  15. package/dist/lib/signal/api.mjs +23 -3
  16. package/dist/lib/signal/cached-resource.cjs +14 -3
  17. package/dist/lib/signal/cached-resource.mjs +14 -3
  18. package/dist/lib/signal/graph/children.cjs +1 -1
  19. package/dist/lib/signal/graph/children.mjs +1 -1
  20. package/dist/lib/signal/graph/compat.cjs +15 -4
  21. package/dist/lib/signal/graph/compat.mjs +15 -4
  22. package/dist/lib/signal/graph/core.cjs +2 -2
  23. package/dist/lib/signal/graph/core.mjs +2 -2
  24. package/dist/lib/signal/graph/debounced.cjs +13 -2
  25. package/dist/lib/signal/graph/debounced.mjs +13 -2
  26. package/dist/lib/signal/graph/derived.cjs +13 -2
  27. package/dist/lib/signal/graph/derived.mjs +13 -2
  28. package/dist/lib/signal/graph/error-boundary.cjs +13 -2
  29. package/dist/lib/signal/graph/error-boundary.mjs +13 -2
  30. package/dist/lib/signal/graph/index.cjs +2 -2
  31. package/dist/lib/signal/graph/index.mjs +2 -2
  32. package/dist/lib/signal/graph/observe.cjs +1 -1
  33. package/dist/lib/signal/graph/observe.mjs +1 -1
  34. package/dist/lib/signal/graph/resource.cjs +13 -2
  35. package/dist/lib/signal/graph/resource.mjs +13 -2
  36. package/dist/lib/signal/graph/runtime.cjs +23 -3
  37. package/dist/lib/signal/graph/runtime.d.ts +4 -1
  38. package/dist/lib/signal/graph/runtime.d.ts.map +1 -1
  39. package/dist/lib/signal/graph/runtime.js +23 -4
  40. package/dist/lib/signal/graph/runtime.mjs +23 -3
  41. package/dist/lib/signal/graph/signal-next.cjs +15 -4
  42. package/dist/lib/signal/graph/signal-next.mjs +15 -4
  43. package/dist/lib/signal/graph/state.cjs +1 -1
  44. package/dist/lib/signal/graph/state.mjs +1 -1
  45. package/dist/lib/signal/graph/suspense.cjs +13 -2
  46. package/dist/lib/signal/graph/suspense.mjs +13 -2
  47. package/dist/lib/signal/index-legacy.cjs +15 -4
  48. package/dist/lib/signal/index-legacy.mjs +15 -4
  49. package/dist/lib/signal/index.cjs +15 -4
  50. package/dist/lib/signal/index.mjs +15 -4
  51. package/dist/lib/signal/list.cjs +14 -3
  52. package/dist/lib/signal/list.mjs +14 -3
  53. package/dist/lib/signal/resource-api.cjs +13 -2
  54. package/dist/lib/signal/resource-api.mjs +13 -2
  55. package/dist/lib/signal/signal.cjs +13 -2
  56. package/dist/lib/signal/signal.mjs +13 -2
  57. package/dist/lib/signal/utilities.cjs +14 -3
  58. package/dist/lib/signal/utilities.mjs +14 -3
  59. package/dist/lib/store/api.cjs +1 -1
  60. package/dist/lib/store/api.mjs +1 -1
  61. package/dist/lib/store/index.cjs +2 -2
  62. package/dist/lib/store/index.mjs +2 -2
  63. package/dist/lib/store/store.cjs +1 -1
  64. package/dist/lib/store/store.mjs +1 -1
  65. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  66. package/dist/version.generated.cjs +2 -2
  67. package/dist/version.generated.d.ts +1 -1
  68. package/dist/version.generated.js +1 -1
  69. package/dist/version.generated.mjs +2 -2
  70. package/package.json +2 -2
@@ -25,7 +25,7 @@ __export(resource_exports, {
25
25
  module.exports = __toCommonJS(resource_exports);
26
26
 
27
27
  // src/version.generated.ts
28
- var VERSION = "1.0.0-alpha.94";
28
+ var VERSION = "1.0.0-alpha.96";
29
29
 
30
30
  // src/lib/signal/graph/state.ts
31
31
  var MAJOR = VERSION.split(".")[0];
@@ -348,6 +348,8 @@ function flushSync() {
348
348
  if (G.flushing) return;
349
349
  G.flushing = true;
350
350
  let guard = 0;
351
+ let failed = false;
352
+ let first;
351
353
  try {
352
354
  while (G.queue.length) {
353
355
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -355,12 +357,21 @@ function flushSync() {
355
357
  G.queue = [];
356
358
  for (const e of batchOf) {
357
359
  e.queued = false;
358
- if (!e.disposed) e.run();
360
+ if (e.disposed) continue;
361
+ try {
362
+ e.run();
363
+ } catch (error) {
364
+ if (!failed) {
365
+ failed = true;
366
+ first = error;
367
+ }
368
+ }
359
369
  }
360
370
  }
361
371
  } finally {
362
372
  G.flushing = false;
363
373
  }
374
+ if (failed) throw first;
364
375
  }
365
376
  function afterWrite() {
366
377
  if (G.batchDepth === 0) flushSync();
@@ -1,5 +1,5 @@
1
1
  // src/version.generated.ts
2
- var VERSION = "1.0.0-alpha.94";
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];
@@ -322,6 +322,8 @@ function flushSync() {
322
322
  if (G.flushing) return;
323
323
  G.flushing = true;
324
324
  let guard = 0;
325
+ let failed = false;
326
+ let first;
325
327
  try {
326
328
  while (G.queue.length) {
327
329
  if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
@@ -329,12 +331,21 @@ function flushSync() {
329
331
  G.queue = [];
330
332
  for (const e of batchOf) {
331
333
  e.queued = false;
332
- if (!e.disposed) e.run();
334
+ if (e.disposed) continue;
335
+ try {
336
+ e.run();
337
+ } catch (error) {
338
+ if (!failed) {
339
+ failed = true;
340
+ first = error;
341
+ }
342
+ }
333
343
  }
334
344
  }
335
345
  } finally {
336
346
  G.flushing = false;
337
347
  }
348
+ if (failed) throw first;
338
349
  }
339
350
  function afterWrite() {
340
351
  if (G.batchDepth === 0) flushSync();
@@ -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.94";
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.94";
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.94 | (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.94";
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.94 | (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.94";
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.94";
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.94";
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.94";
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.94";
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.94 | (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.94";
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.94 | (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.94";
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.94 | (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.94";
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();