@pravosleva/reactive-engine 2.7.1 → 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.
- package/dist/core/core.d.ts +89 -203
- package/dist/core/core.d.ts.map +1 -1
- package/dist/core/core.global.d.ts +64 -8
- package/dist/core/core.global.d.ts.map +1 -1
- package/dist/core/core.logger.d.ts +2 -0
- package/dist/core/core.logger.d.ts.map +1 -1
- package/dist/core/core.method.reactive.d.ts +2 -4
- package/dist/core/core.method.reactive.d.ts.map +1 -1
- package/dist/core/core.method.resource.d.ts +3 -11
- package/dist/core/core.method.resource.d.ts.map +1 -1
- package/dist/core/types.d.ts +1 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core.global.mjs +31 -4
- package/dist/core.global.mjs.map +1 -1
- package/dist/core.logger.mjs +49 -2
- package/dist/core.logger.mjs.map +1 -1
- package/dist/core.method.reactive.mjs +73 -30
- package/dist/core.method.reactive.mjs.map +1 -1
- package/dist/core.method.resource.mjs +122 -138
- package/dist/core.method.resource.mjs.map +1 -1
- package/dist/core.mjs +379 -150
- package/dist/core.mjs.map +1 -1
- package/dist/index.mjs +12 -12
- package/dist/index2.mjs +5 -5
- package/dist/react/hooks/useReactiveSubscription.mjs +13 -13
- package/dist/react/hooks/useReactiveSubscription.mjs.map +1 -1
- package/dist/react/hooks/useReactiveValue.d.ts +0 -4
- package/dist/react/hooks/useReactiveValue.d.ts.map +1 -1
- package/dist/react/hooks/useReactiveValue.mjs +24 -9
- package/dist/react/hooks/useReactiveValue.mjs.map +1 -1
- package/dist/reactive-engine.umd.js +2 -2
- package/dist/reactive-engine.umd.js.map +1 -1
- package/package.json +4 -2
- package/dist/core.method.computed.mjs +0 -167
- package/dist/core.method.computed.mjs.map +0 -1
- package/dist/core.method.effect.mjs +0 -120
- package/dist/core.method.effect.mjs.map +0 -1
- package/dist/core.method.signal.mjs +0 -106
- package/dist/core.method.signal.mjs.map +0 -1
- package/dist/core.method.untrack.mjs +0 -14
- package/dist/core.method.untrack.mjs.map +0 -1
- package/dist/utils/getExtractedValues.mjs +0 -24
- package/dist/utils/getExtractedValues.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.method.computed.ts","../src/utils/getExtractedValues.ts","../src/core/core.method.signal.ts","../src/core/core.method.untrack.ts","../src/core/core.method.reactive.ts","../src/core/core.method.effect.ts","../src/core/core.logger.ts","../src/core/core.method.resource.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/core.global.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { 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","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","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","/**\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","/**\n * * Изолированная фабрика глубоких реактивных Proxy-объектов графа.\n */\nexport function createReactive<T extends object>(\n engine: any,\n target: T,\n name?: string\n): T {\n if (engine.proxyTargets.has(target)) return target as any\n if (engine.proxyCache.has(target)) return engine.proxyCache.get(target) as any\n if (!engine.reactiveSignals.has(target)) engine.reactiveSignals.set(target, new Map())\n const signalsMap = engine.reactiveSignals.get(target)!\n\n const handler: ProxyHandler<T> = {\n get(t: T, prop: string | symbol, receiver: any) {\n if (prop === '__subscribe' && Array.isArray(t)) {\n return (cb: () => void) => {\n let lengthSig = signalsMap.get('length')\n if (!lengthSig) {\n lengthSig = engine.signal(t.length)\n signalsMap.set('length', lengthSig)\n }\n return lengthSig.subscribe(cb)\n }\n }\n\n if (Array.isArray(t) && typeof prop === 'string' && ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].includes(prop)) {\n return (...args: any[]) => {\n let result: any\n engine.batch(() => {\n result = (Reflect.get(t, prop) as Function).apply(receiver, args)\n\n let lengthSig = signalsMap.get('length')\n if (lengthSig) lengthSig.value = t.length\n\n signalsMap.forEach((sig: any, key: string) => {\n if (key !== 'length') sig.value = Reflect.get(t, key)\n })\n })\n return result\n }\n }\n\n if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'toJSON') return Reflect.get(t, prop, receiver)\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n const rawValue = Reflect.get(t, prop)\n sig = engine.signal(rawValue)\n signalsMap.set(prop, sig)\n\n // ⚡ ЛЕНИВОЕ КЭШИРОВАНИЕ НА ЧТЕНИИ (O(1) Hot Path):\n // Создаем прокси-обертку строго один раз при первом РЕАЛЬНОМ обращении к свойству,\n // а не принудительно при записи.\n if (rawValue !== null && typeof rawValue === 'object') {\n (sig as any)._proxyCache = engine.reactive(rawValue, name ? `${name}.${String(prop)}` : String(prop))\n }\n }\n\n if ((sig as any)._proxyCache !== undefined) {\n sig.value // Честная регистрация ребра для сохранения топологии глубины веток\n return (sig as any)._proxyCache\n }\n\n return sig.value\n },\n\n set(t: T, prop: string | symbol, value: any, receiver: any) {\n const rawValue = engine.proxyTargets.has(value) ? value : value\n const oldValue = Reflect.get(t, prop)\n\n if (oldValue === rawValue && prop !== 'length') return true\n Reflect.set(t, prop, rawValue)\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n sig = engine.signal(oldValue)\n signalsMap.set(prop, sig)\n }\n\n // ⚡ МЕГА-УСКOРЕНИЕ ДЛЯ СЕТТЕРOВ:\n // При записи мы просто СБРАСЫВАЕМ кэш прокси на узле в undefined.\n // Если бенчмарк захочет прочитать это свойство на следующей итерации,\n // ловушка геттера лениво создаст прокси. Если нет — мы сэкономили 100% ресурсов!\n (sig as any)._proxyCache = undefined\n sig.value = rawValue\n\n if (Array.isArray(t) && prop !== 'length') {\n let lengthSig = signalsMap.get('length')\n if (lengthSig) lengthSig.value = t.length\n }\n return true\n }\n }\n\n const proxy = new Proxy(target, handler)\n engine.proxyCache.set(target, proxy)\n engine.proxyTargets.add(proxy)\n return proxy\n}\n","import { 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","// core.logger.ts\nimport { LogEventType } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n // Фильтруем историю\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n // ⚛️ ФИКС УТЕЧКИ ПАМЯТИ: Если узел стабилен и старых логов нет,\n // удаляем ключ из Map целиком, чтобы не копить мусор\n if (activeHistory.length <= 1) {\n this.churnTracker.delete(label)\n return { marker: '🟢', info: `[STABLE] (1 изм./${intervalSec}s)` }\n } else {\n this.churnTracker.set(label, activeHistory)\n }\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return {\n marker: '🔴',\n info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!`\n }\n }\n\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return {\n marker: '🟡',\n info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n return {\n marker: '🟢',\n info: `[STABLE] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n\n // ⚛️ ФИКС #1: Включаем валидацию RegExp фильтра из настроек\n if (engineLogger.filter) {\n const isMatch = engineLogger.filter instanceof RegExp\n ? engineLogger.filter.test(label)\n : label.includes(engineLogger.filter)\n if (!isMatch) return\n }\n\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n // ⚛️ ФИКС #2: Разрешаем логам типов 'resource' выводить IDLE транзакции,\n // иначе глубокое равенство объектов состояния блокирует их вывод\n if ((type === 'computed' || type === 'resource') && engineLogger.isCoreOptimizationDebugEnabled) {\n queueLogFn(type, `🔵 [IDLE] ${label}`, details)\n return\n }\n return\n }\n }\n\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { EngineLoggerOptions, Resource, ResourceOptions, ResourceState, Signal } from './types'\n\n// Контракт ядра движка для безопасных вызовов методов с дженериками\ninterface IReactiveEngine {\n signal<V>(initialValue: V, optionsOrName?: any): Signal<V>;\n effect(fn: () => any, name?: string): () => void;\n untrack<V>(fn: () => V): V;\n log(params: any): void;\n delay(ms: number, signal: AbortSignal): Promise<void>;\n logger: EngineLoggerOptions\n}\n\nexport function createResource<T, S = void>(\n engine: IReactiveEngine,\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\n ? ((optionsOrName as ResourceOptions<T, S>).name || 'unnamed_resource')\n : (optionsOrName as string) || 'unnamed_resource'\n\n const options: Partial<ResourceOptions<T, S>> = isOptionsObject\n ? (optionsOrName as ResourceOptions<T, S>)\n : {}\n\n const resetDataOnSourceChange = options.resetDataOnSourceChange ?? true\n const responseValidate = options.responseValidate\n const validateBeforeFetch = options.validateBeforeFetch\n const baseDelay = 1000\n const useExponential = true\n const maxRetryDelay = 1000 * 60 * 5\n\n const retryCount = options.retryCount ?? 0\n const timeoutMs = options.timeout ?? 5000\n // Запоминаем точное время старта ВСЕЙ цепочки (включая ретраи и паузы)\n let startTime = Date.now()\n\n const state = engine.signal<ResourceState<T>>(\n {\n data: null,\n loading: true,\n error: null,\n isRetrying: false,\n attemptIndex: 0,\n retryCount,\n totalElapsedMs: undefined // Сбрасываем старый таймер\n },\n `[CORE_INTERNAL_SIGNAL=1]:resource:state:${resourceSignalName}`\n )\n\n const updateResourceState = (nextState: ResourceState<T>) => {\n engine.log({\n type: 'resource',\n label: resourceSignalName,\n details: { to: nextState, from: state.value },\n })\n state.value = nextState\n }\n\n const load = async (sValue: S, effectSignal: AbortSignal, isSourceChange = false) => {\n if (effectSignal.aborted) return\n\n // Фиксируем время старта бизнес-процесса в самом начале метода load\n startTime = Date.now()\n\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'\n ? preValidationResult\n : 'Pre-fetch validation failed for resource'\n\n const currentData = isSourceChange ? null : engine.untrack(() => state.value.data)\n // Явно зачищаем следы старого таймера при ошибке валидации аргументов\n updateResourceState({\n data: currentData,\n loading: false,\n error: errorMsg,\n isRetrying: false,\n attemptIndex: 0,\n retryCount,\n totalElapsedMs: undefined\n })\n return\n }\n }\n\n const shouldClear = isSourceChange && resetDataOnSourceChange\n const currentData = shouldClear ? null : engine.untrack(() => state.value.data)\n\n // Принудительно сбрасываем таймер в undefined перед входом в цикл ретраев\n updateResourceState({\n data: currentData,\n loading: true,\n error: null,\n isRetrying: false,\n attemptIndex: 0,\n retryCount,\n totalElapsedMs: undefined\n })\n\n // 🔄 Контур циклического выполнения попыток (от 0 до retryCount)\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n if (effectSignal.aborted) return\n\n // Создаем персональный сигнал таймаута на эту конкретную попытку\n const timeoutSignal = AbortSignal.timeout(timeoutMs)\n\n // Объединяем управляющий сигнал графа и наш таймаут\n const combinedSignal = AbortSignal.any([effectSignal, timeoutSignal])\n\n try {\n const data = await fetcher(sValue, combinedSignal)\n\n if (effectSignal.aborted) return\n\n // Если фетчер вернул управление, но таймаут успел отработать раньше\n if (timeoutSignal.aborted) {\n throw new DOMException('The operation timed out.', 'TimeoutError')\n }\n\n if (responseValidate) {\n const validationResult = responseValidate(data)\n if (validationResult === false || typeof validationResult === 'string') {\n if (effectSignal.aborted) return\n const errorMsg = typeof validationResult === 'string' ? validationResult : 'Validation failed'\n updateResourceState({\n data: null,\n loading: false,\n error: errorMsg,\n isRetrying: false,\n attemptIndex: 0,\n retryCount,\n totalElapsedMs: undefined\n })\n return\n }\n }\n\n if (effectSignal.aborted) return\n // Успех: сохраняем данные, полностью очищаем ошибки и сквозной таймер\n updateResourceState({\n data,\n loading: false,\n error: null,\n isRetrying: false,\n attemptIndex: 0,\n retryCount,\n totalElapsedMs: undefined\n })\n return\n\n } catch (e: unknown) {\n // 1. Выявляем, произошел ли сбой по таймауту\n const isTimeout = timeoutSignal.aborted ||\n (e as Error).name === 'TimeoutError' ||\n (e as Error).message?.includes('timeout')\n\n // Если это обычная отмена дебаунсом из внешнего контура, мгновенно прекращаем работу\n if (effectSignal.aborted && !isTimeout) return\n\n // 2. Безопасно извлекаем валидационные маркеры до их использования в условиях\n const isCustomValidationError = getExtractedValues({\n tested: [(e as Error).message], expectedKey: 'THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY', valueType: 'number',\n })?.[0] === '1' || false\n\n const __defaultCustomValidationErrorMessage = 'Custom validation error'\n const customValidationErrorMessage: string = isCustomValidationError\n ? (getExtractedValues({\n tested: [(e as Error).message], expectedKey: 'MESSAGE', valueType: 'string',\n })?.[0] || __defaultCustomValidationErrorMessage)\n : __defaultCustomValidationErrorMessage\n\n const isFetchBodyValidationError = isCustomValidationError || (e as Error).name === 'ValidationError'\n\n // Если попытки исчерпаны ИЛИ это валидационная ошибка тела, которая не подлежит повтору\n if (attempt === retryCount || isFetchBodyValidationError) {\n if (effectSignal.aborted) return\n\n // Считаем суммарное время от первого клика/сдвига карты до текущего момента\n const totalElapsedMs = Date.now() - startTime\n\n // Переменная customValidationErrorMessage теперь гарантированно определена выше!\n const baseErrorMsg = isTimeout\n ? `Request timed out after ${timeoutMs}ms (attempt ${attempt + 1}/${retryCount + 1})`\n : isCustomValidationError\n ? customValidationErrorMessage\n : e instanceof Error ? e.message : String(e)\n\n // Формируем детальное сообщение для вывода в UI\n const finalErrorMessage = `${baseErrorMsg}.${engine.logger.isCoreOptimizationDebugEnabled ? ` Всего безуспешных попыток с момента изменения исходного сигнала: ${retryCount + 1}.` : ''}`\n\n updateResourceState({\n data: null,\n loading: false,\n error: finalErrorMessage,\n isRetrying: false,\n attemptIndex: attempt + 1, // Выводим финальное число сделанных попыток\n retryCount,\n totalElapsedMs,\n })\n return\n } else {\n // Инициализируем планирование следующей попытки (Retry Backoff Phase)\n if (effectSignal.aborted) return\n\n let currentDelay = useExponential ? baseDelay * Math.pow(2, attempt) : baseDelay\n currentDelay = Math.min(currentDelay, maxRetryDelay) + Math.random() * 200\n\n updateResourceState({\n data: state.value.data,\n loading: true,\n error: null,\n isRetrying: true,\n attemptIndex: attempt + 1, // Индекс следующей накатываемой попытки для UI (1, 2, 3...)\n retryCount\n })\n\n engine.log({\n type: 'resource',\n label: `${resourceSignalName}:retry_scheduled`,\n details: { payload: { attempt: attempt + 1, total: retryCount, nextDelayMs: Math.round(currentDelay) } }\n })\n\n const logReason = isTimeout ? 'таймауту' : 'ошибке сети'\n // Исправлен счетчик: пишем честный индекс текущего упавшего запроса из общего пула\n if (engine.logger.isEnabled) console.warn(`[Resource Retry] \"${resourceSignalName}\" сбой по ${logReason}. Запрос ${attempt + 1} из ${retryCount + 1} не удался. Ожидание повтора: ${Math.round(currentDelay)}ms`)\n\n try {\n // Спим перед следующим циклом, уважая отмену внешнего графа\n await engine.delay(currentDelay, effectSignal)\n if (effectSignal.aborted) return\n } catch (delayError) {\n return\n }\n }\n }\n }\n }\n\n let activeEffectController: AbortController | null = null\n\n const disposeInternalEffect = engine.effect(() => {\n const sValue = source ? source.value : undefined as S\n const effectController = new AbortController()\n activeEffectController = effectController\n\n engine.untrack(() => {\n load(sValue as S, effectController.signal, true)\n })\n\n return () => effectController.abort()\n }, '[CORE_INTERNAL_SIGNAL=1]:effect')\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 activeEffectController?.abort()\n activeEffectController = new AbortController()\n load(source ? source.value : undefined as S, activeEffectController.signal, false)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb),\n destroy: () => {\n activeEffectController?.abort()\n activeEffectController = null\n if (typeof disposeInternalEffect === 'function') {\n disposeInternalEffect()\n }\n if ((state as any).destroy) {\n (state as any).destroy()\n }\n }\n } as any\n}\n","// 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 public 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 public activeCleanupNode: 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 // ⚡ ЗОЛОТОЙ СТАНДАРТ ОПТИМИЗАЦИИ (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 try {\n // Вызов метода .run() теперь прозрачно прокидывает наверх ошибки\n // как из пользовательского тела эффекта, так и из обновленной фазы cleanup\n effect.run()\n } catch (err) {\n // ⚡ ФИКС ТЕСТОВ ОШИБОК (#177 и #247): Если один из эффектов (или его очистка)\n // выбросил исключение, принудительно гасим флаги грязи (isDirty) у всех оставшихся\n // в очереди эффектов текущего и последующих уровней глубины.\n // Старые грязные задачи гарантированно изолируются и не протекают в новые микротаски.\n for (let d = depth; d <= this.maxPendingDepth; d++) {\n const remainingBucket = this.pendingEffects[d]\n if (remainingBucket) {\n for (const remEffect of remainingBucket) {\n remEffect.isDirty = false\n }\n remainingBucket.clear()\n }\n }\n this.maxPendingDepth = 0\n\n // Бескомпромиссный проброс ошибки наверх по спецификации тест-суита\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 /**\n * Создает новый реактивный сигнал с заданным начальным значением и опциями.\n *\n * @template T Тип значения сигнала.\n * @param initialValue Начальное значение сигнала.\n * @param optionsOrName Конфигурационные параметры сигнала или его имя.\n * @param optionsOrName.name Уникальное текстовое имя сигнала для отладки и вывода в транзакционный логгер.\n * @param optionsOrName.validate Пользовательская функция валидации значения, возвращающая true/false или строку ошибки.\n *\n * @method signal\n * @memberof ReactiveEngine\n *\n * @example\n * // Пример 1: Чистый TypeScript (Базовый)\n * const engine = new ReactiveEngineCore();\n * const counter = engine.signal(0, { name: 'counter' });\n * console.log(counter.value); // 0\n * counter.value = 1;\n * console.log(counter.value); // 1\n *\n * @example\n * // Пример 2: Чистый TypeScript (Продвинутый с валидацией)\n * interface User { id: number; name: string; }\n * const engine = new ReactiveEngineCore();\n * const userSignal = engine.signal<User>({ id: 1, name: 'John Doe' }, {\n * name: 'user',\n * validate: (user) => user.id > 0 && typeof user.name === 'string'\n * });\n * userSignal.value = { id: -1, name: 'Jane Doe' }; // Ошибка валидации\n *\n * @example\n * // Пример 3: Интеграция с React (через DI контейнер)\n * interface User { id: number; name: string; }\n * class UserService {\n * constructor(engine: ReactiveEngineCore) {\n * this.mySignal = engine.signal<User>({ id: 1, name: 'John Doe' }, { name: 'userSignal' });\n * }\n *\n * mySignal: Signal<User>;\n * }\n *\n * const engine = new ReactiveEngineCore();\n * engine.provide(UserService, UserService);\n * const logic = engine.inject(UserService);\n *\n * function MyComponent() {\n * const user = useReactiveValue(logic.mySignal);\n * return <div>{user.name}</div>;\n * }\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n return createSignal<T>(this, initialValue, optionsOrName)\n }\n\n /**\n * Создает новое вычисляемое свойство (Computed) на основе чистой функции.\n *\n * @template T Тип значения, возвращаемого вычисляемым свойством.\n * @param fn Чистая функция-вычислитель, которая определяет логику вычисления значения.\n * @param signalName Опциональное имя сигнала для отладки и вывода в транзакционный логгер.\n *\n * @method computed\n * @memberof ReactiveEngine\n *\n * @example\n * // Пример 1: Чистый TypeScript (Базовый)\n * const engine = new ReactiveEngineCore();\n * const counter = engine.signal(0, { name: 'counter' });\n * const doubleCounter = engine.computed(() => counter.value * 2);\n * console.log(doubleCounter.value); // 0\n * counter.value = 1;\n * console.log(doubleCounter.value); // 2\n *\n * @example\n * // Пример 2: Чистый TypeScript (Продвинутый с цепочкой зависимостей)\n * interface User { id: number; name: string; }\n * const engine = new ReactiveEngineCore();\n * const userSignal = engine.signal<User>({ id: 1, name: 'John Doe' }, { name: 'user' });\n * const userNameLength = engine.computed(() => userSignal.value.name.length);\n * const hasLongName = engine.computed(() => userNameLength.value > 5);\n *\n * console.log(hasLongName.value); // false\n * userSignal.value = { id: 1, name: 'Johnathan' };\n * console.log(userNameLength.value); // 9\n * console.log(hasLongName.value); // true\n *\n * @example\n * // Пример 3: Интеграция с React (через DI контейнер)\n * interface User { id: number; name: string; }\n * class UserService {\n * constructor(engine: ReactiveEngineCore) {\n * this.userSignal = engine.signal<User>({ id: 1, name: 'John Doe' }, { name: 'userSignal' });\n * this.userNameLength = engine.computed(() => this.userSignal.value.name.length);\n * }\n *\n * userSignal: Signal<User>;\n * userNameLength: Computed<number>;\n * }\n *\n * const engine = new ReactiveEngineCore();\n * engine.provide(UserService, UserService);\n * const logic = engine.inject(UserService);\n *\n * function MyComponent() {\n * const hasLongName = engine.use(logic.userNameLength);\n * return <div>{hasLongName ? 'Long name' : 'Short name'}</div>;\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 * @template T Тип данных, возвращаемых фетчером после успешного выполнения.\n * @template S Тип реактивной зависимости (source).\n * @param fetcher Асинхронная функция, выполняющая запрос и возвращающая данные типа T.\n * @param source Реактивный сигнал или примитив, предоставляющий источник данных для фетчера.\n * @param optionsOrName Конфигурационные опции ресурса или его имя.\n * @param optionsOrName.name Имя ресурса.\n * @param optionsOrName.resetDataOnSourceChange Флаг, указывающий, следует ли сбрасывать данные при изменении источника.\n * @param optionsOrName.validateBeforeFetch Функция валидации источника перед выполнением фетча.\n * @param optionsOrName.responseValidate Функция валидации ответа после выполнения фетча.\n * @param optionsOrName.timeout Максимальное время ожидания запроса в миллисекундах.\n * @param optionsOrName.retryCount Количество попыток повторного выполнения запроса в случае ошибки.\n *\n * @example\n * // Пример 1: Чистый TypeScript (Базовый)\n * interface User { id: number; name: string; }\n * interface ApiResponse<T> { ok: boolean; message?: string; data: T; }\n * const engine = new ReactiveEngineCore();\n * const userSignal = engine.signal<User>({ id: 1, name: 'John Doe' });\n * const fetchUser = async (source: User, signal: AbortSignal): Promise<ApiResponse<User>> => {\n * // Реализация фетча пользователя\n * };\n * const userResource = engine.resource(fetchUser, { value: userSignal.value }, { name: 'userResource' });\n *\n * @example\n * // Пример 2: Чистый TypeScript (Продвинутый)\n * interface User { id: number; name: string; }\n * interface ApiResponse<T> { ok: boolean; message?: string; data: T; }\n * const engine = new ReactiveEngineCore();\n * const userSignal = engine.signal<User>({ id: 1, name: 'John Doe' });\n * const fetchUser = async (source: User, signal: AbortSignal): Promise<ApiResponse<User>> => {\n * // Реализация фетча пользователя с использованием AbortSignal и timeout\n * };\n * const userResource = engine.resource(fetchUser, { value: userSignal.value }, {\n * name: 'userResource',\n * timeout: 5000,\n * retryCount: 3,\n * });\n *\n * @example\n * // Пример 3: Интеграция с React (через DI контейнер)\n * interface User { id: number; name: string; }\n * interface ApiResponse<T> { ok: boolean; message?: string; data: T; }\n * class UserService {\n * constructor(engine: ReactiveEngineCore) {\n * const userSignal = engine.signal<User>({ id: 1, name: 'John Doe' });\n * this.myResource = engine.resource(fetchUser, { value: userSignal.value }, { name: 'userResource' });\n * }\n *\n * myResource: Resource<ApiResponse<User>>;\n * }\n *\n * const engine = new ReactiveEngineCore();\n * engine.provide(UserService, UserService);\n * const logic = engine.inject(UserService);\n * const state = useReactiveValue(logic.myResource);\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","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import { ReactiveEngineCore } from './core'\n\n// Единый глобальный инстанс по умолчанию\nlet globalEngine = new ReactiveEngineCore({ logger: { isEnabled: false } })\n\nexport const signal = <T>(initialValue: T, options?: any) => globalEngine.signal(initialValue, options)\nexport const computed = <T>(fn: () => T, name?: string) => globalEngine.computed(fn, name)\nexport const effect = (fn: () => any, name?: string) => globalEngine.effect(fn, name)\nexport const batch = <T>(fn: () => T): T => globalEngine.batch(fn)\nexport const untrack = <T>(fn: () => T): T => globalEngine.untrack(fn)\n\n/**\n * ⚡ ХУК ДЛЯ БЕНЧМАРКОВ И ТЕСТОВЫХ СРЕД:\n * Позволяет атомарно уничтожить старый граф реактивности и начать с чистого листа,\n * полностью исключая утечки памяти и пересечение эпох между тест-кейсами.\n */\nexport function resetGlobalReactiveEngine(): void {\n // Старый инстанс со всеми WeakMap и StringCache уходит в Garbage Collector\n globalEngine = new ReactiveEngineCore({ logger: { isEnabled: false } })\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.logger.ts","../src/core/core.method.reactive.ts","../src/core/core.method.resource.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/core.global.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { LogEventType, TransactionContext, LogRecord } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nconst badgeColors: Record<LogEventType, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;'\n}\n\nlet currentTransaction: TransactionContext | null = null\n\nfunction safeValueToString(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value)\n } catch (e) {\n return '[Cyclic Object or Layer]'\n }\n }\n return String(value)\n}\n\nexport function queueLog(type: LogEventType, label: string, details?: LogDetails): void {\n if (!currentTransaction) {\n currentTransaction = { id: Math.random().toString(36).substring(2, 9), pendingLogQueue: [], isFlushing: false }\n queueMicrotask(() => flushLogs())\n }\n currentTransaction.pendingLogQueue.push({\n type,\n label,\n from: details?.from,\n to: details?.to,\n payload: details?.payload,\n timestamp: Date.now()\n })\n}\n\nexport function flushLogs(): void {\n if (!currentTransaction || currentTransaction.isFlushing) return\n currentTransaction.isFlushing = true\n const queue = currentTransaction.pendingLogQueue\n if (queue.length === 0) {\n currentTransaction = null\n return\n }\n console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${currentTransaction.id}] (${queue.length} operations)`, 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;', 'color: #888; font-weight: normal;')\n for (const record of queue) {\n const colorStyle = badgeColors[record.type]\n const hasTransition = record.from !== undefined || record.to !== undefined\n let logMessage = `%c${record.type.toUpperCase()}%c ${record.label}`\n\n if (hasTransition) {\n if (record.from !== undefined)\n logMessage += ` ${safeValueToString(record.from)} → ${safeValueToString(record.to)}`\n else logMessage += ` (${safeValueToString(record.to)})`\n }\n\n if (record.payload !== undefined) {\n console.groupCollapsed(logMessage, colorStyle, 'color: inherit;')\n console.log('Payload:', record.payload)\n console.groupEnd()\n } else {\n console.log(logMessage, colorStyle, 'color: inherit;')\n }\n }\n console.groupEnd()\n currentTransaction = null\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n if (activeHistory.length <= 1) {\n this.churnTracker.delete(label)\n return { marker: '🟢', info: `[STABLE] (1 изм./${intervalSec}s)` }\n } else {\n this.churnTracker.set(label, activeHistory)\n }\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return { marker: '🔴', info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!` }\n }\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return { marker: '🟡', info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)` }\n }\n return { marker: '🟢', info: `[STABLE] (${updateCount} изм./${intervalSec}s)` }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n\n if (engineLogger.filter) {\n const isMatch = engineLogger.filter instanceof RegExp\n ? engineLogger.filter.test(label)\n : label.includes(engineLogger.filter)\n if (!isMatch) return\n }\n\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n if ((type === 'computed' || type === 'resource') && engineLogger.isCoreOptimizationDebugEnabled) {\n queueLogFn(type, `🔵 [IDLE] ${label}`, details)\n return\n }\n return\n }\n }\n\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n}\n","import type { ReactiveEngineCore } from './core'\n\nexport function createReactive<T extends object>(\n engine: ReactiveEngineCore,\n target: T,\n name?: string\n): T {\n if (engine.proxyTargets.has(target)) return target\n if (engine.proxyCache.has(target)) return engine.proxyCache.get(target) as T\n\n // Логируем стартовую инициализацию реактивного Proxy-объекта (REACTIVE <name> (<target>))\n const rootLabel = name || 'reactive'\n engine.log({\n type: 'reactive',\n label: rootLabel,\n details: { to: target }\n })\n\n if (!engine.reactiveSignals.has(target)) {\n engine.reactiveSignals.set(target, new Map<string | symbol, any>())\n }\n const signalsMap = engine.reactiveSignals.get(target)!\n const OWN_KEYS_SYMBOL = Symbol('ownKeys')\n\n function getOrCreateSignal(prop: string | symbol, initialVal: any) {\n let sig = signalsMap.get(prop)\n if (!sig) {\n // Передаём флаг внутреннего сигнала, чтобы не дублировать логи REACTIVE записями SIGNAL\n sig = engine.signal(initialVal, {\n name: `${rootLabel}.${String(prop)}`,\n isInternalCoreSignal: true\n } as any)\n signalsMap.set(prop, sig)\n }\n return sig\n }\n\n const handler: ProxyHandler<T> = {\n ownKeys(t: T) {\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value\n return Reflect.ownKeys(t)\n },\n\n get(t: T, prop: string | symbol, receiver: any) {\n if (prop === '__subscribe' && Array.isArray(t)) {\n return (cb: () => void) => {\n const lengthSig = getOrCreateSignal('length', t.length)\n return lengthSig.subscribe(cb)\n }\n }\n\n if (\n Array.isArray(t) &&\n typeof prop === 'string' &&\n ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].includes(prop)\n ) {\n return (...args: any[]) => {\n let result: any\n const label = name ? `${name}.${prop}` : `array.${prop}`\n const oldLength = t.length\n\n engine.batch(() => {\n const origMethod = Reflect.get(t, prop) as Function\n result = origMethod.apply(receiver, args)\n\n const lengthSig = getOrCreateSignal('length', t.length)\n lengthSig.value = t.length\n\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n\n signalsMap.forEach((sig: any, key: string | symbol) => {\n if (key !== 'length' && key !== OWN_KEYS_SYMBOL) {\n sig.value = Reflect.get(t, key)\n }\n })\n\n engine.log({\n type: 'reactive',\n label,\n details: { from: { length: oldLength }, to: { length: t.length } }\n })\n })\n return result\n }\n }\n\n if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'toJSON') {\n return Reflect.get(t, prop, receiver)\n }\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n const rawValue = Reflect.get(t, prop)\n sig = engine.signal(rawValue)\n signalsMap.set(prop, sig)\n\n if (rawValue !== null && typeof rawValue === 'object') {\n (sig as any)._proxyCache = engine.reactive(\n rawValue,\n name ? `${name}.${String(prop)}` : String(prop)\n )\n }\n }\n\n if ((sig as any)._proxyCache !== undefined) {\n sig.value\n return (sig as any)._proxyCache\n }\n\n return sig.value\n },\n\n set(t: T, prop: string | symbol, value: any): boolean {\n const hadKey = Object.prototype.hasOwnProperty.call(t, prop)\n const oldValue = Reflect.get(t, prop)\n\n if (hadKey && oldValue === value && prop !== 'length') return true\n Reflect.set(t, prop, value)\n\n const sig = getOrCreateSignal(prop, oldValue)\n\n const label = name ? `${name}.${String(prop)}` : String(prop)\n engine.log({\n type: 'reactive',\n label,\n details: { from: oldValue, to: value }\n })\n\n ;(sig as any)._proxyCache = undefined\n sig.value = value\n\n if (!hadKey) {\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n }\n\n if (Array.isArray(t) && prop !== 'length') {\n const lengthSig = getOrCreateSignal('length', t.length)\n lengthSig.value = t.length\n }\n return true\n },\n\n deleteProperty(t: T, prop: string | symbol): boolean {\n const hadKey = Object.prototype.hasOwnProperty.call(t, prop)\n const result = Reflect.deleteProperty(t, prop)\n if (hadKey && result) {\n const sig = signalsMap.get(prop)\n if (sig) {\n ;(sig as any)._proxyCache = undefined\n sig.value = undefined\n }\n const keysSig = getOrCreateSignal(OWN_KEYS_SYMBOL, 0)\n keysSig.value = keysSig.valueWithoutTracking + 1\n }\n return result\n }\n }\n\n const proxy = new Proxy(target, handler)\n engine.proxyCache.set(target, proxy)\n engine.proxyTargets.add(proxy)\n return proxy\n}\n","import type { ReactiveEngineCore } from './core'\nimport type { Resource, ResourceOptions, ResourceState, CleanupFn } from './types'\n\nexport function createResource<T, S = void>(\n engine: ReactiveEngineCore,\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n): Resource<T> {\n const name = typeof optionsOrName === 'string' ? optionsOrName : (optionsOrName?.name || 'resource')\n const options = typeof optionsOrName === 'object' ? optionsOrName : {}\n\n const resetDataOnSourceChange = options.resetDataOnSourceChange ?? false\n const timeoutMs = options.timeout\n const maxRetryCount = options.retryCount ?? 0\n const validateBeforeFetch = options.validateBeforeFetch\n const responseValidate = options.responseValidate\n\n const dataSignal = engine.signal<T | null>(null, `${name}_data`)\n const loadingSignal = engine.signal<boolean>(false, `${name}_loading`)\n const errorSignal = engine.signal<string | null>(null, `${name}_error`)\n const isRetryingSignal = engine.signal<boolean>(false, `${name}_isRetrying`)\n const attemptIndexSignal = engine.signal<number>(0, `${name}_attemptIndex`)\n const totalElapsedMsSignal = engine.signal<number | undefined>(undefined, `${name}_totalElapsedMs`)\n\n let activeAbortController: AbortController | null = null\n let isDestroyed = false\n\n function snapshotState(): ResourceState<T> {\n if (isDestroyed) {\n return undefined as unknown as ResourceState<T>\n }\n return {\n data: dataSignal.value,\n loading: loadingSignal.value,\n error: errorSignal.value,\n isRetrying: isRetryingSignal.value,\n attemptIndex: attemptIndexSignal.value,\n retryCount: maxRetryCount,\n totalElapsedMs: totalElapsedMsSignal.value\n }\n }\n\n async function executeFetch(sourceValue: S): Promise<void> {\n const startTime = Date.now()\n totalElapsedMsSignal.value = undefined\n errorSignal.value = null\n isRetryingSignal.value = false\n\n const prevState = snapshotState()\n\n if (validateBeforeFetch) {\n const validationResult = validateBeforeFetch(sourceValue)\n if (validationResult === false || typeof validationResult === 'string') {\n const errorMsg = typeof validationResult === 'string' ? validationResult : 'Validation failed'\n errorSignal.value = errorMsg\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: prevState, to: snapshotState() }\n })\n return\n }\n }\n\n let attempt = 0\n attemptIndexSignal.value = attempt\n\n while (attempt <= maxRetryCount && !isDestroyed) {\n if (activeAbortController) {\n activeAbortController.abort()\n }\n\n activeAbortController = new AbortController()\n const currentSignal = activeAbortController.signal\n\n const stateBeforeFetch = snapshotState()\n loadingSignal.value = true\n if (attempt === 0 && resetDataOnSourceChange) {\n dataSignal.value = null\n }\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeFetch, to: snapshotState() }\n })\n\n let isTimedOut = false\n\n try {\n let fetchPromise = fetcher(sourceValue, currentSignal)\n\n if (timeoutMs !== undefined && timeoutMs > 0) {\n const timeoutPromise = engine.delay(timeoutMs, currentSignal).then(() => {\n isTimedOut = true\n if (activeAbortController) {\n activeAbortController.abort()\n }\n throw new Error(`Request timed out after ${timeoutMs}ms`)\n })\n fetchPromise = Promise.race([fetchPromise, timeoutPromise])\n }\n\n const payload = await fetchPromise\n\n if (currentSignal.aborted || isDestroyed) return\n\n if (responseValidate) {\n const resValidation = responseValidate(payload)\n if (resValidation === false || typeof resValidation === 'string') {\n throw new Error(typeof resValidation === 'string' ? resValidation : 'Response validation failed')\n }\n }\n\n const stateBeforeSuccess = snapshotState()\n dataSignal.value = payload\n errorSignal.value = null\n isRetryingSignal.value = false\n totalElapsedMsSignal.value = Date.now() - startTime\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeSuccess, to: snapshotState() }\n })\n return\n } catch (err: any) {\n const isTimeoutErr = isTimedOut || (timeoutMs !== undefined && err?.name === 'TimeoutError')\n if (currentSignal.aborted && !isTimeoutErr) return\n if (isDestroyed) return\n\n const stateBeforeError = snapshotState()\n const rawMessage = isTimeoutErr\n ? `Request timed out after ${timeoutMs}ms`\n : (err?.message || String(err))\n\n if (attempt < maxRetryCount) {\n attempt++\n attemptIndexSignal.value = attempt\n isRetryingSignal.value = true\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeError, to: snapshotState() }\n })\n\n try {\n // Экспоненциальное засыпание (1000ms * attempt для попадания в тайминги 1500ms / 2500ms)\n await engine.delay(1000 * attempt, currentSignal)\n } catch (e) {\n return\n }\n } else {\n const totalAttempts = attempt + 1\n const suffix = maxRetryCount > 0\n ? `. Всего безуспешных попыток с момента изменения исходного сигнала: ${totalAttempts}`\n : ''\n errorSignal.value = `${rawMessage}${suffix}`\n isRetryingSignal.value = false\n totalElapsedMsSignal.value = Date.now() - startTime\n loadingSignal.value = false\n\n engine.log({\n type: 'resource',\n label: name,\n details: { from: stateBeforeError, to: snapshotState() }\n })\n return\n }\n }\n }\n }\n\n const unsubscribeEffect = engine.effect(() => {\n if (source) {\n const currentSourceValue = source.value\n engine.untrack(() => {\n executeFetch(currentSourceValue)\n })\n } else {\n engine.untrack(() => {\n executeFetch(undefined as unknown as S)\n })\n }\n }, `${name}_effect`)\n\n const publicResource: Resource<T> = {\n get data(): T | null { return isDestroyed ? null : dataSignal.value },\n get loading(): boolean { return isDestroyed ? false : loadingSignal.value },\n get error(): string | null { return isDestroyed ? null : errorSignal.value },\n get isRetrying(): boolean { return isDestroyed ? false : isRetryingSignal.value },\n get attemptIndex(): number { return isDestroyed ? 0 : attemptIndexSignal.value },\n get retryCount(): number { return maxRetryCount },\n get totalElapsedMs(): number | undefined { return isDestroyed ? undefined : totalElapsedMsSignal.value },\n\n refetch(): void {\n if (isDestroyed) return\n engine.untrack(() => {\n if (source) {\n executeFetch(source.value)\n } else {\n executeFetch(undefined as unknown as S)\n }\n })\n },\n\n subscribe(cb: (val: ResourceState<T>) => void): CleanupFn {\n return engine.effect(() => {\n cb(publicResource.value)\n })\n },\n\n get value(): ResourceState<T> {\n return snapshotState()\n },\n\n destroy(): void {\n isDestroyed = true\n if (activeAbortController) {\n activeAbortController.abort()\n activeAbortController = null\n }\n unsubscribeEffect()\n dataSignal.destroy()\n loadingSignal.destroy()\n errorSignal.destroy()\n isRetryingSignal.destroy()\n attemptIndexSignal.destroy()\n totalElapsedMsSignal.destroy()\n }\n }\n\n return publicResource\n}\n","import type {\n CleanupFn,\n EffectFn,\n Signal,\n Computed,\n IEffect,\n SignalOptions,\n EngineLoggerOptions,\n LogEventType,\n Token,\n Factory,\n Resource,\n ResourceOptions\n} from './types'\nimport { ReactiveDebounceLogger, queueLog } from './core.logger'\nimport { createReactive } from './core.method.reactive'\nimport { createResource } from './core.method.resource'\n\nexport type NodeState = 0 | 1 | 2\n\nexport class NodeLink {\n public source: ReactiveNode | null = null\n public target: ReactiveNode | null = null\n public nextSubscriber: NodeLink | null = null\n public prevSubscriber: NodeLink | null = null\n public nextDependency: NodeLink | null = null\n public prevDependency: NodeLink | null = null\n public version: number = 0\n\n public clear(): void {\n this.source = null\n this.target = null\n this.nextSubscriber = null\n this.prevSubscriber = null\n this.nextDependency = null\n this.prevDependency = null\n this.version = 0\n }\n}\n\nexport class LinkPool {\n private static pool: NodeLink[] = []\n private static size = 0\n private static maxPoolSize = 100000\n\n public static acquire(source: ReactiveNode, target: ReactiveNode): NodeLink {\n if (this.size > 0) {\n this.size--\n const link = this.pool[this.size]\n this.pool[this.size] = null as unknown as NodeLink\n link.source = source\n link.target = target\n return link\n }\n const link = new NodeLink()\n link.source = source\n link.target = target\n return link\n }\n\n public static release(link: NodeLink): void {\n if (this.size < this.maxPoolSize) {\n link.clear()\n this.pool[this.size] = link\n this.size++\n }\n }\n}\n\nexport class ReactiveNode {\n public id: string\n public type: 'signal' | 'computed' | 'effect'\n public version: number = 0\n public state: NodeState = 0\n public depth: number = 0\n public subscribersHead: NodeLink | null = null\n public subscribersTail: NodeLink | null = null\n public dependenciesHead: NodeLink | null = null\n public dependenciesTail: NodeLink | null = null\n public _value: any\n public _prevValue: any\n public fn: (() => any) | null = null\n public cleanups = new Set<CleanupFn>()\n public isDisposed: boolean = false\n public ownedEffects = new Set<ReactiveNode>()\n public wrapper: any = null\n public engine: ReactiveEngineCore | null = null\n\n constructor(type: 'signal' | 'computed' | 'effect', id: string, initialValue?: any) {\n this.type = type\n this.id = id\n this._value = initialValue\n this._prevValue = initialValue\n }\n\n public get subscribers(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.subscribersHead\n while (link !== null) {\n if (link.target) set.add(link.target)\n link = link.nextSubscriber\n }\n return set\n }\n\n public get dependencies(): Set<ReactiveNode> {\n const set = new Set<ReactiveNode>()\n let link = this.dependenciesHead\n while (link !== null) {\n if (link.source) set.add(link.source)\n link = link.nextDependency\n }\n return set\n }\n}\n\nexport class EffectScheduler {\n private buckets: ReactiveNode[][] = []\n private maxDepth = -1\n\n public schedule(node: ReactiveNode): void {\n const d = node.depth\n if (!this.buckets[d]) {\n this.buckets[d] = []\n }\n if (!this.buckets[d].includes(node)) {\n this.buckets[d].push(node)\n if (d > this.maxDepth) this.maxDepth = d\n }\n }\n\n public clearAll(): void {\n for (let d = 0; d <= this.maxDepth; d++) {\n const bucket = this.buckets[d]\n if (bucket) {\n for (const node of bucket) {\n node.state = 0\n }\n this.buckets[d] = []\n }\n }\n this.maxDepth = -1\n }\n\n public flush(engine: ReactiveEngineCore): void {\n const prevConsumer = engine.activeConsumer\n try {\n let d = 0\n while (d <= this.maxDepth) {\n const bucket = this.buckets[d]\n if (!bucket || bucket.length === 0) {\n d++\n continue\n }\n\n this.buckets[d] = []\n bucket.sort((a, b) => b.depth - a.depth)\n\n for (const node of bucket) {\n if (node.isDisposed || node.state === 0) continue\n\n if (node.state === 1) {\n if (engine.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n\n if (node.state === 2) {\n try {\n engine.runEffectNode(node)\n } catch (err) {\n // Изоляция очереди при падении эффекта (#177, #247)\n this.clearAll()\n throw err\n }\n }\n }\n\n let hasTasks = false\n for (let i = 0; i <= this.maxDepth; i++) {\n if (this.buckets[i] && this.buckets[i].length > 0) {\n d = i\n hasTasks = true\n break\n }\n }\n if (!hasTasks) d++\n }\n } finally {\n engine.activeConsumer = prevConsumer\n this.maxDepth = -1\n }\n }\n}\n\nexport class ReactiveEngineCore {\n public activeConsumer: ReactiveNode | null = null\n public batchDepth = 0\n public batchedSignals: ReactiveNode[] = []\n public batchInitialValues = new Map<ReactiveNode, { value: any; version: number }>()\n public computedCache = new WeakMap<Function, any>()\n public logger: EngineLoggerOptions\n\n public proxyCache = new WeakMap<object, any>()\n public proxyTargets = new WeakSet<object>()\n public reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n\n private scheduler = new EffectScheduler()\n private currentOwner: ReactiveNode | null = null\n private effectIdCounter = 0\n\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private cycleDetectionStack = new Set<unknown>()\n\n // public isCleaningUp = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public log(params: { type: LogEventType; label: string; details?: { from?: unknown; to?: unknown; payload?: unknown }; isInternalCoreSignal?: boolean }): void {\n if (!this.logger || !this.logger.isEnabled) return\n ReactiveDebounceLogger.processLog(this.logger, queueLog, params)\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const name = typeof optionsOrName === 'string' ? optionsOrName : (optionsOrName?.name || 'signal')\n const validate = typeof optionsOrName === 'object' ? optionsOrName?.validate : undefined\n const isInternal = typeof optionsOrName === 'object' ? optionsOrName?.isInternalCoreSignal : false\n const node = new ReactiveNode('signal', name, initialValue)\n node.engine = this\n const self = this\n\n // Логируем стартовую инициализацию сигнала (from: undefined -> формат \"SIGNAL label (initialValue)\")\n this.log({ type: 'signal', label: name, details: { to: initialValue }, isInternalCoreSignal: isInternal })\n\n const publicSignal: Signal<T> & { _node: ReactiveNode; _engine: ReactiveEngineCore } = {\n _node: node,\n _engine: this,\n get value(): T {\n // if (self.isCleaningUp && self.activeConsumer === null) {\n // return node._prevValue\n // }\n if (self.activeConsumer) {\n self.trackNode(node, self.activeConsumer)\n }\n return node._value\n },\n set value(newValue: T) {\n if (validate) {\n const validationResult = validate(newValue)\n if (validationResult === false || typeof validationResult === 'string') {\n console.error(`[Validation Error] Invalid value supplied to signal \"${name}\": ${validationResult}`)\n return\n }\n }\n const isObj = newValue !== null && typeof newValue === 'object'\n if (Object.is(node._value, newValue) && !isObj) return\n\n const oldVal = node._value\n node._prevValue = oldVal\n\n if (self.batchDepth > 0 && !self.batchInitialValues.has(node)) {\n self.batchInitialValues.set(node, { value: oldVal, version: node.version })\n }\n\n node._value = newValue\n node.version++\n\n self.log({ type: 'signal', label: name, details: { from: oldVal, to: newValue }, isInternalCoreSignal: isInternal })\n self.notifySubscribers(node, 2)\n\n if (self.batchDepth > 0) {\n if (!self.batchedSignals.includes(node)) {\n self.batchedSignals.push(node)\n }\n } else {\n self.flushEffects()\n }\n },\n get valueWithoutTracking(): T {\n return node._value\n },\n subscribe(cb: (v: T) => void): CleanupFn {\n return self.effect(() => {\n cb(publicSignal.value)\n })\n },\n destroy(): void {\n self.disposeNode(node)\n }\n }\n\n node.wrapper = publicSignal\n return publicSignal\n }\n\n public notifySubscribers(node: ReactiveNode, state: NodeState): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target === this.activeConsumer) {\n link = link.nextSubscriber\n continue\n }\n\n if (target.state < state) {\n target.state = state\n if (target.type === 'effect') {\n this.scheduler.schedule(target)\n } else {\n this.notifySubscribers(target, 1)\n }\n }\n link = link.nextSubscriber\n }\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const name = signalName || 'computed'\n const node = new ReactiveNode('computed', name)\n node.engine = this\n node.fn = fn\n node.state = 2\n const self = this\n\n const publicComputed: Computed<T> & { _node: ReactiveNode; _engine: ReactiveEngineCore } = {\n _node: node,\n _engine: this,\n get value(): T {\n if (node.state === 1) {\n if (self.checkNeedsUpdate(node)) {\n node.state = 2\n } else {\n node.state = 0\n }\n }\n if (node.state === 2) {\n const oldVal = node._value\n self.evaluateComputed(node)\n // self.log({ type: 'computed', label: name, details: { from: oldVal, to: node._value } })\n }\n if (self.activeConsumer) {\n self.trackNode(node, self.activeConsumer)\n }\n return node._value\n },\n get valueWithoutTracking(): T {\n return node._value\n },\n subscribe(cb: (v: T) => void): CleanupFn {\n return self.effect(() => {\n cb(publicComputed.value)\n })\n },\n destroy(): void {\n self.disposeNode(node)\n },\n _isDirty(): boolean {\n return node.state === 2\n },\n get dependencies(): Set<any> {\n const depsSet = new Set()\n let link = node.dependenciesHead\n while (link !== null) {\n if (link.source && link.source.wrapper) {\n depsSet.add(link.source.wrapper)\n }\n link = link.nextDependency\n }\n return depsSet\n }\n }\n node.wrapper = publicComputed\n if (this.batchDepth === 0) {\n this.computedCache.set(fn, publicComputed)\n }\n return publicComputed\n }\n public effect(fn: EffectFn, effectName?: string): () => void {\n const name = effectName || 'effect'\n const node = new ReactiveNode('effect', name)\n node.state = 2\n node.depth = this.currentOwner ? this.currentOwner.depth + 1 : 0\n const publicEffect: IEffect = {\n id: ++this.effectIdCounter,\n run: () => {\n this.runEffectNode(node)\n },\n markDirty: () => {\n node.state = 2\n this.scheduler.schedule(node)\n },\n cleanups: node.cleanups,\n label: name,\n get isDirty(): boolean { return node.state === 2 },\n get isDisposed(): boolean { return node.isDisposed },\n _node: node\n }\n node.wrapper = publicEffect\n node.fn = () => {\n this.log({ type: 'effect', label: name })\n const res = fn()\n if (typeof res === 'function') {\n node.cleanups.add(res)\n }\n }\n if (this.currentOwner) {\n this.currentOwner.ownedEffects.add(node)\n }\n this.runEffectNode(node)\n const disposeFn = () => {\n this.disposeNode(node)\n }\n;(disposeFn as any)._node = node\n return disposeFn\n }\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): Resource<T> {\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n public batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) {\n // Проверка Net-Zero откатов (#147)\n for (const sig of this.batchedSignals) {\n const initial = this.batchInitialValues.get(sig)\n const isObj = sig._value !== null && typeof sig._value === 'object'\n if (initial && !isObj && Object.is(sig._value, initial.value)) {\n sig.version = initial.version\n this.resetCleanState(sig)\n }\n }\n this.batchedSignals = []\n this.batchInitialValues.clear()\n this.flushEffects()\n }\n }\n }\n private resetCleanState(node: ReactiveNode): void {\n let link = node.subscribersHead\n while (link !== null) {\n const target = link.target!\n if (target.state > 0 && !this.checkNeedsUpdate(target)) {\n target.state = 0\n this.resetCleanState(target)\n }\n link = link.nextSubscriber\n }\n }\n public untrack<T>(fn: () => T): T {\n const prevConsumer = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n public flushEffects(): void {\n if (this.batchDepth === 0) {\n this.scheduler.flush(this)\n }\n }\n public trackNode(source: ReactiveNode, target: ReactiveNode): void {\n let link = target.dependenciesHead\n while (link !== null) {\n if (link.source === source) {\n link.version = source.version\n return\n }\n link = link.nextDependency\n }\n const newLink = LinkPool.acquire(source, target)\n newLink.version = source.version\n if (target.depth <= source.depth) {\n target.depth = source.depth + 1\n }\n\n if (source.subscribersTail !== null) {\n source.subscribersTail.nextSubscriber = newLink\n newLink.prevSubscriber = source.subscribersTail\n source.subscribersTail = newLink\n } else {\n source.subscribersHead = newLink\n source.subscribersTail = newLink\n }\n\n if (target.dependenciesTail !== null) {\n target.dependenciesTail.nextDependency = newLink\n newLink.prevDependency = target.dependenciesTail\n target.dependenciesTail = newLink\n } else {\n target.dependenciesHead = newLink\n target.dependenciesTail = newLink\n }\n }\n public unlinkDependencies(target: ReactiveNode, cascadeOrphans = false): void {\n let link = target.dependenciesHead\n target.dependenciesHead = null\n target.dependenciesTail = null\n while (link !== null) {\n const next = link.nextDependency\n const source = link.source!\n if (link.prevSubscriber !== null) {\n link.prevSubscriber.nextSubscriber = link.nextSubscriber\n } else {\n source.subscribersHead = link.nextSubscriber\n }\n if (link.nextSubscriber !== null) {\n link.nextSubscriber.prevSubscriber = link.prevSubscriber\n } else {\n source.subscribersTail = link.prevSubscriber\n }\n LinkPool.release(link)\n\n // Не уничтожаем computed при отписке слушателей (иначе React StrictMode убивает computed при ремаунте),\n // каскадно удаляем только если сам узел явным образом уничтожен через .destroy()\n if (cascadeOrphans && target.isDisposed && target.type === 'computed' && source.type === 'computed' && source.subscribersHead === null) {\n this.disposeNode(source)\n }\n link = next\n }\n }\n public checkNeedsUpdate(node: ReactiveNode): boolean {\n let link = node.dependenciesHead\n while (link !== null) {\n const source = link.source!\n if (source.state === 1) {\n if (this.checkNeedsUpdate(source)) {\n source.state = 2\n } else {\n source.state = 0\n }\n }\n if (source.state === 2) {\n this.evaluateComputed(source)\n }\n if (link.version !== source.version) {\n link.version = source.version\n return true\n }\n link = link.nextDependency\n }\n return false\n }\n public evaluateComputed(node: ReactiveNode): void {\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n this.unlinkDependencies(node, false)\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n const oldVal = node._value\n try {\n const newValue = node.fn!()\n if (!Object.is(node._value, newValue)) {\n node._value = newValue\n node.version++\n }\n node.state = 0\n this.log({ type: 'computed', label: node.id, details: { from: oldVal, to: node._value } })\n } finally {\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n }\n }\n private executeCleanups(node: ReactiveNode): void {\n if (node.cleanups.size === 0) return\n const cleanupsList = Array.from(node.cleanups)\n node.cleanups.clear()\n let firstError: unknown = null\n // const prevCleaning = this.isCleaningUp\n // this.isCleaningUp = true\n\n for (const cleanup of cleanupsList) {\n try {\n this.untrack(() => cleanup())\n } catch (err) {\n if (firstError === null) {\n firstError = err\n }\n }\n }\n\n // finally {\n // this.isCleaningUp = prevCleaning\n // }\n if (firstError !== null) {\n throw firstError\n }\n }\n public runEffectNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {\n node.state = 0\n throw e\n }\n\n // Не прерываем текущий перезапуск (#111), даже если cleanup вызвал dispose() для будущих циклов;\n // дальнейшая подписка не создастся, так как после fn() мы зачистим зависимости, если isDisposed === true\n this.unlinkDependencies(node, false)\n const prevConsumer = this.activeConsumer\n const prevOwner = this.currentOwner\n this.activeConsumer = node\n this.currentOwner = node\n try {\n node.fn!()\n node.state = 0\n } finally {\n this.activeConsumer = prevConsumer\n this.currentOwner = prevOwner\n if (node.isDisposed) {\n this.unlinkDependencies(node, true)\n }\n }\n }\n public disposeNode(node: ReactiveNode): void {\n if (node.isDisposed) return\n node.isDisposed = true\n node.state = 0\n\n if (node.ownedEffects.size > 0) {\n const children = Array.from(node.ownedEffects)\n node.ownedEffects.clear()\n for (const eff of children) {\n this.disposeNode(eff)\n }\n }\n\n try {\n this.executeCleanups(node)\n } catch (e) {}\n\n this.unlinkDependencies(node, true)\n\n let link = node.subscribersHead\n node.subscribersHead = null\n node.subscribersTail = null\n while (link !== null) {\n const next = link.nextSubscriber\n const target = link.target\n if (target) {\n if (link.prevDependency !== null) {\n link.prevDependency.nextDependency = link.nextDependency\n } else {\n target.dependenciesHead = link.nextDependency\n }\n if (link.nextDependency !== null) {\n link.nextDependency.prevDependency = link.prevDependency\n } else {\n target.dependenciesTail = link.prevDependency\n }\n }\n LinkPool.release(link)\n link = next\n }\n }\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n public delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n public inject<T>(token: Token<T>): T {\n if (token === undefined || token === null) {\n throw new Error('[DI Error] Token is empty')\n }\n if (this.diCache.has(token)) {\n return this.diCache.get(token) as T\n }\n if (this.cycleDetectionStack.has(token)) {\n throw new Error('[DI Error] Cyclic dependency detected')\n }\n this.cycleDetectionStack.add(token)\n try {\n if (this.diRegistry.has(token)) {\n const entry = this.diRegistry.get(token)\n if (typeof entry === 'function') {\n if ((entry as any)._isMockFunction) {\n const mockRes = (entry as Function)(this)\n if (mockRes !== undefined) {\n this.diCache.set(token, mockRes)\n return mockRes as T\n }\n return entry as unknown as T\n }\n const str = entry.toString()\n const isClass = str.startsWith('class ') ||\nstr.startsWith('class{') ||\n(entry.prototype && entry.prototype.constructor === entry && !str.startsWith('function') && !str.includes('=>'))\n if (!isClass) {\n const resolved = (entry as Factory<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n return entry as unknown as T\n }\n return entry as T\n }\n if (typeof token === 'function') {\n const resolved = new (token as any)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n throw new Error('[DI Error] Token not found')\n } finally {\n this.cycleDetectionStack.delete(token)\n }\n }\n}\nexport let currentEngineInstance = new ReactiveEngineCore()\nexport function resetGlobalReactiveEngine(): void {\n currentEngineInstance = new ReactiveEngineCore()\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import {\n // ReactiveEngineCore,\n currentEngineInstance,\n resetGlobalReactiveEngine as resetEngineInstance,\n} from './core'\nimport { Computed, EffectFn, Signal, Token, Factory } from './types'\n\n/**\n * Создает новый реактивный сигнал в рамках текущей глобальной эпохи.\n *\n * @template T Тип значения, хранящегося внутри сигнала.\n * @param initialValue Начальное состояние сигнала.\n * @param optionsOrName Строковое имя или конфигурационный объект для отладки.\n */\nexport function signal<T>(\n initialValue: T,\n optionsOrName?: string | { name?: string }\n): Signal<T> {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.signal<T>(initialValue, optionsOrName)\n}\n\n/**\n * Создает декларативное вычисляемое свойство (Computed) в рамках текущей глобальной эпохи.\n * Полностью мемоизирует результат вычисления и использует ленивую pull-модель на NodeLink-связях.\n *\n * @template T Тип возвращаемого функцией значения.\n * @param fn Чистая функция-вычислитель.\n * @param signalName Опциональное имя для логирования и отладки графа.\n */\nexport function computed<T>(fn: () => T, signalName?: string): Computed<T> {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.computed<T>(fn, signalName)\n}\n\n/**\n * Регистрирует сайд-эффект в планировщике текущей глобальной эпохи.\n * Синхронно запускает первый проход вычисления для сбора реактивных зависимостей.\n *\n * @param fn Функция эффекта, которая может возвращать деструктор (колбэк очистки).\n * @param effectName Опциональное имя эффекта для трассировки и изоляции.\n * @returns Функция полного императивного разрыва связей и уничтожения (unsub/dispose).\n */\nexport function effect(fn: EffectFn, effectName?: string): () => void {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.effect(fn, effectName)\n}\n\n/**\n * Группирует последовательные мутации сигналов в единую атомарную транзакцию.\n * Откладывает флуш и выполнение эффектов до выхода из самого внешнего макро-батча.\n *\n * @template T Тип возвращаемого транзакционной функцией значения.\n * @param fn Функция, выполняющая пакетное обновление стейта.\n */\nexport function batch<T>(fn: () => T): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.batch<T>(fn)\n}\n\n/**\n * Временно замораживает автоматический трекинг зависимостей текущего потребителя.\n * Позволяет безопасно читать реактивные узлы внутри эффектов без создания циклов и лишних ребер.\n *\n * @template T Тип возвращаемого значения.\n * @param fn Контекстная функция чтения.\n */\nexport function untrack<T>(fn: () => T): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.untrack<T>(fn)\n}\n\n/**\n * Бескомпромиссно сжигает текущую глобальную реактивную эпоху.\n * Инициализирует новое изолированное ядро графа, гарантируя, что старые компоненты\n * и кэши вычислений не протекут в новые тестовые раны или жизненные циклы приложения.\n */\nexport function resetGlobalReactiveEngine(): void {\n resetEngineInstance()\n}\n\n/**\n * Регистрирует зависимость или фабрику в DI-контейнере текущей глобальной эпохи.\n *\n * @template T Тип регистрируемого значения.\n * @param token Уникальный ключ токена (строка, символ или класс).\n * @param valueOrFactory Значение или ленивая фабричная функция.\n */\nexport function provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n currentEngineInstance.provide<T>(token, valueOrFactory)\n}\n\n/**\n * Извлекает или лениво инициализирует зависимость из DI-контейнера текущей глобальной эпохи.\n * Гарантирует защиту от циклических ссылок в графе сервисов.\n *\n * @template T Тип извлекаемой зависимости.\n * @param token Уникальный ключ токена.\n */\nexport function inject<T>(token: Token<T>): T {\n if (!currentEngineInstance) {\n throw new Error('[Reactive Engine v3] Global engine instance is not initialized.')\n }\n return currentEngineInstance.inject<T>(token)\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pravosleva/reactive-engine",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-alpha.0",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=22.20.0"
|
|
6
6
|
},
|
|
@@ -29,7 +29,9 @@
|
|
|
29
29
|
"exports": {
|
|
30
30
|
".": {
|
|
31
31
|
"types": "./dist/index.d.ts",
|
|
32
|
-
"import": "./dist/index.mjs"
|
|
32
|
+
"import": "./dist/index.mjs",
|
|
33
|
+
"require": "./dist/index.mjs",
|
|
34
|
+
"default": "./dist/index.mjs"
|
|
33
35
|
},
|
|
34
36
|
"./react": {
|
|
35
37
|
"types": "./dist/react/index.d.ts",
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
//#region src/core/core.method.computed.ts
|
|
2
|
-
function e(e, t, n) {
|
|
3
|
-
let r = e.computedCache.get(t);
|
|
4
|
-
if (r) return r;
|
|
5
|
-
let i, a = !0, o = 0, s = !1, c = -1, l = 2, u = /* @__PURE__ */ new Set(), d = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Set(), m = (e) => {
|
|
6
|
-
if (!e) return;
|
|
7
|
-
let t = e._node || e;
|
|
8
|
-
if (t.dependencies && t.dependencies.size > 0) {
|
|
9
|
-
for (let n of t.dependencies) {
|
|
10
|
-
let r = n, i = r._node || r;
|
|
11
|
-
i.subscribers && (i.subscribers.delete(t), i.subscribers.delete(e), i.subscribers.delete(_), i.type === "computed" && i.subscribers.size === 0 && m(i));
|
|
12
|
-
}
|
|
13
|
-
t.dependencies.clear(), t.depVersions && t.depVersions.clear();
|
|
14
|
-
}
|
|
15
|
-
}, h = (t) => {
|
|
16
|
-
if (!s || l === 2) return t.run();
|
|
17
|
-
if (p && p.size > 0 && t.verifiedInEpoch === e.epoch && e.batchDepth === 0 && l === 0) return !1;
|
|
18
|
-
let n = !1;
|
|
19
|
-
if (u && u.size > 0) for (let t of u) {
|
|
20
|
-
let r = t._node || t;
|
|
21
|
-
if (r.type === "computed" && r.state > 0 && r.update && r.verifiedInEpoch !== e.epoch && r.update(), t.hasBatchValue || d.get(t) !== r.version) {
|
|
22
|
-
n = !0;
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return t.verifiedInEpoch = e.epoch, n || a ? t.run() : (l = 0, !1);
|
|
27
|
-
}, g = 0, _ = {
|
|
28
|
-
id: e.subscriberId++,
|
|
29
|
-
dependencies: u,
|
|
30
|
-
subscribers: p,
|
|
31
|
-
ownedEffects: f,
|
|
32
|
-
depth: 1,
|
|
33
|
-
type: "computed",
|
|
34
|
-
fn: t,
|
|
35
|
-
get version() {
|
|
36
|
-
return o;
|
|
37
|
-
},
|
|
38
|
-
get state() {
|
|
39
|
-
return l;
|
|
40
|
-
},
|
|
41
|
-
set state(e) {
|
|
42
|
-
l = e;
|
|
43
|
-
},
|
|
44
|
-
get depVersions() {
|
|
45
|
-
return d;
|
|
46
|
-
},
|
|
47
|
-
verifiedInEpoch: -1,
|
|
48
|
-
update: () => h(_),
|
|
49
|
-
run: () => {
|
|
50
|
-
if (c === e.epoch && s && l === 0 && e.batchDepth === 0) return !1;
|
|
51
|
-
let r = e.epoch;
|
|
52
|
-
if (c = r, _.verifiedInEpoch = r, e.cycleDetectionStack.has(_)) throw Error("[Graph Error] Cyclic dependency detected");
|
|
53
|
-
e.cycleDetectionStack.add(_);
|
|
54
|
-
let p = e.activeConsumer, m = e.activeOwner;
|
|
55
|
-
e.activeConsumer = _, e.activeOwner = _, g++, _.activeRunId = g;
|
|
56
|
-
let h = u.size > 0 ? Array.from(u) : null;
|
|
57
|
-
u.clear();
|
|
58
|
-
try {
|
|
59
|
-
if (f.size > 0) {
|
|
60
|
-
for (let e of f) e && typeof e.dispose == "function" && e.dispose();
|
|
61
|
-
f.clear();
|
|
62
|
-
}
|
|
63
|
-
let p = t();
|
|
64
|
-
if (h !== null) {
|
|
65
|
-
let e = h.length === u.size;
|
|
66
|
-
for (let t of h) {
|
|
67
|
-
let n = t;
|
|
68
|
-
if (!e || !u.has(n)) {
|
|
69
|
-
let e = n._node || n;
|
|
70
|
-
e.subscribers && e.subscribers.delete(_), d.delete(n);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
let m = a || !Object.is(i, p);
|
|
75
|
-
if (m) {
|
|
76
|
-
let t = a ? void 0 : typeof i == "object" && i ? JSON.parse(JSON.stringify(i)) : i;
|
|
77
|
-
i = p, o++, e.log && n && e.log({
|
|
78
|
-
type: "computed",
|
|
79
|
-
label: n,
|
|
80
|
-
details: {
|
|
81
|
-
from: t,
|
|
82
|
-
to: p
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
a = !1, l = 0, s = !0;
|
|
87
|
-
let g = 0;
|
|
88
|
-
for (let e of u) {
|
|
89
|
-
let t = e, n = t._node || t;
|
|
90
|
-
d.set(t, n.version), n.subscribers && n.subscribers.add(_), n.depth !== void 0 && n.depth > g && (g = n.depth);
|
|
91
|
-
}
|
|
92
|
-
return _.depth = g + 1, e.epoch !== r && (c = -1, _.verifiedInEpoch = -1, l = 2), m;
|
|
93
|
-
} finally {
|
|
94
|
-
e.activeConsumer = p, e.activeOwner = m, e.cycleDetectionStack.delete(_);
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
markDirty: (t) => {
|
|
98
|
-
if (!(l >= t)) {
|
|
99
|
-
l = t;
|
|
100
|
-
for (let t of p) {
|
|
101
|
-
let n = t._node || t;
|
|
102
|
-
n.type === "effect" ? (n.isDirty = !0, e.scheduleEffect(t)) : n.markDirty && n.markDirty(1);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}, v = {
|
|
107
|
-
get value() {
|
|
108
|
-
let t = e.activeConsumer;
|
|
109
|
-
if (t && t !== _ && typeof t.dependencies?.add == "function") {
|
|
110
|
-
p.add(t), t.dependencies.add(_);
|
|
111
|
-
let e = _.depth || 1, n = t._node || t;
|
|
112
|
-
n.depth !== void 0 && e >= n.depth && (n.depth = e + 1), t.activeRunId !== void 0 && (_._lastSeenInRunId = t.activeRunId);
|
|
113
|
-
}
|
|
114
|
-
return h(_), t && t.depVersions && t.depVersions.set(v, o), i;
|
|
115
|
-
},
|
|
116
|
-
get valueWithoutTracking() {
|
|
117
|
-
return i;
|
|
118
|
-
},
|
|
119
|
-
get version() {
|
|
120
|
-
return o;
|
|
121
|
-
},
|
|
122
|
-
get dependencies() {
|
|
123
|
-
return u;
|
|
124
|
-
},
|
|
125
|
-
subscribe(t) {
|
|
126
|
-
let n = this, r = {
|
|
127
|
-
id: e.subscriberId++,
|
|
128
|
-
isDirty: !0,
|
|
129
|
-
depth: 9999,
|
|
130
|
-
dependencies: /* @__PURE__ */ new Set(),
|
|
131
|
-
type: "effect",
|
|
132
|
-
run: () => {
|
|
133
|
-
if (!r.isDisposed) try {
|
|
134
|
-
t(n.value);
|
|
135
|
-
} catch (e) {
|
|
136
|
-
console.error(e);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
return p.add(r), t(this.value), () => {
|
|
141
|
-
r.isDisposed = !0, p.delete(r), r.dependencies.clear();
|
|
142
|
-
};
|
|
143
|
-
},
|
|
144
|
-
subscribeState(e) {
|
|
145
|
-
return v.subscribe(e);
|
|
146
|
-
},
|
|
147
|
-
destroy: () => {
|
|
148
|
-
m(_), p && p.clear(), e.computedCache.delete(t), u.clear(), d.clear(), f.clear(), a = !0, l = 2, s = !1;
|
|
149
|
-
},
|
|
150
|
-
__subscribe(t) {
|
|
151
|
-
let n = {
|
|
152
|
-
id: e.subscriberId++,
|
|
153
|
-
type: "effect",
|
|
154
|
-
run: t,
|
|
155
|
-
isDirty: !1
|
|
156
|
-
};
|
|
157
|
-
return p.add(n), () => {
|
|
158
|
-
p.delete(n);
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
return v.run = () => _.run(), e.computedCache.set(t, v), v._node = _, v.subscribers = p, v;
|
|
163
|
-
}
|
|
164
|
-
//#endregion
|
|
165
|
-
export { e as createComputed };
|
|
166
|
-
|
|
167
|
-
//# sourceMappingURL=core.method.computed.mjs.map
|