@pravosleva/reactive-engine 2.7.2 → 3.0.0-alpha.1

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 (43) hide show
  1. package/dist/core/core.d.ts +92 -203
  2. package/dist/core/core.d.ts.map +1 -1
  3. package/dist/core/core.global.d.ts +64 -8
  4. package/dist/core/core.global.d.ts.map +1 -1
  5. package/dist/core/core.logger.d.ts +2 -0
  6. package/dist/core/core.logger.d.ts.map +1 -1
  7. package/dist/core/core.method.reactive.d.ts +2 -4
  8. package/dist/core/core.method.reactive.d.ts.map +1 -1
  9. package/dist/core/core.method.resource.d.ts +3 -11
  10. package/dist/core/core.method.resource.d.ts.map +1 -1
  11. package/dist/core/types.d.ts +1 -0
  12. package/dist/core/types.d.ts.map +1 -1
  13. package/dist/core.global.mjs +31 -4
  14. package/dist/core.global.mjs.map +1 -1
  15. package/dist/core.logger.mjs +49 -2
  16. package/dist/core.logger.mjs.map +1 -1
  17. package/dist/core.method.reactive.mjs +73 -30
  18. package/dist/core.method.reactive.mjs.map +1 -1
  19. package/dist/core.method.resource.mjs +122 -138
  20. package/dist/core.method.resource.mjs.map +1 -1
  21. package/dist/core.mjs +406 -150
  22. package/dist/core.mjs.map +1 -1
  23. package/dist/index.mjs +12 -12
  24. package/dist/index2.mjs +5 -5
  25. package/dist/react/hooks/useReactiveSubscription.mjs +13 -13
  26. package/dist/react/hooks/useReactiveSubscription.mjs.map +1 -1
  27. package/dist/react/hooks/useReactiveValue.d.ts +0 -4
  28. package/dist/react/hooks/useReactiveValue.d.ts.map +1 -1
  29. package/dist/react/hooks/useReactiveValue.mjs +24 -9
  30. package/dist/react/hooks/useReactiveValue.mjs.map +1 -1
  31. package/dist/reactive-engine.umd.js +2 -2
  32. package/dist/reactive-engine.umd.js.map +1 -1
  33. package/package.json +1 -1
  34. package/dist/core.method.computed.mjs +0 -167
  35. package/dist/core.method.computed.mjs.map +0 -1
  36. package/dist/core.method.effect.mjs +0 -120
  37. package/dist/core.method.effect.mjs.map +0 -1
  38. package/dist/core.method.signal.mjs +0 -106
  39. package/dist/core.method.signal.mjs.map +0 -1
  40. package/dist/core.method.untrack.mjs +0 -14
  41. package/dist/core.method.untrack.mjs.map +0 -1
  42. package/dist/utils/getExtractedValues.mjs +0 -24
  43. package/dist/utils/getExtractedValues.mjs.map +0 -1
package/dist/core.mjs CHANGED
@@ -1,90 +1,262 @@
1
- import { createComputed as e } from "./core.method.computed.mjs";
2
- import { createSignal as t } from "./core.method.signal.mjs";
3
- import { executeUntrack as n } from "./core.method.untrack.mjs";
4
- import { createReactive as r } from "./core.method.reactive.mjs";
5
- import { createEffect as i } from "./core.method.effect.mjs";
6
- import { ReactiveDebounceLogger as a } from "./core.logger.mjs";
7
- import { createResource as o } from "./core.method.resource.mjs";
1
+ import { ReactiveDebounceLogger as e, queueLog as t } from "./core.logger.mjs";
2
+ import { createReactive as n } from "./core.method.reactive.mjs";
3
+ import { createResource as r } from "./core.method.resource.mjs";
8
4
  //#region src/core/core.ts
9
- var s = {
10
- signal: "background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
11
- computed: "background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
12
- effect: "background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
13
- batch: "background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
14
- resource: "background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
15
- reactive: "background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;"
16
- }, c = null;
17
- function l(e) {
18
- if (e === null) return "null";
19
- if (e === void 0) return "undefined";
20
- if (typeof e == "object") try {
21
- return JSON.stringify(e);
22
- } catch {
23
- return "[Cyclic Object or Layer]";
24
- }
25
- return String(e);
26
- }
27
- function u(e, t, n) {
28
- c || (c = {
29
- id: Math.random().toString(36).substring(2, 9),
30
- pendingLogQueue: [],
31
- isFlushing: !1
32
- }, queueMicrotask(() => d())), c.pendingLogQueue.push({
33
- type: e,
34
- label: t,
35
- from: n?.from,
36
- to: n?.to,
37
- payload: n?.payload,
38
- timestamp: Date.now()
39
- });
40
- }
41
- function d() {
42
- if (!c || c.isFlushing) return;
43
- c.isFlushing = !0;
44
- let e = c.pendingLogQueue;
45
- if (e.length === 0) {
46
- c = null;
47
- return;
48
- }
49
- console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${c.id}] (${e.length} operations)`, "background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;", "color: #888; font-weight: normal;");
50
- for (let t of e) {
51
- let e = s[t.type], n = t.from !== void 0 || t.to !== void 0, r = `%c${t.type.toUpperCase()}%c ${t.label}`;
52
- n && (t.from ? r += ` ${l(t.from)} → ${l(t.to)}` : r += ` (${l(t.to)})`), t.payload === void 0 ? console.log(r, e, "color: inherit;") : (console.groupCollapsed(r, e, "color: inherit;"), console.log("Payload:", t.payload), console.groupEnd());
53
- }
54
- console.groupEnd(), c = null;
55
- }
56
- var f = class {
57
- frameworkPrefix = "core";
58
- logger;
59
- epoch = 0;
5
+ var i = class {
6
+ source = null;
7
+ target = null;
8
+ nextSubscriber = null;
9
+ prevSubscriber = null;
10
+ nextDependency = null;
11
+ prevDependency = null;
12
+ version = 0;
13
+ clear() {
14
+ this.source = null, this.target = null, this.nextSubscriber = null, this.prevSubscriber = null, this.nextDependency = null, this.prevDependency = null, this.version = 0;
15
+ }
16
+ }, a = class {
17
+ static pool = [];
18
+ static size = 0;
19
+ static maxPoolSize = 1e5;
20
+ static acquire(e, t) {
21
+ if (this.size > 0) {
22
+ this.size--;
23
+ let n = this.pool[this.size];
24
+ return this.pool[this.size] = null, n.source = e, n.target = t, n;
25
+ }
26
+ let n = new i();
27
+ return n.source = e, n.target = t, n;
28
+ }
29
+ static release(e) {
30
+ this.size < this.maxPoolSize && (e.clear(), this.pool[this.size] = e, this.size++);
31
+ }
32
+ }, o = class {
33
+ id;
34
+ type;
35
+ version = 0;
36
+ state = 0;
37
+ depth = 0;
38
+ subscribersHead = null;
39
+ subscribersTail = null;
40
+ dependenciesHead = null;
41
+ dependenciesTail = null;
42
+ depsCursor = null;
43
+ _value;
44
+ _prevValue;
45
+ fn = null;
46
+ cleanups = /* @__PURE__ */ new Set();
47
+ isDisposed = !1;
48
+ ownedEffects = /* @__PURE__ */ new Set();
49
+ wrapper = null;
50
+ engine = null;
51
+ constructor(e, t, n) {
52
+ this.type = e, this.id = t, this._value = n, this._prevValue = n;
53
+ }
54
+ get subscribers() {
55
+ let e = /* @__PURE__ */ new Set(), t = this.subscribersHead;
56
+ for (; t !== null;) t.target && e.add(t.target), t = t.nextSubscriber;
57
+ return e;
58
+ }
59
+ get dependencies() {
60
+ let e = /* @__PURE__ */ new Set(), t = this.dependenciesHead;
61
+ for (; t !== null;) t.source && e.add(t.source), t = t.nextDependency;
62
+ return e;
63
+ }
64
+ }, s = class {
65
+ buckets = [];
66
+ maxDepth = -1;
67
+ schedule(e) {
68
+ let t = e.depth;
69
+ this.buckets[t] || (this.buckets[t] = []), this.buckets[t].includes(e) || (this.buckets[t].push(e), t > this.maxDepth && (this.maxDepth = t));
70
+ }
71
+ clearAll() {
72
+ for (let e = 0; e <= this.maxDepth; e++) {
73
+ let t = this.buckets[e];
74
+ if (t) {
75
+ for (let e of t) e.state = 0;
76
+ this.buckets[e] = [];
77
+ }
78
+ }
79
+ this.maxDepth = -1;
80
+ }
81
+ flush(e) {
82
+ let t = e.activeConsumer;
83
+ try {
84
+ let t = 0;
85
+ for (; t <= this.maxDepth;) {
86
+ let n = this.buckets[t];
87
+ if (!n || n.length === 0) {
88
+ t++;
89
+ continue;
90
+ }
91
+ this.buckets[t] = [], n.sort((e, t) => t.depth - e.depth);
92
+ for (let t of n) if (!(t.isDisposed || t.state === 0) && (t.state === 1 && (e.checkNeedsUpdate(t) ? t.state = 2 : t.state = 0), t.state === 2)) try {
93
+ e.runEffectNode(t);
94
+ } catch (e) {
95
+ throw this.clearAll(), e;
96
+ }
97
+ let r = !1;
98
+ for (let e = 0; e <= this.maxDepth; e++) if (this.buckets[e] && this.buckets[e].length > 0) {
99
+ t = e, r = !0;
100
+ break;
101
+ }
102
+ r || t++;
103
+ }
104
+ } finally {
105
+ e.activeConsumer = t, this.maxDepth = -1;
106
+ }
107
+ }
108
+ }, c = class {
60
109
  activeConsumer = null;
61
110
  batchDepth = 0;
62
- subscriberId = 0;
63
- pendingEffects = [];
64
- maxPendingDepth = 0;
111
+ batchedSignals = [];
112
+ batchInitialValues = /* @__PURE__ */ new Map();
65
113
  computedCache = /* @__PURE__ */ new WeakMap();
66
- diRegistry = /* @__PURE__ */ new Map();
67
- diCache = /* @__PURE__ */ new Map();
114
+ logger;
68
115
  proxyCache = /* @__PURE__ */ new WeakMap();
69
116
  proxyTargets = /* @__PURE__ */ new WeakSet();
70
117
  reactiveSignals = /* @__PURE__ */ new WeakMap();
118
+ scheduler = new s();
119
+ currentOwner = null;
120
+ effectIdCounter = 0;
121
+ diRegistry = /* @__PURE__ */ new Map();
122
+ diCache = /* @__PURE__ */ new Map();
71
123
  cycleDetectionStack = /* @__PURE__ */ new Set();
72
- batchedSignals = /* @__PURE__ */ new Set();
73
- activeOwner = null;
74
- activeCleanupNode = null;
75
- pendingCleanups = /* @__PURE__ */ new Set();
76
- queueCleanup(e) {
77
- this.pendingCleanups.add(e);
78
- }
79
124
  constructor(e) {
80
125
  this.logger = e?.logger || { isEnabled: !1 };
81
126
  }
82
- scheduleEffect(e) {
83
- let t = e.depth || 0;
84
- this.pendingEffects[t] || (this.pendingEffects[t] = /* @__PURE__ */ new Set()), this.pendingEffects[t].add(e), t > this.maxPendingDepth && (this.maxPendingDepth = t);
127
+ log(n) {
128
+ !this.logger || !this.logger.isEnabled || e.processLog(this.logger, t, n);
129
+ }
130
+ signal(e, t) {
131
+ let n = typeof t == "string" ? t : t?.name || "signal", r = typeof t == "object" ? t?.validate : void 0, i = typeof t == "object" ? t?.isInternalCoreSignal : !1, a = new o("signal", n, e);
132
+ a.engine = this;
133
+ let s = this;
134
+ this.log({
135
+ type: "signal",
136
+ label: n,
137
+ details: { to: e },
138
+ isInternalCoreSignal: i
139
+ });
140
+ let c = {
141
+ _node: a,
142
+ _engine: this,
143
+ get value() {
144
+ return s.activeConsumer && s.trackNode(a, s.activeConsumer), a._value;
145
+ },
146
+ set value(e) {
147
+ if (r) {
148
+ let t = r(e);
149
+ if (t === !1 || typeof t == "string") {
150
+ console.error(`[Validation Error] Invalid value supplied to signal "${n}": ${t}`);
151
+ return;
152
+ }
153
+ }
154
+ let t = typeof e == "object" && !!e;
155
+ if (Object.is(a._value, e) && !t) return;
156
+ let o = a._value;
157
+ a._prevValue = o, s.batchDepth > 0 && !s.batchInitialValues.has(a) && s.batchInitialValues.set(a, {
158
+ value: o,
159
+ version: a.version
160
+ }), a._value = e, a.version++, s.log({
161
+ type: "signal",
162
+ label: n,
163
+ details: {
164
+ from: o,
165
+ to: e
166
+ },
167
+ isInternalCoreSignal: i
168
+ }), s.notifySubscribers(a, 2), s.batchDepth > 0 ? s.batchedSignals.includes(a) || s.batchedSignals.push(a) : s.flushEffects();
169
+ },
170
+ get valueWithoutTracking() {
171
+ return a._value;
172
+ },
173
+ subscribe(e) {
174
+ return s.effect(() => {
175
+ e(c.value);
176
+ });
177
+ },
178
+ destroy() {
179
+ s.disposeNode(a);
180
+ }
181
+ };
182
+ return a.wrapper = c, c;
183
+ }
184
+ notifySubscribers(e, t) {
185
+ let n = e.subscribersHead;
186
+ for (; n !== null;) {
187
+ let e = n.target;
188
+ if (e === this.activeConsumer) {
189
+ n = n.nextSubscriber;
190
+ continue;
191
+ }
192
+ e.state < t && (e.state = t, e.type === "effect" ? this.scheduler.schedule(e) : this.notifySubscribers(e, 1)), n = n.nextSubscriber;
193
+ }
194
+ }
195
+ computed(e, t) {
196
+ let n = new o("computed", t || "computed");
197
+ n.engine = this, n.fn = e, n.state = 2;
198
+ let r = this, i = {
199
+ _node: n,
200
+ _engine: this,
201
+ get value() {
202
+ return n.state === 1 && (r.checkNeedsUpdate(n) ? n.state = 2 : n.state = 0), n.state === 2 && (n._value, r.evaluateComputed(n)), r.activeConsumer && r.trackNode(n, r.activeConsumer), n._value;
203
+ },
204
+ get valueWithoutTracking() {
205
+ return n._value;
206
+ },
207
+ subscribe(e) {
208
+ return r.effect(() => {
209
+ e(i.value);
210
+ });
211
+ },
212
+ destroy() {
213
+ r.disposeNode(n);
214
+ },
215
+ _isDirty() {
216
+ return n.state === 2;
217
+ },
218
+ get dependencies() {
219
+ let e = /* @__PURE__ */ new Set(), t = n.dependenciesHead;
220
+ for (; t !== null;) t.source && t.source.wrapper && e.add(t.source.wrapper), t = t.nextDependency;
221
+ return e;
222
+ }
223
+ };
224
+ return n.wrapper = i, this.batchDepth === 0 && this.computedCache.set(e, i), i;
85
225
  }
86
- queueLog(e, t, n) {
87
- u(e, t, n);
226
+ effect(e, t) {
227
+ let n = t || "effect", r = new o("effect", n);
228
+ r.state = 2, r.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0, r.wrapper = {
229
+ id: ++this.effectIdCounter,
230
+ run: () => {
231
+ this.runEffectNode(r);
232
+ },
233
+ markDirty: () => {
234
+ r.state = 2, this.scheduler.schedule(r);
235
+ },
236
+ cleanups: r.cleanups,
237
+ label: n,
238
+ get isDirty() {
239
+ return r.state === 2;
240
+ },
241
+ get isDisposed() {
242
+ return r.isDisposed;
243
+ },
244
+ _node: r
245
+ }, r.fn = () => {
246
+ this.log({
247
+ type: "effect",
248
+ label: n
249
+ });
250
+ let t = e();
251
+ typeof t == "function" && r.cleanups.add(t);
252
+ }, this.currentOwner && this.currentOwner.ownedEffects.add(r), this.runEffectNode(r);
253
+ let i = () => {
254
+ this.disposeNode(r);
255
+ };
256
+ return i._node = r, i;
257
+ }
258
+ resource(e, t, n) {
259
+ return r(this, e, t, n);
88
260
  }
89
261
  batch(e) {
90
262
  this.batchDepth++;
@@ -92,79 +264,174 @@ var f = class {
92
264
  return e();
93
265
  } finally {
94
266
  if (this.batchDepth--, this.batchDepth === 0) {
95
- if (this.batchedSignals.size > 0) {
96
- for (let e of this.batchedSignals) e._flushBatch && e._flushBatch();
97
- this.batchedSignals.clear();
267
+ for (let e of this.batchedSignals) {
268
+ let t = this.batchInitialValues.get(e), n = e._value !== null && typeof e._value == "object";
269
+ t && !n && Object.is(e._value, t.value) && (e.version = t.version, this.resetCleanState(e));
98
270
  }
99
- this.flushEffects();
271
+ this.batchedSignals = [], this.batchInitialValues.clear(), this.flushEffects();
100
272
  }
101
273
  }
102
274
  }
103
- flushEffects() {
104
- if (this.batchDepth > 0) return;
105
- let e = this.activeConsumer;
275
+ resetCleanState(e) {
276
+ let t = e.subscribersHead;
277
+ for (; t !== null;) {
278
+ let e = t.target;
279
+ e.state > 0 && !this.checkNeedsUpdate(e) && (e.state = 0, this.resetCleanState(e)), t = t.nextSubscriber;
280
+ }
281
+ }
282
+ untrack(e) {
283
+ let t = this.activeConsumer;
284
+ this.activeConsumer = null;
106
285
  try {
107
- for (let e = 0; e <= this.maxPendingDepth; e++) {
108
- let t = this.pendingEffects[e];
109
- if (!t || t.size === 0) continue;
110
- let n = Array.from(t);
111
- t.clear();
112
- for (let t of n) if (!t.isDisposed && t.isDirty) {
113
- if (t.dependencies && t.dependencies.size > 0) {
114
- let e = !1;
115
- for (let n of t.dependencies) {
116
- let r = n._node || n;
117
- r.type === "computed" && r.state > 0 && r.update && r.update(), t.depVersions && t.depVersions.get(n) !== r.version && (e = !0);
118
- }
119
- if (!e && t.dependencies.size > 0) {
120
- t.isDirty = !1;
121
- continue;
122
- }
123
- }
124
- try {
125
- t.run();
126
- } catch (t) {
127
- for (let t = e; t <= this.maxPendingDepth; t++) {
128
- let e = this.pendingEffects[t];
129
- if (e) {
130
- for (let t of e) t.isDirty = !1;
131
- e.clear();
132
- }
133
- }
134
- throw this.maxPendingDepth = 0, t;
135
- }
136
- }
137
- if (e > 0) {
138
- let t = !1;
139
- for (let n = 0; n < e; n++) if (this.pendingEffects[n] && this.pendingEffects[n].size > 0) {
140
- t = !0;
141
- break;
142
- }
143
- t && (e = -1);
144
- }
145
- }
146
- this.maxPendingDepth = 0;
286
+ return e();
147
287
  } finally {
148
- this.activeConsumer = e;
288
+ this.activeConsumer = t;
149
289
  }
150
290
  }
151
- log(e) {
152
- !this.logger || !this.logger.isEnabled || a.processLog(this.logger, u, e);
291
+ flushEffects() {
292
+ this.batchDepth === 0 && this.scheduler.flush(this);
153
293
  }
154
- signal(e, n) {
155
- return t(this, e, n);
294
+ trackNode(e, t) {
295
+ let n = t.depsCursor;
296
+ if (n !== null && n.source === e) {
297
+ n.version = e.version, t.depsCursor = n.nextDependency;
298
+ return;
299
+ }
300
+ let r = t.dependenciesHead;
301
+ for (; r !== n;) {
302
+ if (r.source === e) {
303
+ r.version = e.version;
304
+ return;
305
+ }
306
+ r = r.nextDependency;
307
+ }
308
+ let i = n === null ? null : n.nextDependency;
309
+ for (; i !== null;) {
310
+ if (i.source === e) {
311
+ i.prevDependency !== null && (i.prevDependency.nextDependency = i.nextDependency), i.nextDependency === null ? t.dependenciesTail = i.prevDependency : i.nextDependency.prevDependency = i.prevDependency, i.version = e.version, this.insertLinkBeforeCursor(t, i, n);
312
+ return;
313
+ }
314
+ i = i.nextDependency;
315
+ }
316
+ let o = a.acquire(e, t);
317
+ o.version = e.version, t.depth <= e.depth && (t.depth = e.depth + 1), e.subscribersTail === null ? (e.subscribersHead = o, e.subscribersTail = o) : (e.subscribersTail.nextSubscriber = o, o.prevSubscriber = e.subscribersTail, e.subscribersTail = o), n === null ? t.dependenciesTail === null ? (t.dependenciesHead = o, t.dependenciesTail = o) : (t.dependenciesTail.nextDependency = o, o.prevDependency = t.dependenciesTail, t.dependenciesTail = o) : this.insertLinkBeforeCursor(t, o, n);
156
318
  }
157
- computed(t, n) {
158
- return e(this, t, n);
319
+ insertLinkBeforeCursor(e, t, n) {
320
+ let r = n.prevDependency;
321
+ t.prevDependency = r, t.nextDependency = n, n.prevDependency = t, r === null ? e.dependenciesHead = t : r.nextDependency = t;
159
322
  }
160
- effect(e, t) {
161
- return i(this, e, t);
323
+ endTracking(e) {
324
+ let t = e.depsCursor;
325
+ if (e.depsCursor = null, t === null) return;
326
+ let n = t.prevDependency;
327
+ for (n === null ? (e.dependenciesHead = null, e.dependenciesTail = null) : (n.nextDependency = null, e.dependenciesTail = n); t !== null;) {
328
+ let e = t.nextDependency, n = t.source;
329
+ t.prevSubscriber === null ? n.subscribersHead = t.nextSubscriber : t.prevSubscriber.nextSubscriber = t.nextSubscriber, t.nextSubscriber === null ? n.subscribersTail = t.prevSubscriber : t.nextSubscriber.prevSubscriber = t.prevSubscriber, a.release(t), t = e;
330
+ }
162
331
  }
163
- untrack(e) {
164
- return n(this, e);
332
+ unlinkDependencies(e, t = !1) {
333
+ let n = e.dependenciesHead;
334
+ for (e.dependenciesHead = null, e.dependenciesTail = null; n !== null;) {
335
+ let r = n.nextDependency, i = n.source;
336
+ n.prevSubscriber === null ? i.subscribersHead = n.nextSubscriber : n.prevSubscriber.nextSubscriber = n.nextSubscriber, n.nextSubscriber === null ? i.subscribersTail = n.prevSubscriber : n.nextSubscriber.prevSubscriber = n.prevSubscriber, a.release(n), t && e.isDisposed && e.type === "computed" && i.type === "computed" && i.subscribersHead === null && this.disposeNode(i), n = r;
337
+ }
338
+ }
339
+ checkNeedsUpdate(e) {
340
+ let t = e.dependenciesHead;
341
+ for (; t !== null;) {
342
+ let e = t.source;
343
+ if (e.state === 1 && (this.checkNeedsUpdate(e) ? e.state = 2 : e.state = 0), e.state === 2 && this.evaluateComputed(e), t.version !== e.version) return t.version = e.version, !0;
344
+ t = t.nextDependency;
345
+ }
346
+ return !1;
347
+ }
348
+ evaluateComputed(e) {
349
+ if (e.ownedEffects.size > 0) {
350
+ let t = Array.from(e.ownedEffects);
351
+ e.ownedEffects.clear();
352
+ for (let e of t) this.disposeNode(e);
353
+ }
354
+ e.depsCursor = e.dependenciesHead;
355
+ let t = this.activeConsumer, n = this.currentOwner;
356
+ this.activeConsumer = e, this.currentOwner = e;
357
+ let r = e._value;
358
+ try {
359
+ let t = e.fn();
360
+ Object.is(e._value, t) || (e._value = t, e.version++), e.state = 0, this.log({
361
+ type: "computed",
362
+ label: e.id,
363
+ details: {
364
+ from: r,
365
+ to: e._value
366
+ }
367
+ });
368
+ } finally {
369
+ this.endTracking(e), this.activeConsumer = t, this.currentOwner = n;
370
+ }
371
+ }
372
+ executeCleanups(e) {
373
+ if (e.cleanups.size === 0) return;
374
+ let t = Array.from(e.cleanups);
375
+ e.cleanups.clear();
376
+ let n = null;
377
+ for (let e of t) try {
378
+ this.untrack(() => e());
379
+ } catch (e) {
380
+ n === null && (n = e);
381
+ }
382
+ if (n !== null) throw n;
383
+ }
384
+ runEffectNode(e) {
385
+ if (e.isDisposed) return;
386
+ if (e.ownedEffects.size > 0) {
387
+ let t = Array.from(e.ownedEffects);
388
+ e.ownedEffects.clear();
389
+ for (let e of t) this.disposeNode(e);
390
+ }
391
+ try {
392
+ this.executeCleanups(e);
393
+ } catch (t) {
394
+ throw e.state = 0, t;
395
+ }
396
+ e.depsCursor = e.dependenciesHead;
397
+ let t = this.activeConsumer, n = this.currentOwner;
398
+ this.activeConsumer = e, this.currentOwner = e;
399
+ try {
400
+ e.fn(), e.state = 0;
401
+ } finally {
402
+ this.endTracking(e), this.activeConsumer = t, this.currentOwner = n, e.isDisposed && this.unlinkDependencies(e, !0);
403
+ }
404
+ }
405
+ disposeNode(e) {
406
+ if (e.isDisposed) return;
407
+ if (e.isDisposed = !0, e.state = 0, e.ownedEffects.size > 0) {
408
+ let t = Array.from(e.ownedEffects);
409
+ e.ownedEffects.clear();
410
+ for (let e of t) this.disposeNode(e);
411
+ }
412
+ try {
413
+ this.executeCleanups(e);
414
+ } catch {}
415
+ this.unlinkDependencies(e, !0);
416
+ let t = e.subscribersHead;
417
+ for (e.subscribersHead = null, e.subscribersTail = null; t !== null;) {
418
+ let e = t.nextSubscriber, n = t.target;
419
+ n && (t.prevDependency === null ? n.dependenciesHead = t.nextDependency : t.prevDependency.nextDependency = t.nextDependency, t.nextDependency === null ? n.dependenciesTail = t.prevDependency : t.nextDependency.prevDependency = t.prevDependency), a.release(t), t = e;
420
+ }
165
421
  }
166
422
  reactive(e, t) {
167
- return r(this, e, t);
423
+ return n(this, e, t);
424
+ }
425
+ delay(e, t) {
426
+ return new Promise((n, r) => {
427
+ if (t.aborted) return r(new DOMException("Aborted", "AbortError"));
428
+ let i = setTimeout(() => {
429
+ t.removeEventListener("abort", a), n();
430
+ }, e), a = () => {
431
+ clearTimeout(i), r(new DOMException("Aborted", "AbortError"));
432
+ };
433
+ t.addEventListener("abort", a, { once: !0 });
434
+ });
168
435
  }
169
436
  provide(e, t) {
170
437
  this.diRegistry.set(e, t), this.diCache.delete(e);
@@ -200,22 +467,11 @@ var f = class {
200
467
  this.cycleDetectionStack.delete(e);
201
468
  }
202
469
  }
203
- delay(e, t) {
204
- return new Promise((n, r) => {
205
- if (t.aborted) return r(new DOMException("Aborted", "AbortError"));
206
- let i = setTimeout(() => {
207
- t.removeEventListener("abort", a), n();
208
- }, e), a = () => {
209
- clearTimeout(i), r(new DOMException("Aborted", "AbortError"));
210
- };
211
- t.addEventListener("abort", a, { once: !0 });
212
- });
213
- }
214
- resource(e, t, n) {
215
- return o(this, e, t, n);
216
- }
217
- };
470
+ }, l = new c();
471
+ function u() {
472
+ l = new c();
473
+ }
218
474
  //#endregion
219
- export { f as ReactiveEngine, f as ReactiveEngineAutomatic, f as ReactiveEngineCore, d as flushLogs, u as queueLog };
475
+ export { s as EffectScheduler, a as LinkPool, i as NodeLink, c as ReactiveEngine, c as ReactiveEngineAutomatic, c as ReactiveEngineCore, o as ReactiveNode, l as currentEngineInstance, u as resetGlobalReactiveEngine };
220
476
 
221
477
  //# sourceMappingURL=core.mjs.map