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

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.
@@ -31,14 +31,35 @@ export declare class ReactiveNode {
31
31
  _value: any;
32
32
  _prevValue: any;
33
33
  fn: (() => any) | null;
34
- cleanups: Set<CleanupFn>;
35
34
  isDisposed: boolean;
36
- ownedEffects: Set<ReactiveNode>;
35
+ ownedEffects: Set<ReactiveNode> | null;
37
36
  wrapper: any;
38
37
  engine: ReactiveEngineCore | null;
38
+ _cleanups: Set<CleanupFn> | null;
39
+ get cleanups(): Set<CleanupFn>;
39
40
  constructor(type: 'signal' | 'computed' | 'effect', id: string, initialValue?: any);
41
+ get _node(): ReactiveNode;
42
+ get _engine(): ReactiveEngineCore | null;
40
43
  get subscribers(): Set<ReactiveNode>;
41
- get dependencies(): Set<ReactiveNode>;
44
+ get dependencies(): Set<any>;
45
+ }
46
+ export declare class SignalNode<T> extends ReactiveNode implements Signal<T> {
47
+ private validate?;
48
+ private isInternal;
49
+ constructor(engine: ReactiveEngineCore, id: string, initialValue: T, validate?: (value: T) => boolean | string, isInternal?: boolean);
50
+ get value(): T;
51
+ set value(newValue: T);
52
+ get valueWithoutTracking(): T;
53
+ subscribe(cb: (v: T) => void): CleanupFn;
54
+ destroy(): void;
55
+ }
56
+ export declare class ComputedNode<T> extends ReactiveNode implements Computed<T> {
57
+ constructor(engine: ReactiveEngineCore, id: string, fn: () => T);
58
+ get value(): T;
59
+ get valueWithoutTracking(): T;
60
+ subscribe(cb: (v: T) => void): CleanupFn;
61
+ destroy(): void;
62
+ _isDirty(): boolean;
42
63
  }
43
64
  export declare class EffectScheduler {
44
65
  private buckets;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,MAAM,EACN,QAAQ,EAER,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,eAAe,EAChB,MAAM,SAAS,CAAA;AAKhB,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAEjC,qBAAa,QAAQ;IACZ,MAAM,EAAE,YAAY,GAAG,IAAI,CAAO;IAClC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAO;IAClC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAO;IACtC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAO;IACtC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAO;IACtC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAO;IACtC,OAAO,EAAE,MAAM,CAAI;IAEnB,KAAK,IAAI,IAAI;CASrB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAiB;IACpC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAI;IACvB,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;WAErB,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,QAAQ;WAe7D,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;CAO5C;AAED,qBAAa,YAAY;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAA;IACtC,OAAO,EAAE,MAAM,CAAI;IACnB,KAAK,EAAE,SAAS,CAAI;IACpB,KAAK,EAAE,MAAM,CAAI;IACjB,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAO;IACvC,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAO;IACvC,gBAAgB,EAAE,QAAQ,GAAG,IAAI,CAAO;IACxC,gBAAgB,EAAE,QAAQ,GAAG,IAAI,CAAO;IACxC,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAO;IAClC,MAAM,EAAE,GAAG,CAAA;IACX,UAAU,EAAE,GAAG,CAAA;IACf,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAO;IAC7B,UAAU,EAAE,OAAO,CAAQ;IAC3B,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CAAO;IAC7C,OAAO,EAAE,GAAG,CAAO;IACnB,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAO;IACxC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAO;IAE9C,IAAW,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,CAKpC;gBAEW,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG;IAOlF,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED,IAAW,OAAO,IAAI,kBAAkB,GAAG,IAAI,CAE9C;IAED,IAAW,WAAW,IAAI,GAAG,CAAC,YAAY,CAAC,CAQ1C;IAED,IAAW,YAAY,IAAI,GAAG,CAAC,GAAG,CAAC,CAUlC;CACF;AAED,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,YAAa,YAAW,MAAM,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,QAAQ,CAAC,CAAgC;IACjD,OAAO,CAAC,UAAU,CAAS;gBAGzB,MAAM,EAAE,kBAAkB,EAC1B,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,CAAC,EACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,EACzC,UAAU,GAAE,OAAe;IAS7B,IAAW,KAAK,IAAI,CAAC,CAMpB;IAED,IAAW,KAAK,CAAC,QAAQ,EAAE,CAAC,EAoC3B;IAED,IAAW,oBAAoB,IAAI,CAAC,CAEnC;IAEM,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,SAAS;IAMxC,OAAO,IAAI,IAAI;CAGvB;AAED,qBAAa,YAAY,CAAC,CAAC,CAAE,SAAQ,YAAa,YAAW,QAAQ,CAAC,CAAC,CAAC;gBAC1D,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC;IAQ/D,IAAW,KAAK,IAAI,CAAC,CAgBpB;IAED,IAAW,oBAAoB,IAAI,CAAC,CAEnC;IAEM,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,SAAS;IAMxC,OAAO,IAAI,IAAI;IAIf,QAAQ,IAAI,OAAO;CAG3B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAK;IAEd,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAWlC,QAAQ,IAAI,IAAI;IAahB,KAAK,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;CAmD/C;AAED,qBAAa,kBAAkB;IACtB,cAAc,EAAE,YAAY,GAAG,IAAI,CAAO;IAC1C,UAAU,SAAI;IACd,cAAc,EAAE,YAAY,EAAE,CAAK;IACnC,kBAAkB;eAAkC,GAAG;iBAAW,MAAM;OAAK;IAC7E,aAAa,yBAA+B;IAC5C,MAAM,EAAE,mBAAmB,CAAA;IAE3B,UAAU,uBAA6B;IACvC,YAAY,kBAAwB;IACpC,eAAe,6CAAmD;IAEzE,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,eAAe,CAAI;IAE3B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,mBAAmB,CAAqB;gBAIpC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,mBAAmB,CAAA;KAAE;IAI/C,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,OAAO,CAAC;YAAC,EAAE,CAAC,EAAE,OAAO,CAAC;YAAC,OAAO,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAKvJ,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAoBhF,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAqB7D,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;IAO1D,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI;IAqDrD,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EACzB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,EACrB,aAAa,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7C,QAAQ,CAAC,CAAC,CAAC;IAGP,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAsB/B,OAAO,CAAC,eAAe;IAWhB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAS1B,YAAY,IAAI,IAAI;IAKpB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IA8ElE,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,WAAW;IAmCZ,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,UAAQ,GAAG,IAAI;IA2BtE,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAsB7C,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAgCjD,OAAO,CAAC,eAAe;IAqBhB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAoCvC,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IA0CrC,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IAGvD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrD,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAIjE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;CA8CrC;AACD,eAAO,IAAI,qBAAqB,oBAA2B,CAAA;AAC3D,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,OAAO,EAAE,kBAAkB,IAAI,cAAc,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,CAAA"}
package/dist/core.mjs CHANGED
@@ -43,14 +43,23 @@ var i = class {
43
43
  _value;
44
44
  _prevValue;
45
45
  fn = null;
46
- cleanups = /* @__PURE__ */ new Set();
47
46
  isDisposed = !1;
48
- ownedEffects = /* @__PURE__ */ new Set();
47
+ ownedEffects = null;
49
48
  wrapper = null;
50
49
  engine = null;
50
+ _cleanups = null;
51
+ get cleanups() {
52
+ return this._cleanups === null && (this._cleanups = /* @__PURE__ */ new Set()), this._cleanups;
53
+ }
51
54
  constructor(e, t, n) {
52
55
  this.type = e, this.id = t, this._value = n, this._prevValue = n;
53
56
  }
57
+ get _node() {
58
+ return this;
59
+ }
60
+ get _engine() {
61
+ return this.engine;
62
+ }
54
63
  get subscribers() {
55
64
  let e = /* @__PURE__ */ new Set(), t = this.subscribersHead;
56
65
  for (; t !== null;) t.target && e.add(t.target), t = t.nextSubscriber;
@@ -58,10 +67,77 @@ var i = class {
58
67
  }
59
68
  get dependencies() {
60
69
  let e = /* @__PURE__ */ new Set(), t = this.dependenciesHead;
61
- for (; t !== null;) t.source && e.add(t.source), t = t.nextDependency;
70
+ for (; t !== null;) t.source && e.add(t.source.wrapper || t.source), t = t.nextDependency;
62
71
  return e;
63
72
  }
64
- }, s = class {
73
+ }, s = class extends o {
74
+ validate;
75
+ isInternal;
76
+ constructor(e, t, n, r, i = !1) {
77
+ super("signal", t, n), this.engine = e, this.validate = r, this.isInternal = i, this.wrapper = this;
78
+ }
79
+ get value() {
80
+ let e = this.engine;
81
+ return e.activeConsumer !== null && e.trackNode(this, e.activeConsumer), this._value;
82
+ }
83
+ set value(e) {
84
+ if (this.validate !== void 0) {
85
+ let t = this.validate(e);
86
+ if (t === !1 || typeof t == "string") {
87
+ console.error(`[Validation Error] Invalid value supplied to signal "${this.id}": ${t}`);
88
+ return;
89
+ }
90
+ }
91
+ let t = typeof e == "object" && !!e;
92
+ if (Object.is(this._value, e) && !t) return;
93
+ let n = this.engine, r = this._value;
94
+ this._prevValue = r, n.batchDepth > 0 && !n.batchInitialValues.has(this) && n.batchInitialValues.set(this, {
95
+ value: r,
96
+ version: this.version
97
+ }), this._value = e, this.version++, n.logger.isEnabled && n.log({
98
+ type: "signal",
99
+ label: this.id,
100
+ details: {
101
+ from: r,
102
+ to: e
103
+ },
104
+ isInternalCoreSignal: this.isInternal
105
+ }), n.notifySubscribers(this, 2), n.batchDepth > 0 ? n.batchedSignals.includes(this) || n.batchedSignals.push(this) : n.flushEffects();
106
+ }
107
+ get valueWithoutTracking() {
108
+ return this._value;
109
+ }
110
+ subscribe(e) {
111
+ return this.engine.effect(() => {
112
+ e(this.value);
113
+ });
114
+ }
115
+ destroy() {
116
+ this.engine.disposeNode(this);
117
+ }
118
+ }, c = class extends o {
119
+ constructor(e, t, n) {
120
+ super("computed", t), this.engine = e, this.fn = n, this.state = 2, this.wrapper = this;
121
+ }
122
+ get value() {
123
+ let e = this.engine;
124
+ return this.state === 1 && (e.checkNeedsUpdate(this) ? this.state = 2 : this.state = 0), this.state === 2 && e.evaluateComputed(this), e.activeConsumer !== null && e.trackNode(this, e.activeConsumer), this._value;
125
+ }
126
+ get valueWithoutTracking() {
127
+ return this._value;
128
+ }
129
+ subscribe(e) {
130
+ return this.engine.effect(() => {
131
+ e(this.value);
132
+ });
133
+ }
134
+ destroy() {
135
+ this.engine.disposeNode(this);
136
+ }
137
+ _isDirty() {
138
+ return this.state === 2;
139
+ }
140
+ }, l = class {
65
141
  buckets = [];
66
142
  maxDepth = -1;
67
143
  schedule(e) {
@@ -105,7 +181,7 @@ var i = class {
105
181
  e.activeConsumer = t, this.maxDepth = -1;
106
182
  }
107
183
  }
108
- }, c = class {
184
+ }, u = class {
109
185
  activeConsumer = null;
110
186
  batchDepth = 0;
111
187
  batchedSignals = [];
@@ -115,7 +191,7 @@ var i = class {
115
191
  proxyCache = /* @__PURE__ */ new WeakMap();
116
192
  proxyTargets = /* @__PURE__ */ new WeakSet();
117
193
  reactiveSignals = /* @__PURE__ */ new WeakMap();
118
- scheduler = new s();
194
+ scheduler = new l();
119
195
  currentOwner = null;
120
196
  effectIdCounter = 0;
121
197
  diRegistry = /* @__PURE__ */ new Map();
@@ -128,58 +204,13 @@ var i = class {
128
204
  !this.logger || !this.logger.isEnabled || e.processLog(this.logger, t, n);
129
205
  }
130
206
  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({
207
+ let n = "signal", r, i = !1;
208
+ return typeof t == "string" ? n = t : t !== void 0 && (t.name !== void 0 && (n = t.name), r = t.validate, i = !!t.isInternalCoreSignal), this.logger.isEnabled && this.log({
135
209
  type: "signal",
136
210
  label: n,
137
211
  details: { to: e },
138
212
  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;
213
+ }), new s(this, n, e, r, i);
183
214
  }
184
215
  notifySubscribers(e, t) {
185
216
  let n = e.subscribersHead;
@@ -193,39 +224,12 @@ var i = class {
193
224
  }
194
225
  }
195
226
  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;
227
+ let n = new c(this, t || "computed", e);
228
+ return this.batchDepth === 0 && this.computedCache.set(e, n), n;
225
229
  }
226
230
  effect(e, t) {
227
231
  let n = t || "effect", r = new o("effect", n);
228
- r.state = 2, r.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0, r.wrapper = {
232
+ r.engine = this, r.state = 2, r.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0, r.wrapper = {
229
233
  id: ++this.effectIdCounter,
230
234
  run: () => {
231
235
  this.runEffectNode(r);
@@ -233,7 +237,9 @@ var i = class {
233
237
  markDirty: () => {
234
238
  r.state = 2, this.scheduler.schedule(r);
235
239
  },
236
- cleanups: r.cleanups,
240
+ get cleanups() {
241
+ return r.cleanups || (r._cleanups = /* @__PURE__ */ new Set()), r.cleanups;
242
+ },
237
243
  label: n,
238
244
  get isDirty() {
239
245
  return r.state === 2;
@@ -243,13 +249,13 @@ var i = class {
243
249
  },
244
250
  _node: r
245
251
  }, r.fn = () => {
246
- this.log({
252
+ this.logger.isEnabled && this.log({
247
253
  type: "effect",
248
254
  label: n
249
255
  });
250
256
  let t = e();
251
- typeof t == "function" && r.cleanups.add(t);
252
- }, this.currentOwner && this.currentOwner.ownedEffects.add(r), this.runEffectNode(r);
257
+ typeof t == "function" && (r._cleanups === null && (r._cleanups = /* @__PURE__ */ new Set()), r._cleanups.add(t));
258
+ }, this.currentOwner && (this.currentOwner.ownedEffects || (this.currentOwner.ownedEffects = /* @__PURE__ */ new Set()), this.currentOwner.ownedEffects.add(r)), this.runEffectNode(r);
253
259
  let i = () => {
254
260
  this.disposeNode(r);
255
261
  };
@@ -292,6 +298,7 @@ var i = class {
292
298
  this.batchDepth === 0 && this.scheduler.flush(this);
293
299
  }
294
300
  trackNode(e, t) {
301
+ if (t.isDisposed) return;
295
302
  let n = t.depsCursor;
296
303
  if (n !== null && n.source === e) {
297
304
  n.version = e.version, t.depsCursor = n.nextDependency;
@@ -346,7 +353,7 @@ var i = class {
346
353
  return !1;
347
354
  }
348
355
  evaluateComputed(e) {
349
- if (e.ownedEffects.size > 0) {
356
+ if (e.ownedEffects !== null && e.ownedEffects.size > 0) {
350
357
  let t = Array.from(e.ownedEffects);
351
358
  e.ownedEffects.clear();
352
359
  for (let e of t) this.disposeNode(e);
@@ -357,7 +364,7 @@ var i = class {
357
364
  let r = e._value;
358
365
  try {
359
366
  let t = e.fn();
360
- Object.is(e._value, t) || (e._value = t, e.version++), e.state = 0, this.log({
367
+ Object.is(e._value, t) || (e._value = t, e.version++), e.state = 0, this.logger.isEnabled && this.log({
361
368
  type: "computed",
362
369
  label: e.id,
363
370
  details: {
@@ -370,8 +377,8 @@ var i = class {
370
377
  }
371
378
  }
372
379
  executeCleanups(e) {
373
- if (e.cleanups.size === 0) return;
374
- let t = Array.from(e.cleanups);
380
+ if (e._cleanups === null || e._cleanups.size === 0) return;
381
+ let t = Array.from(e._cleanups);
375
382
  e.cleanups.clear();
376
383
  let n = null;
377
384
  for (let e of t) try {
@@ -383,7 +390,7 @@ var i = class {
383
390
  }
384
391
  runEffectNode(e) {
385
392
  if (e.isDisposed) return;
386
- if (e.ownedEffects.size > 0) {
393
+ if (e.ownedEffects !== null && e.ownedEffects.size > 0) {
387
394
  let t = Array.from(e.ownedEffects);
388
395
  e.ownedEffects.clear();
389
396
  for (let e of t) this.disposeNode(e);
@@ -404,7 +411,7 @@ var i = class {
404
411
  }
405
412
  disposeNode(e) {
406
413
  if (e.isDisposed) return;
407
- if (e.isDisposed = !0, e.state = 0, e.ownedEffects.size > 0) {
414
+ if (e.isDisposed = !0, e.state = 0, e.depsCursor = null, e.ownedEffects !== null && e.ownedEffects.size > 0) {
408
415
  let t = Array.from(e.ownedEffects);
409
416
  e.ownedEffects.clear();
410
417
  for (let e of t) this.disposeNode(e);
@@ -467,11 +474,11 @@ var i = class {
467
474
  this.cycleDetectionStack.delete(e);
468
475
  }
469
476
  }
470
- }, l = new c();
471
- function u() {
472
- l = new c();
477
+ }, d = new u();
478
+ function f() {
479
+ d = new u();
473
480
  }
474
481
  //#endregion
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 };
482
+ export { c as ComputedNode, l as EffectScheduler, a as LinkPool, i as NodeLink, u as ReactiveEngine, u as ReactiveEngineAutomatic, u as ReactiveEngineCore, o as ReactiveNode, s as SignalNode, d as currentEngineInstance, f as resetGlobalReactiveEngine };
476
483
 
477
484
  //# sourceMappingURL=core.mjs.map
package/dist/core.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.mjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["import type {\n CleanupFn,\n EffectFn,\n Signal,\n Computed,\n IEffect,\n SignalOptions,\n EngineLoggerOptions,\n LogEventType,\n Token,\n Factory,\n Resource,\n ResourceOptions\n} from './types'\nimport { ReactiveDebounceLogger, queueLog } from './core.logger'\nimport { createReactive } from './core.method.reactive'\nimport { createResource } from './core.method.resource'\n\nexport type NodeState = 0 | 1 | 2\n\nexport class NodeLink {\n public source: ReactiveNode | null = null\n public target: ReactiveNode | null = null\n public nextSubscriber: NodeLink | null = null\n public prevSubscriber: NodeLink | null = null\n public nextDependency: NodeLink | null = null\n public prevDependency: NodeLink | null = null\n public version: number = 0\n\n public clear(): void {\n this.source = null\n this.target = null\n this.nextSubscriber = null\n this.prevSubscriber = null\n this.nextDependency = null\n this.prevDependency = null\n this.version = 0\n }\n}\n\nexport class LinkPool {\n private static pool: NodeLink[] = []\n private static size = 0\n private static maxPoolSize = 100000\n\n public static acquire(source: ReactiveNode, target: ReactiveNode): NodeLink {\n if (this.size > 0) {\n this.size--\n const link = this.pool[this.size]\n this.pool[this.size] = null as unknown as NodeLink\n link.source = source\n link.target = target\n return link\n }\n const link = new NodeLink()\n link.source = source\n link.target = target\n return link\n }\n\n public static release(link: NodeLink): void {\n if (this.size < this.maxPoolSize) {\n link.clear()\n this.pool[this.size] = link\n this.size++\n }\n }\n}\n\nexport class ReactiveNode {\n public id: string\n public type: 'signal' | 'computed' | 'effect'\n public version: number = 0\n public state: NodeState = 0\n public depth: number = 0\n public subscribersHead: NodeLink | null = null\n public subscribersTail: NodeLink | null = null\n public dependenciesHead: NodeLink | null = null\n public dependenciesTail: NodeLink | null = null\n public depsCursor: NodeLink | null = null // Курсор для O(1) переиспользования связей\n public _value: any\n public _prevValue: any\n public fn: (() => any) | null = null\n public cleanups = new Set<CleanupFn>()\n public isDisposed: boolean = false\n public ownedEffects = new Set<ReactiveNode>()\n public wrapper: any = null\n public engine: ReactiveEngineCore | null = null\n\n constructor(type: 'signal' | 'computed' | 'effect', id: string, initialValue?: any) {\n this.type = type\n this.id = id\n this._value = initialValue\n this._prevValue = initialValue\n }\n\n public get subscribers(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.subscribersHead\n while (link !== null) {\n if (link.target) set.add(link.target)\n link = link.nextSubscriber\n }\n return set\n }\n\n public get dependencies(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.dependenciesHead\n while (link !== null) {\n if (link.source) set.add(link.source)\n link = link.nextDependency\n }\n return set\n }\n}\n\nexport class EffectScheduler {\n private buckets: ReactiveNode[][] = []\n private maxDepth = -1\n\n public schedule(node: ReactiveNode): void {\n const d = node.depth\n if (!this.buckets[d]) {\n this.buckets[d] = []\n }\n if (!this.buckets[d].includes(node)) {\n this.buckets[d].push(node)\n if (d > this.maxDepth) this.maxDepth = d\n }\n }\n\n public clearAll(): void {\n for (let d = 0; d <= this.maxDepth; d++) {\n const bucket = this.buckets[d]\n if (bucket) {\n for (const node of bucket) {\n node.state = 0\n }\n this.buckets[d] = []\n }\n }\n this.maxDepth = -1\n }\n\n public flush(engine: ReactiveEngineCore): void {\n const prevConsumer = engine.activeConsumer\n try {\n let d = 0\n while (d <= this.maxDepth) {\n const bucket = this.buckets[d]\n if (!bucket || bucket.length === 0) {\n d++\n continue\n }\n\n this.buckets[d] = []\n bucket.sort((a, b) => b.depth - a.depth)\n\n for (const node of bucket) {\n if (node.isDisposed || node.state === 0) continue\n\n if (node.state === 1) {\n if (engine.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n\n if (node.state === 2) {\n try {\n engine.runEffectNode(node)\n } catch (err) {\n // Изоляция очереди при падении эффекта (#177, #247)\n this.clearAll()\n throw err\n }\n }\n }\n\n let hasTasks = false\n for (let i = 0; i <= this.maxDepth; i++) {\n if (this.buckets[i] && this.buckets[i].length > 0) {\n d = i\n hasTasks = true\n break\n }\n }\n if (!hasTasks) d++\n }\n } finally {\n engine.activeConsumer = prevConsumer\n this.maxDepth = -1\n }\n }\n}\n\nexport class ReactiveEngineCore {\n public activeConsumer: ReactiveNode | null = null\n public batchDepth = 0\n public batchedSignals: ReactiveNode[] = []\n public batchInitialValues = new Map<ReactiveNode, { value: any; version: number }>()\n public computedCache = new WeakMap<Function, any>()\n public logger: EngineLoggerOptions\n\n public proxyCache = new WeakMap<object, any>()\n public proxyTargets = new WeakSet<object>()\n public reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n\n private scheduler = new EffectScheduler()\n private currentOwner: ReactiveNode | null = null\n private effectIdCounter = 0\n\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private cycleDetectionStack = new Set<unknown>()\n\n // public isCleaningUp = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public log(params: { type: LogEventType; label: string; details?: { from?: unknown; to?: unknown; payload?: unknown }; isInternalCoreSignal?: boolean }): void {\n if (!this.logger || !this.logger.isEnabled) return\n ReactiveDebounceLogger.processLog(this.logger, queueLog, params)\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const name = typeof optionsOrName === 'string' ? optionsOrName : (optionsOrName?.name || 'signal')\n const validate = typeof optionsOrName === 'object' ? optionsOrName?.validate : undefined\n const isInternal = typeof optionsOrName === 'object' ? optionsOrName?.isInternalCoreSignal : false\n const node = new ReactiveNode('signal', name, initialValue)\n node.engine = this\n const self = this\n\n // Логируем стартовую инициализацию сигнала (from: undefined -> формат \"SIGNAL label (initialValue)\")\n this.log({ type: 'signal', label: name, details: { to: initialValue }, isInternalCoreSignal: isInternal })\n\n const publicSignal: Signal<T> & { _node: ReactiveNode; _engine: ReactiveEngineCore } = {\n _node: node,\n _engine: this,\n get value(): T {\n // if (self.isCleaningUp && self.activeConsumer === null) {\n // return node._prevValue\n // }\n if (self.activeConsumer) {\n self.trackNode(node, self.activeConsumer)\n }\n return node._value\n },\n set value(newValue: T) {\n if (validate) {\n const validationResult = validate(newValue)\n if (validationResult === false || typeof validationResult === 'string') {\n console.error(`[Validation Error] Invalid value supplied to signal \"${name}\": ${validationResult}`)\n return\n }\n }\n const isObj = newValue !== null && typeof newValue === 'object'\n if (Object.is(node._value, newValue) && !isObj) return\n\n const oldVal = node._value\n node._prevValue = oldVal\n\n if (self.batchDepth > 0 && !self.batchInitialValues.has(node)) {\n self.batchInitialValues.set(node, { value: oldVal, version: node.version })\n }\n\n node._value = newValue\n node.version++\n\n self.log({ type: 'signal', label: name, details: { from: oldVal, to: newValue }, isInternalCoreSignal: isInternal })\n self.notifySubscribers(node, 2)\n\n if (self.batchDepth > 0) {\n if (!self.batchedSignals.includes(node)) {\n self.batchedSignals.push(node)\n }\n } else {\n self.flushEffects()\n }\n },\n get valueWithoutTracking(): T {\n return node._value\n },\n subscribe(cb: (v: T) => void): CleanupFn {\n return self.effect(() => {\n cb(publicSignal.value)\n })\n },\n destroy(): void {\n self.disposeNode(node)\n }\n }\n\n node.wrapper = publicSignal\n return publicSignal\n }\n\n public notifySubscribers(node: ReactiveNode, state: NodeState): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target === this.activeConsumer) {\n link = link.nextSubscriber\n continue\n }\n\n if (target.state < state) {\n target.state = state\n if (target.type === 'effect') {\n this.scheduler.schedule(target)\n } else {\n this.notifySubscribers(target, 1)\n }\n }\n link = link.nextSubscriber\n }\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const name = signalName || 'computed'\n const node = new ReactiveNode('computed', name)\n node.engine = this\n node.fn = fn\n node.state = 2\n const self = this\n\n const publicComputed: Computed<T> & { _node: ReactiveNode; _engine: ReactiveEngineCore } = {\n _node: node,\n _engine: this,\n get value(): T {\n if (node.state === 1) {\n if (self.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n if (node.state === 2) {\n const oldVal = node._value\n self.evaluateComputed(node)\n // self.log({ type: 'computed', label: name, details: { from: oldVal, to: node._value } })\n }\n if (self.activeConsumer) {\n self.trackNode(node, self.activeConsumer)\n }\n return node._value\n },\n get valueWithoutTracking(): T {\n return node._value\n },\n subscribe(cb: (v: T) => void): CleanupFn {\n return self.effect(() => {\n cb(publicComputed.value)\n })\n },\n destroy(): void {\n self.disposeNode(node)\n },\n _isDirty(): boolean {\n return node.state === 2\n },\n get dependencies(): Set<any> {\n const depsSet = new Set()\n let link = node.dependenciesHead\n while (link !== null) {\n if (link.source && link.source.wrapper) {\n depsSet.add(link.source.wrapper)\n }\n link = link.nextDependency\n }\n return depsSet\n }\n }\n node.wrapper = publicComputed\n if (this.batchDepth === 0) {\n this.computedCache.set(fn, publicComputed)\n }\n return publicComputed\n }\n public effect(fn: EffectFn, effectName?: string): () => void {\n const name = effectName || 'effect'\n const node = new ReactiveNode('effect', name)\n node.state = 2\n node.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0\n const publicEffect: IEffect = {\n id: ++this.effectIdCounter,\n run: () => {\n this.runEffectNode(node)\n },\n markDirty: () => {\n node.state = 2\n this.scheduler.schedule(node)\n },\n cleanups: node.cleanups,\n label: name,\n get isDirty(): boolean { return node.state === 2 },\n get isDisposed(): boolean { return node.isDisposed },\n _node: node\n }\n node.wrapper = publicEffect\n node.fn = () => {\n this.log({ type: 'effect', label: name })\n const res = fn()\n if (typeof res === 'function') {\n node.cleanups.add(res)\n }\n }\n if (this.currentOwner) {\n this.currentOwner.ownedEffects.add(node)\n }\n this.runEffectNode(node)\n const disposeFn = () => {\n this.disposeNode(node)\n }\n;(disposeFn as any)._node = node\n return disposeFn\n }\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): Resource<T> {\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n public batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) {\n // Проверка Net-Zero откатов (#147)\n for (const sig of this.batchedSignals) {\n const initial = this.batchInitialValues.get(sig)\n const isObj = sig._value !== null && typeof sig._value === 'object'\n if (initial && !isObj && Object.is(sig._value, initial.value)) {\n sig.version = initial.version\n this.resetCleanState(sig)\n }\n }\n this.batchedSignals = []\n this.batchInitialValues.clear()\n this.flushEffects()\n }\n }\n }\n private resetCleanState(node: ReactiveNode): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target.state > 0 && !this.checkNeedsUpdate(target)) {\n target.state = 0\n this.resetCleanState(target)\n }\n link = link.nextSubscriber\n }\n }\n public untrack<T>(fn: () => T): T {\n const prevConsumer = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n public flushEffects(): void {\n if (this.batchDepth === 0) {\n this.scheduler.flush(this)\n }\n }\n public trackNode(source: ReactiveNode, target: ReactiveNode): void {\n const cursor = target.depsCursor\n\n // 1. FAST PATH (O(1)): Зависимость совпала с текущей позицией курсора\n if (cursor !== null && cursor.source === source) {\n cursor.version = source.version\n target.depsCursor = cursor.nextDependency\n return\n }\n\n // 2. SLOW PATH: Проверяем, нет ли уже этого source среди уже пройденных (от head до cursor)\n // или среди оставшихся после cursor (если зависимости поменялись местами)\n let link = target.dependenciesHead\n while (link !== cursor) {\n if (link!.source === source) {\n link!.version = source.version\n return\n }\n link = link!.nextDependency\n }\n\n // Проверяем, не встречается ли source дальше по списку (после cursor)\n let ahead = cursor !== null ? cursor.nextDependency : null\n while (ahead !== null) {\n if (ahead.source === source) {\n // Вырезаем ahead из его текущей позиции и перемещаем перед cursor\n if (ahead.prevDependency !== null) {\n ahead.prevDependency.nextDependency = ahead.nextDependency\n }\n if (ahead.nextDependency !== null) {\n ahead.nextDependency.prevDependency = ahead.prevDependency\n } else {\n target.dependenciesTail = ahead.prevDependency\n }\n\n ahead.version = source.version\n this.insertLinkBeforeCursor(target, ahead, cursor!)\n return\n }\n ahead = ahead.nextDependency\n }\n\n // 3. Совершенно новая зависимость — берём из пула\n const newLink = LinkPool.acquire(source, target)\n newLink.version = source.version\n\n if (target.depth <= source.depth) {\n target.depth = source.depth + 1\n }\n\n // Вставляем в хвост подписчиков source\n if (source.subscribersTail !== null) {\n source.subscribersTail.nextSubscriber = newLink\n newLink.prevSubscriber = source.subscribersTail\n source.subscribersTail = newLink\n } else {\n source.subscribersHead = newLink\n source.subscribersTail = newLink\n }\n\n // Вставляем в список зависимостей target строго перед cursor (или в хвост, если cursor === null)\n if (cursor !== null) {\n this.insertLinkBeforeCursor(target, newLink, cursor)\n } else {\n if (target.dependenciesTail !== null) {\n target.dependenciesTail.nextDependency = newLink\n newLink.prevDependency = target.dependenciesTail\n target.dependenciesTail = newLink\n } else {\n target.dependenciesHead = newLink\n target.dependenciesTail = newLink\n }\n }\n }\n\n private insertLinkBeforeCursor(target: ReactiveNode, link: NodeLink, cursor: NodeLink): void {\n const prev = cursor.prevDependency\n link.prevDependency = prev\n link.nextDependency = cursor\n cursor.prevDependency = link\n if (prev !== null) {\n prev.nextDependency = link\n } else {\n target.dependenciesHead = link\n }\n }\n\n private endTracking(target: ReactiveNode): void {\n let link = target.depsCursor\n target.depsCursor = null\n\n if (link === null) return\n\n // Отрезаем неиспользованный хвост начиная с link\n const prev = link.prevDependency\n if (prev !== null) {\n prev.nextDependency = null\n target.dependenciesTail = prev\n } else {\n target.dependenciesHead = null\n target.dependenciesTail = null\n }\n\n while (link !== null) {\n const next: NodeLink | null = link.nextDependency\n const source = link.source!\n\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n\n LinkPool.release(link)\n link = next\n }\n }\n public unlinkDependencies(target: ReactiveNode, cascadeOrphans = false): void {\n let link = target.dependenciesHead\n target.dependenciesHead = null\n target.dependenciesTail = null\n while (link !== null) {\n const next = link.nextDependency\n const source = link.source!\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n LinkPool.release(link)\n\n // Не уничтожаем computed при отписке слушателей (иначе React StrictMode убивает computed при ремаунте),\n // каскадно удаляем только если сам узел явным образом уничтожен через .destroy()\n if (cascadeOrphans && target.isDisposed && target.type === 'computed' && source.type === 'computed' && source.subscribersHead === null) {\n this.disposeNode(source)\n }\n link = next\n }\n }\n public checkNeedsUpdate(node: ReactiveNode): boolean {\n let link = node.dependenciesHead\n while (link !== null) {\n const source = link.source!\n if (source.state === 1) {\n if (this.checkNeedsUpdate(source)) {\n source.state = 2\n } else {\n source.state = 0\n }\n }\n if (source.state === 2) {\n this.evaluateComputed(source)\n }\n if (link.version !== source.version) {\n link.version = source.version\n return true\n }\n link = link.nextDependency\n }\n return false\n }\n public evaluateComputed(node: ReactiveNode): void {\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n // Ставим курсор в начало существующих зависимостей вместо полного разрыва связей\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n const oldVal = node._value\n try {\n const newValue = node.fn!()\n if (!Object.is(node._value, newValue)) {\n node._value = newValue\n node.version++\n }\n node.state = 0\n this.log({ type: 'computed', label: node.id, details: { from: oldVal, to: node._value } })\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n }\n }\n private executeCleanups(node: ReactiveNode): void {\n if (node.cleanups.size === 0) return\n const cleanupsList = Array.from(node.cleanups)\n node.cleanups.clear()\n let firstError: unknown = null\n // const prevCleaning = this.isCleaningUp\n // this.isCleaningUp = true\n\n for (const cleanup of cleanupsList) {\n try {\n this.untrack(() => cleanup())\n } catch (err) {\n if (firstError === null) {\n firstError = err\n }\n }\n }\n\n // finally {\n // this.isCleaningUp = prevCleaning\n // }\n if (firstError !== null) {\n throw firstError\n }\n }\n public runEffectNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {\n node.state = 0\n throw e\n }\n\n // Ставим курсор в начало существующих зависимостей\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n try {\n node.fn!()\n node.state = 0\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n if (node.isDisposed) {\n this.unlinkDependencies(node, true)\n }\n }\n }\n public disposeNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n node.isDisposed = true\n node.state = 0\n\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {}\n\n this.unlinkDependencies(node, true)\n\n let link = node.subscribersHead\n node.subscribersHead = null\n node.subscribersTail = null\n while (link !== null) {\n const next = link.nextSubscriber\n const target = link.target\n if (target) {\n if (link.prevDependency !== null) {\n link.prevDependency.nextDependency = link.nextDependency\n } else {\n target.dependenciesHead = link.nextDependency\n }\n if (link.nextDependency !== null) {\n link.nextDependency.prevDependency = link.prevDependency\n } else {\n target.dependenciesTail = link.prevDependency\n }\n }\n LinkPool.release(link)\n link = next\n }\n }\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n public delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n public inject<T>(token: Token<T>): T {\n if (token === undefined || token === null) {\n throw new Error('[DI Error] Token is empty')\n }\n if (this.diCache.has(token)) {\n return this.diCache.get(token) as T\n }\n if (this.cycleDetectionStack.has(token)) {\n throw new Error('[DI Error] Cyclic dependency detected')\n }\n this.cycleDetectionStack.add(token)\n try {\n if (this.diRegistry.has(token)) {\n const entry = this.diRegistry.get(token)\n if (typeof entry === 'function') {\n if ((entry as any)._isMockFunction) {\n const mockRes = (entry as Function)(this)\n if (mockRes !== undefined) {\n this.diCache.set(token, mockRes)\n return mockRes as T\n }\n return entry as unknown as T\n }\n const str = entry.toString()\n const isClass = str.startsWith('class ') ||\nstr.startsWith('class{') ||\n(entry.prototype && entry.prototype.constructor === entry && !str.startsWith('function') && !str.includes('=>'))\n if (!isClass) {\n const resolved = (entry as Factory<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n return entry as unknown as T\n }\n return entry as T\n }\n if (typeof token === 'function') {\n const resolved = new (token as any)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n throw new Error('[DI Error] Token not found')\n } finally {\n this.cycleDetectionStack.delete(token)\n }\n }\n}\nexport let currentEngineInstance = new ReactiveEngineCore()\nexport function resetGlobalReactiveEngine(): void {\n currentEngineInstance = new ReactiveEngineCore()\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n"],"mappings":";;;;AAoBA,IAAa,IAAb,MAAsB;CACpB,SAAqC;CACrC,SAAqC;CACrC,iBAAyC;CACzC,iBAAyC;CACzC,iBAAyC;CACzC,iBAAyC;CACzC,UAAyB;CAEzB,QAAqB;EAOnB,AANA,KAAK,SAAS,MACd,KAAK,SAAS,MACd,KAAK,iBAAiB,MACtB,KAAK,iBAAiB,MACtB,KAAK,iBAAiB,MACtB,KAAK,iBAAiB,MACtB,KAAK,UAAU;CACjB;AACF,GAEa,IAAb,MAAsB;CACpB,OAAe,OAAmB,CAAC;CACnC,OAAe,OAAO;CACtB,OAAe,cAAc;CAE7B,OAAc,QAAQ,GAAsB,GAAgC;EAC1E,IAAI,KAAK,OAAO,GAAG;GACjB,KAAK;GACL,IAAM,IAAO,KAAK,KAAK,KAAK;GAI5B,OAHA,KAAK,KAAK,KAAK,QAAQ,MACvB,EAAK,SAAS,GACd,EAAK,SAAS,GACP;EACT;EACA,IAAM,IAAO,IAAI,EAAS;EAG1B,OAFA,EAAK,SAAS,GACd,EAAK,SAAS,GACP;CACT;CAEA,OAAc,QAAQ,GAAsB;EAC1C,AAAI,KAAK,OAAO,KAAK,gBACnB,EAAK,MAAM,GACX,KAAK,KAAK,KAAK,QAAQ,GACvB,KAAK;CAET;AACF,GAEa,IAAb,MAA0B;CACxB;CACA;CACA,UAAyB;CACzB,QAA0B;CAC1B,QAAuB;CACvB,kBAA0C;CAC1C,kBAA0C;CAC1C,mBAA2C;CAC3C,mBAA2C;CAC3C,aAAqC;CACrC;CACA;CACA,KAAgC;CAChC,2BAAkB,IAAI,IAAe;CACrC,aAA6B;CAC7B,+BAAsB,IAAI,IAAkB;CAC5C,UAAsB;CACtB,SAA2C;CAE3C,YAAY,GAAwC,GAAY,GAAoB;EAIlF,AAHA,KAAK,OAAO,GACZ,KAAK,KAAK,GACV,KAAK,SAAS,GACd,KAAK,aAAa;CACpB;CAEA,IAAW,cAAiC;EAC1C,IAAM,oBAAM,IAAI,IAAkB,GAC9B,IAAO,KAAK;EAChB,OAAO,MAAS,OAEd,AADI,EAAK,UAAQ,EAAI,IAAI,EAAK,MAAM,GACpC,IAAO,EAAK;EAEd,OAAO;CACT;CAEA,IAAW,eAAkC;EAC3C,IAAM,oBAAM,IAAI,IAAkB,GAC9B,IAAO,KAAK;EAChB,OAAO,MAAS,OAEd,AADI,EAAK,UAAQ,EAAI,IAAI,EAAK,MAAM,GACpC,IAAO,EAAK;EAEd,OAAO;CACT;AACF,GAEa,IAAb,MAA6B;CAC3B,UAAoC,CAAC;CACrC,WAAmB;CAEnB,SAAgB,GAA0B;EACxC,IAAM,IAAI,EAAK;EAIf,AAHK,KAAK,QAAQ,OAChB,KAAK,QAAQ,KAAK,CAAC,IAEhB,KAAK,QAAQ,EAAE,CAAC,SAAS,CAAI,MAChC,KAAK,QAAQ,EAAE,CAAC,KAAK,CAAI,GACrB,IAAI,KAAK,aAAU,KAAK,WAAW;CAE3C;CAEA,WAAwB;EACtB,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,UAAU,KAAK;GACvC,IAAM,IAAS,KAAK,QAAQ;GAC5B,IAAI,GAAQ;IACV,KAAK,IAAM,KAAQ,GACjB,EAAK,QAAQ;IAEf,KAAK,QAAQ,KAAK,CAAC;GACrB;EACF;EACA,KAAK,WAAW;CAClB;CAEA,MAAa,GAAkC;EAC7C,IAAM,IAAe,EAAO;EAC5B,IAAI;GACF,IAAI,IAAI;GACR,OAAO,KAAK,KAAK,WAAU;IACzB,IAAM,IAAS,KAAK,QAAQ;IAC5B,IAAI,CAAC,KAAU,EAAO,WAAW,GAAG;KAClC;KACA;IACF;IAGA,AADA,KAAK,QAAQ,KAAK,CAAC,GACnB,EAAO,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;IAEvC,KAAK,IAAM,KAAQ,GACb,QAAK,cAAc,EAAK,UAAU,OAElC,EAAK,UAAU,MACb,EAAO,iBAAiB,CAAI,IAC9B,EAAK,QAAQ,IAEb,EAAK,QAAQ,IAIb,EAAK,UAAU,IACjB,IAAI;KACF,EAAO,cAAc,CAAI;IAC3B,SAAS,GAAK;KAGZ,MADA,KAAK,SAAS,GACR;IACR;IAIJ,IAAI,IAAW;IACf,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,UAAU,KAClC,IAAI,KAAK,QAAQ,MAAM,KAAK,QAAQ,EAAE,CAAC,SAAS,GAAG;KAEjD,AADA,IAAI,GACJ,IAAW;KACX;IACF;IAEF,AAAK,KAAU;GACjB;EACF,UAAU;GAER,AADA,EAAO,iBAAiB,GACxB,KAAK,WAAW;EAClB;CACF;AACF,GAEa,IAAb,MAAgC;CAC9B,iBAA6C;CAC7C,aAAoB;CACpB,iBAAwC,CAAC;CACzC,qCAA4B,IAAI,IAAmD;CACnF,gCAAuB,IAAI,QAAuB;CAClD;CAEA,6BAAoB,IAAI,QAAqB;CAC7C,+BAAsB,IAAI,QAAgB;CAC1C,kCAAyB,IAAI,QAA2C;CAExE,YAAoB,IAAI,EAAgB;CACxC,eAA4C;CAC5C,kBAA0B;CAE1B,6BAAqB,IAAI,IAAsB;CAC/C,0BAAkB,IAAI,IAAsB;CAC5C,sCAA8B,IAAI,IAAa;CAI/C,YAAY,GAA4C;EACtD,KAAK,SAAS,GAAS,UAAU,EAAE,WAAW,GAAM;CACtD;CAEA,IAAW,GAAoJ;EACzJ,CAAC,KAAK,UAAU,CAAC,KAAK,OAAO,aACjC,EAAuB,WAAW,KAAK,QAAQ,GAAU,CAAM;CACjE;CAEA,OAAiB,GAAiB,GAAsD;EACtF,IAAM,IAAO,OAAO,KAAkB,WAAW,IAAiB,GAAe,QAAQ,UACnF,IAAW,OAAO,KAAkB,WAAW,GAAe,WAAW,KAAA,GACzE,IAAa,OAAO,KAAkB,WAAW,GAAe,uBAAuB,IACvF,IAAO,IAAI,EAAa,UAAU,GAAM,CAAY;EAC1D,EAAK,SAAS;EACd,IAAM,IAAO;EAGb,KAAK,IAAI;GAAE,MAAM;GAAU,OAAO;GAAM,SAAS,EAAE,IAAI,EAAa;GAAG,sBAAsB;EAAW,CAAC;EAEzG,IAAM,IAAiF;GACrF,OAAO;GACP,SAAS;GACT,IAAI,QAAW;IAOb,OAHI,EAAK,kBACP,EAAK,UAAU,GAAM,EAAK,cAAc,GAEnC,EAAK;GACd;GACA,IAAI,MAAM,GAAa;IACrB,IAAI,GAAU;KACZ,IAAM,IAAmB,EAAS,CAAQ;KAC1C,IAAI,MAAqB,MAAS,OAAO,KAAqB,UAAU;MACtE,QAAQ,MAAM,wDAAwD,EAAK,KAAK,GAAkB;MAClG;KACF;IACF;IACA,IAAM,IAA6B,OAAO,KAAa,cAAzC;IACd,IAAI,OAAO,GAAG,EAAK,QAAQ,CAAQ,KAAK,CAAC,GAAO;IAEhD,IAAM,IAAS,EAAK;IAapB,AAZA,EAAK,aAAa,GAEd,EAAK,aAAa,KAAK,CAAC,EAAK,mBAAmB,IAAI,CAAI,KAC1D,EAAK,mBAAmB,IAAI,GAAM;KAAE,OAAO;KAAQ,SAAS,EAAK;IAAQ,CAAC,GAG5E,EAAK,SAAS,GACd,EAAK,WAEL,EAAK,IAAI;KAAE,MAAM;KAAU,OAAO;KAAM,SAAS;MAAE,MAAM;MAAQ,IAAI;KAAS;KAAG,sBAAsB;IAAW,CAAC,GACnH,EAAK,kBAAkB,GAAM,CAAC,GAE1B,EAAK,aAAa,IACf,EAAK,eAAe,SAAS,CAAI,KACpC,EAAK,eAAe,KAAK,CAAI,IAG/B,EAAK,aAAa;GAEtB;GACA,IAAI,uBAA0B;IAC5B,OAAO,EAAK;GACd;GACA,UAAU,GAA+B;IACvC,OAAO,EAAK,aAAa;KACvB,EAAG,EAAa,KAAK;IACvB,CAAC;GACH;GACA,UAAgB;IACd,EAAK,YAAY,CAAI;GACvB;EACF;EAGA,OADA,EAAK,UAAU,GACR;CACT;CAEA,kBAAyB,GAAoB,GAAwB;EACnE,IAAI,IAAO,EAAK;EAChB,OAAO,MAAS,OAAM;GACpB,IAAM,IAAS,EAAK;GACpB,IAAI,MAAW,KAAK,gBAAgB;IAClC,IAAO,EAAK;IACZ;GACF;GAUA,AARI,EAAO,QAAQ,MACjB,EAAO,QAAQ,GACX,EAAO,SAAS,WAClB,KAAK,UAAU,SAAS,CAAM,IAE9B,KAAK,kBAAkB,GAAQ,CAAC,IAGpC,IAAO,EAAK;EACd;CACF;CAEA,SAAmB,GAAa,GAAkC;EAEhE,IAAM,IAAO,IAAI,EAAa,YADjB,KAAc,UACmB;EAG9C,AAFA,EAAK,SAAS,MACd,EAAK,KAAK,GACV,EAAK,QAAQ;EACb,IAAM,IAAO,MAEP,IAAqF;GACzF,OAAO;GACP,SAAS;GACT,IAAI,QAAW;IAgBb,OAfI,EAAK,UAAU,MACb,EAAK,iBAAiB,CAAI,IAC5B,EAAK,QAAQ,IAEb,EAAK,QAAQ,IAGb,EAAK,UAAU,MACF,EAAK,QACpB,EAAK,iBAAiB,CAAI,IAGxB,EAAK,kBACP,EAAK,UAAU,GAAM,EAAK,cAAc,GAEnC,EAAK;GACd;GACA,IAAI,uBAA0B;IAC5B,OAAO,EAAK;GACd;GACA,UAAU,GAA+B;IACvC,OAAO,EAAK,aAAa;KACvB,EAAG,EAAe,KAAK;IACzB,CAAC;GACH;GACA,UAAgB;IACd,EAAK,YAAY,CAAI;GACvB;GACA,WAAoB;IAClB,OAAO,EAAK,UAAU;GACxB;GACA,IAAI,eAAyB;IAC3B,IAAM,oBAAU,IAAI,IAAI,GACpB,IAAO,EAAK;IAChB,OAAO,MAAS,OAId,AAHI,EAAK,UAAU,EAAK,OAAO,WAC7B,EAAQ,IAAI,EAAK,OAAO,OAAO,GAEjC,IAAO,EAAK;IAEd,OAAO;GACT;EACF;EAKA,OAJA,EAAK,UAAU,GACX,KAAK,eAAe,KACtB,KAAK,cAAc,IAAI,GAAI,CAAc,GAEpC;CACT;CACA,OAAc,GAAc,GAAiC;EAC3D,IAAM,IAAO,KAAc,UACrB,IAAO,IAAI,EAAa,UAAU,CAAI;EA6B5C,AA5BA,EAAK,QAAQ,GACb,EAAK,QAAQ,KAAK,eAAe,KAAK,aAAa,QAAQ,IAAI,GAgB/D,EAAK,UAAU;GAdb,IAAI,EAAE,KAAK;GACX,WAAW;IACT,KAAK,cAAc,CAAI;GACzB;GACA,iBAAiB;IAEf,AADA,EAAK,QAAQ,GACb,KAAK,UAAU,SAAS,CAAI;GAC9B;GACA,UAAU,EAAK;GACf,OAAO;GACP,IAAI,UAAmB;IAAE,OAAO,EAAK,UAAU;GAAE;GACjD,IAAI,aAAsB;IAAE,OAAO,EAAK;GAAW;GACnD,OAAO;EAEM,GACf,EAAK,WAAW;GACd,KAAK,IAAI;IAAE,MAAM;IAAU,OAAO;GAAK,CAAC;GACxC,IAAM,IAAM,EAAG;GACf,AAAI,OAAO,KAAQ,cACjB,EAAK,SAAS,IAAI,CAAG;EAEzB,GACI,KAAK,gBACP,KAAK,aAAa,aAAa,IAAI,CAAI,GAEzC,KAAK,cAAc,CAAI;EACvB,IAAM,UAAkB;GACtB,KAAK,YAAY,CAAI;EACvB;EAEA,OADH,EAAmB,QAAQ,GACjB;CACT;CACA,SACE,GACA,GACA,GACa;EACb,OAAO,EAAqB,MAAM,GAAS,GAAQ,CAAa;CAClE;CACA,MAAgB,GAAgB;EAC9B,KAAK;EACL,IAAI;GACF,OAAO,EAAG;EACZ,UAAU;GAER,IADA,KAAK,cACD,KAAK,eAAe,GAAG;IAEzB,KAAK,IAAM,KAAO,KAAK,gBAAgB;KACrC,IAAM,IAAU,KAAK,mBAAmB,IAAI,CAAG,GACzC,IAAQ,EAAI,WAAW,QAAQ,OAAO,EAAI,UAAW;KAC3D,AAAI,KAAW,CAAC,KAAS,OAAO,GAAG,EAAI,QAAQ,EAAQ,KAAK,MAC1D,EAAI,UAAU,EAAQ,SACtB,KAAK,gBAAgB,CAAG;IAE5B;IAGA,AAFA,KAAK,iBAAiB,CAAC,GACvB,KAAK,mBAAmB,MAAM,GAC9B,KAAK,aAAa;GACpB;EACF;CACF;CACA,gBAAwB,GAA0B;EAChD,IAAI,IAAO,EAAK;EAChB,OAAO,MAAS,OAAM;GACpB,IAAM,IAAS,EAAK;GAKpB,AAJI,EAAO,QAAQ,KAAK,CAAC,KAAK,iBAAiB,CAAM,MACnD,EAAO,QAAQ,GACf,KAAK,gBAAgB,CAAM,IAE7B,IAAO,EAAK;EACd;CACF;CACA,QAAkB,GAAgB;EAChC,IAAM,IAAe,KAAK;EAC1B,KAAK,iBAAiB;EACtB,IAAI;GACF,OAAO,EAAG;EACZ,UAAU;GACR,KAAK,iBAAiB;EACxB;CACF;CACA,eAA4B;EAC1B,AAAI,KAAK,eAAe,KACtB,KAAK,UAAU,MAAM,IAAI;CAE7B;CACA,UAAiB,GAAsB,GAA4B;EACjE,IAAM,IAAS,EAAO;EAGtB,IAAI,MAAW,QAAQ,EAAO,WAAW,GAAQ;GAE/C,AADA,EAAO,UAAU,EAAO,SACxB,EAAO,aAAa,EAAO;GAC3B;EACF;EAIA,IAAI,IAAO,EAAO;EAClB,OAAO,MAAS,IAAQ;GACtB,IAAI,EAAM,WAAW,GAAQ;IAC3B,EAAM,UAAU,EAAO;IACvB;GACF;GACA,IAAO,EAAM;EACf;EAGA,IAAI,IAAQ,MAAW,OAA+B,OAAxB,EAAO;EACrC,OAAO,MAAU,OAAM;GACrB,IAAI,EAAM,WAAW,GAAQ;IAY3B,AAVI,EAAM,mBAAmB,SAC3B,EAAM,eAAe,iBAAiB,EAAM,iBAE1C,EAAM,mBAAmB,OAG3B,EAAO,mBAAmB,EAAM,iBAFhC,EAAM,eAAe,iBAAiB,EAAM,gBAK9C,EAAM,UAAU,EAAO,SACvB,KAAK,uBAAuB,GAAQ,GAAO,CAAO;IAClD;GACF;GACA,IAAQ,EAAM;EAChB;EAGA,IAAM,IAAU,EAAS,QAAQ,GAAQ,CAAM;EAkB/C,AAjBA,EAAQ,UAAU,EAAO,SAErB,EAAO,SAAS,EAAO,UACzB,EAAO,QAAQ,EAAO,QAAQ,IAI5B,EAAO,oBAAoB,QAK7B,EAAO,kBAAkB,GACzB,EAAO,kBAAkB,MALzB,EAAO,gBAAgB,iBAAiB,GACxC,EAAQ,iBAAiB,EAAO,iBAChC,EAAO,kBAAkB,IAOvB,MAAW,OAGT,EAAO,qBAAqB,QAK9B,EAAO,mBAAmB,GAC1B,EAAO,mBAAmB,MAL1B,EAAO,iBAAiB,iBAAiB,GACzC,EAAQ,iBAAiB,EAAO,kBAChC,EAAO,mBAAmB,KAL5B,KAAK,uBAAuB,GAAQ,GAAS,CAAM;CAWvD;CAEA,uBAA+B,GAAsB,GAAgB,GAAwB;EAC3F,IAAM,IAAO,EAAO;EAIpB,AAHA,EAAK,iBAAiB,GACtB,EAAK,iBAAiB,GACtB,EAAO,iBAAiB,GACpB,MAAS,OAGX,EAAO,mBAAmB,IAF1B,EAAK,iBAAiB;CAI1B;CAEA,YAAoB,GAA4B;EAC9C,IAAI,IAAO,EAAO;EAGlB,IAFA,EAAO,aAAa,MAEhB,MAAS,MAAM;EAGnB,IAAM,IAAO,EAAK;EASlB,KARI,MAAS,QAIX,EAAO,mBAAmB,MAC1B,EAAO,mBAAmB,SAJ1B,EAAK,iBAAiB,MACtB,EAAO,mBAAmB,IAMrB,MAAS,OAAM;GACpB,IAAM,IAAwB,EAAK,gBAC7B,IAAS,EAAK;GAcpB,AAZI,EAAK,mBAAmB,OAG1B,EAAO,kBAAkB,EAAK,iBAF9B,EAAK,eAAe,iBAAiB,EAAK,gBAIxC,EAAK,mBAAmB,OAG1B,EAAO,kBAAkB,EAAK,iBAF9B,EAAK,eAAe,iBAAiB,EAAK,gBAK5C,EAAS,QAAQ,CAAI,GACrB,IAAO;EACT;CACF;CACA,mBAA0B,GAAsB,IAAiB,IAAa;EAC5E,IAAI,IAAO,EAAO;EAGlB,KAFA,EAAO,mBAAmB,MAC1B,EAAO,mBAAmB,MACnB,MAAS,OAAM;GACpB,IAAM,IAAO,EAAK,gBACZ,IAAS,EAAK;GAkBpB,AAjBI,EAAK,mBAAmB,OAG1B,EAAO,kBAAkB,EAAK,iBAF9B,EAAK,eAAe,iBAAiB,EAAK,gBAIxC,EAAK,mBAAmB,OAG1B,EAAO,kBAAkB,EAAK,iBAF9B,EAAK,eAAe,iBAAiB,EAAK,gBAI5C,EAAS,QAAQ,CAAI,GAIjB,KAAkB,EAAO,cAAc,EAAO,SAAS,cAAc,EAAO,SAAS,cAAc,EAAO,oBAAoB,QAChI,KAAK,YAAY,CAAM,GAEzB,IAAO;EACT;CACF;CACA,iBAAwB,GAA6B;EACnD,IAAI,IAAO,EAAK;EAChB,OAAO,MAAS,OAAM;GACpB,IAAM,IAAS,EAAK;GAWpB,IAVI,EAAO,UAAU,MACf,KAAK,iBAAiB,CAAM,IAC9B,EAAO,QAAQ,IAEf,EAAO,QAAQ,IAGf,EAAO,UAAU,KACnB,KAAK,iBAAiB,CAAM,GAE1B,EAAK,YAAY,EAAO,SAE1B,OADA,EAAK,UAAU,EAAO,SACf;GAET,IAAO,EAAK;EACd;EACA,OAAO;CACT;CACA,iBAAwB,GAA0B;EAChD,IAAI,EAAK,aAAa,OAAO,GAAG;GAC9B,IAAM,IAAW,MAAM,KAAK,EAAK,YAAY;GAC7C,EAAK,aAAa,MAAM;GACxB,KAAK,IAAM,KAAO,GAChB,KAAK,YAAY,CAAG;EAExB;EAGA,EAAK,aAAa,EAAK;EAEvB,IAAM,IAAe,KAAK,gBACpB,IAAY,KAAK;EAEvB,AADA,KAAK,iBAAiB,GACtB,KAAK,eAAe;EACpB,IAAM,IAAS,EAAK;EACpB,IAAI;GACF,IAAM,IAAW,EAAK,GAAI;GAM1B,AALK,OAAO,GAAG,EAAK,QAAQ,CAAQ,MAClC,EAAK,SAAS,GACd,EAAK,YAEP,EAAK,QAAQ,GACb,KAAK,IAAI;IAAE,MAAM;IAAY,OAAO,EAAK;IAAI,SAAS;KAAE,MAAM;KAAQ,IAAI,EAAK;IAAO;GAAE,CAAC;EAC3F,UAAU;GAGR,AAFA,KAAK,YAAY,CAAI,GACrB,KAAK,iBAAiB,GACtB,KAAK,eAAe;EACtB;CACF;CACA,gBAAwB,GAA0B;EAChD,IAAI,EAAK,SAAS,SAAS,GAAG;EAC9B,IAAM,IAAe,MAAM,KAAK,EAAK,QAAQ;EAC7C,EAAK,SAAS,MAAM;EACpB,IAAI,IAAsB;EAI1B,KAAK,IAAM,KAAW,GACpB,IAAI;GACF,KAAK,cAAc,EAAQ,CAAC;EAC9B,SAAS,GAAK;GACZ,AAAI,MAAe,SACjB,IAAa;EAEjB;EAMF,IAAI,MAAe,MACjB,MAAM;CAEV;CACA,cAAqB,GAA0B;EAC7C,IAAI,EAAK,YAAY;EAErB,IAAI,EAAK,aAAa,OAAO,GAAG;GAC9B,IAAM,IAAW,MAAM,KAAK,EAAK,YAAY;GAC7C,EAAK,aAAa,MAAM;GACxB,KAAK,IAAM,KAAO,GAChB,KAAK,YAAY,CAAG;EAExB;EAEA,IAAI;GACF,KAAK,gBAAgB,CAAI;EAC3B,SAAS,GAAG;GAEV,MADA,EAAK,QAAQ,GACP;EACR;EAGA,EAAK,aAAa,EAAK;EAEvB,IAAM,IAAe,KAAK,gBACpB,IAAY,KAAK;EAEvB,AADA,KAAK,iBAAiB,GACtB,KAAK,eAAe;EACpB,IAAI;GAEF,AADA,EAAK,GAAI,GACT,EAAK,QAAQ;EACf,UAAU;GAIR,AAHA,KAAK,YAAY,CAAI,GACrB,KAAK,iBAAiB,GACtB,KAAK,eAAe,GAChB,EAAK,cACP,KAAK,mBAAmB,GAAM,EAAI;EAEtC;CACF;CACA,YAAmB,GAA0B;EAC3C,IAAI,EAAK,YAAY;EAIrB,IAHA,EAAK,aAAa,IAClB,EAAK,QAAQ,GAET,EAAK,aAAa,OAAO,GAAG;GAC9B,IAAM,IAAW,MAAM,KAAK,EAAK,YAAY;GAC7C,EAAK,aAAa,MAAM;GACxB,KAAK,IAAM,KAAO,GAChB,KAAK,YAAY,CAAG;EAExB;EAEA,IAAI;GACF,KAAK,gBAAgB,CAAI;EAC3B,QAAY,CAAC;EAEb,KAAK,mBAAmB,GAAM,EAAI;EAElC,IAAI,IAAO,EAAK;EAGhB,KAFA,EAAK,kBAAkB,MACvB,EAAK,kBAAkB,MAChB,MAAS,OAAM;GACpB,IAAM,IAAO,EAAK,gBACZ,IAAS,EAAK;GAcpB,AAbI,MACE,EAAK,mBAAmB,OAG1B,EAAO,mBAAmB,EAAK,iBAF/B,EAAK,eAAe,iBAAiB,EAAK,gBAIxC,EAAK,mBAAmB,OAG1B,EAAO,mBAAmB,EAAK,iBAF/B,EAAK,eAAe,iBAAiB,EAAK,iBAK9C,EAAS,QAAQ,CAAI,GACrB,IAAO;EACT;CACF;CACA,SAAkC,GAAW,GAAkB;EAC7D,OAAO,EAAkB,MAAM,GAAQ,CAAI;CAC7C;CACA,MAAa,GAAY,GAAoC;EAC3D,OAAO,IAAI,SAAS,GAAS,MAAW;GACtC,IAAI,EAAO,SACT,OAAO,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;GAEzD,IAAM,IAAY,iBAAiB;IAEjC,AADA,EAAO,oBAAoB,SAAS,CAAO,GAC3C,EAAQ;GACV,GAAG,CAAE,GACC,UAAgB;IAEpB,AADA,aAAa,CAAS,GACtB,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;GAClD;GACA,EAAO,iBAAiB,SAAS,GAAS,EAAE,MAAM,GAAK,CAAC;EAC1D,CAAC;CACH;CACA,QAAkB,GAAiB,GAAsC;EAEvE,AADA,KAAK,WAAW,IAAI,GAAO,CAAc,GACzC,KAAK,QAAQ,OAAO,CAAK;CAC3B;CACA,OAAiB,GAAoB;EACnC,IAAI,KAAiC,MACnC,MAAU,MAAM,2BAA2B;EAE7C,IAAI,KAAK,QAAQ,IAAI,CAAK,GACxB,OAAO,KAAK,QAAQ,IAAI,CAAK;EAE/B,IAAI,KAAK,oBAAoB,IAAI,CAAK,GACpC,MAAU,MAAM,uCAAuC;EAEzD,KAAK,oBAAoB,IAAI,CAAK;EAClC,IAAI;GACF,IAAI,KAAK,WAAW,IAAI,CAAK,GAAG;IAC9B,IAAM,IAAQ,KAAK,WAAW,IAAI,CAAK;IACvC,IAAI,OAAO,KAAU,YAAY;KAC/B,IAAK,EAAc,iBAAiB;MAClC,IAAM,IAAW,EAAmB,IAAI;MAKxC,OAJI,MAAY,KAAA,IAIT,KAHL,KAAK,QAAQ,IAAI,GAAO,CAAO,GACxB;KAGX;KACA,IAAM,IAAM,EAAM,SAAS;KAI3B,IAAI,EAHY,EAAI,WAAW,QAAQ,KACjD,EAAI,WAAW,QAAQ,KACtB,EAAM,aAAa,EAAM,UAAU,gBAAgB,KAAS,CAAC,EAAI,WAAW,UAAU,KAAK,CAAC,EAAI,SAAS,IAAI,IACtF;MACZ,IAAM,IAAY,EAAqB,IAAI;MAE3C,OADA,KAAK,QAAQ,IAAI,GAAO,CAAQ,GACzB;KACT;KACA,OAAO;IACT;IACA,OAAO;GACT;GACA,IAAI,OAAO,KAAU,YAAY;IAC/B,IAAM,IAAW,IAAK,EAAc,IAAI;IAExC,OADA,KAAK,QAAQ,IAAI,GAAO,CAAQ,GACzB;GACT;GACA,MAAU,MAAM,4BAA4B;EAC9C,UAAU;GACR,KAAK,oBAAoB,OAAO,CAAK;EACvC;CACF;AACF,GACW,IAAwB,IAAI,EAAmB;AAC1D,SAAgB,IAAkC;CAChD,IAAwB,IAAI,EAAmB;AACjD"}
1
+ {"version":3,"file":"core.mjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["import type {\n CleanupFn,\n EffectFn,\n Signal,\n Computed,\n IEffect,\n SignalOptions,\n EngineLoggerOptions,\n LogEventType,\n Token,\n Factory,\n Resource,\n ResourceOptions\n} from './types'\nimport { ReactiveDebounceLogger, queueLog } from './core.logger'\nimport { createReactive } from './core.method.reactive'\nimport { createResource } from './core.method.resource'\n\nexport type NodeState = 0 | 1 | 2\n\nexport class NodeLink {\n public source: ReactiveNode | null = null\n public target: ReactiveNode | null = null\n public nextSubscriber: NodeLink | null = null\n public prevSubscriber: NodeLink | null = null\n public nextDependency: NodeLink | null = null\n public prevDependency: NodeLink | null = null\n public version: number = 0\n\n public clear(): void {\n this.source = null\n this.target = null\n this.nextSubscriber = null\n this.prevSubscriber = null\n this.nextDependency = null\n this.prevDependency = null\n this.version = 0\n }\n}\n\nexport class LinkPool {\n private static pool: NodeLink[] = []\n private static size = 0\n private static maxPoolSize = 100000\n\n public static acquire(source: ReactiveNode, target: ReactiveNode): NodeLink {\n if (this.size > 0) {\n this.size--\n const link = this.pool[this.size]\n this.pool[this.size] = null as unknown as NodeLink\n link.source = source\n link.target = target\n return link\n }\n const link = new NodeLink()\n link.source = source\n link.target = target\n return link\n }\n\n public static release(link: NodeLink): void {\n if (this.size < this.maxPoolSize) {\n link.clear()\n this.pool[this.size] = link\n this.size++\n }\n }\n}\n\nexport class ReactiveNode {\n public id: string\n public type: 'signal' | 'computed' | 'effect'\n public version: number = 0\n public state: NodeState = 0\n public depth: number = 0\n public subscribersHead: NodeLink | null = null\n public subscribersTail: NodeLink | null = null\n public dependenciesHead: NodeLink | null = null\n public dependenciesTail: NodeLink | null = null\n public depsCursor: NodeLink | null = null\n public _value: any\n public _prevValue: any\n public fn: (() => any) | null = null\n public isDisposed: boolean = false\n public ownedEffects: Set<ReactiveNode> | null = null\n public wrapper: any = null\n public engine: ReactiveEngineCore | null = null\n public _cleanups: Set<CleanupFn> | null = null\n\n public get cleanups(): Set<CleanupFn> {\n if (this._cleanups === null) {\n this._cleanups = new Set<CleanupFn>()\n }\n return this._cleanups\n }\n\n constructor(type: 'signal' | 'computed' | 'effect', id: string, initialValue?: any) {\n this.type = type\n this.id = id\n this._value = initialValue\n this._prevValue = initialValue\n }\n\n public get _node(): ReactiveNode {\n return this\n }\n\n public get _engine(): ReactiveEngineCore | null {\n return this.engine\n }\n\n public get subscribers(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.subscribersHead\n while (link !== null) {\n if (link.target) set.add(link.target)\n link = link.nextSubscriber\n }\n return set\n }\n\n public get dependencies(): Set<any> {\n const set = new Set<any>()\n let link = this.dependenciesHead\n while (link !== null) {\n if (link.source) {\n set.add(link.source.wrapper || link.source)\n }\n link = link.nextDependency\n }\n return set\n }\n}\n\nexport class SignalNode<T> extends ReactiveNode implements Signal<T> {\n private validate?: (value: T) => boolean | string\n private isInternal: boolean\n\n constructor(\n engine: ReactiveEngineCore,\n id: string,\n initialValue: T,\n validate?: (value: T) => boolean | string,\n isInternal: boolean = false\n ) {\n super('signal', id, initialValue)\n this.engine = engine\n this.validate = validate\n this.isInternal = isInternal\n this.wrapper = this\n }\n\n public get value(): T {\n const engine = this.engine!\n if (engine.activeConsumer !== null) {\n engine.trackNode(this, engine.activeConsumer)\n }\n return this._value\n }\n\n public set value(newValue: T) {\n if (this.validate !== undefined) {\n const validationResult = this.validate(newValue)\n if (validationResult === false || typeof validationResult === 'string') {\n console.error(`[Validation Error] Invalid value supplied to signal \"${this.id}\": ${validationResult}`)\n return\n }\n }\n\n const isObj = newValue !== null && typeof newValue === 'object'\n if (Object.is(this._value, newValue) && !isObj) return\n\n const engine = this.engine!\n const oldVal = this._value\n this._prevValue = oldVal\n\n if (engine.batchDepth > 0 && !engine.batchInitialValues.has(this)) {\n engine.batchInitialValues.set(this, { value: oldVal, version: this.version })\n }\n\n this._value = newValue\n this.version++\n\n if (engine.logger.isEnabled) {\n engine.log({ type: 'signal', label: this.id, details: { from: oldVal, to: newValue }, isInternalCoreSignal: this.isInternal })\n }\n\n engine.notifySubscribers(this, 2)\n\n if (engine.batchDepth > 0) {\n if (!engine.batchedSignals.includes(this)) {\n engine.batchedSignals.push(this)\n }\n } else {\n engine.flushEffects()\n }\n }\n\n public get valueWithoutTracking(): T {\n return this._value\n }\n\n public subscribe(cb: (v: T) => void): CleanupFn {\n return this.engine!.effect(() => {\n cb(this.value)\n })\n }\n\n public destroy(): void {\n this.engine!.disposeNode(this)\n }\n}\n\nexport class ComputedNode<T> extends ReactiveNode implements Computed<T> {\n constructor(engine: ReactiveEngineCore, id: string, fn: () => T) {\n super('computed', id)\n this.engine = engine\n this.fn = fn\n this.state = 2\n this.wrapper = this\n }\n\n public get value(): T {\n const engine = this.engine!\n if (this.state === 1) {\n if (engine.checkNeedsUpdate(this)) {\n this.state = 2\n } else {\n this.state = 0\n }\n }\n if (this.state === 2) {\n engine.evaluateComputed(this)\n }\n if (engine.activeConsumer !== null) {\n engine.trackNode(this, engine.activeConsumer)\n }\n return this._value\n }\n\n public get valueWithoutTracking(): T {\n return this._value\n }\n\n public subscribe(cb: (v: T) => void): CleanupFn {\n return this.engine!.effect(() => {\n cb(this.value)\n })\n }\n\n public destroy(): void {\n this.engine!.disposeNode(this)\n }\n\n public _isDirty(): boolean {\n return this.state === 2\n }\n}\n\nexport class EffectScheduler {\n private buckets: ReactiveNode[][] = []\n private maxDepth = -1\n\n public schedule(node: ReactiveNode): void {\n const d = node.depth\n if (!this.buckets[d]) {\n this.buckets[d] = []\n }\n if (!this.buckets[d].includes(node)) {\n this.buckets[d].push(node)\n if (d > this.maxDepth) this.maxDepth = d\n }\n }\n\n public clearAll(): void {\n for (let d = 0; d <= this.maxDepth; d++) {\n const bucket = this.buckets[d]\n if (bucket) {\n for (const node of bucket) {\n node.state = 0\n }\n this.buckets[d] = []\n }\n }\n this.maxDepth = -1\n }\n\n public flush(engine: ReactiveEngineCore): void {\n const prevConsumer = engine.activeConsumer\n try {\n let d = 0\n while (d <= this.maxDepth) {\n const bucket = this.buckets[d]\n if (!bucket || bucket.length === 0) {\n d++\n continue\n }\n\n this.buckets[d] = []\n bucket.sort((a, b) => b.depth - a.depth)\n\n for (const node of bucket) {\n if (node.isDisposed || node.state === 0) continue\n\n if (node.state === 1) {\n if (engine.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n\n if (node.state === 2) {\n try {\n engine.runEffectNode(node)\n } catch (err) {\n // Изоляция очереди при падении эффекта (#177, #247)\n this.clearAll()\n throw err\n }\n }\n }\n\n let hasTasks = false\n for (let i = 0; i <= this.maxDepth; i++) {\n if (this.buckets[i] && this.buckets[i].length > 0) {\n d = i\n hasTasks = true\n break\n }\n }\n if (!hasTasks) d++\n }\n } finally {\n engine.activeConsumer = prevConsumer\n this.maxDepth = -1\n }\n }\n}\n\nexport class ReactiveEngineCore {\n public activeConsumer: ReactiveNode | null = null\n public batchDepth = 0\n public batchedSignals: ReactiveNode[] = []\n public batchInitialValues = new Map<ReactiveNode, { value: any; version: number }>()\n public computedCache = new WeakMap<Function, any>()\n public logger: EngineLoggerOptions\n\n public proxyCache = new WeakMap<object, any>()\n public proxyTargets = new WeakSet<object>()\n public reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n\n private scheduler = new EffectScheduler()\n private currentOwner: ReactiveNode | null = null\n private effectIdCounter = 0\n\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private cycleDetectionStack = new Set<unknown>()\n\n // public isCleaningUp = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public log(params: { type: LogEventType; label: string; details?: { from?: unknown; to?: unknown; payload?: unknown }; isInternalCoreSignal?: boolean }): void {\n if (!this.logger || !this.logger.isEnabled) return\n ReactiveDebounceLogger.processLog(this.logger, queueLog, params)\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n let name = 'signal'\n let validate: ((value: T) => boolean | string) | undefined\n let isInternal = false\n\n if (typeof optionsOrName === 'string') {\n name = optionsOrName\n } else if (optionsOrName !== undefined) {\n if (optionsOrName.name !== undefined) name = optionsOrName.name\n validate = optionsOrName.validate\n isInternal = Boolean(optionsOrName.isInternalCoreSignal)\n }\n\n if (this.logger.isEnabled) {\n this.log({ type: 'signal', label: name, details: { to: initialValue }, isInternalCoreSignal: isInternal })\n }\n\n return new SignalNode<T>(this, name, initialValue, validate, isInternal)\n }\n\n public notifySubscribers(node: ReactiveNode, state: NodeState): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target === this.activeConsumer) {\n link = link.nextSubscriber\n continue\n }\n\n if (target.state < state) {\n target.state = state\n if (target.type === 'effect') {\n this.scheduler.schedule(target)\n } else {\n this.notifySubscribers(target, 1)\n }\n }\n link = link.nextSubscriber\n }\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const node = new ComputedNode<T>(this, signalName || 'computed', fn)\n if (this.batchDepth === 0) {\n this.computedCache.set(fn, node)\n }\n return node\n }\n public effect(fn: EffectFn, effectName?: string): () => void {\n const name = effectName || 'effect'\n const node = new ReactiveNode('effect', name)\n node.engine = this\n node.state = 2\n node.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0\n\n const publicEffect: IEffect = {\n id: ++this.effectIdCounter,\n run: () => {\n this.runEffectNode(node)\n },\n markDirty: () => {\n node.state = 2\n this.scheduler.schedule(node)\n },\n get cleanups() {\n if (!node.cleanups) node._cleanups = new Set<CleanupFn>()\n return node.cleanups\n },\n label: name,\n get isDirty(): boolean { return node.state === 2 },\n get isDisposed(): boolean { return node.isDisposed },\n _node: node\n }\n\n node.wrapper = publicEffect\n node.fn = () => {\n if (this.logger.isEnabled) {\n this.log({ type: 'effect', label: name })\n }\n const res = fn()\n if (typeof res === 'function') {\n if (node._cleanups === null) node._cleanups = new Set<CleanupFn>()\n node._cleanups.add(res)\n }\n }\n\n if (this.currentOwner) {\n if (!this.currentOwner.ownedEffects) {\n this.currentOwner.ownedEffects = new Set<ReactiveNode>()\n }\n this.currentOwner.ownedEffects.add(node)\n }\n\n this.runEffectNode(node)\n\n const disposeFn = () => {\n this.disposeNode(node)\n }\n ;(disposeFn as any)._node = node\n return disposeFn\n }\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): Resource<T> {\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n public batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) {\n // Проверка Net-Zero откатов (#147)\n for (const sig of this.batchedSignals) {\n const initial = this.batchInitialValues.get(sig)\n const isObj = sig._value !== null && typeof sig._value === 'object'\n if (initial && !isObj && Object.is(sig._value, initial.value)) {\n sig.version = initial.version\n this.resetCleanState(sig)\n }\n }\n this.batchedSignals = []\n this.batchInitialValues.clear()\n this.flushEffects()\n }\n }\n }\n private resetCleanState(node: ReactiveNode): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target.state > 0 && !this.checkNeedsUpdate(target)) {\n target.state = 0\n this.resetCleanState(target)\n }\n link = link.nextSubscriber\n }\n }\n public untrack<T>(fn: () => T): T {\n const prevConsumer = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n public flushEffects(): void {\n if (this.batchDepth === 0) {\n this.scheduler.flush(this)\n }\n }\n public trackNode(source: ReactiveNode, target: ReactiveNode): void {\n // Защита от подписки уже уничтоженного узла (тест #141)\n if (target.isDisposed) return\n\n const cursor = target.depsCursor\n\n // 1. FAST PATH (O(1)): Зависимость совпала с текущей позицией курсора\n if (cursor !== null && cursor.source === source) {\n cursor.version = source.version\n target.depsCursor = cursor.nextDependency\n return\n }\n\n // 2. SLOW PATH: Проверяем, нет ли уже этого source среди уже пройденных (от head до cursor)\n // или среди оставшихся после cursor (если зависимости поменялись местами)\n let link = target.dependenciesHead\n while (link !== cursor) {\n if (link!.source === source) {\n link!.version = source.version\n return\n }\n link = link!.nextDependency\n }\n\n // Проверяем, не встречается ли source дальше по списку (после cursor)\n let ahead = cursor !== null ? cursor.nextDependency : null\n while (ahead !== null) {\n if (ahead.source === source) {\n // Вырезаем ahead из его текущей позиции и перемещаем перед cursor\n if (ahead.prevDependency !== null) {\n ahead.prevDependency.nextDependency = ahead.nextDependency\n }\n if (ahead.nextDependency !== null) {\n ahead.nextDependency.prevDependency = ahead.prevDependency\n } else {\n target.dependenciesTail = ahead.prevDependency\n }\n\n ahead.version = source.version\n this.insertLinkBeforeCursor(target, ahead, cursor!)\n return\n }\n ahead = ahead.nextDependency\n }\n\n // 3. Совершенно новая зависимость — берём из пула\n const newLink = LinkPool.acquire(source, target)\n newLink.version = source.version\n\n if (target.depth <= source.depth) {\n target.depth = source.depth + 1\n }\n\n // Вставляем в хвост подписчиков source\n if (source.subscribersTail !== null) {\n source.subscribersTail.nextSubscriber = newLink\n newLink.prevSubscriber = source.subscribersTail\n source.subscribersTail = newLink\n } else {\n source.subscribersHead = newLink\n source.subscribersTail = newLink\n }\n\n // Вставляем в список зависимостей target строго перед cursor (или в хвост, если cursor === null)\n if (cursor !== null) {\n this.insertLinkBeforeCursor(target, newLink, cursor)\n } else {\n if (target.dependenciesTail !== null) {\n target.dependenciesTail.nextDependency = newLink\n newLink.prevDependency = target.dependenciesTail\n target.dependenciesTail = newLink\n } else {\n target.dependenciesHead = newLink\n target.dependenciesTail = newLink\n }\n }\n }\n\n private insertLinkBeforeCursor(target: ReactiveNode, link: NodeLink, cursor: NodeLink): void {\n const prev = cursor.prevDependency\n link.prevDependency = prev\n link.nextDependency = cursor\n cursor.prevDependency = link\n if (prev !== null) {\n prev.nextDependency = link\n } else {\n target.dependenciesHead = link\n }\n }\n\n private endTracking(target: ReactiveNode): void {\n let link = target.depsCursor\n target.depsCursor = null\n\n if (link === null) return\n\n // Отрезаем неиспользованный хвост начиная с link\n const prev = link.prevDependency\n if (prev !== null) {\n prev.nextDependency = null\n target.dependenciesTail = prev\n } else {\n target.dependenciesHead = null\n target.dependenciesTail = null\n }\n\n while (link !== null) {\n const next: NodeLink | null = link.nextDependency\n const source = link.source!\n\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n\n LinkPool.release(link)\n link = next\n }\n }\n public unlinkDependencies(target: ReactiveNode, cascadeOrphans = false): void {\n let link = target.dependenciesHead\n target.dependenciesHead = null\n target.dependenciesTail = null\n while (link !== null) {\n const next = link.nextDependency\n const source = link.source!\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n LinkPool.release(link)\n\n // Не уничтожаем computed при отписке слушателей (иначе React StrictMode убивает computed при ремаунте),\n // каскадно удаляем только если сам узел явным образом уничтожен через .destroy()\n if (cascadeOrphans && target.isDisposed && target.type === 'computed' && source.type === 'computed' && source.subscribersHead === null) {\n this.disposeNode(source)\n }\n link = next\n }\n }\n public checkNeedsUpdate(node: ReactiveNode): boolean {\n let link = node.dependenciesHead\n while (link !== null) {\n const source = link.source!\n if (source.state === 1) {\n if (this.checkNeedsUpdate(source)) {\n source.state = 2\n } else {\n source.state = 0\n }\n }\n if (source.state === 2) {\n this.evaluateComputed(source)\n }\n if (link.version !== source.version) {\n link.version = source.version\n return true\n }\n link = link.nextDependency\n }\n return false\n }\n public evaluateComputed(node: ReactiveNode): void {\n if (node.ownedEffects !== null && node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n const oldVal = node._value\n try {\n const newValue = node.fn!()\n if (!Object.is(node._value, newValue)) {\n node._value = newValue\n node.version++\n }\n node.state = 0\n if (this.logger.isEnabled) {\n this.log({ type: 'computed', label: node.id, details: { from: oldVal, to: node._value } })\n }\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n }\n }\n private executeCleanups(node: ReactiveNode): void {\n if (node._cleanups === null || node._cleanups.size === 0) return\n\n const cleanupsList = Array.from(node._cleanups)\n node.cleanups.clear()\n let firstError: unknown = null\n\n for (const cleanup of cleanupsList) {\n try {\n this.untrack(() => cleanup())\n } catch (err) {\n if (firstError === null) {\n firstError = err\n }\n }\n }\n\n if (firstError !== null) {\n throw firstError\n }\n }\n public runEffectNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n\n if (node.ownedEffects !== null && node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {\n node.state = 0\n throw e\n }\n\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n try {\n node.fn!()\n node.state = 0\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n if (node.isDisposed) {\n this.unlinkDependencies(node, true)\n }\n }\n }\n public disposeNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n node.isDisposed = true\n node.state = 0\n node.depsCursor = null\n\n if (node.ownedEffects !== null && node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {}\n\n this.unlinkDependencies(node, true)\n\n let link = node.subscribersHead\n node.subscribersHead = null\n node.subscribersTail = null\n while (link !== null) {\n const next = link.nextSubscriber\n const target = link.target\n if (target) {\n if (link.prevDependency !== null) {\n link.prevDependency.nextDependency = link.nextDependency\n } else {\n target.dependenciesHead = link.nextDependency\n }\n if (link.nextDependency !== null) {\n link.nextDependency.prevDependency = link.prevDependency\n } else {\n target.dependenciesTail = link.prevDependency\n }\n }\n LinkPool.release(link)\n link = next\n }\n }\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n public delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n public inject<T>(token: Token<T>): T {\n if (token === undefined || token === null) {\n throw new Error('[DI Error] Token is empty')\n }\n if (this.diCache.has(token)) {\n return this.diCache.get(token) as T\n }\n if (this.cycleDetectionStack.has(token)) {\n throw new Error('[DI Error] Cyclic dependency detected')\n }\n this.cycleDetectionStack.add(token)\n try {\n if (this.diRegistry.has(token)) {\n const entry = this.diRegistry.get(token)\n if (typeof entry === 'function') {\n if ((entry as any)._isMockFunction) {\n const mockRes = (entry as Function)(this)\n if (mockRes !== undefined) {\n this.diCache.set(token, mockRes)\n return mockRes as T\n }\n return entry as unknown as T\n }\n const str = entry.toString()\n const isClass = str.startsWith('class ') ||\nstr.startsWith('class{') ||\n(entry.prototype && entry.prototype.constructor === entry && !str.startsWith('function') && !str.includes('=>'))\n if (!isClass) {\n const resolved = (entry as Factory<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n return entry as unknown as T\n }\n return entry as T\n }\n if (typeof token === 'function') {\n const resolved = new (token as any)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n throw new Error('[DI Error] Token not found')\n } finally {\n this.cycleDetectionStack.delete(token)\n }\n }\n}\nexport let currentEngineInstance = new ReactiveEngineCore()\nexport function resetGlobalReactiveEngine(): void {\n currentEngineInstance = new ReactiveEngineCore()\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n"],"mappings":"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"}
package/dist/index2.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import { EffectScheduler as e, LinkPool as t, NodeLink as n, ReactiveEngine as r, ReactiveNode as i, currentEngineInstance as a } from "./core.mjs";
1
+ import { ComputedNode as e, EffectScheduler as t, LinkPool as n, NodeLink as r, ReactiveEngine as i, ReactiveNode as a, SignalNode as o, currentEngineInstance as s } from "./core.mjs";
2
2
  import "./core.automatic.mjs";
3
3
  import "./core.autolog.mjs";
4
- import { batch as o, computed as s, effect as c, inject as l, provide as u, signal as d, untrack as f } from "./core.global.mjs";
5
- import { AbstractService as p, BaseREService as m } from "./AbstractService.mjs";
6
- import { BaseREServiceEnhanced as h } from "./BaseREServiceEnhanced.mjs";
7
- export { p as AbstractService, m as BaseREService, h as BaseREServiceEnhanced, e as EffectScheduler, t as LinkPool, n as NodeLink, r as ReactiveEngineAutomatic, i as ReactiveNode, o as batch, s as computed, a as currentEngineInstance, c as effect, l as inject, u as provide, d as signal, f as untrack };
4
+ import { batch as c, computed as l, effect as u, inject as d, provide as f, signal as p, untrack as m } from "./core.global.mjs";
5
+ import { AbstractService as h, BaseREService as g } from "./AbstractService.mjs";
6
+ import { BaseREServiceEnhanced as _ } from "./BaseREServiceEnhanced.mjs";
7
+ export { h as AbstractService, g as BaseREService, _ as BaseREServiceEnhanced, e as ComputedNode, t as EffectScheduler, n as LinkPool, r as NodeLink, i as ReactiveEngineAutomatic, a as ReactiveNode, o as SignalNode, c as batch, l as computed, s as currentEngineInstance, u as effect, d as inject, f as provide, p as signal, m as untrack };
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pravosleva/reactive-engine v3.0.0-alpha.1
2
+ * @pravosleva/reactive-engine v3.0.0-alpha.3
3
3
  * High-performance transactional reactive engine with microtask batching.
4
4
  *
5
5
  * @license MIT
@@ -9,5 +9,5 @@
9
9
  * @contact Telegram Channel: https://t.me/bash_exp_ru/3393
10
10
  * @contact Developer Telegram: https://t.me/pravosleva
11
11
  */
12
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactiveEngineLib={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t={signal:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,computed:`background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,effect:`background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,batch:`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,resource:`background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,reactive:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`},n=null;function r(e){if(e===null)return`null`;if(e===void 0)return`undefined`;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[Cyclic Object or Layer]`}return String(e)}function i(e,t,r){n||(n={id:Math.random().toString(36).substring(2,9),pendingLogQueue:[],isFlushing:!1},queueMicrotask(()=>a())),n.pendingLogQueue.push({type:e,label:t,from:r?.from,to:r?.to,payload:r?.payload,timestamp:Date.now()})}function a(){if(!n||n.isFlushing)return;n.isFlushing=!0;let e=n.pendingLogQueue;if(e.length===0){n=null;return}console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${n.id}] (${e.length} operations)`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #888; font-weight: normal;`);for(let n of e){let e=t[n.type],i=n.from!==void 0||n.to!==void 0,a=`%c${n.type.toUpperCase()}%c ${n.label}`;i&&(n.from===void 0?a+=` (${r(n.to)})`:a+=` ${r(n.from)} → ${r(n.to)}`),n.payload===void 0?console.log(a,e,`color: inherit;`):(console.groupCollapsed(a,e,`color: inherit;`),console.log(`Payload:`,n.payload),console.groupEnd())}console.groupEnd(),n=null}var o=class{static churnTracker=new Map;static TIME_WINDOW_MS=1e3;static CHURN_WARNING_THRESHOLD=3;static CHURN_CRITICAL_THRESHOLD=6;static isDeepEqual(e,t){return e===t?!0:typeof e!=`object`||typeof t!=`object`||e===null||t===null?!1:JSON.stringify(e)===JSON.stringify(t)}static analyzeSignalChurn(e){let t=Date.now();this.churnTracker.has(e)||this.churnTracker.set(e,[]);let n=this.churnTracker.get(e),r=t-this.TIME_WINDOW_MS,i=n.filter(e=>e>r);i.push(t);let a=i.length,o=(this.TIME_WINDOW_MS/1e3).toFixed(1);return i.length<=1?(this.churnTracker.delete(e),{marker:`🟢`,info:`[STABLE] (1 изм./${o}s)`}):(this.churnTracker.set(e,i),a>=this.CHURN_CRITICAL_THRESHOLD?{marker:`🔴`,info:`[CRITICAL CHURN] (${a} изм./${o}s) — Нужен debounce!`}:a>=this.CHURN_WARNING_THRESHOLD?{marker:`🟡`,info:`[WARNING CHURN] (${a} изм./${o}s)`}:{marker:`🟢`,info:`[STABLE] (${a} изм./${o}s)`})}static processLog(e,t,n){let{type:r,label:i,details:a,isInternalCoreSignal:o=!1}=n;if(!e.isEnabled||e.filter&&!(e.filter instanceof RegExp?e.filter.test(i):i.includes(e.filter))||o&&!e.isCoreOptimizationDebugEnabled)return;if(a&&`from`in a&&`to`in a&&this.isDeepEqual(a.from,a.to)){if((r===`computed`||r===`resource`)&&e.isCoreOptimizationDebugEnabled){t(r,`🔵 [IDLE] ${i}`,a);return}return}let s=``;if(r===`signal`||r===`resource`||r===`computed`){let e=this.analyzeSignalChurn(i);s=e.marker===`🟢`?` ${e.marker}`:` ${e.marker} ${e.info}`}t(r,`${i}${s}`,a)}};function s(e,t,n){if(e.proxyTargets.has(t))return t;if(e.proxyCache.has(t))return e.proxyCache.get(t);let r=n||`reactive`;e.log({type:`reactive`,label:r,details:{to:t}}),e.reactiveSignals.has(t)||e.reactiveSignals.set(t,new Map);let i=e.reactiveSignals.get(t),a=Symbol(`ownKeys`);function o(t,n){let a=i.get(t);return a||(a=e.signal(n,{name:`${r}.${String(t)}`,isInternalCoreSignal:!0}),i.set(t,a)),a}let s=new Proxy(t,{ownKeys(e){return o(a,0).value,Reflect.ownKeys(e)},get(t,r,s){if(r===`__subscribe`&&Array.isArray(t))return e=>o(`length`,t.length).subscribe(e);if(Array.isArray(t)&&typeof r==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(r))return(...c)=>{let l,u=n?`${n}.${r}`:`array.${r}`,d=t.length;return e.batch(()=>{l=Reflect.get(t,r).apply(s,c);let n=o(`length`,t.length);n.value=t.length;let f=o(a,0);f.value=f.valueWithoutTracking+1,i.forEach((e,n)=>{n!==`length`&&n!==a&&(e.value=Reflect.get(t,n))}),e.log({type:`reactive`,label:u,details:{from:{length:d},to:{length:t.length}}})}),l};if(typeof r==`symbol`||r===`constructor`||r===`toJSON`)return Reflect.get(t,r,s);let c=i.get(r);if(!c){let a=Reflect.get(t,r);c=e.signal(a),i.set(r,c),typeof a==`object`&&a&&(c._proxyCache=e.reactive(a,n?`${n}.${String(r)}`:String(r)))}return c._proxyCache===void 0?c.value:(c.value,c._proxyCache)},set(t,r,i){let s=Object.prototype.hasOwnProperty.call(t,r),c=Reflect.get(t,r);if(s&&c===i&&r!==`length`)return!0;Reflect.set(t,r,i);let l=o(r,c),u=n?`${n}.${String(r)}`:String(r);if(e.log({type:`reactive`,label:u,details:{from:c,to:i}}),l._proxyCache=void 0,l.value=i,!s){let e=o(a,0);e.value=e.valueWithoutTracking+1}if(Array.isArray(t)&&r!==`length`){let e=o(`length`,t.length);e.value=t.length}return!0},deleteProperty(e,t){let n=Object.prototype.hasOwnProperty.call(e,t),r=Reflect.deleteProperty(e,t);if(n&&r){let e=i.get(t);e&&(e._proxyCache=void 0,e.value=void 0);let n=o(a,0);n.value=n.valueWithoutTracking+1}return r}});return e.proxyCache.set(t,s),e.proxyTargets.add(s),s}function c(e,t,n,r){let i=typeof r==`string`?r:r?.name||`resource`,a=typeof r==`object`?r:{},o=a.resetDataOnSourceChange??!1,s=a.timeout,c=a.retryCount??0,l=a.validateBeforeFetch,u=a.responseValidate,d=e.signal(null,`${i}_data`),f=e.signal(!1,`${i}_loading`),p=e.signal(null,`${i}_error`),m=e.signal(!1,`${i}_isRetrying`),h=e.signal(0,`${i}_attemptIndex`),g=e.signal(void 0,`${i}_totalElapsedMs`),_=null,v=!1;function y(){if(!v)return{data:d.value,loading:f.value,error:p.value,isRetrying:m.value,attemptIndex:h.value,retryCount:c,totalElapsedMs:g.value}}async function b(n){let r=Date.now();g.value=void 0,p.value=null,m.value=!1;let a=y();if(l){let t=l(n);if(t===!1||typeof t==`string`){p.value=typeof t==`string`?t:`Validation failed`,f.value=!1,e.log({type:`resource`,label:i,details:{from:a,to:y()}});return}}let b=0;for(h.value=b;b<=c&&!v;){_&&_.abort(),_=new AbortController;let a=_.signal,l=y();f.value=!0,b===0&&o&&(d.value=null),e.log({type:`resource`,label:i,details:{from:l,to:y()}});let x=!1;try{let o=t(n,a);if(s!==void 0&&s>0){let t=e.delay(s,a).then(()=>{throw x=!0,_&&_.abort(),Error(`Request timed out after ${s}ms`)});o=Promise.race([o,t])}let c=await o;if(a.aborted||v)return;if(u){let e=u(c);if(e===!1||typeof e==`string`)throw Error(typeof e==`string`?e:`Response validation failed`)}let l=y();d.value=c,p.value=null,m.value=!1,g.value=Date.now()-r,f.value=!1,e.log({type:`resource`,label:i,details:{from:l,to:y()}});return}catch(t){let n=x||s!==void 0&&t?.name===`TimeoutError`;if(a.aborted&&!n||v)return;let o=y(),l=n?`Request timed out after ${s}ms`:t?.message||String(t);if(b<c){b++,h.value=b,m.value=!0,e.log({type:`resource`,label:i,details:{from:o,to:y()}});try{await e.delay(1e3*b,a)}catch{return}}else{let t=b+1,n=c>0?`. Всего безуспешных попыток с момента изменения исходного сигнала: ${t}`:``;p.value=`${l}${n}`,m.value=!1,g.value=Date.now()-r,f.value=!1,e.log({type:`resource`,label:i,details:{from:o,to:y()}});return}}}}let x=e.effect(()=>{if(n){let t=n.value;e.untrack(()=>{b(t)})}else e.untrack(()=>{b(void 0)})},`${i}_effect`),S={get data(){return v?null:d.value},get loading(){return v?!1:f.value},get error(){return v?null:p.value},get isRetrying(){return v?!1:m.value},get attemptIndex(){return v?0:h.value},get retryCount(){return c},get totalElapsedMs(){return v?void 0:g.value},refetch(){v||e.untrack(()=>{b(n?n.value:void 0)})},subscribe(t){return e.effect(()=>{t(S.value)})},get value(){return y()},destroy(){v=!0,_&&=(_.abort(),null),x(),d.destroy(),f.destroy(),p.destroy(),m.destroy(),h.destroy(),g.destroy()}};return S}var l=class{source=null;target=null;nextSubscriber=null;prevSubscriber=null;nextDependency=null;prevDependency=null;version=0;clear(){this.source=null,this.target=null,this.nextSubscriber=null,this.prevSubscriber=null,this.nextDependency=null,this.prevDependency=null,this.version=0}},u=class{static pool=[];static size=0;static maxPoolSize=1e5;static acquire(e,t){if(this.size>0){this.size--;let n=this.pool[this.size];return this.pool[this.size]=null,n.source=e,n.target=t,n}let n=new l;return n.source=e,n.target=t,n}static release(e){this.size<this.maxPoolSize&&(e.clear(),this.pool[this.size]=e,this.size++)}},d=class{id;type;version=0;state=0;depth=0;subscribersHead=null;subscribersTail=null;dependenciesHead=null;dependenciesTail=null;depsCursor=null;_value;_prevValue;fn=null;cleanups=new Set;isDisposed=!1;ownedEffects=new Set;wrapper=null;engine=null;constructor(e,t,n){this.type=e,this.id=t,this._value=n,this._prevValue=n}get subscribers(){let e=new Set,t=this.subscribersHead;for(;t!==null;)t.target&&e.add(t.target),t=t.nextSubscriber;return e}get dependencies(){let e=new Set,t=this.dependenciesHead;for(;t!==null;)t.source&&e.add(t.source),t=t.nextDependency;return e}},f=class{buckets=[];maxDepth=-1;schedule(e){let t=e.depth;this.buckets[t]||(this.buckets[t]=[]),this.buckets[t].includes(e)||(this.buckets[t].push(e),t>this.maxDepth&&(this.maxDepth=t))}clearAll(){for(let e=0;e<=this.maxDepth;e++){let t=this.buckets[e];if(t){for(let e of t)e.state=0;this.buckets[e]=[]}}this.maxDepth=-1}flush(e){let t=e.activeConsumer;try{let t=0;for(;t<=this.maxDepth;){let n=this.buckets[t];if(!n||n.length===0){t++;continue}this.buckets[t]=[],n.sort((e,t)=>t.depth-e.depth);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{e.runEffectNode(t)}catch(e){throw this.clearAll(),e}let r=!1;for(let e=0;e<=this.maxDepth;e++)if(this.buckets[e]&&this.buckets[e].length>0){t=e,r=!0;break}r||t++}}finally{e.activeConsumer=t,this.maxDepth=-1}}},p=class{activeConsumer=null;batchDepth=0;batchedSignals=[];batchInitialValues=new Map;computedCache=new WeakMap;logger;proxyCache=new WeakMap;proxyTargets=new WeakSet;reactiveSignals=new WeakMap;scheduler=new f;currentOwner=null;effectIdCounter=0;diRegistry=new Map;diCache=new Map;cycleDetectionStack=new Set;constructor(e){this.logger=e?.logger||{isEnabled:!1}}log(e){!this.logger||!this.logger.isEnabled||o.processLog(this.logger,i,e)}signal(e,t){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 d(`signal`,n,e);a.engine=this;let o=this;this.log({type:`signal`,label:n,details:{to:e},isInternalCoreSignal:i});let s={_node:a,_engine:this,get value(){return o.activeConsumer&&o.trackNode(a,o.activeConsumer),a._value},set value(e){if(r){let t=r(e);if(t===!1||typeof t==`string`){console.error(`[Validation Error] Invalid value supplied to signal "${n}": ${t}`);return}}let t=typeof e==`object`&&!!e;if(Object.is(a._value,e)&&!t)return;let s=a._value;a._prevValue=s,o.batchDepth>0&&!o.batchInitialValues.has(a)&&o.batchInitialValues.set(a,{value:s,version:a.version}),a._value=e,a.version++,o.log({type:`signal`,label:n,details:{from:s,to:e},isInternalCoreSignal:i}),o.notifySubscribers(a,2),o.batchDepth>0?o.batchedSignals.includes(a)||o.batchedSignals.push(a):o.flushEffects()},get valueWithoutTracking(){return a._value},subscribe(e){return o.effect(()=>{e(s.value)})},destroy(){o.disposeNode(a)}};return a.wrapper=s,s}notifySubscribers(e,t){let n=e.subscribersHead;for(;n!==null;){let e=n.target;if(e===this.activeConsumer){n=n.nextSubscriber;continue}e.state<t&&(e.state=t,e.type===`effect`?this.scheduler.schedule(e):this.notifySubscribers(e,1)),n=n.nextSubscriber}}computed(e,t){let n=new d(`computed`,t||`computed`);n.engine=this,n.fn=e,n.state=2;let r=this,i={_node:n,_engine:this,get value(){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},get valueWithoutTracking(){return n._value},subscribe(e){return r.effect(()=>{e(i.value)})},destroy(){r.disposeNode(n)},_isDirty(){return n.state===2},get dependencies(){let e=new Set,t=n.dependenciesHead;for(;t!==null;)t.source&&t.source.wrapper&&e.add(t.source.wrapper),t=t.nextDependency;return e}};return n.wrapper=i,this.batchDepth===0&&this.computedCache.set(e,i),i}effect(e,t){let n=t||`effect`,r=new d(`effect`,n);r.state=2,r.depth=this.currentOwner?this.currentOwner.depth+1:0,r.wrapper={id:++this.effectIdCounter,run:()=>{this.runEffectNode(r)},markDirty:()=>{r.state=2,this.scheduler.schedule(r)},cleanups:r.cleanups,label:n,get isDirty(){return r.state===2},get isDisposed(){return r.isDisposed},_node:r},r.fn=()=>{this.log({type:`effect`,label:n});let t=e();typeof t==`function`&&r.cleanups.add(t)},this.currentOwner&&this.currentOwner.ownedEffects.add(r),this.runEffectNode(r);let i=()=>{this.disposeNode(r)};return i._node=r,i}resource(e,t,n){return c(this,e,t,n)}batch(e){this.batchDepth++;try{return e()}finally{if(this.batchDepth--,this.batchDepth===0){for(let e of this.batchedSignals){let t=this.batchInitialValues.get(e),n=e._value!==null&&typeof e._value==`object`;t&&!n&&Object.is(e._value,t.value)&&(e.version=t.version,this.resetCleanState(e))}this.batchedSignals=[],this.batchInitialValues.clear(),this.flushEffects()}}}resetCleanState(e){let t=e.subscribersHead;for(;t!==null;){let e=t.target;e.state>0&&!this.checkNeedsUpdate(e)&&(e.state=0,this.resetCleanState(e)),t=t.nextSubscriber}}untrack(e){let t=this.activeConsumer;this.activeConsumer=null;try{return e()}finally{this.activeConsumer=t}}flushEffects(){this.batchDepth===0&&this.scheduler.flush(this)}trackNode(e,t){let n=t.depsCursor;if(n!==null&&n.source===e){n.version=e.version,t.depsCursor=n.nextDependency;return}let r=t.dependenciesHead;for(;r!==n;){if(r.source===e){r.version=e.version;return}r=r.nextDependency}let i=n===null?null:n.nextDependency;for(;i!==null;){if(i.source===e){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);return}i=i.nextDependency}let a=u.acquire(e,t);a.version=e.version,t.depth<=e.depth&&(t.depth=e.depth+1),e.subscribersTail===null?(e.subscribersHead=a,e.subscribersTail=a):(e.subscribersTail.nextSubscriber=a,a.prevSubscriber=e.subscribersTail,e.subscribersTail=a),n===null?t.dependenciesTail===null?(t.dependenciesHead=a,t.dependenciesTail=a):(t.dependenciesTail.nextDependency=a,a.prevDependency=t.dependenciesTail,t.dependenciesTail=a):this.insertLinkBeforeCursor(t,a,n)}insertLinkBeforeCursor(e,t,n){let r=n.prevDependency;t.prevDependency=r,t.nextDependency=n,n.prevDependency=t,r===null?e.dependenciesHead=t:r.nextDependency=t}endTracking(e){let t=e.depsCursor;if(e.depsCursor=null,t===null)return;let n=t.prevDependency;for(n===null?(e.dependenciesHead=null,e.dependenciesTail=null):(n.nextDependency=null,e.dependenciesTail=n);t!==null;){let e=t.nextDependency,n=t.source;t.prevSubscriber===null?n.subscribersHead=t.nextSubscriber:t.prevSubscriber.nextSubscriber=t.nextSubscriber,t.nextSubscriber===null?n.subscribersTail=t.prevSubscriber:t.nextSubscriber.prevSubscriber=t.prevSubscriber,u.release(t),t=e}}unlinkDependencies(e,t=!1){let n=e.dependenciesHead;for(e.dependenciesHead=null,e.dependenciesTail=null;n!==null;){let r=n.nextDependency,i=n.source;n.prevSubscriber===null?i.subscribersHead=n.nextSubscriber:n.prevSubscriber.nextSubscriber=n.nextSubscriber,n.nextSubscriber===null?i.subscribersTail=n.prevSubscriber:n.nextSubscriber.prevSubscriber=n.prevSubscriber,u.release(n),t&&e.isDisposed&&e.type===`computed`&&i.type===`computed`&&i.subscribersHead===null&&this.disposeNode(i),n=r}}checkNeedsUpdate(e){let t=e.dependenciesHead;for(;t!==null;){let e=t.source;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;t=t.nextDependency}return!1}evaluateComputed(e){if(e.ownedEffects.size>0){let t=Array.from(e.ownedEffects);e.ownedEffects.clear();for(let e of t)this.disposeNode(e)}e.depsCursor=e.dependenciesHead;let t=this.activeConsumer,n=this.currentOwner;this.activeConsumer=e,this.currentOwner=e;let r=e._value;try{let t=e.fn();Object.is(e._value,t)||(e._value=t,e.version++),e.state=0,this.log({type:`computed`,label:e.id,details:{from:r,to:e._value}})}finally{this.endTracking(e),this.activeConsumer=t,this.currentOwner=n}}executeCleanups(e){if(e.cleanups.size===0)return;let t=Array.from(e.cleanups);e.cleanups.clear();let n=null;for(let e of t)try{this.untrack(()=>e())}catch(e){n===null&&(n=e)}if(n!==null)throw n}runEffectNode(e){if(e.isDisposed)return;if(e.ownedEffects.size>0){let t=Array.from(e.ownedEffects);e.ownedEffects.clear();for(let e of t)this.disposeNode(e)}try{this.executeCleanups(e)}catch(t){throw e.state=0,t}e.depsCursor=e.dependenciesHead;let t=this.activeConsumer,n=this.currentOwner;this.activeConsumer=e,this.currentOwner=e;try{e.fn(),e.state=0}finally{this.endTracking(e),this.activeConsumer=t,this.currentOwner=n,e.isDisposed&&this.unlinkDependencies(e,!0)}}disposeNode(e){if(e.isDisposed)return;if(e.isDisposed=!0,e.state=0,e.ownedEffects.size>0){let t=Array.from(e.ownedEffects);e.ownedEffects.clear();for(let e of t)this.disposeNode(e)}try{this.executeCleanups(e)}catch{}this.unlinkDependencies(e,!0);let t=e.subscribersHead;for(e.subscribersHead=null,e.subscribersTail=null;t!==null;){let e=t.nextSubscriber,n=t.target;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),u.release(t),t=e}}reactive(e,t){return s(this,e,t)}delay(e,t){return new Promise((n,r)=>{if(t.aborted)return r(new DOMException(`Aborted`,`AbortError`));let i=setTimeout(()=>{t.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};t.addEventListener(`abort`,a,{once:!0})})}provide(e,t){this.diRegistry.set(e,t),this.diCache.delete(e)}inject(e){if(e==null)throw Error(`[DI Error] Token is empty`);if(this.diCache.has(e))return this.diCache.get(e);if(this.cycleDetectionStack.has(e))throw Error(`[DI Error] Cyclic dependency detected`);this.cycleDetectionStack.add(e);try{if(this.diRegistry.has(e)){let t=this.diRegistry.get(e);if(typeof t==`function`){if(t._isMockFunction){let n=t(this);return n===void 0?t:(this.diCache.set(e,n),n)}let n=t.toString();if(!(n.startsWith(`class `)||n.startsWith(`class{`)||t.prototype&&t.prototype.constructor===t&&!n.startsWith(`function`)&&!n.includes(`=>`))){let n=t(this);return this.diCache.set(e,n),n}return t}return t}if(typeof e==`function`){let t=new e(this);return this.diCache.set(e,t),t}throw Error(`[DI Error] Token not found`)}finally{this.cycleDetectionStack.delete(e)}}},m=new p,h=class extends p{},g=class extends h{autoLogQueue=[];isHardFlushScheduled=!1;queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,meta:n,timestamp:Date.now()}),this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>this.flushLogs()))}flushLogs(){this.isHardFlushScheduled=!1,this.autoLogQueue.length!==0&&(typeof process<`u`&&process.env.NODE_ENV!==`test`&&(console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`),this.autoLogQueue.forEach(e=>console.log(`[${e.type.toUpperCase()}] ${e.name}`,e.meta||``)),console.groupEnd()),this.autoLogQueue=[])}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t),a=!1,o={get value(){if(a)return i.value;let e=typeof performance<`u`?performance.now():0,t=i.value;return e&&n.queueLog(`computed`,r,{value:t,duration:`${(performance.now()-e).toFixed(3)}ms`}),t},subscribe:e=>i.subscribe(e),destroy(){a=!0,i.destroy()}};return`_node`in i&&Object.defineProperty(o,"_node",{value:i._node,enumerable:!1}),o}};function _(e,t){if(!m)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return m.signal(e,t)}function v(e,t){if(!m)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return m.computed(e,t)}function y(e,t){if(!m)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return m.effect(e,t)}function b(e){if(!m)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return m.batch(e)}function x(e){if(!m)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return m.untrack(e)}function S(e,t){if(!m)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);m.provide(e,t)}function C(e){if(!m)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return m.inject(e)}var w=class{engine;constructor(e){this.engine=e,this.onInit()}createNumericSignal(e,t){return this.engine.signal(e,{name:t,validate:e=>typeof e==`number`&&!isNaN(e)})}createComputed(e){return this.engine.computed(e)}createSignal(e,t){return this.engine.signal(e,t)}onInit(){}},T=w,E=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=w,e.BaseREService=T,e.BaseREServiceEnhanced=E,e.EffectScheduler=f,e.LinkPool=u,e.NodeLink=l,e.ReactiveEngine=h,e.ReactiveEngineAutolog=g,e.ReactiveEngineAutomatic=p,e.ReactiveEngineCore=p,e.ReactiveNode=d,e.batch=b,e.computed=v,Object.defineProperty(e,"currentEngineInstance",{enumerable:!0,get:function(){return m}}),e.effect=y,e.inject=C,e.provide=S,e.signal=_,e.untrack=x});
12
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactiveEngineLib={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t={signal:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,computed:`background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,effect:`background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,batch:`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,resource:`background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,reactive:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`},n=null;function r(e){if(e===null)return`null`;if(e===void 0)return`undefined`;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[Cyclic Object or Layer]`}return String(e)}function i(e,t,r){n||(n={id:Math.random().toString(36).substring(2,9),pendingLogQueue:[],isFlushing:!1},queueMicrotask(()=>a())),n.pendingLogQueue.push({type:e,label:t,from:r?.from,to:r?.to,payload:r?.payload,timestamp:Date.now()})}function a(){if(!n||n.isFlushing)return;n.isFlushing=!0;let e=n.pendingLogQueue;if(e.length===0){n=null;return}console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${n.id}] (${e.length} operations)`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #888; font-weight: normal;`);for(let n of e){let e=t[n.type],i=n.from!==void 0||n.to!==void 0,a=`%c${n.type.toUpperCase()}%c ${n.label}`;i&&(n.from===void 0?a+=` (${r(n.to)})`:a+=` ${r(n.from)} → ${r(n.to)}`),n.payload===void 0?console.log(a,e,`color: inherit;`):(console.groupCollapsed(a,e,`color: inherit;`),console.log(`Payload:`,n.payload),console.groupEnd())}console.groupEnd(),n=null}var o=class{static churnTracker=new Map;static TIME_WINDOW_MS=1e3;static CHURN_WARNING_THRESHOLD=3;static CHURN_CRITICAL_THRESHOLD=6;static isDeepEqual(e,t){return e===t?!0:typeof e!=`object`||typeof t!=`object`||e===null||t===null?!1:JSON.stringify(e)===JSON.stringify(t)}static analyzeSignalChurn(e){let t=Date.now();this.churnTracker.has(e)||this.churnTracker.set(e,[]);let n=this.churnTracker.get(e),r=t-this.TIME_WINDOW_MS,i=n.filter(e=>e>r);i.push(t);let a=i.length,o=(this.TIME_WINDOW_MS/1e3).toFixed(1);return i.length<=1?(this.churnTracker.delete(e),{marker:`🟢`,info:`[STABLE] (1 изм./${o}s)`}):(this.churnTracker.set(e,i),a>=this.CHURN_CRITICAL_THRESHOLD?{marker:`🔴`,info:`[CRITICAL CHURN] (${a} изм./${o}s) — Нужен debounce!`}:a>=this.CHURN_WARNING_THRESHOLD?{marker:`🟡`,info:`[WARNING CHURN] (${a} изм./${o}s)`}:{marker:`🟢`,info:`[STABLE] (${a} изм./${o}s)`})}static processLog(e,t,n){let{type:r,label:i,details:a,isInternalCoreSignal:o=!1}=n;if(!e.isEnabled||e.filter&&!(e.filter instanceof RegExp?e.filter.test(i):i.includes(e.filter))||o&&!e.isCoreOptimizationDebugEnabled)return;if(a&&`from`in a&&`to`in a&&this.isDeepEqual(a.from,a.to)){if((r===`computed`||r===`resource`)&&e.isCoreOptimizationDebugEnabled){t(r,`🔵 [IDLE] ${i}`,a);return}return}let s=``;if(r===`signal`||r===`resource`||r===`computed`){let e=this.analyzeSignalChurn(i);s=e.marker===`🟢`?` ${e.marker}`:` ${e.marker} ${e.info}`}t(r,`${i}${s}`,a)}};function s(e,t,n){if(e.proxyTargets.has(t))return t;if(e.proxyCache.has(t))return e.proxyCache.get(t);let r=n||`reactive`;e.log({type:`reactive`,label:r,details:{to:t}}),e.reactiveSignals.has(t)||e.reactiveSignals.set(t,new Map);let i=e.reactiveSignals.get(t),a=Symbol(`ownKeys`);function o(t,n){let a=i.get(t);return a||(a=e.signal(n,{name:`${r}.${String(t)}`,isInternalCoreSignal:!0}),i.set(t,a)),a}let s=new Proxy(t,{ownKeys(e){return o(a,0).value,Reflect.ownKeys(e)},get(t,r,s){if(r===`__subscribe`&&Array.isArray(t))return e=>o(`length`,t.length).subscribe(e);if(Array.isArray(t)&&typeof r==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(r))return(...c)=>{let l,u=n?`${n}.${r}`:`array.${r}`,d=t.length;return e.batch(()=>{l=Reflect.get(t,r).apply(s,c);let n=o(`length`,t.length);n.value=t.length;let f=o(a,0);f.value=f.valueWithoutTracking+1,i.forEach((e,n)=>{n!==`length`&&n!==a&&(e.value=Reflect.get(t,n))}),e.log({type:`reactive`,label:u,details:{from:{length:d},to:{length:t.length}}})}),l};if(typeof r==`symbol`||r===`constructor`||r===`toJSON`)return Reflect.get(t,r,s);let c=i.get(r);if(!c){let a=Reflect.get(t,r);c=e.signal(a),i.set(r,c),typeof a==`object`&&a&&(c._proxyCache=e.reactive(a,n?`${n}.${String(r)}`:String(r)))}return c._proxyCache===void 0?c.value:(c.value,c._proxyCache)},set(t,r,i){let s=Object.prototype.hasOwnProperty.call(t,r),c=Reflect.get(t,r);if(s&&c===i&&r!==`length`)return!0;Reflect.set(t,r,i);let l=o(r,c),u=n?`${n}.${String(r)}`:String(r);if(e.log({type:`reactive`,label:u,details:{from:c,to:i}}),l._proxyCache=void 0,l.value=i,!s){let e=o(a,0);e.value=e.valueWithoutTracking+1}if(Array.isArray(t)&&r!==`length`){let e=o(`length`,t.length);e.value=t.length}return!0},deleteProperty(e,t){let n=Object.prototype.hasOwnProperty.call(e,t),r=Reflect.deleteProperty(e,t);if(n&&r){let e=i.get(t);e&&(e._proxyCache=void 0,e.value=void 0);let n=o(a,0);n.value=n.valueWithoutTracking+1}return r}});return e.proxyCache.set(t,s),e.proxyTargets.add(s),s}function c(e,t,n,r){let i=typeof r==`string`?r:r?.name||`resource`,a=typeof r==`object`?r:{},o=a.resetDataOnSourceChange??!1,s=a.timeout,c=a.retryCount??0,l=a.validateBeforeFetch,u=a.responseValidate,d=e.signal(null,`${i}_data`),f=e.signal(!1,`${i}_loading`),p=e.signal(null,`${i}_error`),m=e.signal(!1,`${i}_isRetrying`),h=e.signal(0,`${i}_attemptIndex`),g=e.signal(void 0,`${i}_totalElapsedMs`),_=null,v=!1;function y(){if(!v)return{data:d.value,loading:f.value,error:p.value,isRetrying:m.value,attemptIndex:h.value,retryCount:c,totalElapsedMs:g.value}}async function b(n){let r=Date.now();g.value=void 0,p.value=null,m.value=!1;let a=y();if(l){let t=l(n);if(t===!1||typeof t==`string`){p.value=typeof t==`string`?t:`Validation failed`,f.value=!1,e.log({type:`resource`,label:i,details:{from:a,to:y()}});return}}let b=0;for(h.value=b;b<=c&&!v;){_&&_.abort(),_=new AbortController;let a=_.signal,l=y();f.value=!0,b===0&&o&&(d.value=null),e.log({type:`resource`,label:i,details:{from:l,to:y()}});let x=!1;try{let o=t(n,a);if(s!==void 0&&s>0){let t=e.delay(s,a).then(()=>{throw x=!0,_&&_.abort(),Error(`Request timed out after ${s}ms`)});o=Promise.race([o,t])}let c=await o;if(a.aborted||v)return;if(u){let e=u(c);if(e===!1||typeof e==`string`)throw Error(typeof e==`string`?e:`Response validation failed`)}let l=y();d.value=c,p.value=null,m.value=!1,g.value=Date.now()-r,f.value=!1,e.log({type:`resource`,label:i,details:{from:l,to:y()}});return}catch(t){let n=x||s!==void 0&&t?.name===`TimeoutError`;if(a.aborted&&!n||v)return;let o=y(),l=n?`Request timed out after ${s}ms`:t?.message||String(t);if(b<c){b++,h.value=b,m.value=!0,e.log({type:`resource`,label:i,details:{from:o,to:y()}});try{await e.delay(1e3*b,a)}catch{return}}else{let t=b+1,n=c>0?`. Всего безуспешных попыток с момента изменения исходного сигнала: ${t}`:``;p.value=`${l}${n}`,m.value=!1,g.value=Date.now()-r,f.value=!1,e.log({type:`resource`,label:i,details:{from:o,to:y()}});return}}}}let x=e.effect(()=>{if(n){let t=n.value;e.untrack(()=>{b(t)})}else e.untrack(()=>{b(void 0)})},`${i}_effect`),S={get data(){return v?null:d.value},get loading(){return v?!1:f.value},get error(){return v?null:p.value},get isRetrying(){return v?!1:m.value},get attemptIndex(){return v?0:h.value},get retryCount(){return c},get totalElapsedMs(){return v?void 0:g.value},refetch(){v||e.untrack(()=>{b(n?n.value:void 0)})},subscribe(t){return e.effect(()=>{t(S.value)})},get value(){return y()},destroy(){v=!0,_&&=(_.abort(),null),x(),d.destroy(),f.destroy(),p.destroy(),m.destroy(),h.destroy(),g.destroy()}};return S}var l=class{source=null;target=null;nextSubscriber=null;prevSubscriber=null;nextDependency=null;prevDependency=null;version=0;clear(){this.source=null,this.target=null,this.nextSubscriber=null,this.prevSubscriber=null,this.nextDependency=null,this.prevDependency=null,this.version=0}},u=class{static pool=[];static size=0;static maxPoolSize=1e5;static acquire(e,t){if(this.size>0){this.size--;let n=this.pool[this.size];return this.pool[this.size]=null,n.source=e,n.target=t,n}let n=new l;return n.source=e,n.target=t,n}static release(e){this.size<this.maxPoolSize&&(e.clear(),this.pool[this.size]=e,this.size++)}},d=class{id;type;version=0;state=0;depth=0;subscribersHead=null;subscribersTail=null;dependenciesHead=null;dependenciesTail=null;depsCursor=null;_value;_prevValue;fn=null;isDisposed=!1;ownedEffects=null;wrapper=null;engine=null;_cleanups=null;get cleanups(){return this._cleanups===null&&(this._cleanups=new Set),this._cleanups}constructor(e,t,n){this.type=e,this.id=t,this._value=n,this._prevValue=n}get _node(){return this}get _engine(){return this.engine}get subscribers(){let e=new Set,t=this.subscribersHead;for(;t!==null;)t.target&&e.add(t.target),t=t.nextSubscriber;return e}get dependencies(){let e=new Set,t=this.dependenciesHead;for(;t!==null;)t.source&&e.add(t.source.wrapper||t.source),t=t.nextDependency;return e}},f=class extends d{validate;isInternal;constructor(e,t,n,r,i=!1){super(`signal`,t,n),this.engine=e,this.validate=r,this.isInternal=i,this.wrapper=this}get value(){let e=this.engine;return e.activeConsumer!==null&&e.trackNode(this,e.activeConsumer),this._value}set value(e){if(this.validate!==void 0){let t=this.validate(e);if(t===!1||typeof t==`string`){console.error(`[Validation Error] Invalid value supplied to signal "${this.id}": ${t}`);return}}let t=typeof e==`object`&&!!e;if(Object.is(this._value,e)&&!t)return;let n=this.engine,r=this._value;this._prevValue=r,n.batchDepth>0&&!n.batchInitialValues.has(this)&&n.batchInitialValues.set(this,{value:r,version:this.version}),this._value=e,this.version++,n.logger.isEnabled&&n.log({type:`signal`,label:this.id,details:{from:r,to:e},isInternalCoreSignal:this.isInternal}),n.notifySubscribers(this,2),n.batchDepth>0?n.batchedSignals.includes(this)||n.batchedSignals.push(this):n.flushEffects()}get valueWithoutTracking(){return this._value}subscribe(e){return this.engine.effect(()=>{e(this.value)})}destroy(){this.engine.disposeNode(this)}},p=class extends d{constructor(e,t,n){super(`computed`,t),this.engine=e,this.fn=n,this.state=2,this.wrapper=this}get value(){let e=this.engine;return this.state===1&&(e.checkNeedsUpdate(this)?this.state=2:this.state=0),this.state===2&&e.evaluateComputed(this),e.activeConsumer!==null&&e.trackNode(this,e.activeConsumer),this._value}get valueWithoutTracking(){return this._value}subscribe(e){return this.engine.effect(()=>{e(this.value)})}destroy(){this.engine.disposeNode(this)}_isDirty(){return this.state===2}},m=class{buckets=[];maxDepth=-1;schedule(e){let t=e.depth;this.buckets[t]||(this.buckets[t]=[]),this.buckets[t].includes(e)||(this.buckets[t].push(e),t>this.maxDepth&&(this.maxDepth=t))}clearAll(){for(let e=0;e<=this.maxDepth;e++){let t=this.buckets[e];if(t){for(let e of t)e.state=0;this.buckets[e]=[]}}this.maxDepth=-1}flush(e){let t=e.activeConsumer;try{let t=0;for(;t<=this.maxDepth;){let n=this.buckets[t];if(!n||n.length===0){t++;continue}this.buckets[t]=[],n.sort((e,t)=>t.depth-e.depth);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{e.runEffectNode(t)}catch(e){throw this.clearAll(),e}let r=!1;for(let e=0;e<=this.maxDepth;e++)if(this.buckets[e]&&this.buckets[e].length>0){t=e,r=!0;break}r||t++}}finally{e.activeConsumer=t,this.maxDepth=-1}}},h=class{activeConsumer=null;batchDepth=0;batchedSignals=[];batchInitialValues=new Map;computedCache=new WeakMap;logger;proxyCache=new WeakMap;proxyTargets=new WeakSet;reactiveSignals=new WeakMap;scheduler=new m;currentOwner=null;effectIdCounter=0;diRegistry=new Map;diCache=new Map;cycleDetectionStack=new Set;constructor(e){this.logger=e?.logger||{isEnabled:!1}}log(e){!this.logger||!this.logger.isEnabled||o.processLog(this.logger,i,e)}signal(e,t){let n=`signal`,r,i=!1;return typeof t==`string`?n=t:t!==void 0&&(t.name!==void 0&&(n=t.name),r=t.validate,i=!!t.isInternalCoreSignal),this.logger.isEnabled&&this.log({type:`signal`,label:n,details:{to:e},isInternalCoreSignal:i}),new f(this,n,e,r,i)}notifySubscribers(e,t){let n=e.subscribersHead;for(;n!==null;){let e=n.target;if(e===this.activeConsumer){n=n.nextSubscriber;continue}e.state<t&&(e.state=t,e.type===`effect`?this.scheduler.schedule(e):this.notifySubscribers(e,1)),n=n.nextSubscriber}}computed(e,t){let n=new p(this,t||`computed`,e);return this.batchDepth===0&&this.computedCache.set(e,n),n}effect(e,t){let n=t||`effect`,r=new d(`effect`,n);r.engine=this,r.state=2,r.depth=this.currentOwner?this.currentOwner.depth+1:0,r.wrapper={id:++this.effectIdCounter,run:()=>{this.runEffectNode(r)},markDirty:()=>{r.state=2,this.scheduler.schedule(r)},get cleanups(){return r.cleanups||(r._cleanups=new Set),r.cleanups},label:n,get isDirty(){return r.state===2},get isDisposed(){return r.isDisposed},_node:r},r.fn=()=>{this.logger.isEnabled&&this.log({type:`effect`,label:n});let t=e();typeof t==`function`&&(r._cleanups===null&&(r._cleanups=new Set),r._cleanups.add(t))},this.currentOwner&&(this.currentOwner.ownedEffects||(this.currentOwner.ownedEffects=new Set),this.currentOwner.ownedEffects.add(r)),this.runEffectNode(r);let i=()=>{this.disposeNode(r)};return i._node=r,i}resource(e,t,n){return c(this,e,t,n)}batch(e){this.batchDepth++;try{return e()}finally{if(this.batchDepth--,this.batchDepth===0){for(let e of this.batchedSignals){let t=this.batchInitialValues.get(e),n=e._value!==null&&typeof e._value==`object`;t&&!n&&Object.is(e._value,t.value)&&(e.version=t.version,this.resetCleanState(e))}this.batchedSignals=[],this.batchInitialValues.clear(),this.flushEffects()}}}resetCleanState(e){let t=e.subscribersHead;for(;t!==null;){let e=t.target;e.state>0&&!this.checkNeedsUpdate(e)&&(e.state=0,this.resetCleanState(e)),t=t.nextSubscriber}}untrack(e){let t=this.activeConsumer;this.activeConsumer=null;try{return e()}finally{this.activeConsumer=t}}flushEffects(){this.batchDepth===0&&this.scheduler.flush(this)}trackNode(e,t){if(t.isDisposed)return;let n=t.depsCursor;if(n!==null&&n.source===e){n.version=e.version,t.depsCursor=n.nextDependency;return}let r=t.dependenciesHead;for(;r!==n;){if(r.source===e){r.version=e.version;return}r=r.nextDependency}let i=n===null?null:n.nextDependency;for(;i!==null;){if(i.source===e){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);return}i=i.nextDependency}let a=u.acquire(e,t);a.version=e.version,t.depth<=e.depth&&(t.depth=e.depth+1),e.subscribersTail===null?(e.subscribersHead=a,e.subscribersTail=a):(e.subscribersTail.nextSubscriber=a,a.prevSubscriber=e.subscribersTail,e.subscribersTail=a),n===null?t.dependenciesTail===null?(t.dependenciesHead=a,t.dependenciesTail=a):(t.dependenciesTail.nextDependency=a,a.prevDependency=t.dependenciesTail,t.dependenciesTail=a):this.insertLinkBeforeCursor(t,a,n)}insertLinkBeforeCursor(e,t,n){let r=n.prevDependency;t.prevDependency=r,t.nextDependency=n,n.prevDependency=t,r===null?e.dependenciesHead=t:r.nextDependency=t}endTracking(e){let t=e.depsCursor;if(e.depsCursor=null,t===null)return;let n=t.prevDependency;for(n===null?(e.dependenciesHead=null,e.dependenciesTail=null):(n.nextDependency=null,e.dependenciesTail=n);t!==null;){let e=t.nextDependency,n=t.source;t.prevSubscriber===null?n.subscribersHead=t.nextSubscriber:t.prevSubscriber.nextSubscriber=t.nextSubscriber,t.nextSubscriber===null?n.subscribersTail=t.prevSubscriber:t.nextSubscriber.prevSubscriber=t.prevSubscriber,u.release(t),t=e}}unlinkDependencies(e,t=!1){let n=e.dependenciesHead;for(e.dependenciesHead=null,e.dependenciesTail=null;n!==null;){let r=n.nextDependency,i=n.source;n.prevSubscriber===null?i.subscribersHead=n.nextSubscriber:n.prevSubscriber.nextSubscriber=n.nextSubscriber,n.nextSubscriber===null?i.subscribersTail=n.prevSubscriber:n.nextSubscriber.prevSubscriber=n.prevSubscriber,u.release(n),t&&e.isDisposed&&e.type===`computed`&&i.type===`computed`&&i.subscribersHead===null&&this.disposeNode(i),n=r}}checkNeedsUpdate(e){let t=e.dependenciesHead;for(;t!==null;){let e=t.source;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;t=t.nextDependency}return!1}evaluateComputed(e){if(e.ownedEffects!==null&&e.ownedEffects.size>0){let t=Array.from(e.ownedEffects);e.ownedEffects.clear();for(let e of t)this.disposeNode(e)}e.depsCursor=e.dependenciesHead;let t=this.activeConsumer,n=this.currentOwner;this.activeConsumer=e,this.currentOwner=e;let r=e._value;try{let t=e.fn();Object.is(e._value,t)||(e._value=t,e.version++),e.state=0,this.logger.isEnabled&&this.log({type:`computed`,label:e.id,details:{from:r,to:e._value}})}finally{this.endTracking(e),this.activeConsumer=t,this.currentOwner=n}}executeCleanups(e){if(e._cleanups===null||e._cleanups.size===0)return;let t=Array.from(e._cleanups);e.cleanups.clear();let n=null;for(let e of t)try{this.untrack(()=>e())}catch(e){n===null&&(n=e)}if(n!==null)throw n}runEffectNode(e){if(e.isDisposed)return;if(e.ownedEffects!==null&&e.ownedEffects.size>0){let t=Array.from(e.ownedEffects);e.ownedEffects.clear();for(let e of t)this.disposeNode(e)}try{this.executeCleanups(e)}catch(t){throw e.state=0,t}e.depsCursor=e.dependenciesHead;let t=this.activeConsumer,n=this.currentOwner;this.activeConsumer=e,this.currentOwner=e;try{e.fn(),e.state=0}finally{this.endTracking(e),this.activeConsumer=t,this.currentOwner=n,e.isDisposed&&this.unlinkDependencies(e,!0)}}disposeNode(e){if(e.isDisposed)return;if(e.isDisposed=!0,e.state=0,e.depsCursor=null,e.ownedEffects!==null&&e.ownedEffects.size>0){let t=Array.from(e.ownedEffects);e.ownedEffects.clear();for(let e of t)this.disposeNode(e)}try{this.executeCleanups(e)}catch{}this.unlinkDependencies(e,!0);let t=e.subscribersHead;for(e.subscribersHead=null,e.subscribersTail=null;t!==null;){let e=t.nextSubscriber,n=t.target;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),u.release(t),t=e}}reactive(e,t){return s(this,e,t)}delay(e,t){return new Promise((n,r)=>{if(t.aborted)return r(new DOMException(`Aborted`,`AbortError`));let i=setTimeout(()=>{t.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};t.addEventListener(`abort`,a,{once:!0})})}provide(e,t){this.diRegistry.set(e,t),this.diCache.delete(e)}inject(e){if(e==null)throw Error(`[DI Error] Token is empty`);if(this.diCache.has(e))return this.diCache.get(e);if(this.cycleDetectionStack.has(e))throw Error(`[DI Error] Cyclic dependency detected`);this.cycleDetectionStack.add(e);try{if(this.diRegistry.has(e)){let t=this.diRegistry.get(e);if(typeof t==`function`){if(t._isMockFunction){let n=t(this);return n===void 0?t:(this.diCache.set(e,n),n)}let n=t.toString();if(!(n.startsWith(`class `)||n.startsWith(`class{`)||t.prototype&&t.prototype.constructor===t&&!n.startsWith(`function`)&&!n.includes(`=>`))){let n=t(this);return this.diCache.set(e,n),n}return t}return t}if(typeof e==`function`){let t=new e(this);return this.diCache.set(e,t),t}throw Error(`[DI Error] Token not found`)}finally{this.cycleDetectionStack.delete(e)}}},g=new h,_=class extends h{},v=class extends _{autoLogQueue=[];isHardFlushScheduled=!1;queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,meta:n,timestamp:Date.now()}),this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>this.flushLogs()))}flushLogs(){this.isHardFlushScheduled=!1,this.autoLogQueue.length!==0&&(typeof process<`u`&&process.env.NODE_ENV!==`test`&&(console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`),this.autoLogQueue.forEach(e=>console.log(`[${e.type.toUpperCase()}] ${e.name}`,e.meta||``)),console.groupEnd()),this.autoLogQueue=[])}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t),a=!1,o={get value(){if(a)return i.value;let e=typeof performance<`u`?performance.now():0,t=i.value;return e&&n.queueLog(`computed`,r,{value:t,duration:`${(performance.now()-e).toFixed(3)}ms`}),t},subscribe:e=>i.subscribe(e),destroy(){a=!0,i.destroy()}};return`_node`in i&&Object.defineProperty(o,"_node",{value:i._node,enumerable:!1}),o}};function y(e,t){if(!g)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return g.signal(e,t)}function b(e,t){if(!g)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return g.computed(e,t)}function x(e,t){if(!g)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return g.effect(e,t)}function S(e){if(!g)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return g.batch(e)}function C(e){if(!g)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return g.untrack(e)}function w(e,t){if(!g)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);g.provide(e,t)}function T(e){if(!g)throw Error(`[Reactive Engine v3] Global engine instance is not initialized.`);return g.inject(e)}var E=class{engine;constructor(e){this.engine=e,this.onInit()}createNumericSignal(e,t){return this.engine.signal(e,{name:t,validate:e=>typeof e==`number`&&!isNaN(e)})}createComputed(e){return this.engine.computed(e)}createSignal(e,t){return this.engine.signal(e,t)}onInit(){}},D=E,O=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=E,e.BaseREService=D,e.BaseREServiceEnhanced=O,e.ComputedNode=p,e.EffectScheduler=m,e.LinkPool=u,e.NodeLink=l,e.ReactiveEngine=_,e.ReactiveEngineAutolog=v,e.ReactiveEngineAutomatic=h,e.ReactiveEngineCore=h,e.ReactiveNode=d,e.SignalNode=f,e.batch=S,e.computed=b,Object.defineProperty(e,"currentEngineInstance",{enumerable:!0,get:function(){return g}}),e.effect=x,e.inject=T,e.provide=w,e.signal=y,e.untrack=C});
13
13
  //# sourceMappingURL=reactive-engine.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.logger.ts","../src/core/core.method.reactive.ts","../src/core/core.method.resource.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/core.global.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { LogEventType, TransactionContext, LogRecord } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nconst badgeColors: Record<LogEventType, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;'\n}\n\nlet currentTransaction: TransactionContext | null = null\n\nfunction safeValueToString(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value)\n } catch (e) {\n return '[Cyclic Object or Layer]'\n }\n }\n return String(value)\n}\n\nexport function queueLog(type: LogEventType, label: string, details?: LogDetails): void {\n if (!currentTransaction) {\n currentTransaction = { id: Math.random().toString(36).substring(2, 9), pendingLogQueue: [], isFlushing: false }\n queueMicrotask(() => flushLogs())\n }\n currentTransaction.pendingLogQueue.push({\n type,\n label,\n from: details?.from,\n to: details?.to,\n payload: details?.payload,\n timestamp: Date.now()\n })\n}\n\nexport function flushLogs(): void {\n if (!currentTransaction || currentTransaction.isFlushing) return\n currentTransaction.isFlushing = true\n const queue = currentTransaction.pendingLogQueue\n if (queue.length === 0) {\n currentTransaction = null\n return\n }\n console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${currentTransaction.id}] (${queue.length} operations)`, 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;', 'color: #888; font-weight: normal;')\n for (const record of queue) {\n const colorStyle = badgeColors[record.type]\n const hasTransition = record.from !== undefined || record.to !== undefined\n let logMessage = `%c${record.type.toUpperCase()}%c ${record.label}`\n\n if (hasTransition) {\n if (record.from !== undefined)\n logMessage += ` ${safeValueToString(record.from)} → ${safeValueToString(record.to)}`\n else logMessage += ` (${safeValueToString(record.to)})`\n }\n\n if (record.payload !== undefined) {\n console.groupCollapsed(logMessage, colorStyle, 'color: inherit;')\n console.log('Payload:', record.payload)\n console.groupEnd()\n } else {\n console.log(logMessage, colorStyle, 'color: inherit;')\n }\n }\n console.groupEnd()\n currentTransaction = null\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n if (activeHistory.length <= 1) {\n this.churnTracker.delete(label)\n return { marker: '🟢', info: `[STABLE] (1 изм./${intervalSec}s)` }\n } else {\n this.churnTracker.set(label, activeHistory)\n }\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return { marker: '🔴', info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!` }\n }\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return { marker: '🟡', info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)` }\n }\n return { marker: '🟢', info: `[STABLE] (${updateCount} изм./${intervalSec}s)` }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n\n if (engineLogger.filter) {\n const isMatch = engineLogger.filter instanceof RegExp\n ? engineLogger.filter.test(label)\n : label.includes(engineLogger.filter)\n if (!isMatch) return\n }\n\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n if ((type === 'computed' || type === 'resource') && engineLogger.isCoreOptimizationDebugEnabled) {\n queueLogFn(type, `🔵 [IDLE] ${label}`, details)\n return\n }\n return\n }\n }\n\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n}\n","import type { ReactiveEngineCore } from './core'\n\nexport function createReactive<T extends object>(\n engine: ReactiveEngineCore,\n target: T,\n name?: string\n): T {\n if (engine.proxyTargets.has(target)) return target\n if (engine.proxyCache.has(target)) return engine.proxyCache.get(target) as T\n\n // Логируем стартовую инициализацию реактивного Proxy-объекта (REACTIVE <name> (<target>))\n const rootLabel = name || 'reactive'\n engine.log({\n type: 'reactive',\n label: rootLabel,\n details: { to: target }\n })\n\n if (!engine.reactiveSignals.has(target)) {\n engine.reactiveSignals.set(target, new Map<string | symbol, any>())\n }\n const signalsMap = engine.reactiveSignals.get(target)!\n const OWN_KEYS_SYMBOL = Symbol('ownKeys')\n\n function getOrCreateSignal(prop: string | symbol, initialVal: any) {\n let sig = signalsMap.get(prop)\n if (!sig) {\n // Передаём флаг внутреннего сигнала, чтобы не дублировать логи REACTIVE записями SIGNAL\n sig = engine.signal(initialVal, {\n name: `${rootLabel}.${String(prop)}`,\n isInternalCoreSignal: true\n } as any)\n signalsMap.set(prop, sig)\n }\n return sig\n }\n\n const handler: ProxyHandler<T> = {\n ownKeys(t: T) {\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value\n return Reflect.ownKeys(t)\n },\n\n get(t: T, prop: string | symbol, receiver: any) {\n if (prop === '__subscribe' && Array.isArray(t)) {\n return (cb: () => void) => {\n const lengthSig = getOrCreateSignal('length', t.length)\n return lengthSig.subscribe(cb)\n }\n }\n\n if (\n Array.isArray(t) &&\n typeof prop === 'string' &&\n ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].includes(prop)\n ) {\n return (...args: any[]) => {\n let result: any\n const label = name ? `${name}.${prop}` : `array.${prop}`\n const oldLength = t.length\n\n engine.batch(() => {\n const origMethod = Reflect.get(t, prop) as Function\n result = origMethod.apply(receiver, args)\n\n const lengthSig = getOrCreateSignal('length', t.length)\n lengthSig.value = t.length\n\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n\n signalsMap.forEach((sig: any, key: string | symbol) => {\n if (key !== 'length' && key !== OWN_KEYS_SYMBOL) {\n sig.value = Reflect.get(t, key)\n }\n })\n\n engine.log({\n type: 'reactive',\n label,\n details: { from: { length: oldLength }, to: { length: t.length } }\n })\n })\n return result\n }\n }\n\n if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'toJSON') {\n return Reflect.get(t, prop, receiver)\n }\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n const rawValue = Reflect.get(t, prop)\n sig = engine.signal(rawValue)\n signalsMap.set(prop, sig)\n\n if (rawValue !== null && typeof rawValue === 'object') {\n (sig as any)._proxyCache = engine.reactive(\n rawValue,\n name ? `${name}.${String(prop)}` : String(prop)\n )\n }\n }\n\n if ((sig as any)._proxyCache !== undefined) {\n sig.value\n return (sig as any)._proxyCache\n }\n\n return sig.value\n },\n\n set(t: T, prop: string | symbol, value: any): boolean {\n const hadKey = Object.prototype.hasOwnProperty.call(t, prop)\n const oldValue = Reflect.get(t, prop)\n\n if (hadKey && oldValue === value && prop !== 'length') return true\n Reflect.set(t, prop, value)\n\n const sig = getOrCreateSignal(prop, oldValue)\n\n const label = name ? `${name}.${String(prop)}` : String(prop)\n engine.log({\n type: 'reactive',\n label,\n details: { from: oldValue, to: value }\n })\n\n ;(sig as any)._proxyCache = undefined\n sig.value = value\n\n if (!hadKey) {\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n }\n\n if (Array.isArray(t) && prop !== 'length') {\n const lengthSig = getOrCreateSignal('length', t.length)\n lengthSig.value = t.length\n }\n return true\n },\n\n deleteProperty(t: T, prop: string | symbol): boolean {\n const hadKey = Object.prototype.hasOwnProperty.call(t, prop)\n const result = Reflect.deleteProperty(t, prop)\n if (hadKey && result) {\n const sig = signalsMap.get(prop)\n if (sig) {\n ;(sig as any)._proxyCache = undefined\n sig.value = undefined\n }\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n }\n return result\n }\n }\n\n const proxy = new Proxy(target, handler)\n engine.proxyCache.set(target, proxy)\n engine.proxyTargets.add(proxy)\n return proxy\n}\n","import type { ReactiveEngineCore } from './core'\nimport type { Resource, ResourceOptions, ResourceState, CleanupFn } from './types'\n\nexport function createResource<T, S = void>(\n engine: ReactiveEngineCore,\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n): Resource<T> {\n const name = typeof optionsOrName === 'string' ? optionsOrName : (optionsOrName?.name || 'resource')\n const options = typeof optionsOrName === 'object' ? optionsOrName : {}\n\n const resetDataOnSourceChange = options.resetDataOnSourceChange ?? false\n const timeoutMs = options.timeout\n const maxRetryCount = options.retryCount ?? 0\n const validateBeforeFetch = options.validateBeforeFetch\n const responseValidate = options.responseValidate\n\n const dataSignal = engine.signal<T | null>(null, `${name}_data`)\n const loadingSignal = engine.signal<boolean>(false, `${name}_loading`)\n const errorSignal = engine.signal<string | null>(null, `${name}_error`)\n const isRetryingSignal = engine.signal<boolean>(false, `${name}_isRetrying`)\n const attemptIndexSignal = engine.signal<number>(0, `${name}_attemptIndex`)\n const totalElapsedMsSignal = engine.signal<number | undefined>(undefined, `${name}_totalElapsedMs`)\n\n let activeAbortController: AbortController | null = null\n let isDestroyed = false\n\n function snapshotState(): ResourceState<T> {\n if (isDestroyed) {\n return undefined as unknown as ResourceState<T>\n }\n return {\n data: dataSignal.value,\n loading: loadingSignal.value,\n error: errorSignal.value,\n isRetrying: isRetryingSignal.value,\n attemptIndex: attemptIndexSignal.value,\n retryCount: maxRetryCount,\n totalElapsedMs: totalElapsedMsSignal.value\n }\n }\n\n async function executeFetch(sourceValue: S): Promise<void> {\n const startTime = Date.now()\n totalElapsedMsSignal.value = undefined\n errorSignal.value = null\n isRetryingSignal.value = false\n\n const prevState = snapshotState()\n\n if (validateBeforeFetch) {\n const validationResult = validateBeforeFetch(sourceValue)\n if (validationResult === false || typeof validationResult === 'string') {\n const errorMsg = typeof validationResult === 'string' ? validationResult : 'Validation failed'\n errorSignal.value = errorMsg\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: prevState, to: snapshotState() }\n })\n return\n }\n }\n\n let attempt = 0\n attemptIndexSignal.value = attempt\n\n while (attempt <= maxRetryCount && !isDestroyed) {\n if (activeAbortController) {\n activeAbortController.abort()\n }\n\n activeAbortController = new AbortController()\n const currentSignal = activeAbortController.signal\n\n const stateBeforeFetch = snapshotState()\n loadingSignal.value = true\n if (attempt === 0 && resetDataOnSourceChange) {\n dataSignal.value = null\n }\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeFetch, to: snapshotState() }\n })\n\n let isTimedOut = false\n\n try {\n let fetchPromise = fetcher(sourceValue, currentSignal)\n\n if (timeoutMs !== undefined && timeoutMs > 0) {\n const timeoutPromise = engine.delay(timeoutMs, currentSignal).then(() => {\n isTimedOut = true\n if (activeAbortController) {\n activeAbortController.abort()\n }\n throw new Error(`Request timed out after ${timeoutMs}ms`)\n })\n fetchPromise = Promise.race([fetchPromise, timeoutPromise])\n }\n\n const payload = await fetchPromise\n\n if (currentSignal.aborted || isDestroyed) return\n\n if (responseValidate) {\n const resValidation = responseValidate(payload)\n if (resValidation === false || typeof resValidation === 'string') {\n throw new Error(typeof resValidation === 'string' ? resValidation : 'Response validation failed')\n }\n }\n\n const stateBeforeSuccess = snapshotState()\n dataSignal.value = payload\n errorSignal.value = null\n isRetryingSignal.value = false\n totalElapsedMsSignal.value = Date.now() - startTime\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeSuccess, to: snapshotState() }\n })\n return\n } catch (err: any) {\n const isTimeoutErr = isTimedOut || (timeoutMs !== undefined && err?.name === 'TimeoutError')\n if (currentSignal.aborted && !isTimeoutErr) return\n if (isDestroyed) return\n\n const stateBeforeError = snapshotState()\n const rawMessage = isTimeoutErr\n ? `Request timed out after ${timeoutMs}ms`\n : (err?.message || String(err))\n\n if (attempt < maxRetryCount) {\n attempt++\n attemptIndexSignal.value = attempt\n isRetryingSignal.value = true\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeError, to: snapshotState() }\n })\n\n try {\n // Экспоненциальное засыпание (1000ms * attempt для попадания в тайминги 1500ms / 2500ms)\n await engine.delay(1000 * attempt, currentSignal)\n } catch (e) {\n return\n }\n } else {\n const totalAttempts = attempt + 1\n const suffix = maxRetryCount > 0\n ? `. Всего безуспешных попыток с момента изменения исходного сигнала: ${totalAttempts}`\n : ''\n errorSignal.value = `${rawMessage}${suffix}`\n isRetryingSignal.value = false\n totalElapsedMsSignal.value = Date.now() - startTime\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeError, to: snapshotState() }\n })\n return\n }\n }\n }\n }\n\n const unsubscribeEffect = engine.effect(() => {\n if (source) {\n const currentSourceValue = source.value\n engine.untrack(() => {\n executeFetch(currentSourceValue)\n })\n } else {\n engine.untrack(() => {\n executeFetch(undefined as unknown as S)\n })\n }\n }, `${name}_effect`)\n\n const publicResource: Resource<T> = {\n get data(): T | null { return isDestroyed ? null : dataSignal.value },\n get loading(): boolean { return isDestroyed ? false : loadingSignal.value },\n get error(): string | null { return isDestroyed ? null : errorSignal.value },\n get isRetrying(): boolean { return isDestroyed ? false : isRetryingSignal.value },\n get attemptIndex(): number { return isDestroyed ? 0 : attemptIndexSignal.value },\n get retryCount(): number { return maxRetryCount },\n get totalElapsedMs(): number | undefined { return isDestroyed ? undefined : totalElapsedMsSignal.value },\n\n refetch(): void {\n if (isDestroyed) return\n engine.untrack(() => {\n if (source) {\n executeFetch(source.value)\n } else {\n executeFetch(undefined as unknown as S)\n }\n })\n },\n\n subscribe(cb: (val: ResourceState<T>) => void): CleanupFn {\n return engine.effect(() => {\n cb(publicResource.value)\n })\n },\n\n get value(): ResourceState<T> {\n return snapshotState()\n },\n\n destroy(): void {\n isDestroyed = true\n if (activeAbortController) {\n activeAbortController.abort()\n activeAbortController = null\n }\n unsubscribeEffect()\n dataSignal.destroy()\n loadingSignal.destroy()\n errorSignal.destroy()\n isRetryingSignal.destroy()\n attemptIndexSignal.destroy()\n totalElapsedMsSignal.destroy()\n }\n }\n\n return publicResource\n}\n","import type {\n CleanupFn,\n EffectFn,\n Signal,\n Computed,\n IEffect,\n SignalOptions,\n EngineLoggerOptions,\n LogEventType,\n Token,\n Factory,\n Resource,\n ResourceOptions\n} from './types'\nimport { ReactiveDebounceLogger, queueLog } from './core.logger'\nimport { createReactive } from './core.method.reactive'\nimport { createResource } from './core.method.resource'\n\nexport type NodeState = 0 | 1 | 2\n\nexport class NodeLink {\n public source: ReactiveNode | null = null\n public target: ReactiveNode | null = null\n public nextSubscriber: NodeLink | null = null\n public prevSubscriber: NodeLink | null = null\n public nextDependency: NodeLink | null = null\n public prevDependency: NodeLink | null = null\n public version: number = 0\n\n public clear(): void {\n this.source = null\n this.target = null\n this.nextSubscriber = null\n this.prevSubscriber = null\n this.nextDependency = null\n this.prevDependency = null\n this.version = 0\n }\n}\n\nexport class LinkPool {\n private static pool: NodeLink[] = []\n private static size = 0\n private static maxPoolSize = 100000\n\n public static acquire(source: ReactiveNode, target: ReactiveNode): NodeLink {\n if (this.size > 0) {\n this.size--\n const link = this.pool[this.size]\n this.pool[this.size] = null as unknown as NodeLink\n link.source = source\n link.target = target\n return link\n }\n const link = new NodeLink()\n link.source = source\n link.target = target\n return link\n }\n\n public static release(link: NodeLink): void {\n if (this.size < this.maxPoolSize) {\n link.clear()\n this.pool[this.size] = link\n this.size++\n }\n }\n}\n\nexport class ReactiveNode {\n public id: string\n public type: 'signal' | 'computed' | 'effect'\n public version: number = 0\n public state: NodeState = 0\n public depth: number = 0\n public subscribersHead: NodeLink | null = null\n public subscribersTail: NodeLink | null = null\n public dependenciesHead: NodeLink | null = null\n public dependenciesTail: NodeLink | null = null\n public depsCursor: NodeLink | null = null // Курсор для O(1) переиспользования связей\n public _value: any\n public _prevValue: any\n public fn: (() => any) | null = null\n public cleanups = new Set<CleanupFn>()\n public isDisposed: boolean = false\n public ownedEffects = new Set<ReactiveNode>()\n public wrapper: any = null\n public engine: ReactiveEngineCore | null = null\n\n constructor(type: 'signal' | 'computed' | 'effect', id: string, initialValue?: any) {\n this.type = type\n this.id = id\n this._value = initialValue\n this._prevValue = initialValue\n }\n\n public get subscribers(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.subscribersHead\n while (link !== null) {\n if (link.target) set.add(link.target)\n link = link.nextSubscriber\n }\n return set\n }\n\n public get dependencies(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.dependenciesHead\n while (link !== null) {\n if (link.source) set.add(link.source)\n link = link.nextDependency\n }\n return set\n }\n}\n\nexport class EffectScheduler {\n private buckets: ReactiveNode[][] = []\n private maxDepth = -1\n\n public schedule(node: ReactiveNode): void {\n const d = node.depth\n if (!this.buckets[d]) {\n this.buckets[d] = []\n }\n if (!this.buckets[d].includes(node)) {\n this.buckets[d].push(node)\n if (d > this.maxDepth) this.maxDepth = d\n }\n }\n\n public clearAll(): void {\n for (let d = 0; d <= this.maxDepth; d++) {\n const bucket = this.buckets[d]\n if (bucket) {\n for (const node of bucket) {\n node.state = 0\n }\n this.buckets[d] = []\n }\n }\n this.maxDepth = -1\n }\n\n public flush(engine: ReactiveEngineCore): void {\n const prevConsumer = engine.activeConsumer\n try {\n let d = 0\n while (d <= this.maxDepth) {\n const bucket = this.buckets[d]\n if (!bucket || bucket.length === 0) {\n d++\n continue\n }\n\n this.buckets[d] = []\n bucket.sort((a, b) => b.depth - a.depth)\n\n for (const node of bucket) {\n if (node.isDisposed || node.state === 0) continue\n\n if (node.state === 1) {\n if (engine.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n\n if (node.state === 2) {\n try {\n engine.runEffectNode(node)\n } catch (err) {\n // Изоляция очереди при падении эффекта (#177, #247)\n this.clearAll()\n throw err\n }\n }\n }\n\n let hasTasks = false\n for (let i = 0; i <= this.maxDepth; i++) {\n if (this.buckets[i] && this.buckets[i].length > 0) {\n d = i\n hasTasks = true\n break\n }\n }\n if (!hasTasks) d++\n }\n } finally {\n engine.activeConsumer = prevConsumer\n this.maxDepth = -1\n }\n }\n}\n\nexport class ReactiveEngineCore {\n public activeConsumer: ReactiveNode | null = null\n public batchDepth = 0\n public batchedSignals: ReactiveNode[] = []\n public batchInitialValues = new Map<ReactiveNode, { value: any; version: number }>()\n public computedCache = new WeakMap<Function, any>()\n public logger: EngineLoggerOptions\n\n public proxyCache = new WeakMap<object, any>()\n public proxyTargets = new WeakSet<object>()\n public reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n\n private scheduler = new EffectScheduler()\n private currentOwner: ReactiveNode | null = null\n private effectIdCounter = 0\n\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private cycleDetectionStack = new Set<unknown>()\n\n // public isCleaningUp = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public log(params: { type: LogEventType; label: string; details?: { from?: unknown; to?: unknown; payload?: unknown }; isInternalCoreSignal?: boolean }): void {\n if (!this.logger || !this.logger.isEnabled) return\n ReactiveDebounceLogger.processLog(this.logger, queueLog, params)\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const name = typeof optionsOrName === 'string' ? optionsOrName : (optionsOrName?.name || 'signal')\n const validate = typeof optionsOrName === 'object' ? optionsOrName?.validate : undefined\n const isInternal = typeof optionsOrName === 'object' ? optionsOrName?.isInternalCoreSignal : false\n const node = new ReactiveNode('signal', name, initialValue)\n node.engine = this\n const self = this\n\n // Логируем стартовую инициализацию сигнала (from: undefined -> формат \"SIGNAL label (initialValue)\")\n this.log({ type: 'signal', label: name, details: { to: initialValue }, isInternalCoreSignal: isInternal })\n\n const publicSignal: Signal<T> & { _node: ReactiveNode; _engine: ReactiveEngineCore } = {\n _node: node,\n _engine: this,\n get value(): T {\n // if (self.isCleaningUp && self.activeConsumer === null) {\n // return node._prevValue\n // }\n if (self.activeConsumer) {\n self.trackNode(node, self.activeConsumer)\n }\n return node._value\n },\n set value(newValue: T) {\n if (validate) {\n const validationResult = validate(newValue)\n if (validationResult === false || typeof validationResult === 'string') {\n console.error(`[Validation Error] Invalid value supplied to signal \"${name}\": ${validationResult}`)\n return\n }\n }\n const isObj = newValue !== null && typeof newValue === 'object'\n if (Object.is(node._value, newValue) && !isObj) return\n\n const oldVal = node._value\n node._prevValue = oldVal\n\n if (self.batchDepth > 0 && !self.batchInitialValues.has(node)) {\n self.batchInitialValues.set(node, { value: oldVal, version: node.version })\n }\n\n node._value = newValue\n node.version++\n\n self.log({ type: 'signal', label: name, details: { from: oldVal, to: newValue }, isInternalCoreSignal: isInternal })\n self.notifySubscribers(node, 2)\n\n if (self.batchDepth > 0) {\n if (!self.batchedSignals.includes(node)) {\n self.batchedSignals.push(node)\n }\n } else {\n self.flushEffects()\n }\n },\n get valueWithoutTracking(): T {\n return node._value\n },\n subscribe(cb: (v: T) => void): CleanupFn {\n return self.effect(() => {\n cb(publicSignal.value)\n })\n },\n destroy(): void {\n self.disposeNode(node)\n }\n }\n\n node.wrapper = publicSignal\n return publicSignal\n }\n\n public notifySubscribers(node: ReactiveNode, state: NodeState): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target === this.activeConsumer) {\n link = link.nextSubscriber\n continue\n }\n\n if (target.state < state) {\n target.state = state\n if (target.type === 'effect') {\n this.scheduler.schedule(target)\n } else {\n this.notifySubscribers(target, 1)\n }\n }\n link = link.nextSubscriber\n }\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const name = signalName || 'computed'\n const node = new ReactiveNode('computed', name)\n node.engine = this\n node.fn = fn\n node.state = 2\n const self = this\n\n const publicComputed: Computed<T> & { _node: ReactiveNode; _engine: ReactiveEngineCore } = {\n _node: node,\n _engine: this,\n get value(): T {\n if (node.state === 1) {\n if (self.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n if (node.state === 2) {\n const oldVal = node._value\n self.evaluateComputed(node)\n // self.log({ type: 'computed', label: name, details: { from: oldVal, to: node._value } })\n }\n if (self.activeConsumer) {\n self.trackNode(node, self.activeConsumer)\n }\n return node._value\n },\n get valueWithoutTracking(): T {\n return node._value\n },\n subscribe(cb: (v: T) => void): CleanupFn {\n return self.effect(() => {\n cb(publicComputed.value)\n })\n },\n destroy(): void {\n self.disposeNode(node)\n },\n _isDirty(): boolean {\n return node.state === 2\n },\n get dependencies(): Set<any> {\n const depsSet = new Set()\n let link = node.dependenciesHead\n while (link !== null) {\n if (link.source && link.source.wrapper) {\n depsSet.add(link.source.wrapper)\n }\n link = link.nextDependency\n }\n return depsSet\n }\n }\n node.wrapper = publicComputed\n if (this.batchDepth === 0) {\n this.computedCache.set(fn, publicComputed)\n }\n return publicComputed\n }\n public effect(fn: EffectFn, effectName?: string): () => void {\n const name = effectName || 'effect'\n const node = new ReactiveNode('effect', name)\n node.state = 2\n node.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0\n const publicEffect: IEffect = {\n id: ++this.effectIdCounter,\n run: () => {\n this.runEffectNode(node)\n },\n markDirty: () => {\n node.state = 2\n this.scheduler.schedule(node)\n },\n cleanups: node.cleanups,\n label: name,\n get isDirty(): boolean { return node.state === 2 },\n get isDisposed(): boolean { return node.isDisposed },\n _node: node\n }\n node.wrapper = publicEffect\n node.fn = () => {\n this.log({ type: 'effect', label: name })\n const res = fn()\n if (typeof res === 'function') {\n node.cleanups.add(res)\n }\n }\n if (this.currentOwner) {\n this.currentOwner.ownedEffects.add(node)\n }\n this.runEffectNode(node)\n const disposeFn = () => {\n this.disposeNode(node)\n }\n;(disposeFn as any)._node = node\n return disposeFn\n }\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): Resource<T> {\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n public batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) {\n // Проверка Net-Zero откатов (#147)\n for (const sig of this.batchedSignals) {\n const initial = this.batchInitialValues.get(sig)\n const isObj = sig._value !== null && typeof sig._value === 'object'\n if (initial && !isObj && Object.is(sig._value, initial.value)) {\n sig.version = initial.version\n this.resetCleanState(sig)\n }\n }\n this.batchedSignals = []\n this.batchInitialValues.clear()\n this.flushEffects()\n }\n }\n }\n private resetCleanState(node: ReactiveNode): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target.state > 0 && !this.checkNeedsUpdate(target)) {\n target.state = 0\n this.resetCleanState(target)\n }\n link = link.nextSubscriber\n }\n }\n public untrack<T>(fn: () => T): T {\n const prevConsumer = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n public flushEffects(): void {\n if (this.batchDepth === 0) {\n this.scheduler.flush(this)\n }\n }\n public trackNode(source: ReactiveNode, target: ReactiveNode): void {\n const cursor = target.depsCursor\n\n // 1. FAST PATH (O(1)): Зависимость совпала с текущей позицией курсора\n if (cursor !== null && cursor.source === source) {\n cursor.version = source.version\n target.depsCursor = cursor.nextDependency\n return\n }\n\n // 2. SLOW PATH: Проверяем, нет ли уже этого source среди уже пройденных (от head до cursor)\n // или среди оставшихся после cursor (если зависимости поменялись местами)\n let link = target.dependenciesHead\n while (link !== cursor) {\n if (link!.source === source) {\n link!.version = source.version\n return\n }\n link = link!.nextDependency\n }\n\n // Проверяем, не встречается ли source дальше по списку (после cursor)\n let ahead = cursor !== null ? cursor.nextDependency : null\n while (ahead !== null) {\n if (ahead.source === source) {\n // Вырезаем ahead из его текущей позиции и перемещаем перед cursor\n if (ahead.prevDependency !== null) {\n ahead.prevDependency.nextDependency = ahead.nextDependency\n }\n if (ahead.nextDependency !== null) {\n ahead.nextDependency.prevDependency = ahead.prevDependency\n } else {\n target.dependenciesTail = ahead.prevDependency\n }\n\n ahead.version = source.version\n this.insertLinkBeforeCursor(target, ahead, cursor!)\n return\n }\n ahead = ahead.nextDependency\n }\n\n // 3. Совершенно новая зависимость — берём из пула\n const newLink = LinkPool.acquire(source, target)\n newLink.version = source.version\n\n if (target.depth <= source.depth) {\n target.depth = source.depth + 1\n }\n\n // Вставляем в хвост подписчиков source\n if (source.subscribersTail !== null) {\n source.subscribersTail.nextSubscriber = newLink\n newLink.prevSubscriber = source.subscribersTail\n source.subscribersTail = newLink\n } else {\n source.subscribersHead = newLink\n source.subscribersTail = newLink\n }\n\n // Вставляем в список зависимостей target строго перед cursor (или в хвост, если cursor === null)\n if (cursor !== null) {\n this.insertLinkBeforeCursor(target, newLink, cursor)\n } else {\n if (target.dependenciesTail !== null) {\n target.dependenciesTail.nextDependency = newLink\n newLink.prevDependency = target.dependenciesTail\n target.dependenciesTail = newLink\n } else {\n target.dependenciesHead = newLink\n target.dependenciesTail = newLink\n }\n }\n }\n\n private insertLinkBeforeCursor(target: ReactiveNode, link: NodeLink, cursor: NodeLink): void {\n const prev = cursor.prevDependency\n link.prevDependency = prev\n link.nextDependency = cursor\n cursor.prevDependency = link\n if (prev !== null) {\n prev.nextDependency = link\n } else {\n target.dependenciesHead = link\n }\n }\n\n private endTracking(target: ReactiveNode): void {\n let link = target.depsCursor\n target.depsCursor = null\n\n if (link === null) return\n\n // Отрезаем неиспользованный хвост начиная с link\n const prev = link.prevDependency\n if (prev !== null) {\n prev.nextDependency = null\n target.dependenciesTail = prev\n } else {\n target.dependenciesHead = null\n target.dependenciesTail = null\n }\n\n while (link !== null) {\n const next: NodeLink | null = link.nextDependency\n const source = link.source!\n\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n\n LinkPool.release(link)\n link = next\n }\n }\n public unlinkDependencies(target: ReactiveNode, cascadeOrphans = false): void {\n let link = target.dependenciesHead\n target.dependenciesHead = null\n target.dependenciesTail = null\n while (link !== null) {\n const next = link.nextDependency\n const source = link.source!\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n LinkPool.release(link)\n\n // Не уничтожаем computed при отписке слушателей (иначе React StrictMode убивает computed при ремаунте),\n // каскадно удаляем только если сам узел явным образом уничтожен через .destroy()\n if (cascadeOrphans && target.isDisposed && target.type === 'computed' && source.type === 'computed' && source.subscribersHead === null) {\n this.disposeNode(source)\n }\n link = next\n }\n }\n public checkNeedsUpdate(node: ReactiveNode): boolean {\n let link = node.dependenciesHead\n while (link !== null) {\n const source = link.source!\n if (source.state === 1) {\n if (this.checkNeedsUpdate(source)) {\n source.state = 2\n } else {\n source.state = 0\n }\n }\n if (source.state === 2) {\n this.evaluateComputed(source)\n }\n if (link.version !== source.version) {\n link.version = source.version\n return true\n }\n link = link.nextDependency\n }\n return false\n }\n public evaluateComputed(node: ReactiveNode): void {\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n // Ставим курсор в начало существующих зависимостей вместо полного разрыва связей\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n const oldVal = node._value\n try {\n const newValue = node.fn!()\n if (!Object.is(node._value, newValue)) {\n node._value = newValue\n node.version++\n }\n node.state = 0\n this.log({ type: 'computed', label: node.id, details: { from: oldVal, to: node._value } })\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n }\n }\n private executeCleanups(node: ReactiveNode): void {\n if (node.cleanups.size === 0) return\n const cleanupsList = Array.from(node.cleanups)\n node.cleanups.clear()\n let firstError: unknown = null\n // const prevCleaning = this.isCleaningUp\n // this.isCleaningUp = true\n\n for (const cleanup of cleanupsList) {\n try {\n this.untrack(() => cleanup())\n } catch (err) {\n if (firstError === null) {\n firstError = err\n }\n }\n }\n\n // finally {\n // this.isCleaningUp = prevCleaning\n // }\n if (firstError !== null) {\n throw firstError\n }\n }\n public runEffectNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {\n node.state = 0\n throw e\n }\n\n // Ставим курсор в начало существующих зависимостей\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n try {\n node.fn!()\n node.state = 0\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n if (node.isDisposed) {\n this.unlinkDependencies(node, true)\n }\n }\n }\n public disposeNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n node.isDisposed = true\n node.state = 0\n\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {}\n\n this.unlinkDependencies(node, true)\n\n let link = node.subscribersHead\n node.subscribersHead = null\n node.subscribersTail = null\n while (link !== null) {\n const next = link.nextSubscriber\n const target = link.target\n if (target) {\n if (link.prevDependency !== null) {\n link.prevDependency.nextDependency = link.nextDependency\n } else {\n target.dependenciesHead = link.nextDependency\n }\n if (link.nextDependency !== null) {\n link.nextDependency.prevDependency = link.prevDependency\n } else {\n target.dependenciesTail = link.prevDependency\n }\n }\n LinkPool.release(link)\n link = next\n }\n }\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n public delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n public inject<T>(token: Token<T>): T {\n if (token === undefined || token === null) {\n throw new Error('[DI Error] Token is empty')\n }\n if (this.diCache.has(token)) {\n return this.diCache.get(token) as T\n }\n if (this.cycleDetectionStack.has(token)) {\n throw new Error('[DI Error] Cyclic dependency detected')\n }\n this.cycleDetectionStack.add(token)\n try {\n if (this.diRegistry.has(token)) {\n const entry = this.diRegistry.get(token)\n if (typeof entry === 'function') {\n if ((entry as any)._isMockFunction) {\n const mockRes = (entry as Function)(this)\n if (mockRes !== undefined) {\n this.diCache.set(token, mockRes)\n return mockRes as T\n }\n return entry as unknown as T\n }\n const str = entry.toString()\n const isClass = str.startsWith('class ') ||\nstr.startsWith('class{') ||\n(entry.prototype && entry.prototype.constructor === entry && !str.startsWith('function') && !str.includes('=>'))\n if (!isClass) {\n const resolved = (entry as Factory<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n return entry as unknown as T\n }\n return entry as T\n }\n if (typeof token === 'function') {\n const resolved = new (token as any)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n throw new Error('[DI Error] Token not found')\n } finally {\n this.cycleDetectionStack.delete(token)\n }\n }\n}\nexport let currentEngineInstance = new ReactiveEngineCore()\nexport function resetGlobalReactiveEngine(): void {\n currentEngineInstance = new ReactiveEngineCore()\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import {\n // ReactiveEngineCore,\n currentEngineInstance,\n resetGlobalReactiveEngine as resetEngineInstance,\n} from './core'\nimport { Computed, EffectFn, Signal, Token, Factory } from './types'\n\n/**\n * Создает новый реактивный сигнал в рамках текущей глобальной эпохи.\n *\n * @template T Тип значения, хранящегося внутри сигнала.\n * @param initialValue Начальное состояние сигнала.\n * @param optionsOrName Строковое имя или конфигурационный объект для отладки.\n */\nexport function signal<T>(\n initialValue: T,\n optionsOrName?: string | { name?: string }\n): Signal<T> {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.signal<T>(initialValue, optionsOrName)\n}\n\n/**\n * Создает декларативное вычисляемое свойство (Computed) в рамках текущей глобальной эпохи.\n * Полностью мемоизирует результат вычисления и использует ленивую pull-модель на NodeLink-связях.\n *\n * @template T Тип возвращаемого функцией значения.\n * @param fn Чистая функция-вычислитель.\n * @param signalName Опциональное имя для логирования и отладки графа.\n */\nexport function computed<T>(fn: () => T, signalName?: string): Computed<T> {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.computed<T>(fn, signalName)\n}\n\n/**\n * Регистрирует сайд-эффект в планировщике текущей глобальной эпохи.\n * Синхронно запускает первый проход вычисления для сбора реактивных зависимостей.\n *\n * @param fn Функция эффекта, которая может возвращать деструктор (колбэк очистки).\n * @param effectName Опциональное имя эффекта для трассировки и изоляции.\n * @returns Функция полного императивного разрыва связей и уничтожения (unsub/dispose).\n */\nexport function effect(fn: EffectFn, effectName?: string): () => void {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.effect(fn, effectName)\n}\n\n/**\n * Группирует последовательные мутации сигналов в единую атомарную транзакцию.\n * Откладывает флуш и выполнение эффектов до выхода из самого внешнего макро-батча.\n *\n * @template T Тип возвращаемого транзакционной функцией значения.\n * @param fn Функция, выполняющая пакетное обновление стейта.\n */\nexport function batch<T>(fn: () => T): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.batch<T>(fn)\n}\n\n/**\n * Временно замораживает автоматический трекинг зависимостей текущего потребителя.\n * Позволяет безопасно читать реактивные узлы внутри эффектов без создания циклов и лишних ребер.\n *\n * @template T Тип возвращаемого значения.\n * @param fn Контекстная функция чтения.\n */\nexport function untrack<T>(fn: () => T): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.untrack<T>(fn)\n}\n\n/**\n * Бескомпромиссно сжигает текущую глобальную реактивную эпоху.\n * Инициализирует новое изолированное ядро графа, гарантируя, что старые компоненты\n * и кэши вычислений не протекут в новые тестовые раны или жизненные циклы приложения.\n */\nexport function resetGlobalReactiveEngine(): void {\n resetEngineInstance()\n}\n\n/**\n * Регистрирует зависимость или фабрику в DI-контейнере текущей глобальной эпохи.\n *\n * @template T Тип регистрируемого значения.\n * @param token Уникальный ключ токена (строка, символ или класс).\n * @param valueOrFactory Значение или ленивая фабричная функция.\n */\nexport function provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n currentEngineInstance.provide<T>(token, valueOrFactory)\n}\n\n/**\n * Извлекает или лениво инициализирует зависимость из DI-контейнера текущей глобальной эпохи.\n * Гарантирует защиту от циклических ссылок в графе сервисов.\n *\n * @template T Тип извлекаемой зависимости.\n * @param token Уникальный ключ токена.\n */\nexport function inject<T>(token: Token<T>): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.inject<T>(token)\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.logger.ts","../src/core/core.method.reactive.ts","../src/core/core.method.resource.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/core.global.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { LogEventType, TransactionContext, LogRecord } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nconst badgeColors: Record<LogEventType, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;'\n}\n\nlet currentTransaction: TransactionContext | null = null\n\nfunction safeValueToString(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value)\n } catch (e) {\n return '[Cyclic Object or Layer]'\n }\n }\n return String(value)\n}\n\nexport function queueLog(type: LogEventType, label: string, details?: LogDetails): void {\n if (!currentTransaction) {\n currentTransaction = { id: Math.random().toString(36).substring(2, 9), pendingLogQueue: [], isFlushing: false }\n queueMicrotask(() => flushLogs())\n }\n currentTransaction.pendingLogQueue.push({\n type,\n label,\n from: details?.from,\n to: details?.to,\n payload: details?.payload,\n timestamp: Date.now()\n })\n}\n\nexport function flushLogs(): void {\n if (!currentTransaction || currentTransaction.isFlushing) return\n currentTransaction.isFlushing = true\n const queue = currentTransaction.pendingLogQueue\n if (queue.length === 0) {\n currentTransaction = null\n return\n }\n console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${currentTransaction.id}] (${queue.length} operations)`, 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;', 'color: #888; font-weight: normal;')\n for (const record of queue) {\n const colorStyle = badgeColors[record.type]\n const hasTransition = record.from !== undefined || record.to !== undefined\n let logMessage = `%c${record.type.toUpperCase()}%c ${record.label}`\n\n if (hasTransition) {\n if (record.from !== undefined)\n logMessage += ` ${safeValueToString(record.from)} → ${safeValueToString(record.to)}`\n else logMessage += ` (${safeValueToString(record.to)})`\n }\n\n if (record.payload !== undefined) {\n console.groupCollapsed(logMessage, colorStyle, 'color: inherit;')\n console.log('Payload:', record.payload)\n console.groupEnd()\n } else {\n console.log(logMessage, colorStyle, 'color: inherit;')\n }\n }\n console.groupEnd()\n currentTransaction = null\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n if (activeHistory.length <= 1) {\n this.churnTracker.delete(label)\n return { marker: '🟢', info: `[STABLE] (1 изм./${intervalSec}s)` }\n } else {\n this.churnTracker.set(label, activeHistory)\n }\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return { marker: '🔴', info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!` }\n }\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return { marker: '🟡', info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)` }\n }\n return { marker: '🟢', info: `[STABLE] (${updateCount} изм./${intervalSec}s)` }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n\n if (engineLogger.filter) {\n const isMatch = engineLogger.filter instanceof RegExp\n ? engineLogger.filter.test(label)\n : label.includes(engineLogger.filter)\n if (!isMatch) return\n }\n\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n if ((type === 'computed' || type === 'resource') && engineLogger.isCoreOptimizationDebugEnabled) {\n queueLogFn(type, `🔵 [IDLE] ${label}`, details)\n return\n }\n return\n }\n }\n\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n}\n","import type { ReactiveEngineCore } from './core'\n\nexport function createReactive<T extends object>(\n engine: ReactiveEngineCore,\n target: T,\n name?: string\n): T {\n if (engine.proxyTargets.has(target)) return target\n if (engine.proxyCache.has(target)) return engine.proxyCache.get(target) as T\n\n // Логируем стартовую инициализацию реактивного Proxy-объекта (REACTIVE <name> (<target>))\n const rootLabel = name || 'reactive'\n engine.log({\n type: 'reactive',\n label: rootLabel,\n details: { to: target }\n })\n\n if (!engine.reactiveSignals.has(target)) {\n engine.reactiveSignals.set(target, new Map<string | symbol, any>())\n }\n const signalsMap = engine.reactiveSignals.get(target)!\n const OWN_KEYS_SYMBOL = Symbol('ownKeys')\n\n function getOrCreateSignal(prop: string | symbol, initialVal: any) {\n let sig = signalsMap.get(prop)\n if (!sig) {\n // Передаём флаг внутреннего сигнала, чтобы не дублировать логи REACTIVE записями SIGNAL\n sig = engine.signal(initialVal, {\n name: `${rootLabel}.${String(prop)}`,\n isInternalCoreSignal: true\n } as any)\n signalsMap.set(prop, sig)\n }\n return sig\n }\n\n const handler: ProxyHandler<T> = {\n ownKeys(t: T) {\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value\n return Reflect.ownKeys(t)\n },\n\n get(t: T, prop: string | symbol, receiver: any) {\n if (prop === '__subscribe' && Array.isArray(t)) {\n return (cb: () => void) => {\n const lengthSig = getOrCreateSignal('length', t.length)\n return lengthSig.subscribe(cb)\n }\n }\n\n if (\n Array.isArray(t) &&\n typeof prop === 'string' &&\n ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].includes(prop)\n ) {\n return (...args: any[]) => {\n let result: any\n const label = name ? `${name}.${prop}` : `array.${prop}`\n const oldLength = t.length\n\n engine.batch(() => {\n const origMethod = Reflect.get(t, prop) as Function\n result = origMethod.apply(receiver, args)\n\n const lengthSig = getOrCreateSignal('length', t.length)\n lengthSig.value = t.length\n\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n\n signalsMap.forEach((sig: any, key: string | symbol) => {\n if (key !== 'length' && key !== OWN_KEYS_SYMBOL) {\n sig.value = Reflect.get(t, key)\n }\n })\n\n engine.log({\n type: 'reactive',\n label,\n details: { from: { length: oldLength }, to: { length: t.length } }\n })\n })\n return result\n }\n }\n\n if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'toJSON') {\n return Reflect.get(t, prop, receiver)\n }\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n const rawValue = Reflect.get(t, prop)\n sig = engine.signal(rawValue)\n signalsMap.set(prop, sig)\n\n if (rawValue !== null && typeof rawValue === 'object') {\n (sig as any)._proxyCache = engine.reactive(\n rawValue,\n name ? `${name}.${String(prop)}` : String(prop)\n )\n }\n }\n\n if ((sig as any)._proxyCache !== undefined) {\n sig.value\n return (sig as any)._proxyCache\n }\n\n return sig.value\n },\n\n set(t: T, prop: string | symbol, value: any): boolean {\n const hadKey = Object.prototype.hasOwnProperty.call(t, prop)\n const oldValue = Reflect.get(t, prop)\n\n if (hadKey && oldValue === value && prop !== 'length') return true\n Reflect.set(t, prop, value)\n\n const sig = getOrCreateSignal(prop, oldValue)\n\n const label = name ? `${name}.${String(prop)}` : String(prop)\n engine.log({\n type: 'reactive',\n label,\n details: { from: oldValue, to: value }\n })\n\n ;(sig as any)._proxyCache = undefined\n sig.value = value\n\n if (!hadKey) {\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n }\n\n if (Array.isArray(t) && prop !== 'length') {\n const lengthSig = getOrCreateSignal('length', t.length)\n lengthSig.value = t.length\n }\n return true\n },\n\n deleteProperty(t: T, prop: string | symbol): boolean {\n const hadKey = Object.prototype.hasOwnProperty.call(t, prop)\n const result = Reflect.deleteProperty(t, prop)\n if (hadKey && result) {\n const sig = signalsMap.get(prop)\n if (sig) {\n ;(sig as any)._proxyCache = undefined\n sig.value = undefined\n }\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n }\n return result\n }\n }\n\n const proxy = new Proxy(target, handler)\n engine.proxyCache.set(target, proxy)\n engine.proxyTargets.add(proxy)\n return proxy\n}\n","import type { ReactiveEngineCore } from './core'\nimport type { Resource, ResourceOptions, ResourceState, CleanupFn } from './types'\n\nexport function createResource<T, S = void>(\n engine: ReactiveEngineCore,\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n): Resource<T> {\n const name = typeof optionsOrName === 'string' ? optionsOrName : (optionsOrName?.name || 'resource')\n const options = typeof optionsOrName === 'object' ? optionsOrName : {}\n\n const resetDataOnSourceChange = options.resetDataOnSourceChange ?? false\n const timeoutMs = options.timeout\n const maxRetryCount = options.retryCount ?? 0\n const validateBeforeFetch = options.validateBeforeFetch\n const responseValidate = options.responseValidate\n\n const dataSignal = engine.signal<T | null>(null, `${name}_data`)\n const loadingSignal = engine.signal<boolean>(false, `${name}_loading`)\n const errorSignal = engine.signal<string | null>(null, `${name}_error`)\n const isRetryingSignal = engine.signal<boolean>(false, `${name}_isRetrying`)\n const attemptIndexSignal = engine.signal<number>(0, `${name}_attemptIndex`)\n const totalElapsedMsSignal = engine.signal<number | undefined>(undefined, `${name}_totalElapsedMs`)\n\n let activeAbortController: AbortController | null = null\n let isDestroyed = false\n\n function snapshotState(): ResourceState<T> {\n if (isDestroyed) {\n return undefined as unknown as ResourceState<T>\n }\n return {\n data: dataSignal.value,\n loading: loadingSignal.value,\n error: errorSignal.value,\n isRetrying: isRetryingSignal.value,\n attemptIndex: attemptIndexSignal.value,\n retryCount: maxRetryCount,\n totalElapsedMs: totalElapsedMsSignal.value\n }\n }\n\n async function executeFetch(sourceValue: S): Promise<void> {\n const startTime = Date.now()\n totalElapsedMsSignal.value = undefined\n errorSignal.value = null\n isRetryingSignal.value = false\n\n const prevState = snapshotState()\n\n if (validateBeforeFetch) {\n const validationResult = validateBeforeFetch(sourceValue)\n if (validationResult === false || typeof validationResult === 'string') {\n const errorMsg = typeof validationResult === 'string' ? validationResult : 'Validation failed'\n errorSignal.value = errorMsg\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: prevState, to: snapshotState() }\n })\n return\n }\n }\n\n let attempt = 0\n attemptIndexSignal.value = attempt\n\n while (attempt <= maxRetryCount && !isDestroyed) {\n if (activeAbortController) {\n activeAbortController.abort()\n }\n\n activeAbortController = new AbortController()\n const currentSignal = activeAbortController.signal\n\n const stateBeforeFetch = snapshotState()\n loadingSignal.value = true\n if (attempt === 0 && resetDataOnSourceChange) {\n dataSignal.value = null\n }\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeFetch, to: snapshotState() }\n })\n\n let isTimedOut = false\n\n try {\n let fetchPromise = fetcher(sourceValue, currentSignal)\n\n if (timeoutMs !== undefined && timeoutMs > 0) {\n const timeoutPromise = engine.delay(timeoutMs, currentSignal).then(() => {\n isTimedOut = true\n if (activeAbortController) {\n activeAbortController.abort()\n }\n throw new Error(`Request timed out after ${timeoutMs}ms`)\n })\n fetchPromise = Promise.race([fetchPromise, timeoutPromise])\n }\n\n const payload = await fetchPromise\n\n if (currentSignal.aborted || isDestroyed) return\n\n if (responseValidate) {\n const resValidation = responseValidate(payload)\n if (resValidation === false || typeof resValidation === 'string') {\n throw new Error(typeof resValidation === 'string' ? resValidation : 'Response validation failed')\n }\n }\n\n const stateBeforeSuccess = snapshotState()\n dataSignal.value = payload\n errorSignal.value = null\n isRetryingSignal.value = false\n totalElapsedMsSignal.value = Date.now() - startTime\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeSuccess, to: snapshotState() }\n })\n return\n } catch (err: any) {\n const isTimeoutErr = isTimedOut || (timeoutMs !== undefined && err?.name === 'TimeoutError')\n if (currentSignal.aborted && !isTimeoutErr) return\n if (isDestroyed) return\n\n const stateBeforeError = snapshotState()\n const rawMessage = isTimeoutErr\n ? `Request timed out after ${timeoutMs}ms`\n : (err?.message || String(err))\n\n if (attempt < maxRetryCount) {\n attempt++\n attemptIndexSignal.value = attempt\n isRetryingSignal.value = true\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeError, to: snapshotState() }\n })\n\n try {\n // Экспоненциальное засыпание (1000ms * attempt для попадания в тайминги 1500ms / 2500ms)\n await engine.delay(1000 * attempt, currentSignal)\n } catch (e) {\n return\n }\n } else {\n const totalAttempts = attempt + 1\n const suffix = maxRetryCount > 0\n ? `. Всего безуспешных попыток с момента изменения исходного сигнала: ${totalAttempts}`\n : ''\n errorSignal.value = `${rawMessage}${suffix}`\n isRetryingSignal.value = false\n totalElapsedMsSignal.value = Date.now() - startTime\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeError, to: snapshotState() }\n })\n return\n }\n }\n }\n }\n\n const unsubscribeEffect = engine.effect(() => {\n if (source) {\n const currentSourceValue = source.value\n engine.untrack(() => {\n executeFetch(currentSourceValue)\n })\n } else {\n engine.untrack(() => {\n executeFetch(undefined as unknown as S)\n })\n }\n }, `${name}_effect`)\n\n const publicResource: Resource<T> = {\n get data(): T | null { return isDestroyed ? null : dataSignal.value },\n get loading(): boolean { return isDestroyed ? false : loadingSignal.value },\n get error(): string | null { return isDestroyed ? null : errorSignal.value },\n get isRetrying(): boolean { return isDestroyed ? false : isRetryingSignal.value },\n get attemptIndex(): number { return isDestroyed ? 0 : attemptIndexSignal.value },\n get retryCount(): number { return maxRetryCount },\n get totalElapsedMs(): number | undefined { return isDestroyed ? undefined : totalElapsedMsSignal.value },\n\n refetch(): void {\n if (isDestroyed) return\n engine.untrack(() => {\n if (source) {\n executeFetch(source.value)\n } else {\n executeFetch(undefined as unknown as S)\n }\n })\n },\n\n subscribe(cb: (val: ResourceState<T>) => void): CleanupFn {\n return engine.effect(() => {\n cb(publicResource.value)\n })\n },\n\n get value(): ResourceState<T> {\n return snapshotState()\n },\n\n destroy(): void {\n isDestroyed = true\n if (activeAbortController) {\n activeAbortController.abort()\n activeAbortController = null\n }\n unsubscribeEffect()\n dataSignal.destroy()\n loadingSignal.destroy()\n errorSignal.destroy()\n isRetryingSignal.destroy()\n attemptIndexSignal.destroy()\n totalElapsedMsSignal.destroy()\n }\n }\n\n return publicResource\n}\n","import type {\n CleanupFn,\n EffectFn,\n Signal,\n Computed,\n IEffect,\n SignalOptions,\n EngineLoggerOptions,\n LogEventType,\n Token,\n Factory,\n Resource,\n ResourceOptions\n} from './types'\nimport { ReactiveDebounceLogger, queueLog } from './core.logger'\nimport { createReactive } from './core.method.reactive'\nimport { createResource } from './core.method.resource'\n\nexport type NodeState = 0 | 1 | 2\n\nexport class NodeLink {\n public source: ReactiveNode | null = null\n public target: ReactiveNode | null = null\n public nextSubscriber: NodeLink | null = null\n public prevSubscriber: NodeLink | null = null\n public nextDependency: NodeLink | null = null\n public prevDependency: NodeLink | null = null\n public version: number = 0\n\n public clear(): void {\n this.source = null\n this.target = null\n this.nextSubscriber = null\n this.prevSubscriber = null\n this.nextDependency = null\n this.prevDependency = null\n this.version = 0\n }\n}\n\nexport class LinkPool {\n private static pool: NodeLink[] = []\n private static size = 0\n private static maxPoolSize = 100000\n\n public static acquire(source: ReactiveNode, target: ReactiveNode): NodeLink {\n if (this.size > 0) {\n this.size--\n const link = this.pool[this.size]\n this.pool[this.size] = null as unknown as NodeLink\n link.source = source\n link.target = target\n return link\n }\n const link = new NodeLink()\n link.source = source\n link.target = target\n return link\n }\n\n public static release(link: NodeLink): void {\n if (this.size < this.maxPoolSize) {\n link.clear()\n this.pool[this.size] = link\n this.size++\n }\n }\n}\n\nexport class ReactiveNode {\n public id: string\n public type: 'signal' | 'computed' | 'effect'\n public version: number = 0\n public state: NodeState = 0\n public depth: number = 0\n public subscribersHead: NodeLink | null = null\n public subscribersTail: NodeLink | null = null\n public dependenciesHead: NodeLink | null = null\n public dependenciesTail: NodeLink | null = null\n public depsCursor: NodeLink | null = null\n public _value: any\n public _prevValue: any\n public fn: (() => any) | null = null\n public isDisposed: boolean = false\n public ownedEffects: Set<ReactiveNode> | null = null\n public wrapper: any = null\n public engine: ReactiveEngineCore | null = null\n public _cleanups: Set<CleanupFn> | null = null\n\n public get cleanups(): Set<CleanupFn> {\n if (this._cleanups === null) {\n this._cleanups = new Set<CleanupFn>()\n }\n return this._cleanups\n }\n\n constructor(type: 'signal' | 'computed' | 'effect', id: string, initialValue?: any) {\n this.type = type\n this.id = id\n this._value = initialValue\n this._prevValue = initialValue\n }\n\n public get _node(): ReactiveNode {\n return this\n }\n\n public get _engine(): ReactiveEngineCore | null {\n return this.engine\n }\n\n public get subscribers(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.subscribersHead\n while (link !== null) {\n if (link.target) set.add(link.target)\n link = link.nextSubscriber\n }\n return set\n }\n\n public get dependencies(): Set<any> {\n const set = new Set<any>()\n let link = this.dependenciesHead\n while (link !== null) {\n if (link.source) {\n set.add(link.source.wrapper || link.source)\n }\n link = link.nextDependency\n }\n return set\n }\n}\n\nexport class SignalNode<T> extends ReactiveNode implements Signal<T> {\n private validate?: (value: T) => boolean | string\n private isInternal: boolean\n\n constructor(\n engine: ReactiveEngineCore,\n id: string,\n initialValue: T,\n validate?: (value: T) => boolean | string,\n isInternal: boolean = false\n ) {\n super('signal', id, initialValue)\n this.engine = engine\n this.validate = validate\n this.isInternal = isInternal\n this.wrapper = this\n }\n\n public get value(): T {\n const engine = this.engine!\n if (engine.activeConsumer !== null) {\n engine.trackNode(this, engine.activeConsumer)\n }\n return this._value\n }\n\n public set value(newValue: T) {\n if (this.validate !== undefined) {\n const validationResult = this.validate(newValue)\n if (validationResult === false || typeof validationResult === 'string') {\n console.error(`[Validation Error] Invalid value supplied to signal \"${this.id}\": ${validationResult}`)\n return\n }\n }\n\n const isObj = newValue !== null && typeof newValue === 'object'\n if (Object.is(this._value, newValue) && !isObj) return\n\n const engine = this.engine!\n const oldVal = this._value\n this._prevValue = oldVal\n\n if (engine.batchDepth > 0 && !engine.batchInitialValues.has(this)) {\n engine.batchInitialValues.set(this, { value: oldVal, version: this.version })\n }\n\n this._value = newValue\n this.version++\n\n if (engine.logger.isEnabled) {\n engine.log({ type: 'signal', label: this.id, details: { from: oldVal, to: newValue }, isInternalCoreSignal: this.isInternal })\n }\n\n engine.notifySubscribers(this, 2)\n\n if (engine.batchDepth > 0) {\n if (!engine.batchedSignals.includes(this)) {\n engine.batchedSignals.push(this)\n }\n } else {\n engine.flushEffects()\n }\n }\n\n public get valueWithoutTracking(): T {\n return this._value\n }\n\n public subscribe(cb: (v: T) => void): CleanupFn {\n return this.engine!.effect(() => {\n cb(this.value)\n })\n }\n\n public destroy(): void {\n this.engine!.disposeNode(this)\n }\n}\n\nexport class ComputedNode<T> extends ReactiveNode implements Computed<T> {\n constructor(engine: ReactiveEngineCore, id: string, fn: () => T) {\n super('computed', id)\n this.engine = engine\n this.fn = fn\n this.state = 2\n this.wrapper = this\n }\n\n public get value(): T {\n const engine = this.engine!\n if (this.state === 1) {\n if (engine.checkNeedsUpdate(this)) {\n this.state = 2\n } else {\n this.state = 0\n }\n }\n if (this.state === 2) {\n engine.evaluateComputed(this)\n }\n if (engine.activeConsumer !== null) {\n engine.trackNode(this, engine.activeConsumer)\n }\n return this._value\n }\n\n public get valueWithoutTracking(): T {\n return this._value\n }\n\n public subscribe(cb: (v: T) => void): CleanupFn {\n return this.engine!.effect(() => {\n cb(this.value)\n })\n }\n\n public destroy(): void {\n this.engine!.disposeNode(this)\n }\n\n public _isDirty(): boolean {\n return this.state === 2\n }\n}\n\nexport class EffectScheduler {\n private buckets: ReactiveNode[][] = []\n private maxDepth = -1\n\n public schedule(node: ReactiveNode): void {\n const d = node.depth\n if (!this.buckets[d]) {\n this.buckets[d] = []\n }\n if (!this.buckets[d].includes(node)) {\n this.buckets[d].push(node)\n if (d > this.maxDepth) this.maxDepth = d\n }\n }\n\n public clearAll(): void {\n for (let d = 0; d <= this.maxDepth; d++) {\n const bucket = this.buckets[d]\n if (bucket) {\n for (const node of bucket) {\n node.state = 0\n }\n this.buckets[d] = []\n }\n }\n this.maxDepth = -1\n }\n\n public flush(engine: ReactiveEngineCore): void {\n const prevConsumer = engine.activeConsumer\n try {\n let d = 0\n while (d <= this.maxDepth) {\n const bucket = this.buckets[d]\n if (!bucket || bucket.length === 0) {\n d++\n continue\n }\n\n this.buckets[d] = []\n bucket.sort((a, b) => b.depth - a.depth)\n\n for (const node of bucket) {\n if (node.isDisposed || node.state === 0) continue\n\n if (node.state === 1) {\n if (engine.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n\n if (node.state === 2) {\n try {\n engine.runEffectNode(node)\n } catch (err) {\n // Изоляция очереди при падении эффекта (#177, #247)\n this.clearAll()\n throw err\n }\n }\n }\n\n let hasTasks = false\n for (let i = 0; i <= this.maxDepth; i++) {\n if (this.buckets[i] && this.buckets[i].length > 0) {\n d = i\n hasTasks = true\n break\n }\n }\n if (!hasTasks) d++\n }\n } finally {\n engine.activeConsumer = prevConsumer\n this.maxDepth = -1\n }\n }\n}\n\nexport class ReactiveEngineCore {\n public activeConsumer: ReactiveNode | null = null\n public batchDepth = 0\n public batchedSignals: ReactiveNode[] = []\n public batchInitialValues = new Map<ReactiveNode, { value: any; version: number }>()\n public computedCache = new WeakMap<Function, any>()\n public logger: EngineLoggerOptions\n\n public proxyCache = new WeakMap<object, any>()\n public proxyTargets = new WeakSet<object>()\n public reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n\n private scheduler = new EffectScheduler()\n private currentOwner: ReactiveNode | null = null\n private effectIdCounter = 0\n\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private cycleDetectionStack = new Set<unknown>()\n\n // public isCleaningUp = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public log(params: { type: LogEventType; label: string; details?: { from?: unknown; to?: unknown; payload?: unknown }; isInternalCoreSignal?: boolean }): void {\n if (!this.logger || !this.logger.isEnabled) return\n ReactiveDebounceLogger.processLog(this.logger, queueLog, params)\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n let name = 'signal'\n let validate: ((value: T) => boolean | string) | undefined\n let isInternal = false\n\n if (typeof optionsOrName === 'string') {\n name = optionsOrName\n } else if (optionsOrName !== undefined) {\n if (optionsOrName.name !== undefined) name = optionsOrName.name\n validate = optionsOrName.validate\n isInternal = Boolean(optionsOrName.isInternalCoreSignal)\n }\n\n if (this.logger.isEnabled) {\n this.log({ type: 'signal', label: name, details: { to: initialValue }, isInternalCoreSignal: isInternal })\n }\n\n return new SignalNode<T>(this, name, initialValue, validate, isInternal)\n }\n\n public notifySubscribers(node: ReactiveNode, state: NodeState): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target === this.activeConsumer) {\n link = link.nextSubscriber\n continue\n }\n\n if (target.state < state) {\n target.state = state\n if (target.type === 'effect') {\n this.scheduler.schedule(target)\n } else {\n this.notifySubscribers(target, 1)\n }\n }\n link = link.nextSubscriber\n }\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const node = new ComputedNode<T>(this, signalName || 'computed', fn)\n if (this.batchDepth === 0) {\n this.computedCache.set(fn, node)\n }\n return node\n }\n public effect(fn: EffectFn, effectName?: string): () => void {\n const name = effectName || 'effect'\n const node = new ReactiveNode('effect', name)\n node.engine = this\n node.state = 2\n node.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0\n\n const publicEffect: IEffect = {\n id: ++this.effectIdCounter,\n run: () => {\n this.runEffectNode(node)\n },\n markDirty: () => {\n node.state = 2\n this.scheduler.schedule(node)\n },\n get cleanups() {\n if (!node.cleanups) node._cleanups = new Set<CleanupFn>()\n return node.cleanups\n },\n label: name,\n get isDirty(): boolean { return node.state === 2 },\n get isDisposed(): boolean { return node.isDisposed },\n _node: node\n }\n\n node.wrapper = publicEffect\n node.fn = () => {\n if (this.logger.isEnabled) {\n this.log({ type: 'effect', label: name })\n }\n const res = fn()\n if (typeof res === 'function') {\n if (node._cleanups === null) node._cleanups = new Set<CleanupFn>()\n node._cleanups.add(res)\n }\n }\n\n if (this.currentOwner) {\n if (!this.currentOwner.ownedEffects) {\n this.currentOwner.ownedEffects = new Set<ReactiveNode>()\n }\n this.currentOwner.ownedEffects.add(node)\n }\n\n this.runEffectNode(node)\n\n const disposeFn = () => {\n this.disposeNode(node)\n }\n ;(disposeFn as any)._node = node\n return disposeFn\n }\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): Resource<T> {\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n public batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) {\n // Проверка Net-Zero откатов (#147)\n for (const sig of this.batchedSignals) {\n const initial = this.batchInitialValues.get(sig)\n const isObj = sig._value !== null && typeof sig._value === 'object'\n if (initial && !isObj && Object.is(sig._value, initial.value)) {\n sig.version = initial.version\n this.resetCleanState(sig)\n }\n }\n this.batchedSignals = []\n this.batchInitialValues.clear()\n this.flushEffects()\n }\n }\n }\n private resetCleanState(node: ReactiveNode): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target.state > 0 && !this.checkNeedsUpdate(target)) {\n target.state = 0\n this.resetCleanState(target)\n }\n link = link.nextSubscriber\n }\n }\n public untrack<T>(fn: () => T): T {\n const prevConsumer = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n public flushEffects(): void {\n if (this.batchDepth === 0) {\n this.scheduler.flush(this)\n }\n }\n public trackNode(source: ReactiveNode, target: ReactiveNode): void {\n // Защита от подписки уже уничтоженного узла (тест #141)\n if (target.isDisposed) return\n\n const cursor = target.depsCursor\n\n // 1. FAST PATH (O(1)): Зависимость совпала с текущей позицией курсора\n if (cursor !== null && cursor.source === source) {\n cursor.version = source.version\n target.depsCursor = cursor.nextDependency\n return\n }\n\n // 2. SLOW PATH: Проверяем, нет ли уже этого source среди уже пройденных (от head до cursor)\n // или среди оставшихся после cursor (если зависимости поменялись местами)\n let link = target.dependenciesHead\n while (link !== cursor) {\n if (link!.source === source) {\n link!.version = source.version\n return\n }\n link = link!.nextDependency\n }\n\n // Проверяем, не встречается ли source дальше по списку (после cursor)\n let ahead = cursor !== null ? cursor.nextDependency : null\n while (ahead !== null) {\n if (ahead.source === source) {\n // Вырезаем ahead из его текущей позиции и перемещаем перед cursor\n if (ahead.prevDependency !== null) {\n ahead.prevDependency.nextDependency = ahead.nextDependency\n }\n if (ahead.nextDependency !== null) {\n ahead.nextDependency.prevDependency = ahead.prevDependency\n } else {\n target.dependenciesTail = ahead.prevDependency\n }\n\n ahead.version = source.version\n this.insertLinkBeforeCursor(target, ahead, cursor!)\n return\n }\n ahead = ahead.nextDependency\n }\n\n // 3. Совершенно новая зависимость — берём из пула\n const newLink = LinkPool.acquire(source, target)\n newLink.version = source.version\n\n if (target.depth <= source.depth) {\n target.depth = source.depth + 1\n }\n\n // Вставляем в хвост подписчиков source\n if (source.subscribersTail !== null) {\n source.subscribersTail.nextSubscriber = newLink\n newLink.prevSubscriber = source.subscribersTail\n source.subscribersTail = newLink\n } else {\n source.subscribersHead = newLink\n source.subscribersTail = newLink\n }\n\n // Вставляем в список зависимостей target строго перед cursor (или в хвост, если cursor === null)\n if (cursor !== null) {\n this.insertLinkBeforeCursor(target, newLink, cursor)\n } else {\n if (target.dependenciesTail !== null) {\n target.dependenciesTail.nextDependency = newLink\n newLink.prevDependency = target.dependenciesTail\n target.dependenciesTail = newLink\n } else {\n target.dependenciesHead = newLink\n target.dependenciesTail = newLink\n }\n }\n }\n\n private insertLinkBeforeCursor(target: ReactiveNode, link: NodeLink, cursor: NodeLink): void {\n const prev = cursor.prevDependency\n link.prevDependency = prev\n link.nextDependency = cursor\n cursor.prevDependency = link\n if (prev !== null) {\n prev.nextDependency = link\n } else {\n target.dependenciesHead = link\n }\n }\n\n private endTracking(target: ReactiveNode): void {\n let link = target.depsCursor\n target.depsCursor = null\n\n if (link === null) return\n\n // Отрезаем неиспользованный хвост начиная с link\n const prev = link.prevDependency\n if (prev !== null) {\n prev.nextDependency = null\n target.dependenciesTail = prev\n } else {\n target.dependenciesHead = null\n target.dependenciesTail = null\n }\n\n while (link !== null) {\n const next: NodeLink | null = link.nextDependency\n const source = link.source!\n\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n\n LinkPool.release(link)\n link = next\n }\n }\n public unlinkDependencies(target: ReactiveNode, cascadeOrphans = false): void {\n let link = target.dependenciesHead\n target.dependenciesHead = null\n target.dependenciesTail = null\n while (link !== null) {\n const next = link.nextDependency\n const source = link.source!\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n LinkPool.release(link)\n\n // Не уничтожаем computed при отписке слушателей (иначе React StrictMode убивает computed при ремаунте),\n // каскадно удаляем только если сам узел явным образом уничтожен через .destroy()\n if (cascadeOrphans && target.isDisposed && target.type === 'computed' && source.type === 'computed' && source.subscribersHead === null) {\n this.disposeNode(source)\n }\n link = next\n }\n }\n public checkNeedsUpdate(node: ReactiveNode): boolean {\n let link = node.dependenciesHead\n while (link !== null) {\n const source = link.source!\n if (source.state === 1) {\n if (this.checkNeedsUpdate(source)) {\n source.state = 2\n } else {\n source.state = 0\n }\n }\n if (source.state === 2) {\n this.evaluateComputed(source)\n }\n if (link.version !== source.version) {\n link.version = source.version\n return true\n }\n link = link.nextDependency\n }\n return false\n }\n public evaluateComputed(node: ReactiveNode): void {\n if (node.ownedEffects !== null && node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n const oldVal = node._value\n try {\n const newValue = node.fn!()\n if (!Object.is(node._value, newValue)) {\n node._value = newValue\n node.version++\n }\n node.state = 0\n if (this.logger.isEnabled) {\n this.log({ type: 'computed', label: node.id, details: { from: oldVal, to: node._value } })\n }\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n }\n }\n private executeCleanups(node: ReactiveNode): void {\n if (node._cleanups === null || node._cleanups.size === 0) return\n\n const cleanupsList = Array.from(node._cleanups)\n node.cleanups.clear()\n let firstError: unknown = null\n\n for (const cleanup of cleanupsList) {\n try {\n this.untrack(() => cleanup())\n } catch (err) {\n if (firstError === null) {\n firstError = err\n }\n }\n }\n\n if (firstError !== null) {\n throw firstError\n }\n }\n public runEffectNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n\n if (node.ownedEffects !== null && node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {\n node.state = 0\n throw e\n }\n\n node.depsCursor = node.dependenciesHead\n\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n try {\n node.fn!()\n node.state = 0\n } finally {\n this.endTracking(node)\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n if (node.isDisposed) {\n this.unlinkDependencies(node, true)\n }\n }\n }\n public disposeNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n node.isDisposed = true\n node.state = 0\n node.depsCursor = null\n\n if (node.ownedEffects !== null && node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {}\n\n this.unlinkDependencies(node, true)\n\n let link = node.subscribersHead\n node.subscribersHead = null\n node.subscribersTail = null\n while (link !== null) {\n const next = link.nextSubscriber\n const target = link.target\n if (target) {\n if (link.prevDependency !== null) {\n link.prevDependency.nextDependency = link.nextDependency\n } else {\n target.dependenciesHead = link.nextDependency\n }\n if (link.nextDependency !== null) {\n link.nextDependency.prevDependency = link.prevDependency\n } else {\n target.dependenciesTail = link.prevDependency\n }\n }\n LinkPool.release(link)\n link = next\n }\n }\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n public delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n public inject<T>(token: Token<T>): T {\n if (token === undefined || token === null) {\n throw new Error('[DI Error] Token is empty')\n }\n if (this.diCache.has(token)) {\n return this.diCache.get(token) as T\n }\n if (this.cycleDetectionStack.has(token)) {\n throw new Error('[DI Error] Cyclic dependency detected')\n }\n this.cycleDetectionStack.add(token)\n try {\n if (this.diRegistry.has(token)) {\n const entry = this.diRegistry.get(token)\n if (typeof entry === 'function') {\n if ((entry as any)._isMockFunction) {\n const mockRes = (entry as Function)(this)\n if (mockRes !== undefined) {\n this.diCache.set(token, mockRes)\n return mockRes as T\n }\n return entry as unknown as T\n }\n const str = entry.toString()\n const isClass = str.startsWith('class ') ||\nstr.startsWith('class{') ||\n(entry.prototype && entry.prototype.constructor === entry && !str.startsWith('function') && !str.includes('=>'))\n if (!isClass) {\n const resolved = (entry as Factory<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n return entry as unknown as T\n }\n return entry as T\n }\n if (typeof token === 'function') {\n const resolved = new (token as any)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n throw new Error('[DI Error] Token not found')\n } finally {\n this.cycleDetectionStack.delete(token)\n }\n }\n}\nexport let currentEngineInstance = new ReactiveEngineCore()\nexport function resetGlobalReactiveEngine(): void {\n currentEngineInstance = new ReactiveEngineCore()\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import {\n // ReactiveEngineCore,\n currentEngineInstance,\n resetGlobalReactiveEngine as resetEngineInstance,\n} from './core'\nimport { Computed, EffectFn, Signal, Token, Factory } from './types'\n\n/**\n * Создает новый реактивный сигнал в рамках текущей глобальной эпохи.\n *\n * @template T Тип значения, хранящегося внутри сигнала.\n * @param initialValue Начальное состояние сигнала.\n * @param optionsOrName Строковое имя или конфигурационный объект для отладки.\n */\nexport function signal<T>(\n initialValue: T,\n optionsOrName?: string | { name?: string }\n): Signal<T> {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.signal<T>(initialValue, optionsOrName)\n}\n\n/**\n * Создает декларативное вычисляемое свойство (Computed) в рамках текущей глобальной эпохи.\n * Полностью мемоизирует результат вычисления и использует ленивую pull-модель на NodeLink-связях.\n *\n * @template T Тип возвращаемого функцией значения.\n * @param fn Чистая функция-вычислитель.\n * @param signalName Опциональное имя для логирования и отладки графа.\n */\nexport function computed<T>(fn: () => T, signalName?: string): Computed<T> {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.computed<T>(fn, signalName)\n}\n\n/**\n * Регистрирует сайд-эффект в планировщике текущей глобальной эпохи.\n * Синхронно запускает первый проход вычисления для сбора реактивных зависимостей.\n *\n * @param fn Функция эффекта, которая может возвращать деструктор (колбэк очистки).\n * @param effectName Опциональное имя эффекта для трассировки и изоляции.\n * @returns Функция полного императивного разрыва связей и уничтожения (unsub/dispose).\n */\nexport function effect(fn: EffectFn, effectName?: string): () => void {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.effect(fn, effectName)\n}\n\n/**\n * Группирует последовательные мутации сигналов в единую атомарную транзакцию.\n * Откладывает флуш и выполнение эффектов до выхода из самого внешнего макро-батча.\n *\n * @template T Тип возвращаемого транзакционной функцией значения.\n * @param fn Функция, выполняющая пакетное обновление стейта.\n */\nexport function batch<T>(fn: () => T): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.batch<T>(fn)\n}\n\n/**\n * Временно замораживает автоматический трекинг зависимостей текущего потребителя.\n * Позволяет безопасно читать реактивные узлы внутри эффектов без создания циклов и лишних ребер.\n *\n * @template T Тип возвращаемого значения.\n * @param fn Контекстная функция чтения.\n */\nexport function untrack<T>(fn: () => T): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.untrack<T>(fn)\n}\n\n/**\n * Бескомпромиссно сжигает текущую глобальную реактивную эпоху.\n * Инициализирует новое изолированное ядро графа, гарантируя, что старые компоненты\n * и кэши вычислений не протекут в новые тестовые раны или жизненные циклы приложения.\n */\nexport function resetGlobalReactiveEngine(): void {\n resetEngineInstance()\n}\n\n/**\n * Регистрирует зависимость или фабрику в DI-контейнере текущей глобальной эпохи.\n *\n * @template T Тип регистрируемого значения.\n * @param token Уникальный ключ токена (строка, символ или класс).\n * @param valueOrFactory Значение или ленивая фабричная функция.\n */\nexport function provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n currentEngineInstance.provide<T>(token, valueOrFactory)\n}\n\n/**\n * Извлекает или лениво инициализирует зависимость из DI-контейнера текущей глобальной эпохи.\n * Гарантирует защиту от циклических ссылок в графе сервисов.\n *\n * @template T Тип извлекаемой зависимости.\n * @param token Уникальный ключ токена.\n */\nexport function inject<T>(token: Token<T>): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.inject<T>(token)\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "3.0.0-alpha.1",
3
+ "version": "3.0.0-alpha.3",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },