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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/core/core.d.ts +89 -203
  2. package/dist/core/core.d.ts.map +1 -1
  3. package/dist/core/core.global.d.ts +64 -8
  4. package/dist/core/core.global.d.ts.map +1 -1
  5. package/dist/core/core.logger.d.ts +2 -0
  6. package/dist/core/core.logger.d.ts.map +1 -1
  7. package/dist/core/core.method.reactive.d.ts +2 -4
  8. package/dist/core/core.method.reactive.d.ts.map +1 -1
  9. package/dist/core/core.method.resource.d.ts +3 -11
  10. package/dist/core/core.method.resource.d.ts.map +1 -1
  11. package/dist/core/types.d.ts +1 -0
  12. package/dist/core/types.d.ts.map +1 -1
  13. package/dist/core.global.mjs +31 -4
  14. package/dist/core.global.mjs.map +1 -1
  15. package/dist/core.logger.mjs +49 -2
  16. package/dist/core.logger.mjs.map +1 -1
  17. package/dist/core.method.reactive.mjs +73 -30
  18. package/dist/core.method.reactive.mjs.map +1 -1
  19. package/dist/core.method.resource.mjs +122 -138
  20. package/dist/core.method.resource.mjs.map +1 -1
  21. package/dist/core.mjs +379 -150
  22. package/dist/core.mjs.map +1 -1
  23. package/dist/index.mjs +12 -12
  24. package/dist/index2.mjs +5 -5
  25. package/dist/react/hooks/useReactiveSubscription.mjs +13 -13
  26. package/dist/react/hooks/useReactiveSubscription.mjs.map +1 -1
  27. package/dist/react/hooks/useReactiveValue.d.ts +0 -4
  28. package/dist/react/hooks/useReactiveValue.d.ts.map +1 -1
  29. package/dist/react/hooks/useReactiveValue.mjs +24 -9
  30. package/dist/react/hooks/useReactiveValue.mjs.map +1 -1
  31. package/dist/reactive-engine.umd.js +2 -2
  32. package/dist/reactive-engine.umd.js.map +1 -1
  33. package/package.json +1 -1
  34. package/dist/core.method.computed.mjs +0 -167
  35. package/dist/core.method.computed.mjs.map +0 -1
  36. package/dist/core.method.effect.mjs +0 -120
  37. package/dist/core.method.effect.mjs.map +0 -1
  38. package/dist/core.method.signal.mjs +0 -106
  39. package/dist/core.method.signal.mjs.map +0 -1
  40. package/dist/core.method.untrack.mjs +0 -14
  41. package/dist/core.method.untrack.mjs.map +0 -1
  42. package/dist/utils/getExtractedValues.mjs +0 -24
  43. package/dist/utils/getExtractedValues.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.method.computed.mjs","names":[],"sources":["../src/core/core.method.computed.ts"],"sourcesContent":["import { Computed, CleanupFn } from './types'\n\nexport function createComputed<T>(\n engine: any,\n fn: () => T,\n signalName?: string\n): Computed<T> {\n // 1. Ультимативный канонический WeakMap путь (строго по ссылке на объект-функцию)\n // Работает со скоростью нативной ссылки в V8, полностью исключая утечки памяти\n const existing = engine.computedCache.get(fn)\n if (existing) return existing as Computed<T>\n\n let value: T\n let isDirty = true\n let version = 0\n let isInitialized = false\n let evaluatedInEpoch = -1\n let state = 2 // 2 = DIRTY, 1 = CHECK, 0 = STABLE\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n const ownedEffects = new Set<any>()\n const subscribers = new Set<any>()\n\n const releaseNode = (node: any): void => {\n if (!node) return\n const actNode = node._node || node\n\n if (actNode.dependencies && actNode.dependencies.size > 0) {\n for (const unknownDep of actNode.dependencies) {\n const dep = unknownDep as any\n const rawDepNode = dep._node || dep\n\n if (rawDepNode.subscribers) {\n rawDepNode.subscribers.delete(actNode)\n rawDepNode.subscribers.delete(node)\n rawDepNode.subscribers.delete(computedNode)\n\n if (rawDepNode.type === 'computed' && rawDepNode.subscribers.size === 0) {\n releaseNode(rawDepNode)\n }\n }\n }\n actNode.dependencies.clear()\n if (actNode.depVersions) actNode.depVersions.clear()\n }\n }\n\n const updateIfNecessary = (node: any): boolean => {\n if (!isInitialized || state === 2) {\n return node.run()\n }\n\n // ⚛️ КОРРЕКТНЫЙ МЕМОИЗАЦИОННЫЙ ГВАРД (Pull-совместимый проход):\n // Если у узла есть активные подписчики (observed), мы можем оптимизировать расчет через эпохи.\n // Но если подписчиков НЕТ (unobserved), мы ОБЯЗАНЫ пропустить быстрый выход по эпохам\n // и честно проверить, изменились ли версии родителей ниже.\n if (subscribers && subscribers.size > 0) {\n if (node.verifiedInEpoch === engine.epoch && engine.batchDepth === 0 && state === 0) {\n return false\n }\n }\n\n let hasChangedParent = false\n\n if (dependencies && dependencies.size > 0) {\n for (const dep of dependencies) {\n const rawDep = dep._node || dep\n\n if (rawDep.type === 'computed' && rawDep.state > 0) {\n // ⚛️ ЗАЩИТА ОТ КАСКАДНОГО ОБХОДА:\n // Вызываем update() родителя только если он еще не был верифицирован в текущей эпохе.\n // Это ликвидирует квадратичную рекурсию на динамических структурах графа!\n if (rawDep.update && rawDep.verifiedInEpoch !== engine.epoch) {\n rawDep.update()\n }\n }\n\n // Если родитель имеет отложенное батч-значение (hasBatchValue)\n // или его версия изменилась — кэш невалиден!\n if (dep.hasBatchValue || depVersions.get(dep) !== rawDep.version) {\n hasChangedParent = true\n break\n }\n }\n }\n\n node.verifiedInEpoch = engine.epoch\n\n if (hasChangedParent || isDirty) {\n return node.run()\n }\n\n state = 0\n return false\n }\n\n let currentRunId = 0\n\n const computedNode: any = {\n id: engine.subscriberId++,\n dependencies,\n subscribers,\n ownedEffects,\n depth: 1,\n type: 'computed',\n fn,\n get version() { return version },\n get state() { return state },\n set state(val: number) { state = val },\n get depVersions() { return depVersions },\n verifiedInEpoch: -1, // Перенесено напрямую на объект ноды для ультимативного O(1)\n update: () => updateIfNecessary(computedNode),\n run: () => {\n // Стандартный быстрый выход для стабильных эпох\n if (evaluatedInEpoch === engine.epoch && isInitialized && state === 0 && engine.batchDepth === 0) {\n return false\n }\n\n // Запоминаем стартовую эпоху до вызова функции пользователя\n const startEpoch = engine.epoch\n evaluatedInEpoch = startEpoch\n computedNode.verifiedInEpoch = startEpoch\n\n if (engine.cycleDetectionStack.has(computedNode)) {\n throw new Error('[Graph Error] Cyclic dependency detected')\n }\n engine.cycleDetectionStack.add(computedNode)\n\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n\n engine.activeConsumer = computedNode\n engine.activeOwner = computedNode\n\n currentRunId++\n computedNode.activeRunId = currentRunId\n\n const oldDeps = dependencies.size > 0 ? Array.from(dependencies) : null\n dependencies.clear()\n\n try {\n if (ownedEffects.size > 0) {\n for (const child of ownedEffects) {\n if (child && typeof child.dispose === 'function') {\n child.dispose()\n }\n }\n ownedEffects.clear()\n }\n\n // Выполняем пользовательскую функцию (здесь могут произойти inner writes из тестов #179, #180, #186)\n const newValue = fn()\n\n if (oldDeps !== null) {\n const isSizeIdentical = oldDeps.length === dependencies.size\n for (const unknownDep of oldDeps) {\n const dep = unknownDep as any\n if (!isSizeIdentical || !dependencies.has(dep)) {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(computedNode)\n depVersions.delete(dep)\n }\n }\n }\n\n const changed = isDirty || !Object.is(value, newValue)\n\n if (changed) {\n const previousValueSnapshot = isDirty ? undefined : (typeof value === 'object' && value !== null ? JSON.parse(JSON.stringify(value)) : value)\n value = newValue\n version++\n\n if (engine.log && signalName) {\n engine.log({\n type: 'computed',\n label: signalName,\n details: { from: previousValueSnapshot, to: newValue }\n })\n }\n }\n\n isDirty = false\n state = 0\n isInitialized = true\n\n let maxDepDepth = 0\n for (const unknownDep of dependencies) {\n const dep = unknownDep as any\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version)\n if (rawNode.subscribers) rawNode.subscribers.add(computedNode)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) {\n maxDepDepth = rawNode.depth\n }\n }\n\n computedNode.depth = maxDepDepth + 1\n\n // ⚡ ФИКС ДЛЯ INNER WRITES (#179, #180, #186):\n // Если во время исполнения fn() эпоха ядра сдвинулась (был вложенный сеттер),\n // мы обязаны сбросить кэш верификации этой эпохи, чтобы последующие цепочки\n // зависимостей внутри этого же тика пересчитали свои значения нативно.\n if (engine.epoch !== startEpoch) {\n evaluatedInEpoch = -1\n computedNode.verifiedInEpoch = -1\n state = 2 // Переводим в DIRTY для немедленной инвалидации\n }\n\n return changed\n } finally {\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n engine.cycleDetectionStack.delete(computedNode)\n }\n },\n markDirty: (parentState: number) => {\n if (state >= parentState) return\n state = parentState\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(1)\n }\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value() {\n // 🛡️ АТОМАРНАЯ ЗАЩИТА: Фиксируем ссылку локально и работаем строго с ней.\n // Это полностью предотвращает TypeError: ... reading 'add' на проде Next.js.\n const consumer = engine.activeConsumer\n if (consumer && consumer !== computedNode) {\n // Проверяем наличие метода add у консьюмера, страхуя граф от стороннего мусора Webpack\n if (typeof consumer.dependencies?.add === 'function') {\n subscribers.add(consumer)\n consumer.dependencies.add(computedNode)\n\n const currentDepth = computedNode.depth || 1\n const consumerRaw = consumer._node || consumer\n if (consumerRaw.depth !== undefined && currentDepth >= consumerRaw.depth) {\n consumerRaw.depth = currentDepth + 1\n }\n\n if (consumer.activeRunId !== undefined) {\n computedNode._lastSeenInRunId = consumer.activeRunId\n }\n }\n }\n\n updateIfNecessary(computedNode)\n\n if (consumer && consumer.depVersions) {\n consumer.depVersions.set(computedInstance, version)\n }\n return value\n },\n get valueWithoutTracking() { return value },\n get version() { return version },\n get dependencies() { return dependencies },\n\n subscribe(cb: (val: T) => void): CleanupFn {\n const self = this\n const fakeEffect: any = {\n id: engine.subscriberId++,\n isDirty: true,\n depth: 9999,\n dependencies: new Set(),\n type: 'effect',\n run: () => {\n if (fakeEffect.isDisposed) return\n try { cb(self.value) } catch (err) { console.error(err) }\n }\n }\n subscribers.add(fakeEffect)\n cb(this.value)\n return () => {\n fakeEffect.isDisposed = true\n subscribers.delete(fakeEffect)\n fakeEffect.dependencies.clear()\n }\n },\n subscribeState(cb: () => void): CleanupFn {\n return (computedInstance as any).subscribe(cb)\n },\n destroy: () => {\n releaseNode(computedNode)\n if (subscribers) subscribers.clear()\n engine.computedCache.delete(fn)\n\n dependencies.clear()\n depVersions.clear()\n ownedEffects.clear()\n\n isDirty = true\n state = 2\n isInitialized = false\n },\n __subscribe(cb: () => void): CleanupFn {\n const hookEffect: any = {\n id: engine.subscriberId++,\n type: 'effect',\n run: cb,\n isDirty: false\n }\n subscribers.add(hookEffect)\n return () => {\n subscribers.delete(hookEffect)\n }\n }\n } as any\n\n computedInstance.run = () => computedNode.run()\n engine.computedCache.set(fn, computedInstance)\n\n ;(computedInstance as any)._node = computedNode\n ;(computedInstance as any).subscribers = subscribers\n\n return computedInstance\n}\n"],"mappings":"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"}
@@ -1,120 +0,0 @@
1
- //#region src/core/core.method.effect.ts
2
- function e(e, t, n) {
3
- let r = !1, i = !1, a = !1, o = 2, s = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Map(), d = () => {
4
- if (a) return;
5
- a = !0;
6
- let t = e.activeCleanupNode;
7
- e.activeCleanupNode = f;
8
- try {
9
- if (l.size > 0) {
10
- let t = e.activeConsumer, n = e.activeOwner;
11
- e.activeConsumer = null, e.activeOwner = null;
12
- for (let e of l) e.dispose && e.dispose();
13
- l.clear(), e.activeConsumer = t, e.activeOwner = n;
14
- }
15
- if (f.cleanups.size > 0) {
16
- let t = e.activeConsumer, n = e.activeOwner;
17
- e.activeConsumer = null, e.activeOwner = null;
18
- let r = null, i = Array.from(f.cleanups);
19
- f.cleanups.clear();
20
- for (let e of i) try {
21
- e();
22
- } catch (e) {
23
- r ||= e;
24
- }
25
- if (e.activeConsumer = t, e.activeOwner = n, r) throw r;
26
- }
27
- } finally {
28
- e.activeCleanupNode = t, a = !1;
29
- }
30
- }, f = {
31
- id: e.subscriberId++,
32
- dependencies: s,
33
- ownedEffects: l,
34
- cleanups: /* @__PURE__ */ new Set(),
35
- type: "effect",
36
- depth: 0,
37
- label: n,
38
- _snapshotValues: u,
39
- get isDirty() {
40
- return o > 0;
41
- },
42
- set isDirty(e) {
43
- e && (o = 2);
44
- },
45
- get isDisposed() {
46
- return r;
47
- },
48
- set isDisposed(e) {
49
- r = e;
50
- },
51
- get state() {
52
- return o;
53
- },
54
- set state(e) {
55
- o = e;
56
- },
57
- get depVersions() {
58
- return c;
59
- },
60
- get _node() {
61
- return f;
62
- },
63
- markDirty: () => {
64
- r || o >= 1 || (o = 1, e.scheduleEffect(f));
65
- },
66
- run: () => {
67
- if (r || i) return;
68
- i = !0;
69
- try {
70
- d();
71
- } catch (e) {
72
- throw i = !1, e;
73
- }
74
- if (r) {
75
- i = !1;
76
- return;
77
- }
78
- let n = e.activeConsumer, a = e.activeOwner;
79
- e.activeConsumer = f, e.activeOwner = f;
80
- let l = s.size > 0 ? Array.from(s) : null;
81
- s.clear();
82
- try {
83
- o = 0;
84
- let e = t();
85
- if (typeof e == "function" && f.cleanups.add(e), l !== null) for (let e of l) {
86
- let t = e;
87
- if (!s.has(t)) {
88
- let e = t._node || t;
89
- e.subscribers && e.subscribers.delete(f), c.delete(t), u.delete(t);
90
- }
91
- }
92
- let n = 0;
93
- for (let e of s) {
94
- let t = e, r = t._node || t;
95
- c.set(t, r.version), r.subscribers && r.subscribers.add(f), r.depth !== void 0 && r.depth > n && (n = r.depth);
96
- }
97
- f.depth = n + 1;
98
- } finally {
99
- i = !1, e.activeConsumer = n, e.activeOwner = a;
100
- }
101
- },
102
- dispose: () => {
103
- if (!r) {
104
- r = !0, f.isDisposed = !0, d();
105
- for (let e of s) {
106
- let t = e._node || e;
107
- t.subscribers && t.subscribers.delete(f);
108
- }
109
- s.clear(), c.clear(), u.clear();
110
- }
111
- }
112
- }, p = e.activeOwner ? e.activeOwner._node || e.activeOwner : null;
113
- return p && p.ownedEffects && p.ownedEffects.add(f), f.run(), () => {
114
- f.dispose();
115
- };
116
- }
117
- //#endregion
118
- export { e as createEffect };
119
-
120
- //# sourceMappingURL=core.method.effect.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.method.effect.mjs","names":[],"sources":["../src/core/core.method.effect.ts"],"sourcesContent":["import { IEffect, EffectFn, CleanupFn } from './types'\n\ninterface ICoreEffectNode extends IEffect {\n dependencies: Set<any>;\n depVersions: Map<any, number>;\n ownedEffects: Set<ICoreEffectNode>;\n type: string;\n depth: number;\n state: number;\n _node: any;\n dispose: () => void;\n _snapshotValues: Map<any, any>;\n}\n\nexport function createEffect(engine: any, fn: EffectFn, effectName?: string): () => void {\n let isDisposed = false\n let isRunning = false\n let isCleaning = false\n let state = 2 // 0 = STABLE, 1 = CHECK, 2 = DIRTY (Гарантированное объявление переменной)\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n const ownedEffects = new Set<ICoreEffectNode>()\n const snapshotValues = new Map<any, any>()\n\n const runCleanupPhase = () => {\n if (isCleaning) return\n isCleaning = true\n\n // Активируем контекст чтения исторических снапшотов сигналов\n const prevCleanupNode = engine.activeCleanupNode\n engine.activeCleanupNode = effectNode\n\n try {\n // 1. Каскадное уничтожение вложенных дочерних эффектов\n if (ownedEffects.size > 0) {\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n engine.activeConsumer = null\n engine.activeOwner = null\n\n for (const child of ownedEffects) {\n if (child.dispose) child.dispose()\n }\n ownedEffects.clear()\n\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n }\n\n // 2. Вызов деструкторов пользователя в режиме полной изоляции контекстов tracking/ownership\n if (effectNode.cleanups.size > 0) {\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner // ⚡ ФИКС TDD #222: Запоминаем текущего владельца\n\n engine.activeConsumer = null\n engine.activeOwner = null // ⚡ ФИКС TDD #222: Изолируем контекст создания для новых эффектов в cleanup\n\n let firstError: unknown = null\n const cleanupsArray = Array.from(effectNode.cleanups)\n effectNode.cleanups.clear()\n\n for (const cleanup of cleanupsArray) {\n try {\n cleanup()\n } catch (err) {\n // Ошибки не логируем в console.error по спецификации Suite #17, чтобы не засорять stderr\n if (!firstError) {\n firstError = err\n }\n }\n }\n\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner // Восстанавливаем контекст владельца\n\n if (firstError) {\n throw firstError\n }\n }\n } finally {\n engine.activeCleanupNode = prevCleanupNode\n isCleaning = false\n }\n }\n\n const effectNode: ICoreEffectNode = {\n id: engine.subscriberId++,\n dependencies,\n ownedEffects,\n cleanups: new Set<CleanupFn>(),\n type: 'effect',\n depth: 0,\n label: effectName,\n _snapshotValues: snapshotValues,\n\n get isDirty(): boolean { return state > 0 },\n set isDirty(val: boolean) { if (val) state = 2 },\n\n get isDisposed(): boolean { return isDisposed },\n set isDisposed(val: boolean) { isDisposed = val },\n\n get state(): number { return state },\n set state(val: number) { state = val },\n get depVersions(): Map<any, number> { return depVersions },\n get _node(): any { return effectNode },\n\n markDirty: () => {\n if (isDisposed || state >= 1) return\n state = 1\n engine.scheduleEffect(effectNode)\n },\n\n run: () => {\n if (isDisposed || isRunning) return\n isRunning = true\n\n try {\n runCleanupPhase()\n } catch (err) {\n isRunning = false\n throw err\n }\n\n if (isDisposed) {\n isRunning = false\n return\n }\n\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n\n engine.activeConsumer = effectNode\n engine.activeOwner = effectNode\n\n const oldDeps = dependencies.size > 0 ? Array.from(dependencies) : null\n dependencies.clear()\n\n try {\n state = 0 // Локальная переменная замыкания теперь успешно сбрасывается в STABLE\n\n const result = fn()\n if (typeof result === 'function') {\n effectNode.cleanups.add(result)\n }\n\n if (oldDeps !== null) {\n for (const unknownDep of oldDeps) {\n const dep = unknownDep as any\n if (!dependencies.has(dep)) {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(effectNode)\n depVersions.delete(dep)\n snapshotValues.delete(dep)\n }\n }\n }\n\n let maxDepDepth = 0\n for (const unknownDep of dependencies) {\n const dep = unknownDep as any\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version)\n if (rawNode.subscribers) rawNode.subscribers.add(effectNode)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) {\n maxDepDepth = rawNode.depth\n }\n }\n effectNode.depth = maxDepDepth + 1\n\n } finally {\n isRunning = false\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n }\n },\n\n dispose: () => {\n if (isDisposed) return\n isDisposed = true\n effectNode.isDisposed = true\n\n runCleanupPhase()\n\n for (const dep of dependencies) {\n const rawNode = dep._node || dep\n if (rawNode.subscribers) rawNode.subscribers.delete(effectNode)\n }\n dependencies.clear()\n depVersions.clear()\n snapshotValues.clear()\n }\n }\n\n const actualOwnerNode = engine.activeOwner ? (engine.activeOwner._node || engine.activeOwner) : null\n\n if (actualOwnerNode && actualOwnerNode.ownedEffects) {\n actualOwnerNode.ownedEffects.add(effectNode)\n }\n\n effectNode.run()\n\n return () => {\n effectNode.dispose()\n }\n}\n"],"mappings":"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"}
@@ -1,106 +0,0 @@
1
- import { getExtractedValues as e } from "./utils/getExtractedValues.mjs";
2
- //#region src/core/core.method.signal.ts
3
- function t(t, n, r) {
4
- let i = n, a = 0, o = typeof r == "string" ? r : r?.name, s = !!o && e({
5
- tested: [o],
6
- expectedKey: "CORE_INTERNAL_SIGNAL",
7
- valueType: "number"
8
- })?.[0] === "1" || !1, c = /* @__PURE__ */ new Set(), l = !1, u = n, d = {
9
- type: "signal",
10
- get version() {
11
- return a;
12
- },
13
- subscribers: c
14
- }, f = () => {
15
- for (let e of c) {
16
- let n = e._node || e;
17
- if (n.type === "effect") n.isDirty = !0, t.scheduleEffect(e);
18
- else if (n.type === "computed") n.markDirty && n.markDirty(2);
19
- else if (typeof e == "function") try {
20
- e(i);
21
- } catch (e) {
22
- console.error(e);
23
- }
24
- else if (e && typeof e.run == "function") try {
25
- e.run();
26
- } catch (e) {
27
- console.error(e);
28
- }
29
- }
30
- }, p = {
31
- get value() {
32
- let e = t.activeConsumer, n = t.activeCleanupNode;
33
- return n && e === null && n._snapshotValues && n._snapshotValues.has(p) ? n._snapshotValues.get(p) : (e && e.dependencies && typeof e.dependencies.add == "function" && (c.add(e), e.dependencies.add(p), e._snapshotValues && e._snapshotValues.set(p, i), e.activeRunId !== void 0 && (p._lastSeenInRunId = e.activeRunId)), i);
34
- },
35
- set value(e) {
36
- if (Object.is(i, e) && !(i === e && typeof i == "object" && i)) return;
37
- if (r && typeof r == "object" && r.validate) {
38
- let t = r.validate(e);
39
- if (t !== !0) {
40
- console.error(typeof t == "string" ? t : "[Validation Error]");
41
- return;
42
- }
43
- }
44
- if (t.batchDepth > 0) {
45
- l || (l = !0, u = i), i = e, t.batchedSignals.add(p);
46
- return;
47
- }
48
- let n = i;
49
- i = e, a++, t.epoch++, t.log({
50
- type: "signal",
51
- label: o || "signal",
52
- details: {
53
- from: n,
54
- to: e
55
- },
56
- isInternalCoreSignal: s
57
- }), f(), t.batchDepth === 0 && t.flushEffects();
58
- },
59
- get version() {
60
- return a;
61
- },
62
- type: "signal",
63
- subscribe(e) {
64
- return c.add(e), e(i), () => {
65
- c.delete(e);
66
- };
67
- },
68
- _flushBatch: () => {
69
- if (l) {
70
- if (!Object.is(u, i) || typeof i == "object" && i) {
71
- a++, t.epoch++, t.log({
72
- type: "signal",
73
- label: o || "signal_batched",
74
- details: {
75
- from: u,
76
- to: i
77
- },
78
- isInternalCoreSignal: s
79
- });
80
- for (let e of c) {
81
- let n = e._node || e;
82
- if (n.type === "effect") n.isDirty = !0, t.scheduleEffect(e);
83
- else if (n.markDirty) n.markDirty(2);
84
- else if (typeof e == "function") try {
85
- e(i);
86
- } catch (e) {
87
- console.error(e);
88
- }
89
- }
90
- }
91
- l = !1, u = i;
92
- }
93
- },
94
- get hasBatchValue() {
95
- return l;
96
- },
97
- destroy: () => {
98
- c && c.clear(), t.batchedSignals && t.batchedSignals.delete(p), l = !1, i = void 0, u = void 0;
99
- }
100
- };
101
- return p._node = d, p.subscribers = c, p;
102
- }
103
- //#endregion
104
- export { t as createSignal };
105
-
106
- //# sourceMappingURL=core.method.signal.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.method.signal.mjs","names":[],"sources":["../src/core/core.method.signal.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, SignalOptions } from './types'\n\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: SignalOptions<T> | string\n): Signal<T> {\n let value = initialValue\n let version = 0\n let name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name\n const isInternalCoreSignal = !!name && getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.[0] === '1' || false\n const subscribers = new Set<any>()\n\n let hasBatchValue = false\n let batchInitialValue: T = initialValue\n\n const signalNode = {\n type: 'signal',\n get version() { return version },\n subscribers\n }\n\n const notifySubscribers = () => {\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.type === 'computed') {\n if (rawSub.markDirty) rawSub.markDirty(2)\n } else {\n if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n } else if (sub && typeof sub.run === 'function') {\n try { sub.run() } catch (err) { console.error(err) }\n }\n }\n }\n }\n\n const signalInstance: Signal<T> = {\n get value() {\n const consumer = engine.activeConsumer\n const cleanupNode = engine.activeCleanupNode\n\n // ⚡ УЛЬТИМАТИВНЫЙ ФИКС TDD #229:\n // Мы отдаем старый снимок (снапшот) исключительно тогда, когда чтение сигнала\n // происходит НАПРЯМУЮ в теле деструктора (cleanupNode активен И сбор зависимостей\n // заморожен в untracked, то есть consumer === null).\n // Если же consumer !== null (например, идет pull-вычисление computed внутри очистки),\n // мы ОБЯЗАНЫ вернуть новое актуальное значение!\n if (cleanupNode && consumer === null && cleanupNode._snapshotValues) {\n if (cleanupNode._snapshotValues.has(signalInstance)) {\n return cleanupNode._snapshotValues.get(signalInstance)\n }\n }\n\n if (consumer) {\n if (consumer.dependencies && typeof consumer.dependencies.add === 'function') {\n subscribers.add(consumer)\n consumer.dependencies.add(signalInstance)\n\n // Сохраняем слепок текущего значения для будущей очистки этого консьюмера\n if (consumer._snapshotValues) {\n consumer._snapshotValues.set(signalInstance, value)\n }\n\n if (consumer.activeRunId !== undefined) {\n (signalInstance as any)._lastSeenInRunId = consumer.activeRunId\n }\n }\n }\n return value\n },\n set value(newValue: T) {\n const isObjectKick = value === newValue && value !== null && typeof value === 'object'\n if (Object.is(value, newValue) && !isObjectKick) return\n\n if (optionsOrName && typeof optionsOrName === 'object' && optionsOrName.validate) {\n const validation = optionsOrName.validate(newValue)\n if (validation !== true) {\n console.error(typeof validation === 'string' ? validation : '[Validation Error]')\n return\n }\n }\n\n if (engine.batchDepth > 0) {\n if (!hasBatchValue) {\n hasBatchValue = true\n batchInitialValue = value\n }\n value = newValue\n engine.batchedSignals.add(signalInstance)\n return\n }\n\n const oldValue = value\n value = newValue\n\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n notifySubscribers()\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n\n get version() { return version },\n type: 'signal',\n\n subscribe(cb: (val: T) => void) {\n subscribers.add(cb)\n cb(value)\n return () => { subscribers.delete(cb) }\n },\n\n _flushBatch: () => {\n if (!hasBatchValue) return\n\n const wasChanged = !Object.is(batchInitialValue, value) || (value !== null && typeof value === 'object')\n\n if (wasChanged) {\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal_batched',\n details: { from: batchInitialValue, to: value },\n isInternalCoreSignal\n })\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(2)\n } else if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n }\n }\n }\n\n hasBatchValue = false\n batchInitialValue = value\n },\n\n get hasBatchValue() { return hasBatchValue },\n\n destroy: () => {\n if (subscribers) {\n subscribers.clear()\n }\n if (engine.batchedSignals) {\n engine.batchedSignals.delete(signalInstance)\n }\n hasBatchValue = false\n value = undefined as any\n batchInitialValue = undefined as any\n }\n } as any\n\n ;(signalInstance as any)._node = signalNode\n ;(signalInstance as any).subscribers = subscribers\n return signalInstance\n}\n"],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- //#region src/core/core.method.untrack.ts
2
- function e(e, t) {
3
- let n = e.activeConsumer;
4
- e.activeConsumer = null;
5
- try {
6
- return t();
7
- } finally {
8
- e.activeConsumer = n;
9
- }
10
- }
11
- //#endregion
12
- export { e as executeUntrack };
13
-
14
- //# sourceMappingURL=core.method.untrack.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.method.untrack.mjs","names":[],"sources":["../src/core/core.method.untrack.ts"],"sourcesContent":["/**\n * Изолированный менеджер контекста untrack реактивного графа.\n * Временно замораживает автоматический сбор зависимостей, подменяя activeConsumer на null.\n */\nexport function executeUntrack<T>(engine: any, fn: () => T): T {\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = null\n try {\n return fn()\n } finally {\n engine.activeConsumer = prevConsumer\n }\n}\n"],"mappings":";AAIA,SAAgB,EAAkB,GAAa,GAAgB;CAC7D,IAAM,IAAe,EAAO;CAC5B,EAAO,iBAAiB;CACxB,IAAI;EACF,OAAO,EAAG;CACZ,UAAU;EACR,EAAO,iBAAiB;CAC1B;AACF"}
@@ -1,24 +0,0 @@
1
- //#region src/utils/getExtractedValues.ts
2
- var e = ({ tested: e, expectedKey: t, valueType: n }) => {
3
- let r = [];
4
- if (!e || !Array.isArray(e)) return r;
5
- for (let i = 0, a = e.length; i < a; i++) {
6
- let a = e[i];
7
- if (typeof a != "string") continue;
8
- let o;
9
- switch (n) {
10
- case "number":
11
- o = RegExp(`\\[${t}=(?<value>\\d+)\\]`, "g");
12
- break;
13
- default:
14
- o = RegExp(`\\[${t}=(?<value>.*?)\\]`, "g");
15
- break;
16
- }
17
- for (let e of a.matchAll(o)) e?.groups && r.push(e.groups.value);
18
- }
19
- return r;
20
- };
21
- //#endregion
22
- export { e as getExtractedValues };
23
-
24
- //# sourceMappingURL=getExtractedValues.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getExtractedValues.mjs","names":[],"sources":["../../src/utils/getExtractedValues.ts"],"sourcesContent":["export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = []\n if (!tested || !Array.isArray(tested)) return results // Предохранитель от пустых массивов\n\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i]\n if (typeof t !== 'string') continue // ЗАЩИТА: Пропускаем всё, что не является валидной строкой\n\n let regex\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g')\n break\n case 'string':\n default:\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g')\n break\n }\n\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value) }\n }\n }\n return results\n}\n"],"mappings":";AAAA,IAAa,KAAsB,EACjC,WAAQ,gBAAa,mBAKP;CACd,IAAM,IAAoB,CAAC;CAC3B,IAAI,CAAC,KAAU,CAAC,MAAM,QAAQ,CAAM,GAAG,OAAO;CAE9C,KAAK,IAAI,IAAI,GAAG,IAAM,EAAO,QAAQ,IAAI,GAAK,KAAK;EACjD,IAAM,IAAI,EAAO;EACjB,IAAI,OAAO,KAAM,UAAU;EAE3B,IAAI;EACJ,QAAQ,GAAR;GACA,KAAK;IACH,IAAY,OAAO,MAAM,EAAY,qBAAqB,GAAG;IAC7D;GAEF;IACE,IAAY,OAAO,MAAM,EAAY,oBAAoB,GAAG;IAC5D;EACF;EAEA,KAAK,IAAM,KAAK,EAAE,SAAS,CAAK,GAC9B,AAAI,GAAG,UAAU,EAAQ,KAAK,EAAE,OAAO,KAAK;CAEhD;CACA,OAAO;AACT"}