@pravosleva/reactive-engine 2.5.0-alpha.8 → 2.6.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular/index.cjs +1 -1
- package/dist/angular/index.cjs.map +1 -1
- package/dist/angular/index.mjs +1 -1
- package/dist/core/core.advanced.optimization.test.d.ts +2 -0
- package/dist/core/core.advanced.optimization.test.d.ts.map +1 -0
- package/dist/core/core.d.ts +20 -8
- package/dist/core/core.d.ts.map +1 -1
- package/dist/core/core.logger.d.ts.map +1 -1
- package/dist/core/core.method.computed.d.ts.map +1 -1
- package/dist/core/core.method.reactive.d.ts +3 -0
- package/dist/core/core.method.reactive.d.ts.map +1 -1
- package/dist/core/core.method.resource.d.ts +13 -0
- package/dist/core/core.method.resource.d.ts.map +1 -0
- package/dist/core/core.method.signal.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core.automatic.cjs +1 -1
- package/dist/core.automatic.cjs.map +1 -1
- package/dist/core.automatic.mjs +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.global.cjs +1 -1
- package/dist/core.global.cjs.map +1 -1
- package/dist/core.global.mjs +1 -1
- package/dist/core.logger.cjs +2 -0
- package/dist/core.logger.cjs.map +1 -0
- package/dist/core.logger.mjs +51 -0
- package/dist/core.logger.mjs.map +1 -0
- package/dist/core.method.computed.cjs +1 -1
- package/dist/core.method.computed.cjs.map +1 -1
- package/dist/core.method.computed.mjs +71 -86
- package/dist/core.method.computed.mjs.map +1 -1
- package/dist/core.method.reactive.cjs +1 -1
- package/dist/core.method.reactive.cjs.map +1 -1
- package/dist/core.method.reactive.mjs +45 -104
- package/dist/core.method.reactive.mjs.map +1 -1
- package/dist/core.method.resource.cjs +2 -0
- package/dist/core.method.resource.cjs.map +1 -0
- package/dist/core.method.resource.mjs +143 -0
- package/dist/core.method.resource.mjs.map +1 -0
- package/dist/core.method.signal.cjs +1 -1
- package/dist/core.method.signal.cjs.map +1 -1
- package/dist/core.method.signal.mjs +67 -38
- package/dist/core.method.signal.mjs.map +1 -1
- package/dist/core.mjs +79 -106
- package/dist/core.mjs.map +1 -1
- package/dist/decorators/withThrottleComputed/withThrottleComputed.d.ts +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index2.cjs +1 -1
- package/dist/index2.mjs +5 -5
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.mjs +1 -1
- package/dist/reactive-engine.umd.js +13 -0
- package/dist/reactive-engine.umd.js.map +1 -0
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/core/core.advanced.reactive-framework-test-suite.p3.test.d.ts +0 -2
- package/dist/core/core.advanced.reactive-framework-test-suite.p3.test.d.ts.map +0 -1
- package/dist/reactive-engine@2.5.0-alpha.8.umd.js +0 -13
- package/dist/reactive-engine@2.5.0-alpha.8.umd.js.map +0 -1
package/dist/core.mjs
CHANGED
|
@@ -3,8 +3,57 @@ import { createSignal as t } from "./core.method.signal.mjs";
|
|
|
3
3
|
import { executeUntrack as n } from "./core.method.untrack.mjs";
|
|
4
4
|
import { createReactive as r } from "./core.method.reactive.mjs";
|
|
5
5
|
import { createEffect as i } from "./core.method.effect.mjs";
|
|
6
|
+
import { ReactiveDebounceLogger as a } from "./core.logger.mjs";
|
|
7
|
+
import { createResource as o } from "./core.method.resource.mjs";
|
|
6
8
|
//#region src/core/core.ts
|
|
7
|
-
var
|
|
9
|
+
var s = {
|
|
10
|
+
signal: "background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
|
|
11
|
+
computed: "background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
|
|
12
|
+
effect: "background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
|
|
13
|
+
batch: "background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
|
|
14
|
+
resource: "background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;",
|
|
15
|
+
reactive: "background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;"
|
|
16
|
+
}, c = null;
|
|
17
|
+
function l(e) {
|
|
18
|
+
if (e === null) return "null";
|
|
19
|
+
if (e === void 0) return "undefined";
|
|
20
|
+
if (typeof e == "object") try {
|
|
21
|
+
return JSON.stringify(e);
|
|
22
|
+
} catch {
|
|
23
|
+
return "[Cyclic Object or Layer]";
|
|
24
|
+
}
|
|
25
|
+
return String(e);
|
|
26
|
+
}
|
|
27
|
+
function u(e, t, n) {
|
|
28
|
+
c || (c = {
|
|
29
|
+
id: Math.random().toString(36).substring(2, 9),
|
|
30
|
+
pendingLogQueue: [],
|
|
31
|
+
isFlushing: !1
|
|
32
|
+
}, queueMicrotask(() => d())), c.pendingLogQueue.push({
|
|
33
|
+
type: e,
|
|
34
|
+
label: t,
|
|
35
|
+
from: n?.from,
|
|
36
|
+
to: n?.to,
|
|
37
|
+
payload: n?.payload,
|
|
38
|
+
timestamp: Date.now()
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function d() {
|
|
42
|
+
if (!c || c.isFlushing) return;
|
|
43
|
+
c.isFlushing = !0;
|
|
44
|
+
let e = c.pendingLogQueue;
|
|
45
|
+
if (e.length === 0) {
|
|
46
|
+
c = null;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${c.id}] (${e.length} operations)`, "background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;", "color: #888; font-weight: normal;");
|
|
50
|
+
for (let t of e) {
|
|
51
|
+
let e = s[t.type], n = t.from !== void 0 || t.to !== void 0, r = `%c${t.type.toUpperCase()}%c ${t.label}`;
|
|
52
|
+
n && (t.from ? r += ` ${l(t.from)} → ${l(t.to)}` : r += ` (${l(t.to)})`), t.payload === void 0 ? console.log(r, e, "color: inherit;") : (console.groupCollapsed(r, e, "color: inherit;"), console.log("Payload:", t.payload), console.groupEnd());
|
|
53
|
+
}
|
|
54
|
+
console.groupEnd(), c = null;
|
|
55
|
+
}
|
|
56
|
+
var f = class {
|
|
8
57
|
frameworkPrefix = "core";
|
|
9
58
|
logger;
|
|
10
59
|
epoch = 0;
|
|
@@ -14,7 +63,6 @@ var a = class {
|
|
|
14
63
|
pendingEffects = [];
|
|
15
64
|
maxPendingDepth = 0;
|
|
16
65
|
computedCache = /* @__PURE__ */ new WeakMap();
|
|
17
|
-
computedStringCache = /* @__PURE__ */ new Map();
|
|
18
66
|
diRegistry = /* @__PURE__ */ new Map();
|
|
19
67
|
diCache = /* @__PURE__ */ new Map();
|
|
20
68
|
proxyCache = /* @__PURE__ */ new WeakMap();
|
|
@@ -24,34 +72,27 @@ var a = class {
|
|
|
24
72
|
batchedSignals = /* @__PURE__ */ new Set();
|
|
25
73
|
activeOwner = null;
|
|
26
74
|
pendingCleanups = /* @__PURE__ */ new Set();
|
|
27
|
-
isLoggingEnabled = !1;
|
|
28
|
-
_poolArr = [];
|
|
29
75
|
queueCleanup(e) {
|
|
30
76
|
this.pendingCleanups.add(e);
|
|
31
77
|
}
|
|
32
78
|
constructor(e) {
|
|
33
|
-
this.logger = e?.logger || { isEnabled: !1 }
|
|
79
|
+
this.logger = e?.logger || { isEnabled: !1 };
|
|
34
80
|
}
|
|
35
81
|
scheduleEffect(e) {
|
|
36
|
-
if (e._isScheduled) return;
|
|
37
|
-
e._isScheduled = !0;
|
|
38
82
|
let t = e.depth || 0;
|
|
39
83
|
this.pendingEffects[t] || (this.pendingEffects[t] = /* @__PURE__ */ new Set()), this.pendingEffects[t].add(e), t > this.maxPendingDepth && (this.maxPendingDepth = t);
|
|
40
84
|
}
|
|
85
|
+
queueLog(e, t, n) {
|
|
86
|
+
u(e, t, n);
|
|
87
|
+
}
|
|
41
88
|
batch(e) {
|
|
42
89
|
this.batchDepth++;
|
|
43
90
|
try {
|
|
44
91
|
return e();
|
|
45
92
|
} finally {
|
|
46
93
|
if (this.batchDepth--, this.batchDepth === 0) {
|
|
47
|
-
if (this.
|
|
48
|
-
let e
|
|
49
|
-
for (let t of this.batchedSignals) t._applyBatchValue && e.set(t, t._applyBatchValue());
|
|
50
|
-
this.epoch++;
|
|
51
|
-
for (let t of this.batchedSignals) if (t._flushBatch) {
|
|
52
|
-
let n = e.get(t) ?? !1;
|
|
53
|
-
t._flushBatch(n, !0);
|
|
54
|
-
}
|
|
94
|
+
if (this.batchedSignals.size > 0) {
|
|
95
|
+
for (let e of this.batchedSignals) e._flushBatch && e._flushBatch();
|
|
55
96
|
this.batchedSignals.clear();
|
|
56
97
|
}
|
|
57
98
|
this.flushEffects();
|
|
@@ -67,7 +108,7 @@ var a = class {
|
|
|
67
108
|
if (!t || t.size === 0) continue;
|
|
68
109
|
let n = Array.from(t);
|
|
69
110
|
t.clear();
|
|
70
|
-
for (let e of n) if (!e.isDisposed &&
|
|
111
|
+
for (let e of n) if (!e.isDisposed && e.isDirty) {
|
|
71
112
|
if (e.dependencies && e.dependencies.size > 0) {
|
|
72
113
|
let t = !1;
|
|
73
114
|
for (let n of e.dependencies) {
|
|
@@ -99,6 +140,9 @@ var a = class {
|
|
|
99
140
|
this.activeConsumer = e;
|
|
100
141
|
}
|
|
101
142
|
}
|
|
143
|
+
log(e) {
|
|
144
|
+
!this.logger || !this.logger.isEnabled || a.processLog(this.logger, u, e);
|
|
145
|
+
}
|
|
102
146
|
signal(e, n) {
|
|
103
147
|
return t(this, e, n);
|
|
104
148
|
}
|
|
@@ -126,6 +170,10 @@ var a = class {
|
|
|
126
170
|
if (this.diRegistry.has(e)) {
|
|
127
171
|
let t = this.diRegistry.get(e);
|
|
128
172
|
if (typeof t == "function") {
|
|
173
|
+
if (t._isMockFunction) {
|
|
174
|
+
let n = t(this);
|
|
175
|
+
return n === void 0 ? t : (this.diCache.set(e, n), n);
|
|
176
|
+
}
|
|
129
177
|
let n = t.toString();
|
|
130
178
|
if (!(n.startsWith("class ") || n.startsWith("class{") || t.prototype && t.prototype.constructor === t && !n.startsWith("function") && !n.includes("=>"))) {
|
|
131
179
|
let n = t(this);
|
|
@@ -144,97 +192,22 @@ var a = class {
|
|
|
144
192
|
this.cycleDetectionStack.delete(e);
|
|
145
193
|
}
|
|
146
194
|
}
|
|
195
|
+
delay(e, t) {
|
|
196
|
+
return new Promise((n, r) => {
|
|
197
|
+
if (t.aborted) return r(new DOMException("Aborted", "AbortError"));
|
|
198
|
+
let i = setTimeout(() => {
|
|
199
|
+
t.removeEventListener("abort", a), n();
|
|
200
|
+
}, e), a = () => {
|
|
201
|
+
clearTimeout(i), r(new DOMException("Aborted", "AbortError"));
|
|
202
|
+
};
|
|
203
|
+
t.addEventListener("abort", a, { once: !0 });
|
|
204
|
+
});
|
|
205
|
+
}
|
|
147
206
|
resource(e, t, n) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
error: null,
|
|
152
|
-
isRetrying: !1
|
|
153
|
-
}, `[CORE_INTERNAL_SIGNAL=1]:resource:state:${i}`), u = async (t, n, r = !1) => {
|
|
154
|
-
if (!n.aborted) {
|
|
155
|
-
if (c) {
|
|
156
|
-
let e = c(t);
|
|
157
|
-
if (e === !1 || typeof e == "string") {
|
|
158
|
-
if (n.aborted) return;
|
|
159
|
-
let t = typeof e == "string" ? e : "Pre-fetch validation failed";
|
|
160
|
-
l.value = {
|
|
161
|
-
data: r ? null : l.value.data,
|
|
162
|
-
loading: !1,
|
|
163
|
-
error: t,
|
|
164
|
-
isRetrying: !1
|
|
165
|
-
};
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
l.value = {
|
|
170
|
-
data: r && o ? null : l.value.data,
|
|
171
|
-
loading: !0,
|
|
172
|
-
error: null,
|
|
173
|
-
isRetrying: !1
|
|
174
|
-
};
|
|
175
|
-
try {
|
|
176
|
-
let r = await e(t, n);
|
|
177
|
-
if (n.aborted) return;
|
|
178
|
-
if (s) {
|
|
179
|
-
let e = s(r);
|
|
180
|
-
if (e === !1 || typeof e == "string") {
|
|
181
|
-
l.value = {
|
|
182
|
-
data: null,
|
|
183
|
-
loading: !1,
|
|
184
|
-
error: typeof e == "string" ? e : "Validation failed",
|
|
185
|
-
isRetrying: !1
|
|
186
|
-
};
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
l.value = {
|
|
191
|
-
data: r,
|
|
192
|
-
loading: !1,
|
|
193
|
-
error: null,
|
|
194
|
-
isRetrying: !1
|
|
195
|
-
};
|
|
196
|
-
} catch (e) {
|
|
197
|
-
if (n.aborted) return;
|
|
198
|
-
l.value = {
|
|
199
|
-
data: null,
|
|
200
|
-
loading: !1,
|
|
201
|
-
error: e.message || "Fetch error",
|
|
202
|
-
isRetrying: !1
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}, d = null;
|
|
207
|
-
return this.effect(() => {
|
|
208
|
-
let e = t ? t.value : void 0, n = new AbortController();
|
|
209
|
-
return d = n, this.untrack(() => {
|
|
210
|
-
u(e, n.signal, !0);
|
|
211
|
-
}), () => n.abort();
|
|
212
|
-
}), {
|
|
213
|
-
get data() {
|
|
214
|
-
return l.value.data;
|
|
215
|
-
},
|
|
216
|
-
get loading() {
|
|
217
|
-
return l.value.loading;
|
|
218
|
-
},
|
|
219
|
-
get error() {
|
|
220
|
-
return l.value.error;
|
|
221
|
-
},
|
|
222
|
-
get isRetrying() {
|
|
223
|
-
return l.value.isRetrying;
|
|
224
|
-
},
|
|
225
|
-
get value() {
|
|
226
|
-
return l.value;
|
|
227
|
-
},
|
|
228
|
-
refetch: () => {
|
|
229
|
-
d?.abort();
|
|
230
|
-
let e = new AbortController();
|
|
231
|
-
d = e, u(t ? t.value : void 0, e.signal, !1);
|
|
232
|
-
},
|
|
233
|
-
subscribe: (e) => l.subscribe(e)
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
}, o = class extends a {};
|
|
207
|
+
return o(this, e, t, n);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
237
210
|
//#endregion
|
|
238
|
-
export {
|
|
211
|
+
export { f as ReactiveEngine, f as ReactiveEngineAutomatic, f as ReactiveEngineCore, d as flushLogs, u as queueLog };
|
|
239
212
|
|
|
240
213
|
//# 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 { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, Computed, IEffect, EngineLoggerOptions, LogEventType, CleanupFn, TransactionContext, LogRecord, SignalOptions, ResourceOptions, ResourceState, Resource } from './types'\nimport { createComputed } from './core.method.computed'\nimport { createSignal } from './core.method.signal'\nimport { executeUntrack } from './core.method.untrack'\nimport { createReactive } from './core.method.reactive'\nimport { createEffect } from './core.method.effect'\nimport { ReactiveDebounceLogger } from './core.logger'\n\ntype Constructor<T> = new (...args: any[]) => T\ntype Factory<T> = (engine: any) => T\ntype InjectionToken<T> = Constructor<T> | Factory<T> | symbol | string\n\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n private logger: EngineLoggerOptions\n public epoch = 0\n public activeConsumer: any = null\n public batchDepth = 0\n public subscriberId = 0\n public pendingEffects: Array<Set<any> | undefined> = []\n public maxPendingDepth = 0\n public computedCache = new WeakMap<Function, any>()\n public computedStringCache = new Map<string, any>()\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private proxyCache = new WeakMap<object, any>()\n private proxyTargets = new WeakSet<object>()\n private reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n public cycleDetectionStack = new Set<unknown>()\n public batchedSignals = new Set<any>()\n public activeOwner: any = null\n public pendingCleanups = new Set<() => void>()\n public isLoggingEnabled = false\n public _poolArr: any[] = []\n\n public queueCleanup(cleanup: () => void): void {\n this.pendingCleanups.add(cleanup)\n }\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n this.isLoggingEnabled = !!this.logger.isEnabled\n }\n\n public scheduleEffect(effect: any): void {\n // ⚛️ ЖЕЛЕЗНЫЙ ДЕДУПЛИКАТОР: Если флаг взведен, эффект уже в очереди!\n if (effect._isScheduled) {\n return\n }\n effect._isScheduled = true\n\n const depth = effect.depth || 0\n if (!this.pendingEffects[depth]) {\n this.pendingEffects[depth] = new Set()\n }\n this.pendingEffects[depth]!.add(effect)\n if (depth > this.maxPendingDepth) {\n this.maxPendingDepth = depth\n }\n }\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 if (!(this as any).batchIterationId) (this as any).batchIterationId = 0\n ;(this as any).batchIterationId++\n\n if (this.batchedSignals.size > 0) {\n const changeFlags = new Map<any, boolean>()\n\n // Фаза 1: Фиксация версий\n for (const sig of this.batchedSignals) {\n if (sig._applyBatchValue) {\n changeFlags.set(sig, sig._applyBatchValue())\n }\n }\n\n // Атомарный сдвиг общей макро-эпохи ядра\n this.epoch++\n\n // Фаза 2: Каскадный пуш со статусом CHECK (1)\n for (const sig of this.batchedSignals) {\n if (sig._flushBatch) {\n const changed = changeFlags.get(sig) ?? false\n sig._flushBatch(changed, true)\n }\n }\n this.batchedSignals.clear()\n }\n\n // Запускаем планировщик под единым защищенным барьером итерации\n this.flushEffects()\n }\n }\n }\n\n public flushEffects(): void {\n if (this.batchDepth > 0) return\n const prevConsumer = this.activeConsumer\n\n try {\n for (let depth = 0; depth <= this.maxPendingDepth; depth++) {\n const bucket = this.pendingEffects[depth]\n if (!bucket || bucket.size === 0) continue\n\n const effects = Array.from(bucket)\n bucket.clear()\n\n for (const effect of effects) {\n if (effect.isDisposed) continue\n\n // Сбрасываем флаг планировщика строго перед вызовом тела\n effect._isScheduled = false\n\n if (!effect.isDirty) continue\n\n if (effect.dependencies && effect.dependencies.size > 0) {\n let parentChanged = false\n for (const dep of effect.dependencies) {\n const rawNode = dep._node || dep\n if (rawNode.type === 'computed' && rawNode.state > 0) {\n if (rawNode.update) rawNode.update()\n }\n if (effect.depVersions && effect.depVersions.get(dep) !== rawNode.version) {\n parentChanged = true\n }\n }\n if (!parentChanged && effect.dependencies.size > 0) {\n effect.isDirty = false\n continue\n }\n }\n\n try {\n effect.run()\n } catch (err) {\n throw err\n }\n }\n\n if (depth > 0) {\n let hasEarlierEffects = false\n for (let i = 0; i < depth; i++) {\n if (this.pendingEffects[i] && this.pendingEffects[i]!.size > 0) {\n hasEarlierEffects = true\n break\n }\n }\n if (hasEarlierEffects) depth = -1\n }\n }\n this.maxPendingDepth = 0\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n return createSignal<T>(this, initialValue, optionsOrName)\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n return createComputed<T>(this, fn, signalName)\n }\n\n public effect(fn: () => void | CleanupFn, effectName?: string): () => void {\n return createEffect(this, fn, effectName)\n }\n\n public untrack<T>(fn: () => T): T {\n return executeUntrack<T>(this, fn)\n }\n\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n\n public provide<T>(token: InjectionToken<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n\n public inject<T>(token: InjectionToken<T>): T {\n if (token === undefined || token === null) throw new Error('[DI Error] Token is empty')\n if (this.diCache.has(token)) return this.diCache.get(token) as T\n if (this.cycleDetectionStack.has(token)) throw new Error('[DI Error] Cyclic dependency detected')\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 const str = entry.toString()\n const isClass = str.startsWith('class ') || str.startsWith('class{') || (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 Constructor<T>)(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\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 const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const resourceSignalName = isOptionsObject ? ((optionsOrName as ResourceOptions<T, S>).name || 'unnamed_resource') : (optionsOrName as string) || 'unnamed_resource'\n\n const options: Partial<ResourceOptions<T, S>> = isOptionsObject ? (optionsOrName as ResourceOptions<T, S>) : {}\n const resetDataOnSourceChange = options.resetDataOnSourceChange ?? true\n const responseValidate = options.responseValidate\n const validateBeforeFetch = options.validateBeforeFetch\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `[CORE_INTERNAL_SIGNAL=1]:resource:state:${resourceSignalName}`\n )\n\n const load = async (sValue: S, effectSignal: AbortSignal, isSourceChange = false) => {\n if (effectSignal.aborted) return\n if (validateBeforeFetch) {\n const preValidationResult = validateBeforeFetch(sValue)\n if (preValidationResult === false || typeof preValidationResult === 'string') {\n if (effectSignal.aborted) return\n const errorMsg = typeof preValidationResult === 'string' ? preValidationResult : 'Pre-fetch validation failed'\n state.value = { data: isSourceChange ? null : state.value.data, loading: false, error: errorMsg, isRetrying: false }\n return\n }\n }\n\n state.value = { data: (isSourceChange && resetDataOnSourceChange) ? null : state.value.data, loading: true, error: null, isRetrying: false }\n\n try {\n const data = await fetcher(sValue, effectSignal)\n if (effectSignal.aborted) return\n if (responseValidate) {\n const validationResult = responseValidate(data)\n if (validationResult === false || typeof validationResult === 'string') {\n const errorMsg = typeof validationResult === 'string' ? validationResult : 'Validation failed'\n state.value = { data: null, loading: false, error: errorMsg, isRetrying: false }\n return\n }\n }\n state.value = { data, loading: false, error: null, isRetrying: false }\n } catch (e: any) {\n if (effectSignal.aborted) return\n state.value = { data: null, loading: false, error: e.message || 'Fetch error', isRetrying: false }\n }\n }\n\n let activeController: AbortController | null = null\n\n this.effect(() => {\n const sValue = source ? source.value : undefined as S\n const controller = new AbortController()\n activeController = controller\n\n this.untrack(() => {\n load(sValue, controller.signal, true)\n })\n\n return () => controller.abort()\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get isRetrying() { return state.value.isRetrying },\n get value() { return state.value },\n refetch: () => {\n activeController?.abort()\n const controller = new AbortController()\n activeController = controller\n load(source ? source.value : undefined as S, controller.signal, false)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n"],"mappings":";;;;;;AAaA,IAAa,IAAb,MAAgC;CAC9B,kBAA4B;CAC5B;CACA,QAAe;CACf,iBAA6B;CAC7B,aAAoB;CACpB,eAAsB;CACtB,iBAAqD,CAAC;CACtD,kBAAyB;CACzB,gCAAuB,IAAI,QAAuB;CAClD,sCAA6B,IAAI,IAAiB;CAClD,6BAAqB,IAAI,IAAsB;CAC/C,0BAAkB,IAAI,IAAsB;CAC5C,6BAAqB,IAAI,QAAqB;CAC9C,+BAAuB,IAAI,QAAgB;CAC3C,kCAA0B,IAAI,QAA2C;CACzE,sCAA6B,IAAI,IAAa;CAC9C,iCAAwB,IAAI,IAAS;CACrC,cAA0B;CAC1B,kCAAyB,IAAI,IAAgB;CAC7C,mBAA0B;CAC1B,WAAyB,CAAC;CAE1B,aAAoB,GAA2B;EAC7C,KAAK,gBAAgB,IAAI,CAAO;CAClC;CAEA,YAAY,GAA4C;EAEtD,AADA,KAAK,SAAS,GAAS,UAAU,EAAE,WAAW,GAAM,GACpD,KAAK,mBAAmB,CAAC,CAAC,KAAK,OAAO;CACxC;CAEA,eAAsB,GAAmB;EAEvC,IAAI,EAAO,cACT;EAEF,EAAO,eAAe;EAEtB,IAAM,IAAQ,EAAO,SAAS;EAK9B,AAJK,KAAK,eAAe,OACvB,KAAK,eAAe,qBAAS,IAAI,IAAI,IAEvC,KAAK,eAAe,EAAM,CAAE,IAAI,CAAM,GAClC,IAAQ,KAAK,oBACf,KAAK,kBAAkB;CAE3B;CAEA,MAAgB,GAAgB;EAC9B,KAAK;EACL,IAAI;GACF,OAAO,EAAG;EACZ,UAAU;GAER,IADA,KAAK,cACD,KAAK,eAAe,GAAG;IAIzB,IAHA,AAAqC,KAAc,qBAAmB,GACrE,KAAc,oBAEX,KAAK,eAAe,OAAO,GAAG;KAChC,IAAM,oBAAc,IAAI,IAAkB;KAG1C,KAAK,IAAM,KAAO,KAAK,gBACrB,AAAI,EAAI,oBACN,EAAY,IAAI,GAAK,EAAI,iBAAiB,CAAC;KAK/C,KAAK;KAGL,KAAK,IAAM,KAAO,KAAK,gBACrB,IAAI,EAAI,aAAa;MACnB,IAAM,IAAU,EAAY,IAAI,CAAG,KAAK;MACxC,EAAI,YAAY,GAAS,EAAI;KAC/B;KAEF,KAAK,eAAe,MAAM;IAC5B;IAGA,KAAK,aAAa;GACpB;EACF;CACF;CAEA,eAA4B;EAC1B,IAAI,KAAK,aAAa,GAAG;EACzB,IAAM,IAAe,KAAK;EAE1B,IAAI;GACF,KAAK,IAAI,IAAQ,GAAG,KAAS,KAAK,iBAAiB,KAAS;IAC1D,IAAM,IAAS,KAAK,eAAe;IACnC,IAAI,CAAC,KAAU,EAAO,SAAS,GAAG;IAElC,IAAM,IAAU,MAAM,KAAK,CAAM;IACjC,EAAO,MAAM;IAEb,KAAK,IAAM,KAAU,GACf,OAAO,eAGX,EAAO,eAAe,IAEjB,EAAO,UAEZ;SAAI,EAAO,gBAAgB,EAAO,aAAa,OAAO,GAAG;MACvD,IAAI,IAAgB;MACpB,KAAK,IAAM,KAAO,EAAO,cAAc;OACrC,IAAM,IAAU,EAAI,SAAS;OAI7B,AAHI,EAAQ,SAAS,cAAc,EAAQ,QAAQ,KAC7C,EAAQ,UAAQ,EAAQ,OAAO,GAEjC,EAAO,eAAe,EAAO,YAAY,IAAI,CAAG,MAAM,EAAQ,YAChE,IAAgB;MAEpB;MACA,IAAI,CAAC,KAAiB,EAAO,aAAa,OAAO,GAAG;OAClD,EAAO,UAAU;OACjB;MACF;KACF;KAEA,IAAI;MACF,EAAO,IAAI;KACb,SAAS,GAAK;MACZ,MAAM;KACR;IANA;IASF,IAAI,IAAQ,GAAG;KACb,IAAI,IAAoB;KACxB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAO,KACzB,IAAI,KAAK,eAAe,MAAM,KAAK,eAAe,EAAE,CAAE,OAAO,GAAG;MAC9D,IAAoB;MACpB;KACF;KAEF,AAAI,MAAmB,IAAQ;IACjC;GACF;GACA,KAAK,kBAAkB;EACzB,UAAU;GACR,KAAK,iBAAiB;EACxB;CACF;CAEA,OAAiB,GAAiB,GAAsD;EACtF,OAAO,EAAgB,MAAM,GAAc,CAAa;CAC1D;CAEA,SAAmB,GAAa,GAAkC;EAChE,OAAO,EAAkB,MAAM,GAAI,CAAU;CAC/C;CAEA,OAAc,GAA4B,GAAiC;EACzE,OAAO,EAAa,MAAM,GAAI,CAAU;CAC1C;CAEA,QAAkB,GAAgB;EAChC,OAAO,EAAkB,MAAM,CAAE;CACnC;CAEA,SAAkC,GAAW,GAAkB;EAC7D,OAAO,EAAkB,MAAM,GAAQ,CAAI;CAC7C;CAEA,QAAkB,GAA0B,GAAsC;EAEhF,AADA,KAAK,WAAW,IAAI,GAAO,CAAc,GACzC,KAAK,QAAQ,OAAO,CAAK;CAC3B;CAEA,OAAiB,GAA6B;EAC5C,IAAI,KAAiC,MAAM,MAAU,MAAM,2BAA2B;EACtF,IAAI,KAAK,QAAQ,IAAI,CAAK,GAAG,OAAO,KAAK,QAAQ,IAAI,CAAK;EAC1D,IAAI,KAAK,oBAAoB,IAAI,CAAK,GAAG,MAAU,MAAM,uCAAuC;EAChG,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,IAAM,IAAM,EAAM,SAAS;KAE3B,IAAI,EADY,EAAI,WAAW,QAAQ,KAAK,EAAI,WAAW,QAAQ,KAAM,EAAM,aAAa,EAAM,UAAU,gBAAgB,KAAS,CAAC,EAAI,WAAW,UAAU,KAAK,CAAC,EAAI,SAAS,IAAI,IACxK;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,EAAyB,IAAI;IAEnD,OADA,KAAK,QAAQ,IAAI,GAAO,CAAQ,GACzB;GACT;GACA,MAAU,MAAM,4BAA4B;EAC9C,UAAU;GACR,KAAK,oBAAoB,OAAO,CAAK;EACvC;CACF;CAEA,SACE,GACA,GACA,GACa;EACb,IAAM,IAAkB,KAAiB,OAAO,KAAkB,UAC5D,IAAqB,IAAoB,EAAwC,QAAQ,qBAAuB,KAA4B,oBAE5I,IAA0C,IAAmB,IAA0C,CAAC,GACxG,IAA0B,EAAQ,2BAA2B,IAC7D,IAAmB,EAAQ,kBAC3B,IAAsB,EAAQ,qBAE9B,IAAQ,KAAK,OACjB;GAAE,MAAM;GAAM,SAAS;GAAM,OAAO;GAAM,YAAY;EAAM,GAC5D,2CAA2C,GAC7C,GAEM,IAAO,OAAO,GAAW,GAA2B,IAAiB,OAAU;GAC/E,OAAa,SACjB;QAAI,GAAqB;KACvB,IAAM,IAAsB,EAAoB,CAAM;KACtD,IAAI,MAAwB,MAAS,OAAO,KAAwB,UAAU;MAC5E,IAAI,EAAa,SAAS;MAC1B,IAAM,IAAW,OAAO,KAAwB,WAAW,IAAsB;MACjF,EAAM,QAAQ;OAAE,MAAM,IAAiB,OAAO,EAAM,MAAM;OAAM,SAAS;OAAO,OAAO;OAAU,YAAY;MAAM;MACnH;KACF;IACF;IAEA,EAAM,QAAQ;KAAE,MAAO,KAAkB,IAA2B,OAAO,EAAM,MAAM;KAAM,SAAS;KAAM,OAAO;KAAM,YAAY;IAAM;IAE3I,IAAI;KACF,IAAM,IAAO,MAAM,EAAQ,GAAQ,CAAY;KAC/C,IAAI,EAAa,SAAS;KAC1B,IAAI,GAAkB;MACpB,IAAM,IAAmB,EAAiB,CAAI;MAC9C,IAAI,MAAqB,MAAS,OAAO,KAAqB,UAAU;OAEtE,EAAM,QAAQ;QAAE,MAAM;QAAM,SAAS;QAAO,OAD3B,OAAO,KAAqB,WAAW,IAAmB;QACd,YAAY;OAAM;OAC/E;MACF;KACF;KACA,EAAM,QAAQ;MAAE;MAAM,SAAS;MAAO,OAAO;MAAM,YAAY;KAAM;IACvE,SAAS,GAAQ;KACf,IAAI,EAAa,SAAS;KAC1B,EAAM,QAAQ;MAAE,MAAM;MAAM,SAAS;MAAO,OAAO,EAAE,WAAW;MAAe,YAAY;KAAM;IACnG;GAnBA;EAoBF,GAEI,IAA2C;EAc/C,OAZA,KAAK,aAAa;GAChB,IAAM,IAAS,IAAS,EAAO,QAAQ,KAAA,GACjC,IAAa,IAAI,gBAAgB;GAOvC,OANA,IAAmB,GAEnB,KAAK,cAAc;IACjB,EAAK,GAAQ,EAAW,QAAQ,EAAI;GACtC,CAAC,SAEY,EAAW,MAAM;EAChC,CAAC,GAEM;GACL,IAAI,OAAO;IAAE,OAAO,EAAM,MAAM;GAAK;GACrC,IAAI,UAAU;IAAE,OAAO,EAAM,MAAM;GAAQ;GAC3C,IAAI,QAAQ;IAAE,OAAO,EAAM,MAAM;GAAM;GACvC,IAAI,aAAa;IAAE,OAAO,EAAM,MAAM;GAAW;GACjD,IAAI,QAAQ;IAAE,OAAO,EAAM;GAAM;GACjC,eAAe;IACb,GAAkB,MAAM;IACxB,IAAM,IAAa,IAAI,gBAAgB;IAEvC,AADA,IAAmB,GACnB,EAAK,IAAS,EAAO,QAAQ,KAAA,GAAgB,EAAW,QAAQ,EAAK;GACvE;GACA,YAAY,MAAwC,EAAM,UAAU,CAAE;EACxE;CACF;AAEF,GAEa,IAAb,cAA6C,EAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"core.mjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, Computed, IEffect, EngineLoggerOptions, LogEventType, CleanupFn, TransactionContext, LogRecord, SignalOptions, ResourceOptions, ResourceState, Resource } from './types'\nimport { createComputed } from './core.method.computed'\nimport { createSignal } from './core.method.signal'\n// import { executeBatch } from './core.method.batch'\nimport { executeUntrack } from './core.method.untrack'\nimport { createReactive } from './core.method.reactive'\nimport { createEffect } from './core.method.effect'\nimport { ReactiveDebounceLogger } from './core.logger'\nimport { createResource } from './core.method.resource'\n\n// Тип для конструктора класса\ntype Constructor<T> = new (...args: any[]) => T\n// Тип для фабричной функции зависимостей\ntype Factory<T> = (engine: any) => T\n// Универсальный тип токена DI\ntype InjectionToken<T> = Constructor<T> | Factory<T> | symbol | string\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}\nlet currentTransaction: TransactionContext | null = null\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}\nexport function queueLog(type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }): 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({ type, label, from: details?.from, to: details?.to, payload: details?.payload, timestamp: Date.now() })\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)\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}\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n private logger: EngineLoggerOptions\n public epoch = 0\n public activeConsumer: any = null\n public batchDepth = 0\n public subscriberId = 0\n public pendingEffects: Array<Set<any> | undefined> = []\n public maxPendingDepth = 0\n public computedCache = new WeakMap<Function, any>()\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private proxyCache = new WeakMap<object, any>()\n private proxyTargets = new WeakSet<object>()\n private reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n private cycleDetectionStack = new Set<unknown>()\n public batchedSignals = new Set<any>()\n public activeOwner: any = null\n // Системная очередь для отложенного батчинга деструкторов\n public pendingCleanups = new Set<() => void>()\n\n // Метод для регистрации отложенной очистки\n public queueCleanup(cleanup: () => void): void {\n this.pendingCleanups.add(cleanup)\n }\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public scheduleEffect(effect: any): void {\n const depth = effect.depth || 0\n if (!this.pendingEffects[depth]) {\n this.pendingEffects[depth] = new Set()\n }\n this.pendingEffects[depth]!.add(effect)\n if (depth > this.maxPendingDepth) {\n this.maxPendingDepth = depth\n }\n }\n\n public queueLog(type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }): void {\n queueLog(type, label, details)\n }\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 if (this.batchedSignals.size > 0) {\n for (const sig of this.batchedSignals) {\n if (sig._flushBatch) sig._flushBatch()\n }\n this.batchedSignals.clear()\n }\n\n this.flushEffects()\n }\n }\n }\n\n public flushEffects(): void {\n if (this.batchDepth > 0) return\n\n const prevConsumer = this.activeConsumer\n\n try {\n for (let depth = 0; depth <= this.maxPendingDepth; depth++) {\n const bucket = this.pendingEffects[depth]\n\n if (!bucket || bucket.size === 0) continue\n\n const effects = Array.from(bucket)\n bucket.clear()\n\n for (const effect of effects) {\n if (effect.isDisposed) continue\n\n // ⚡ ЗOЛОТOЙ СТАНДАРТ ОПТИМИЗАЦИИ (Early Dirty Check Bypass):\n // Переносим проверку грязи в самое начало цикла. Если эффект не был промаркирован\n // как DIRTY волной push-уведомлений, мы мгновенно пропускаем его, полностью\n // избавляя V8 от холостого обхода родителей и тяжелых хэш-поисков depVersions.get(dep).\n if (!effect.isDirty) continue\n\n if (effect.dependencies && effect.dependencies.size > 0) {\n let parentChanged = false\n\n for (const dep of effect.dependencies) {\n const rawNode = dep._node || dep\n\n if (rawNode.type === 'computed' && rawNode.state > 0) {\n if (rawNode.update) rawNode.update()\n }\n\n if (effect.depVersions && effect.depVersions.get(dep) !== rawNode.version) {\n parentChanged = true\n }\n }\n\n if (!parentChanged && effect.dependencies.size > 0) {\n effect.isDirty = false\n continue\n }\n }\n\n // Оригинальная проверка снизу убирается, так как она теперь стоит сверху\n try {\n effect.run()\n } catch (err) {\n throw err\n }\n }\n\n if (depth > 0) {\n let hasEarlierEffects = false\n for (let i = 0; i < depth; i++) {\n if (this.pendingEffects[i] && this.pendingEffects[i]!.size > 0) {\n hasEarlierEffects = true\n break\n }\n }\n if (hasEarlierEffects) depth = -1\n }\n }\n this.maxPendingDepth = 0\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n\n // public batch<T>(fn: () => T): T {\n // return executeBatch<T>(this, fn)\n // }\n\n // ⚛️ ФИКС ДЛЯ РЕЛИЗА 2.5.0: Меняем private на public,\n // чтобы изолированные функции-методы имели легальный доступ к регистратору логов\n public log(params: any) {\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 return createSignal<T>(this, initialValue, optionsOrName)\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n // Просто делегируем вызов строго изолированной чистой функции\n return createComputed<T>(this, fn, signalName)\n }\n\n public effect(fn: () => void | CleanupFn, effectName?: string): () => void {\n return createEffect(this, fn, effectName)\n }\n\n public untrack<T>(fn: () => T): T {\n return executeUntrack<T>(this, fn)\n }\n\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n\n public provide<T>(token: InjectionToken<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n\n public inject<T>(token: InjectionToken<T>): T {\n if (token === undefined || token === null) throw new Error('[DI Error] Token is empty')\n if (this.diCache.has(token)) return this.diCache.get(token) as T\n if (this.cycleDetectionStack.has(token)) throw new Error('[DI Error] Cyclic dependency detected')\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 ') || str.startsWith('class{') || (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 Constructor<T>)(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\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\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n\n /**\n * Создает умную реактивную декларативную обертку над асинхронными операциями\n * с автоматическим подавлением Race Conditions и встроенным методом .destroy().\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 // Передаем инстанс движка (this) как IReactiveEngine для соблюдения строгой типизации\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n"],"mappings":"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"}
|
|
@@ -58,7 +58,7 @@ interface ThrottleComputedOptions {
|
|
|
58
58
|
*/
|
|
59
59
|
export declare const withThrottleComputed: <T>(engine: ReactiveEngine, getter: () => T, options: ThrottleComputedOptions, signalName?: string) => {
|
|
60
60
|
readonly value: T;
|
|
61
|
-
subscribe: (cb: (val: T) => void) =>
|
|
61
|
+
subscribe: (cb: (val: T) => void) => import('../..').CleanupFn;
|
|
62
62
|
destroy: () => void;
|
|
63
63
|
};
|
|
64
64
|
export {};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core.cjs"),t=require("./core.automatic.cjs"),n=require("./core.autolog.cjs"),r=require("./core.global.cjs"),i=require("./AbstractService.cjs"),a=require("./BaseREServiceEnhanced.cjs"),o=require("./decorators/withCache/withCache.cjs"),s=require("./decorators/withDebounce/withDebounce.cjs"),c=require("./decorators/withLongPolling/withLongPolling.cjs"),l=require("./decorators/withThrottle/withThrottle.cjs"),u=require("./decorators/withThrottleComputed/withThrottleComputed.cjs"),d=require("./decorators/withThrottleAndCache/withThrottleAndCache.cjs"),f=require("./decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.cjs"),p=require("./decorators/withValidation/withValidation.cjs");exports.AbstractService=i.AbstractService,exports.BaseREService=i.BaseREService,exports.BaseREServiceEnhanced=a.BaseREServiceEnhanced,exports.ReactiveEngine=t.ReactiveEngineAutomatic,exports.ReactiveEngineAutolog=n.ReactiveEngineAutolog,exports.ReactiveEngineAutomatic=t.ReactiveEngineAutomatic,exports.ReactiveEngineCore=e.
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core.cjs"),t=require("./core.automatic.cjs"),n=require("./core.autolog.cjs"),r=require("./core.global.cjs"),i=require("./AbstractService.cjs"),a=require("./BaseREServiceEnhanced.cjs"),o=require("./decorators/withCache/withCache.cjs"),s=require("./decorators/withDebounce/withDebounce.cjs"),c=require("./decorators/withLongPolling/withLongPolling.cjs"),l=require("./decorators/withThrottle/withThrottle.cjs"),u=require("./decorators/withThrottleComputed/withThrottleComputed.cjs"),d=require("./decorators/withThrottleAndCache/withThrottleAndCache.cjs"),f=require("./decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.cjs"),p=require("./decorators/withValidation/withValidation.cjs");exports.AbstractService=i.AbstractService,exports.BaseREService=i.BaseREService,exports.BaseREServiceEnhanced=a.BaseREServiceEnhanced,exports.ReactiveEngine=t.ReactiveEngineAutomatic,exports.ReactiveEngineAutolog=n.ReactiveEngineAutolog,exports.ReactiveEngineAutomatic=t.ReactiveEngineAutomatic,exports.ReactiveEngineCore=e.ReactiveEngine,exports.batch=r.batch,exports.computed=r.computed,exports.effect=r.effect,exports.resetGlobalReactiveEngine=r.resetGlobalReactiveEngine,exports.signal=r.signal,exports.untrack=r.untrack,exports.withCache=o.withCache,exports.withDebounce=s.withDebounce,exports.withLongPolling=c.withLongPolling,exports.withResourceValidation=p.withResourceValidation,exports.withStaleWhileRevalidate=f.withStaleWhileRevalidate,exports.withThrottle=l.withThrottle,exports.withThrottleAndCache=d.withThrottleAndCache,exports.withThrottleComputed=u.withThrottleComputed,exports.withValidation=p.withValidation;
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactiveEngine as e } from "./core.mjs";
|
|
2
2
|
import { ReactiveEngineAutomatic as t } from "./core.automatic.mjs";
|
|
3
3
|
import { ReactiveEngineAutolog as n } from "./core.autolog.mjs";
|
|
4
4
|
import { batch as r, computed as i, effect as a, resetGlobalReactiveEngine as o, signal as s, untrack as c } from "./core.global.mjs";
|
package/dist/index2.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require("./core.cjs");require("./core.automatic.cjs"),require("./core.autolog.cjs");const t=require("./core.global.cjs"),n=require("./AbstractService.cjs"),r=require("./BaseREServiceEnhanced.cjs");exports.AbstractService=n.AbstractService,exports.BaseREService=n.BaseREService,exports.BaseREServiceEnhanced=r.BaseREServiceEnhanced,exports.ReactiveEngineAutomatic=e.
|
|
1
|
+
const e=require("./core.cjs");require("./core.automatic.cjs"),require("./core.autolog.cjs");const t=require("./core.global.cjs"),n=require("./AbstractService.cjs"),r=require("./BaseREServiceEnhanced.cjs");exports.AbstractService=n.AbstractService,exports.BaseREService=n.BaseREService,exports.BaseREServiceEnhanced=r.BaseREServiceEnhanced,exports.ReactiveEngineAutomatic=e.ReactiveEngine,exports.batch=t.batch,exports.computed=t.computed,exports.effect=t.effect,exports.flushLogs=e.flushLogs,exports.queueLog=e.queueLog,exports.resetGlobalReactiveEngine=t.resetGlobalReactiveEngine,exports.signal=t.signal,exports.untrack=t.untrack;
|
package/dist/index2.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactiveEngine as e, flushLogs as t, queueLog as n } from "./core.mjs";
|
|
2
2
|
import "./core.automatic.mjs";
|
|
3
3
|
import "./core.autolog.mjs";
|
|
4
|
-
import { batch as
|
|
5
|
-
import { AbstractService as
|
|
6
|
-
import { BaseREServiceEnhanced as
|
|
7
|
-
export {
|
|
4
|
+
import { batch as r, computed as i, effect as a, resetGlobalReactiveEngine as o, signal as s, untrack as c } from "./core.global.mjs";
|
|
5
|
+
import { AbstractService as l, BaseREService as u } from "./AbstractService.mjs";
|
|
6
|
+
import { BaseREServiceEnhanced as d } from "./BaseREServiceEnhanced.mjs";
|
|
7
|
+
export { l as AbstractService, u as BaseREService, d as BaseREServiceEnhanced, e as ReactiveEngineAutomatic, r as batch, i as computed, a as effect, t as flushLogs, n as queueLog, o as resetGlobalReactiveEngine, s as signal, c as untrack };
|
package/dist/react/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./hooks/useReactiveValue.cjs"),n=require("./hooks/useReactiveSubscription.cjs");var r=t.useReactiveValue,i=class extends e.
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./hooks/useReactiveValue.cjs"),n=require("./hooks/useReactiveSubscription.cjs");var r=t.useReactiveValue,i=class extends e.ReactiveEngine{use(e){return t.useReactiveValue(e)}};exports.ReactiveEngine=i,exports.use=r,exports.useReactiveSubscription=n.useReactiveSubscription,exports.useReactiveValue=t.useReactiveValue;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/react/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../src/react/index.ts"],"sourcesContent":["import { ReactiveEngineCore } from '../core/core'\nimport { useReactiveValue } from './hooks/useReactiveValue'\nimport { ISignalLike } from '../core/types'\n\nexport interface IUseReactiveHook {\n <V>(item: ISignalLike<V>): V;\n <T>(item: T): T;\n}\n\nexport const use: IUseReactiveHook = useReactiveValue as any\n\n/**\n * Расширенная версия движка ядра для ООП/DI паттернов в React-среде\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n public use<V>(item: ISignalLike<V>): V;\n public use<T>(item: T): T;\n public use(item: any): any {\n return useReactiveValue(item)\n }\n // Метод inject удален отсюда, так как он нативно наследуется из ReactiveEngineCore без хуков!\n}\n\nexport { useReactiveValue }\nexport { useReactiveSubscription } from './hooks/useReactiveSubscription'\n"],"mappings":"6LASA,IAAa,EAAwB,EAAA,iBAKxB,EAAb,cAAoC,EAAA,
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../src/react/index.ts"],"sourcesContent":["import { ReactiveEngineCore } from '../core/core'\nimport { useReactiveValue } from './hooks/useReactiveValue'\nimport { ISignalLike } from '../core/types'\n\nexport interface IUseReactiveHook {\n <V>(item: ISignalLike<V>): V;\n <T>(item: T): T;\n}\n\nexport const use: IUseReactiveHook = useReactiveValue as any\n\n/**\n * Расширенная версия движка ядра для ООП/DI паттернов в React-среде\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n public use<V>(item: ISignalLike<V>): V;\n public use<T>(item: T): T;\n public use(item: any): any {\n return useReactiveValue(item)\n }\n // Метод inject удален отсюда, так как он нативно наследуется из ReactiveEngineCore без хуков!\n}\n\nexport { useReactiveValue }\nexport { useReactiveSubscription } from './hooks/useReactiveSubscription'\n"],"mappings":"6LASA,IAAa,EAAwB,EAAA,iBAKxB,EAAb,cAAoC,EAAA,cAAmB,CAGrD,IAAW,EAAgB,CACzB,OAAO,EAAA,iBAAiB,CAAI,CAC9B,CAEF"}
|
package/dist/react/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactiveEngine as e } from "../core.mjs";
|
|
2
2
|
import { useReactiveValue as t } from "./hooks/useReactiveValue.mjs";
|
|
3
3
|
import { useReactiveSubscription as n } from "./hooks/useReactiveSubscription.mjs";
|
|
4
4
|
//#region src/react/index.ts
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @pravosleva/reactive-engine v2.6.0-beta.1
|
|
3
|
+
* High-performance transactional reactive engine with microtask batching.
|
|
4
|
+
*
|
|
5
|
+
* @license MIT
|
|
6
|
+
* @author pravosleva <selection4test@google.com>
|
|
7
|
+
* @homepage https://pravosleva.pro/reactive-engine
|
|
8
|
+
*
|
|
9
|
+
* @contact Telegram Channel: https://t.me/bash_exp_ru/3393
|
|
10
|
+
* @contact Developer Telegram: https://t.me/pravosleva
|
|
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`});function t(e,t,n){let r=e.computedCache.get(t);if(r)return r;let i,a=!0,o=0,s=!1,c=-1,l=2,u=new Set,d=new Map,f=new Set,p=new Set,m=e=>{if(!e)return;let t=e._node||e;if(t.dependencies&&t.dependencies.size>0){for(let n of t.dependencies){let r=n,i=r._node||r;i.subscribers&&(i.subscribers.delete(t),i.subscribers.delete(e),i.subscribers.delete(v),i.type===`computed`&&i.subscribers.size===0&&m(i))}t.dependencies.clear(),t.depVersions&&t.depVersions.clear()}},h=-1,g=t=>{if(!s||l===2)return t.run();if(e.batchDepth===0&&h===e.epoch&&l===0)return!1;let n=!1;if(u&&u.size>0)for(let t of u){let r=t._node||t;if(r.type===`computed`&&r.update&&r.verifiedInEpoch!==e.epoch&&r.update(),t.hasBatchValue||d.get(t)!==r.version){n=!0;break}}return h=e.epoch,n||a?t.run():(l=0,!1)},_=0,v={id:e.subscriberId++,dependencies:u,subscribers:p,ownedEffects:f,depth:1,type:`computed`,fn:t,get version(){return o},get state(){return l},set state(e){l=e},get depVersions(){return d},update:()=>g(v),run:()=>{if(c===e.epoch&&s&&l===0&&e.batchDepth===0)return!1;if(c=e.epoch,h=e.epoch,e.cycleDetectionStack.has(v))throw Error(`[Graph Error] Cyclic dependency detected`);e.cycleDetectionStack.add(v);let r=e.activeConsumer,p=e.activeOwner;e.activeConsumer=v,e.activeOwner=v,_++,v.activeRunId=_;let m=u.size>0?Array.from(u):null;u.clear();try{if(f.size>0){for(let e of f)e&&typeof e.dispose==`function`&&e.dispose();f.clear()}let r=t();if(m!==null){let e=m.length===u.size;for(let t of m){let n=t;if(!e||!u.has(n)){let e=n._node||n;e.subscribers&&e.subscribers.delete(v),d.delete(n)}}}let c=a||!Object.is(i,r);if(c){let t=a?void 0:typeof i==`object`&&i?JSON.parse(JSON.stringify(i)):i;i=r,o++,e.log&&n&&e.log({type:`computed`,label:n,details:{from:t,to:r}})}a=!1,l=0,s=!0;let p=0;for(let e of u){let t=e,n=t._node||t;d.set(t,n.version),n.subscribers&&n.subscribers.add(v),n.depth!==void 0&&n.depth>p&&(p=n.depth)}return v.depth=p+1,c}finally{e.activeConsumer=r,e.activeOwner=p,e.cycleDetectionStack.delete(v)}},markDirty:t=>{if(!(l>=t)){l=t;for(let t of p){let n=t._node||t;n.type===`effect`?(n.isDirty=!0,e.scheduleEffect(t)):n.markDirty&&n.markDirty(1)}}}},y={get value(){let t=e.activeConsumer;if(t&&t!==v){p.add(t),t.dependencies.add(v);let e=v.depth||1,n=t._node||t;n.depth!==void 0&&e>=n.depth&&(n.depth=e+1),t.activeRunId!==void 0&&(v._lastSeenInRunId=t.activeRunId)}return g(v),t&&t.depVersions&&t.depVersions.set(y,o),i},get valueWithoutTracking(){return i},get version(){return o},get dependencies(){return u},subscribe(t){let n=this,r={id:e.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,run:()=>{if(!r.isDisposed)try{t(n.value)}catch(e){console.error(e)}}};return p.add(r),t(this.value),()=>{r.isDisposed=!0,p.delete(r),r.dependencies.clear()}},subscribeState(e){return y.subscribe(e)},destroy:()=>{m(v),p&&p.clear(),e.computedCache.delete(t),u.clear(),d.clear(),f.clear(),a=!0,l=2,s=!1},__subscribe(t){let n={id:e.subscriberId++,type:`effect`,run:t,isDirty:!1};return p.add(n),()=>{p.delete(n)}}};return y.run=()=>v.run(),e.computedCache.set(t,y),y._node=v,y.subscribers=p,y}var n=({tested:e,expectedKey:t,valueType:n})=>{let r=[];if(!e||!Array.isArray(e))return r;for(let i=0,a=e.length;i<a;i++){let a=e[i];if(typeof a!=`string`)continue;let o;switch(n){case`number`:o=RegExp(`\\[${t}=(?<value>\\d+)\\]`,`g`);break;default:o=RegExp(`\\[${t}=(?<value>.*?)\\]`,`g`);break}for(let e of a.matchAll(o))e?.groups&&r.push(e.groups.value)}return r};function r(e,t,r){let i=t,a=0,o=typeof r==`string`?r:r?.name,s=!!o&&n({tested:[o],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.[0]===`1`||!1,c=new Set,l=!1,u=t,d={type:`signal`,get version(){return a},subscribers:c},f=()=>{for(let t of c){let n=t._node||t;if(n.type===`effect`)n.isDirty=!0,e.scheduleEffect(t);else if(n.type===`computed`)n.markDirty&&n.markDirty(2);else if(typeof t==`function`)try{t(i)}catch(e){console.error(e)}else if(t&&typeof t.run==`function`)try{t.run()}catch(e){console.error(e)}}},p={get value(){let t=e.activeConsumer;return t&&(c.add(e.activeConsumer),e.activeConsumer.dependencies.add(p),t.activeRunId!==void 0&&(p._lastSeenInRunId=t.activeRunId)),i},set value(t){if(Object.is(i,t)&&!(i===t&&typeof i==`object`&&i))return;if(r&&typeof r==`object`&&r.validate){let e=r.validate(t);if(e!==!0){console.error(typeof e==`string`?e:`[Validation Error]`);return}}if(e.batchDepth>0){l||(l=!0,u=i),i=t,e.batchedSignals.add(p);return}let n=i;i=t,a++,e.epoch++,e.log({type:`signal`,label:o||`signal`,details:{from:n,to:t},isInternalCoreSignal:s}),f(),e.batchDepth===0&&e.flushEffects()},get version(){return a},type:`signal`,subscribe(e){return c.add(e),e(i),()=>{c.delete(e)}},_flushBatch:()=>{if(l){if(!Object.is(u,i)||typeof i==`object`&&i){a++,e.epoch++,e.log({type:`signal`,label:o||`signal_batched`,details:{from:u,to:i},isInternalCoreSignal:s});for(let t of c){let n=t._node||t;if(n.type===`effect`)n.isDirty=!0,e.scheduleEffect(t);else if(n.markDirty)n.markDirty(2);else if(typeof t==`function`)try{t(i)}catch(e){console.error(e)}}}l=!1,u=i}},get hasBatchValue(){return l},destroy:()=>{c&&c.clear(),e.batchedSignals&&e.batchedSignals.delete(p),l=!1,i=void 0,u=void 0}};return p._node=d,p.subscribers=c,p}function i(e,t){let n=e.activeConsumer;e.activeConsumer=null;try{return t()}finally{e.activeConsumer=n}}function a(e,t,n){if(e.proxyTargets.has(t))return t;if(e.proxyCache.has(t))return e.proxyCache.get(t);e.reactiveSignals.has(t)||e.reactiveSignals.set(t,new Map);let r=e.reactiveSignals.get(t),i=new Proxy(t,{get(t,i,a){if(i===`__subscribe`&&Array.isArray(t))return n=>{let i=r.get(`length`);return i||(i=e.signal(t.length),r.set(`length`,i)),i.subscribe(n)};if(Array.isArray(t)&&typeof i==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(i))return(...n)=>{let o;return e.batch(()=>{o=Reflect.get(t,i).apply(a,n);let e=r.get(`length`);e&&(e.value=t.length),r.forEach((e,n)=>{n!==`length`&&(e.value=Reflect.get(t,n))})}),o};if(typeof i==`symbol`||i===`constructor`||i===`toJSON`)return Reflect.get(t,i,a);let o=r.get(i);if(!o){let a=Reflect.get(t,i);o=e.signal(a),r.set(i,o),typeof a==`object`&&a&&(o._proxyCache=e.reactive(a,n?`${n}.${String(i)}`:String(i)))}return o._proxyCache===void 0?o.value:(o.value,o._proxyCache)},set(t,n,i,a){let o=(e.proxyTargets.has(i),i),s=Reflect.get(t,n);if(s===o&&n!==`length`)return!0;Reflect.set(t,n,o);let c=r.get(n);if(c||(c=e.signal(s),r.set(n,c)),c._proxyCache=void 0,c.value=o,Array.isArray(t)&&n!==`length`){let e=r.get(`length`);e&&(e.value=t.length)}return!0}});return e.proxyCache.set(t,i),e.proxyTargets.add(i),i}function o(e,t,n){let r=!1,i=!1,a=2,o=new Set,s=new Map,c=new Set,l=()=>{if(c.size>0){let t=e.activeConsumer,n=e.activeOwner;e.activeConsumer=null,e.activeOwner=null;for(let e of c)e.dispose&&e.dispose();c.clear(),e.activeConsumer=t,e.activeOwner=n}if(u.cleanups.size>0){let t=e.activeConsumer;e.activeConsumer=null;for(let e of u.cleanups)try{e()}catch(e){console.error(e)}u.cleanups.clear(),e.activeConsumer=t}},u={id:e.subscriberId++,dependencies:o,ownedEffects:c,cleanups:new Set,type:`effect`,depth:0,label:n,get isDirty(){return a>0},set isDirty(e){e&&(a=2)},get isDisposed(){return r},set isDisposed(e){r=e},get state(){return a},set state(e){a=e},get depVersions(){return s},get _node(){return u},markDirty:()=>{a>=1||(a=1,e.scheduleEffect(u))},run:()=>{if(r||i)return;i=!0,l();let n=e.activeConsumer,c=e.activeOwner;e.activeConsumer=u,e.activeOwner=u;let d=o.size>0?Array.from(o):null;o.clear();try{a=0;let e=t();if(typeof e==`function`&&u.cleanups.add(e),d!==null)for(let e of d){let t=e;if(!o.has(t)){let e=t._node||t;e.subscribers&&e.subscribers.delete(u),s.delete(t)}}let n=0;for(let e of o){let t=e,r=t._node||t;s.set(t,r.version),r.subscribers&&r.subscribers.add(u),r.depth!==void 0&&r.depth>n&&(n=r.depth)}u.depth=n+1}finally{i=!1,e.activeConsumer=n,e.activeOwner=c}},dispose:()=>{if(!r){r=!0,u.isDisposed=!0,l();for(let e of o){let t=e._node||e;t.subscribers&&t.subscribers.delete(u)}o.clear(),s.clear()}}},d=e.activeOwner?e.activeOwner._node||e.activeOwner:null;return d&&d.ownedEffects&&d.ownedEffects.add(u),u.run(),()=>{u.dispose()}}var s=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||o&&!e.isCoreOptimizationDebugEnabled)return;if(a&&`from`in a&&`to`in a&&this.isDeepEqual(a.from,a.to)){if(r===`computed`){t(r,`🔵 [IDLE PULL] ${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 c(e,t,r,i){let a=i&&typeof i==`object`,o=a?i.name||`unnamed_resource`:i||`unnamed_resource`,s=a?i:{},c=s.resetDataOnSourceChange??!0,l=s.responseValidate,u=s.validateBeforeFetch,d=e.signal({data:null,loading:!0,error:null,isRetrying:!1},`[CORE_INTERNAL_SIGNAL=1]:resource:state:${o}`),f=t=>{e.log({type:`resource`,label:o,details:{to:t,from:d.value}}),d.value=t},p=async(r,i,a=!1)=>{if(i.aborted)return;if(s.validateBeforeFetch&&s.validateBeforeFetch(r),u){let t=u(r);if(t===!1||typeof t==`string`){if(i.aborted)return;let n=typeof t==`string`?t:`Pre-fetch validation failed for resource`,r=a?null:e.untrack(()=>d.value.data);f({data:r,loading:!1,error:n,isRetrying:!1});return}}let p=a&&c?null:e.untrack(()=>d.value.data);f({data:p,loading:!0,error:null,isRetrying:!1});for(let a=0;a<=0;a++){if(i.aborted)return;let s=i;try{let e=await t(r,s);if(i.aborted)return;if(s.aborted)throw new DOMException(`The operation timed out.`,`TimeoutError`);if(l){let t=l(e);if(t===!1||typeof t==`string`){if(i.aborted)return;f({data:null,loading:!1,error:typeof t==`string`?t:`Validation failed`,isRetrying:!1});return}}if(i.aborted)return;f({data:e,loading:!1,error:null,isRetrying:!1});return}catch(t){if(i.aborted||t.name===`AbortError`&&i.aborted)return;let r=t.name===`TimeoutError`||t.name===`AbortError`||t.message?.includes(`timeout`),s=n({tested:[t.message],expectedKey:`THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY`,valueType:`number`})?.[0]===`1`||!1,c=s&&n({tested:[t.message],expectedKey:`MESSAGE`,valueType:`string`})?.[0]||`Custom validation error`,l=s||t.name===`ValidationError`;if(a===0||l){if(i.aborted)return;let e=r?Error(`Request timed out after 1000ms`,{cause:t}):s?Error(c,{cause:t}):t;f({data:null,loading:!1,error:e instanceof Error?e.message:typeof e==`string`?e:`typeof finalError is ${typeof e}`,isRetrying:!1});return}else{if(i.aborted)return;let t=1e3*2**a;t=Math.min(t,3e5);let n=Math.random()*200;t+=n,f({data:d.value.data,loading:!0,error:null,isRetrying:!0}),console.warn(`[Resource Retry] "${o}" сбой по ${r?`таймауту`:`ошибке сети`}. Попытка ${a+1}/${a+1}...`);try{if(await e.delay(t,i),i.aborted)return}catch{return}}}}},m=null,h=e.effect(()=>{let t=r?r.value:void 0,n=new AbortController;return m=n,e.untrack(()=>{p(t,n.signal,!0)}),()=>n.abort()},`[CORE_INTERNAL_SIGNAL=1]:effect`);return{get data(){return d.value.data},get loading(){return d.value.loading},get error(){return d.value.error},get isRetrying(){return d.value.isRetrying},get value(){return d.value},refetch:()=>{m?.abort(),m=new AbortController,p(r?r.value:void 0,m.signal,!1)},subscribe:e=>d.subscribe(e),destroy:()=>{m?.abort(),m=null,typeof h==`function`&&h(),d.destroy&&d.destroy()}}}var l={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;`},u=null;function d(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 f(e,t,n){u||(u={id:Math.random().toString(36).substring(2,9),pendingLogQueue:[],isFlushing:!1},queueMicrotask(()=>p())),u.pendingLogQueue.push({type:e,label:t,from:n?.from,to:n?.to,payload:n?.payload,timestamp:Date.now()})}function p(){if(!u||u.isFlushing)return;u.isFlushing=!0;let e=u.pendingLogQueue;if(e.length===0){u=null;return}console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${u.id}] (${e.length} operations)`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #888; font-weight: normal;`);for(let t of e){let e=l[t.type],n=t.from!==void 0||t.to!==void 0,r=`%c${t.type.toUpperCase()}%c ${t.label}`;n&&(t.from?r+=` ${d(t.from)} → ${d(t.to)}`:r+=` (${d(t.to)})`),t.payload===void 0?console.log(r,e,`color: inherit;`):(console.groupCollapsed(r,e,`color: inherit;`),console.log(`Payload:`,t.payload),console.groupEnd())}console.groupEnd(),u=null}var m=class{frameworkPrefix=`core`;logger;epoch=0;activeConsumer=null;batchDepth=0;subscriberId=0;pendingEffects=[];maxPendingDepth=0;computedCache=new WeakMap;diRegistry=new Map;diCache=new Map;proxyCache=new WeakMap;proxyTargets=new WeakSet;reactiveSignals=new WeakMap;cycleDetectionStack=new Set;batchedSignals=new Set;activeOwner=null;pendingCleanups=new Set;queueCleanup(e){this.pendingCleanups.add(e)}constructor(e){this.logger=e?.logger||{isEnabled:!1}}scheduleEffect(e){let t=e.depth||0;this.pendingEffects[t]||(this.pendingEffects[t]=new Set),this.pendingEffects[t].add(e),t>this.maxPendingDepth&&(this.maxPendingDepth=t)}queueLog(e,t,n){f(e,t,n)}batch(e){this.batchDepth++;try{return e()}finally{if(this.batchDepth--,this.batchDepth===0){if(this.batchedSignals.size>0){for(let e of this.batchedSignals)e._flushBatch&&e._flushBatch();this.batchedSignals.clear()}this.flushEffects()}}}flushEffects(){if(this.batchDepth>0)return;let e=this.activeConsumer;try{for(let e=0;e<=this.maxPendingDepth;e++){let t=this.pendingEffects[e];if(!t||t.size===0)continue;let n=Array.from(t);t.clear();for(let e of n)if(!e.isDisposed&&e.isDirty){if(e.dependencies&&e.dependencies.size>0){let t=!1;for(let n of e.dependencies){let r=n._node||n;r.type===`computed`&&r.state>0&&r.update&&r.update(),e.depVersions&&e.depVersions.get(n)!==r.version&&(t=!0)}if(!t&&e.dependencies.size>0){e.isDirty=!1;continue}}try{e.run()}catch(e){throw e}}if(e>0){let t=!1;for(let n=0;n<e;n++)if(this.pendingEffects[n]&&this.pendingEffects[n].size>0){t=!0;break}t&&(e=-1)}}this.maxPendingDepth=0}finally{this.activeConsumer=e}}log(e){!this.logger||!this.logger.isEnabled||s.processLog(this.logger,f,e)}signal(e,t){return r(this,e,t)}computed(e,n){return t(this,e,n)}effect(e,t){return o(this,e,t)}untrack(e){return i(this,e)}reactive(e,t){return a(this,e,t)}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)}}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})})}resource(e,t,n){return c(this,e,t,n)}},h=class extends m{},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}},_=new m({logger:{isEnabled:!1}}),v=(e,t)=>_.signal(e,t),y=(e,t)=>_.computed(e,t),b=(e,t)=>_.effect(e,t),x=e=>_.batch(e),S=e=>_.untrack(e);function C(){_=new m({logger:{isEnabled:!1}})}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.ReactiveEngine=h,e.ReactiveEngineAutolog=g,e.ReactiveEngineAutomatic=m,e.ReactiveEngineCore=m,e.batch=x,e.computed=y,e.effect=b,e.flushLogs=p,e.queueLog=f,e.resetGlobalReactiveEngine=C,e.signal=v,e.untrack=S});
|
|
13
|
+
//# sourceMappingURL=reactive-engine.umd.js.map
|