@pravosleva/reactive-engine 1.8.3-beta → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/README.md +271 -0
  2. package/dist/AbstractService.cjs.map +1 -1
  3. package/dist/AbstractService.mjs.map +1 -1
  4. package/dist/BaseREServiceEnhanced.cjs.map +1 -1
  5. package/dist/BaseREServiceEnhanced.mjs.map +1 -1
  6. package/dist/_react-bindings.d.ts +1 -1
  7. package/dist/_react-bindings.d.ts.map +1 -1
  8. package/dist/angular/core.angular-adapter.cjs +2 -0
  9. package/dist/angular/core.angular-adapter.cjs.map +1 -0
  10. package/dist/angular/core.angular-adapter.d.ts +15 -0
  11. package/dist/angular/core.angular-adapter.d.ts.map +1 -0
  12. package/dist/angular/core.angular-adapter.mjs +28 -0
  13. package/dist/angular/core.angular-adapter.mjs.map +1 -0
  14. package/dist/angular/core.angular-adapter.test.d.ts +2 -0
  15. package/dist/angular/core.angular-adapter.test.d.ts.map +1 -0
  16. package/dist/angular/index.cjs +2 -1
  17. package/dist/angular/index.cjs.map +1 -0
  18. package/dist/angular/index.d.ts +19 -2
  19. package/dist/angular/index.d.ts.map +1 -1
  20. package/dist/angular/index.mjs +28 -2
  21. package/dist/angular/index.mjs.map +1 -0
  22. package/dist/core/AbstractService.d.ts +3 -3
  23. package/dist/core/AbstractService.d.ts.map +1 -1
  24. package/dist/core/BaseREServiceEnhanced.d.ts +3 -3
  25. package/dist/core/BaseREServiceEnhanced.d.ts.map +1 -1
  26. package/dist/core/_draft.core.methods.d.ts +13 -0
  27. package/dist/core/_draft.core.methods.d.ts.map +1 -0
  28. package/dist/core/core.advanced.reactive-framework-test-suite.p2.test.d.ts +2 -0
  29. package/dist/core/core.advanced.reactive-framework-test-suite.p2.test.d.ts.map +1 -0
  30. package/dist/core/core.advanced.test.d.ts +2 -0
  31. package/dist/core/core.advanced.test.d.ts.map +1 -0
  32. package/dist/core/core.autolog.d.ts +15 -0
  33. package/dist/core/core.autolog.d.ts.map +1 -0
  34. package/dist/core/core.automatic.d.ts +23 -0
  35. package/dist/core/core.automatic.d.ts.map +1 -0
  36. package/dist/core/core.automatic.test.d.ts +2 -0
  37. package/dist/core/core.automatic.test.d.ts.map +1 -0
  38. package/dist/core/core.d.ts +38 -158
  39. package/dist/core/core.d.ts.map +1 -1
  40. package/dist/core/core.method.batch.d.ts +6 -0
  41. package/dist/core/core.method.batch.d.ts.map +1 -0
  42. package/dist/core/core.method.computed.d.ts +7 -0
  43. package/dist/core/core.method.computed.d.ts.map +1 -0
  44. package/dist/core/core.method.effect.d.ts +7 -0
  45. package/dist/core/core.method.effect.d.ts.map +1 -0
  46. package/dist/core/core.method.reactive.d.ts +6 -0
  47. package/dist/core/core.method.reactive.d.ts.map +1 -0
  48. package/dist/core/core.method.signal.d.ts +7 -0
  49. package/dist/core/core.method.signal.d.ts.map +1 -0
  50. package/dist/core/core.method.untrack.d.ts +6 -0
  51. package/dist/core/core.method.untrack.d.ts.map +1 -0
  52. package/dist/core/core.propagation.test.d.ts +2 -0
  53. package/dist/core/core.propagation.test.d.ts.map +1 -0
  54. package/dist/core/core.test.d.ts +2 -0
  55. package/dist/core/core.test.d.ts.map +1 -0
  56. package/dist/core/index.d.ts +4 -1
  57. package/dist/core/index.d.ts.map +1 -1
  58. package/dist/core/types.d.ts +31 -4
  59. package/dist/core/types.d.ts.map +1 -1
  60. package/dist/core.autolog.cjs +2 -0
  61. package/dist/core.autolog.cjs.map +1 -0
  62. package/dist/core.autolog.mjs +41 -0
  63. package/dist/core.autolog.mjs.map +1 -0
  64. package/dist/core.automatic.cjs +2 -0
  65. package/dist/core.automatic.cjs.map +1 -0
  66. package/dist/core.automatic.mjs +26 -0
  67. package/dist/core.automatic.mjs.map +1 -0
  68. package/dist/core.cjs +1 -1
  69. package/dist/core.cjs.map +1 -1
  70. package/dist/core.method.batch.cjs +2 -0
  71. package/dist/core.method.batch.cjs.map +1 -0
  72. package/dist/core.method.batch.mjs +13 -0
  73. package/dist/core.method.batch.mjs.map +1 -0
  74. package/dist/core.method.computed.cjs +2 -0
  75. package/dist/core.method.computed.cjs.map +1 -0
  76. package/dist/core.method.computed.mjs +122 -0
  77. package/dist/core.method.computed.mjs.map +1 -0
  78. package/dist/core.method.effect.cjs +2 -0
  79. package/dist/core.method.effect.cjs.map +1 -0
  80. package/dist/core.method.effect.mjs +49 -0
  81. package/dist/core.method.effect.mjs.map +1 -0
  82. package/dist/core.method.reactive.cjs +2 -0
  83. package/dist/core.method.reactive.cjs.map +1 -0
  84. package/dist/core.method.reactive.mjs +39 -0
  85. package/dist/core.method.reactive.mjs.map +1 -0
  86. package/dist/core.method.signal.cjs +2 -0
  87. package/dist/core.method.signal.cjs.map +1 -0
  88. package/dist/core.method.signal.mjs +75 -0
  89. package/dist/core.method.signal.mjs.map +1 -0
  90. package/dist/core.method.untrack.cjs +2 -0
  91. package/dist/core.method.untrack.cjs.map +1 -0
  92. package/dist/core.method.untrack.mjs +14 -0
  93. package/dist/core.method.untrack.mjs.map +1 -0
  94. package/dist/core.mjs +268 -592
  95. package/dist/core.mjs.map +1 -1
  96. package/dist/decorators/index.d.ts +1 -0
  97. package/dist/decorators/index.d.ts.map +1 -1
  98. package/dist/decorators/withCache/types.d.ts +29 -0
  99. package/dist/decorators/withCache/types.d.ts.map +1 -0
  100. package/dist/decorators/withCache/withCache.cjs +1 -1
  101. package/dist/decorators/withCache/withCache.cjs.map +1 -1
  102. package/dist/decorators/withCache/withCache.d.ts +4 -61
  103. package/dist/decorators/withCache/withCache.d.ts.map +1 -1
  104. package/dist/decorators/withCache/withCache.mjs +29 -9
  105. package/dist/decorators/withCache/withCache.mjs.map +1 -1
  106. package/dist/decorators/withValidation/index.d.ts +2 -0
  107. package/dist/decorators/withValidation/index.d.ts.map +1 -0
  108. package/dist/decorators/withValidation/withValidation.cjs +2 -0
  109. package/dist/decorators/withValidation/withValidation.cjs.map +1 -0
  110. package/dist/decorators/withValidation/withValidation.d.ts +18 -0
  111. package/dist/decorators/withValidation/withValidation.d.ts.map +1 -0
  112. package/dist/decorators/withValidation/withValidation.mjs +27 -0
  113. package/dist/decorators/withValidation/withValidation.mjs.map +1 -0
  114. package/dist/index.cjs +1 -1
  115. package/dist/index.d.ts +7 -1
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.mjs +14 -11
  118. package/dist/react/core.react-adapter.test.d.ts +2 -0
  119. package/dist/react/core.react-adapter.test.d.ts.map +1 -0
  120. package/dist/react/hooks/_draft.useReactiveValue.v2.d.ts +9 -0
  121. package/dist/react/hooks/_draft.useReactiveValue.v2.d.ts.map +1 -0
  122. package/dist/react/hooks/useReactiveSubscription.cjs +2 -0
  123. package/dist/react/hooks/useReactiveSubscription.cjs.map +1 -0
  124. package/dist/react/hooks/useReactiveSubscription.d.ts +7 -0
  125. package/dist/react/hooks/useReactiveSubscription.d.ts.map +1 -0
  126. package/dist/react/hooks/useReactiveSubscription.mjs +21 -0
  127. package/dist/react/hooks/useReactiveSubscription.mjs.map +1 -0
  128. package/dist/react/hooks/useReactiveValue.cjs +2 -0
  129. package/dist/react/hooks/useReactiveValue.cjs.map +1 -0
  130. package/dist/react/hooks/useReactiveValue.d.ts +3 -0
  131. package/dist/react/hooks/useReactiveValue.d.ts.map +1 -0
  132. package/dist/react/hooks/useReactiveValue.mjs +25 -0
  133. package/dist/react/hooks/useReactiveValue.mjs.map +1 -0
  134. package/dist/react/index.cjs +2 -1
  135. package/dist/react/index.cjs.map +1 -0
  136. package/dist/react/index.d.ts +9 -3
  137. package/dist/react/index.d.ts.map +1 -1
  138. package/dist/react/index.mjs +13 -6
  139. package/dist/react/index.mjs.map +1 -0
  140. package/dist/react/types.d.ts +0 -1
  141. package/dist/react/types.d.ts.map +1 -1
  142. package/dist/reactive-engine.umd.js +2 -2
  143. package/dist/reactive-engine.umd.js.map +1 -1
  144. package/dist/utils/getExtractedValues.cjs +2 -0
  145. package/dist/utils/getExtractedValues.cjs.map +1 -0
  146. package/dist/utils/getExtractedValues.mjs +24 -0
  147. package/dist/utils/getExtractedValues.mjs.map +1 -0
  148. package/dist/vue/core.vue-adapter.cjs +2 -0
  149. package/dist/vue/core.vue-adapter.cjs.map +1 -0
  150. package/dist/vue/core.vue-adapter.d.ts +8 -0
  151. package/dist/vue/core.vue-adapter.d.ts.map +1 -0
  152. package/dist/vue/core.vue-adapter.mjs +22 -0
  153. package/dist/vue/core.vue-adapter.mjs.map +1 -0
  154. package/dist/vue/core.vue-adapter.test.d.ts +2 -0
  155. package/dist/vue/core.vue-adapter.test.d.ts.map +1 -0
  156. package/dist/vue/index.cjs +2 -1
  157. package/dist/vue/index.cjs.map +1 -0
  158. package/dist/vue/index.d.ts +14 -2
  159. package/dist/vue/index.d.ts.map +1 -1
  160. package/dist/vue/index.mjs +54 -3
  161. package/dist/vue/index.mjs.map +1 -0
  162. package/package.json +4 -3
  163. package/dist/angular/ReactiveEngine4Angular.cjs +0 -2
  164. package/dist/angular/ReactiveEngine4Angular.cjs.map +0 -1
  165. package/dist/angular/ReactiveEngine4Angular.d.ts +0 -37
  166. package/dist/angular/ReactiveEngine4Angular.d.ts.map +0 -1
  167. package/dist/angular/ReactiveEngine4Angular.mjs +0 -45
  168. package/dist/angular/ReactiveEngine4Angular.mjs.map +0 -1
  169. package/dist/angular/core.angular.auto.test.d.ts +0 -2
  170. package/dist/angular/core.angular.auto.test.d.ts.map +0 -1
  171. package/dist/angular/core.angular.test.d.ts +0 -2
  172. package/dist/angular/core.angular.test.d.ts.map +0 -1
  173. package/dist/core/core.auto.test.d.ts +0 -2
  174. package/dist/core/core.auto.test.d.ts.map +0 -1
  175. package/dist/react/ReactiveEngine4React.cjs +0 -2
  176. package/dist/react/ReactiveEngine4React.cjs.map +0 -1
  177. package/dist/react/ReactiveEngine4React.d.ts +0 -34
  178. package/dist/react/ReactiveEngine4React.d.ts.map +0 -1
  179. package/dist/react/ReactiveEngine4React.mjs +0 -51
  180. package/dist/react/ReactiveEngine4React.mjs.map +0 -1
  181. package/dist/react/core.react.auto.test.d.ts +0 -2
  182. package/dist/react/core.react.auto.test.d.ts.map +0 -1
  183. package/dist/react/core.react.test.d.ts +0 -2
  184. package/dist/react/core.react.test.d.ts.map +0 -1
  185. package/dist/react/hooks/FilteredCatalog.auto.test.d.ts +0 -2
  186. package/dist/react/hooks/FilteredCatalog.auto.test.d.ts.map +0 -1
  187. package/dist/react/hooks/FilteredCatalog.test.d.ts +0 -2
  188. package/dist/react/hooks/FilteredCatalog.test.d.ts.map +0 -1
  189. package/dist/react/hooks/index.cjs +0 -1
  190. package/dist/react/hooks/index.d.ts +0 -4
  191. package/dist/react/hooks/index.d.ts.map +0 -1
  192. package/dist/react/hooks/index.mjs +0 -7
  193. package/dist/react/hooks/types.d.ts +0 -20
  194. package/dist/react/hooks/types.d.ts.map +0 -1
  195. package/dist/react/hooks/useReactiveSubscription/index.cjs +0 -1
  196. package/dist/react/hooks/useReactiveSubscription/index.d.ts +0 -2
  197. package/dist/react/hooks/useReactiveSubscription/index.d.ts.map +0 -1
  198. package/dist/react/hooks/useReactiveSubscription/index.mjs +0 -2
  199. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.auto.test.d.ts +0 -2
  200. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.auto.test.d.ts.map +0 -1
  201. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs +0 -2
  202. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs.map +0 -1
  203. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts +0 -7
  204. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts.map +0 -1
  205. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs +0 -27
  206. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs.map +0 -1
  207. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.test.d.ts +0 -2
  208. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.test.d.ts.map +0 -1
  209. package/dist/react/hooks/useReactiveValue/index.cjs +0 -1
  210. package/dist/react/hooks/useReactiveValue/index.d.ts +0 -2
  211. package/dist/react/hooks/useReactiveValue/index.d.ts.map +0 -1
  212. package/dist/react/hooks/useReactiveValue/index.mjs +0 -2
  213. package/dist/react/hooks/useReactiveValue/useReactiveValue.auto.test.d.ts +0 -2
  214. package/dist/react/hooks/useReactiveValue/useReactiveValue.auto.test.d.ts.map +0 -1
  215. package/dist/react/hooks/useReactiveValue/useReactiveValue.cjs +0 -2
  216. package/dist/react/hooks/useReactiveValue/useReactiveValue.cjs.map +0 -1
  217. package/dist/react/hooks/useReactiveValue/useReactiveValue.d.ts +0 -18
  218. package/dist/react/hooks/useReactiveValue/useReactiveValue.d.ts.map +0 -1
  219. package/dist/react/hooks/useReactiveValue/useReactiveValue.mjs +0 -25
  220. package/dist/react/hooks/useReactiveValue/useReactiveValue.mjs.map +0 -1
  221. package/dist/react/hooks/useReactiveValue/useReactiveValue.test.d.ts +0 -2
  222. package/dist/react/hooks/useReactiveValue/useReactiveValue.test.d.ts.map +0 -1
  223. package/dist/react/hooks/useReactiveValue0/index.cjs +0 -1
  224. package/dist/react/hooks/useReactiveValue0/index.d.ts +0 -2
  225. package/dist/react/hooks/useReactiveValue0/index.d.ts.map +0 -1
  226. package/dist/react/hooks/useReactiveValue0/index.mjs +0 -2
  227. package/dist/react/hooks/useReactiveValue0/useReactiveValue0.cjs +0 -2
  228. package/dist/react/hooks/useReactiveValue0/useReactiveValue0.cjs.map +0 -1
  229. package/dist/react/hooks/useReactiveValue0/useReactiveValue0.d.ts +0 -51
  230. package/dist/react/hooks/useReactiveValue0/useReactiveValue0.d.ts.map +0 -1
  231. package/dist/react/hooks/useReactiveValue0/useReactiveValue0.mjs +0 -23
  232. package/dist/react/hooks/useReactiveValue0/useReactiveValue0.mjs.map +0 -1
  233. package/dist/vue/ReactiveEngine4Vue.cjs +0 -2
  234. package/dist/vue/ReactiveEngine4Vue.cjs.map +0 -1
  235. package/dist/vue/ReactiveEngine4Vue.d.ts +0 -37
  236. package/dist/vue/ReactiveEngine4Vue.d.ts.map +0 -1
  237. package/dist/vue/ReactiveEngine4Vue.mjs +0 -53
  238. package/dist/vue/ReactiveEngine4Vue.mjs.map +0 -1
  239. package/dist/vue/composables/index.d.ts +0 -2
  240. package/dist/vue/composables/index.d.ts.map +0 -1
  241. package/dist/vue/composables/useReactiveValue.auto.test.d.ts +0 -2
  242. package/dist/vue/composables/useReactiveValue.auto.test.d.ts.map +0 -1
  243. package/dist/vue/composables/useReactiveValue.cjs +0 -2
  244. package/dist/vue/composables/useReactiveValue.cjs.map +0 -1
  245. package/dist/vue/composables/useReactiveValue.d.ts +0 -12
  246. package/dist/vue/composables/useReactiveValue.d.ts.map +0 -1
  247. package/dist/vue/composables/useReactiveValue.mjs +0 -19
  248. package/dist/vue/composables/useReactiveValue.mjs.map +0 -1
  249. package/dist/vue/composables/useReactiveValue.test.d.ts +0 -2
  250. package/dist/vue/composables/useReactiveValue.test.d.ts.map +0 -1
  251. package/dist/vue/core.vue.auto.test.d.ts +0 -2
  252. package/dist/vue/core.vue.auto.test.d.ts.map +0 -1
  253. package/dist/vue/core.vue.test.d.ts +0 -2
  254. package/dist/vue/core.vue.test.d.ts.map +0 -1
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ С МАРКЕРОМ ИСТОЧНИКА)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n // Создаем структурный узел внутри замыкания, чтобы хранить версию мутаций\n const signalNode = {\n version: 0\n }\n\n return {\n get value(): T {\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n\n const unsubscribeClosure = () => {\n subscribers.delete(consumer)\n }\n\n // КРИТИЧЕСКИЙ ШАГ ДЛЯ АВТОБАТЧИНГА: Сохраняем ссылку на контекст\n // узла и его версию непосредственно на замыкании функции отписки!\n (unsubscribeClosure as any)._sourceNode = signalNode\n\n consumer.cleanups.add(unsubscribeClosure)\n }\n }\n return val\n },\n set value(newValue: T) {\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue\n\n // Инкрементируем версию при каждой честной мутации данных\n signalNode.version++;\n\n (engine as any).onSignalChange?.(name, newValue, old)\n\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ (ОТКАЗОУСТОЙЧИВЫЙ)\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n // Изолируем панику эффекта, позволяя соседним эффектам в очереди успешно выполниться!\n console.error('[Reactive Engine: Effect Execution Error]', error)\n }\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\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 ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING ENTERPRISE REACTIVE ENGINE (v1.8.2-beta)\n *\n * Полностью автономный асингулярный движок с топологической сортировкой графа,\n * каскадным уничтожением вложенных эффектов и циклом схождения inner-записей.\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n private isFlushScheduled = false\n\n // Карта глубин зависимостей для топологической сортировки\n protected nodeDepths = new WeakMap<any, number>()\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО С АКТИВНОЙ ВАЛИДАЦИЕЙ РОДИТЕЛЕЙ\n * Перехватывает pull-запросы внутри транзакций и синхронно проверяет апстрим-узлы,\n * предотвращая холостые пересчеты (Кейсы #128, #132).\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_auto_computed'\n let cachedValue: T\n let isValueCached = false\n const downstreamSubscribers = new Set<any>()\n\n // Храним мапу версий родительских сигналов\n const upstreamVersions = new Map<any, number>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n // ПУЛЕНЕПРОБИВАЕМЫЙ ПЕРЕХВАТ: Если узел считается грязным, но у нас есть кэш,\n // мы проверяем, изменились ли реальные версии сигналов в апстриме\n if (computedNode.isDirty && isValueCached) {\n let hasRealChanges = false\n for (const [node, savedVersion] of upstreamVersions.entries()) {\n if (node.version !== savedVersion) {\n hasRealChanges = true\n break\n }\n }\n // Если версии совпали (изменений не было или был revert) — гасим грязь!\n if (!hasRealChanges) {\n computedNode.isDirty = false\n }\n }\n\n // Если узел действительно грязный или кэша еще нет — выполняем расчет\n if (computedNode.isDirty || !isValueCached) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n isValueCached = true\n\n // Запоминаем текущие версии сигналов, которые были прочитаны в процессе fn()\n upstreamVersions.clear()\n computedNode.cleanups.forEach((unsub: any) => {\n // Ищем родительский узел через ссылки подписок графа ядра\n if (unsub && typeof unsub === 'function') {\n // Извлекаем контекст источника, сохраненный при сборке зависимостей\n const srcNode = (engine as any).allEffects?.has(unsub) || unsub._sourceNode\n if (srcNode) {\n upstreamVersions.set(srcNode, srcNode.version || 0)\n }\n }\n })\n\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:auto:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n upstreamVersions.clear()\n\n engine.computedCache.delete(fn)\n }\n }\n\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n return computedInstance\n }\n\n /**\n * ВЫЧИСЛЕНИЕ ГЛУБИНЫ УЗЛА ДЛЯ ТОПОЛОГИЧЕСКОЙ СОРТИРОВКИ\n */\n protected getNodeDepth(node: any): number {\n if (!node) return 0\n if (this.nodeDepths.has(node)) return this.nodeDepths.get(node)!\n\n // По умолчанию глубина равна 1, увеличивается при обнаружении родительских контекстов\n return 1\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (ИЕРАРХИЯ + ТОПОЛОГИЯ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const parentConsumer = engine.activeConsumer // Ловим родительский контекст\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n // Вычисляем и фиксируем глубину эффекта относительно его динамических геттеров\n const currentDepth = engine.getNodeDepth(prevConsumer) + 1\n engine.nodeDepths.set(effectObj, currentDepth)\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // ПАТТЕРН CASCADE: Если эффект создан внутри родительского эффекта,\n // регистрируем его автоматическое уничтожение при пересчете родителя!\n if (parentConsumer) {\n const autoDisposeChild = () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n parentConsumer.cleanups.add(autoDisposeChild)\n }\n\n (engine as any).allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n }\n\n /**\n * АСИНХРОННЫЙ ЦИКЛ СХОЖДЕНИЯ ГРАФА (CONVERGENCE LOOP)\n * Прогоняет эффекты строго по топологической глубине и обрабатывает Inner Writes на месте.\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n\n // ЦИКЛ СХОЖДЕНИЯ (Convergence Loop): Крутимся до тех пор,\n // пока внутренние записи (Inner Writes) не перестанут загрязнять граф\n let iterations = 0\n const MAX_ITERATIONS = 100\n\n while (this.pendingEffects.size > 0 && iterations < MAX_ITERATIONS) {\n iterations++\n\n // ТОПОЛОГИЧЕСКАЯ СОРТИРОВКА: Сортируем эффекты по глубине вложенности графа,\n // чтобы апстрим-компьютеды всегда выполнялись раньше даунстрим-эффектов!\n const effectsToRun = Array.from(this.pendingEffects).sort((a: any, b: any) => {\n const depthA = this.getNodeDepth(a)\n const depthB = this.getNodeDepth(b)\n return depthA - depthB || a.id - b.id\n })\n\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n console.error('[Reactive Engine Automatic: Effect Error]', error)\n }\n })\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn('[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.')\n }\n })\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, 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\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\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\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, Computed, IEffect, EngineLoggerOptions, LogEventType, CleanupFn, TransactionContext, LogRecord, SignalOptions, ResourceOptions, ResourceState, Resource } from './types'\nimport { createComputed } from './core.method.computed'\nimport { createSignal } from './core.method.signal'\nimport { executeBatch } from './core.method.batch'\nimport { executeUntrack } from './core.method.untrack'\nimport { createReactive } from './core.method.reactive'\nimport { createEffect } from './core.method.effect'\n\n// Тип для конструктора класса\ntype Constructor<T> = new (...args: any[]) => T\n// Тип для фабричной функции зависимостей\ntype Factory<T> = (engine: any) => T\n// Универсальный тип токена DI\ntype InjectionToken<T> = Constructor<T> | Factory<T> | symbol | string\n\nconst badgeColors: Record<LogEventType, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;'\n}\nlet currentTransaction: TransactionContext | null = null\nfunction safeValueToString(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value)\n } catch (e) {\n return '[Cyclic Object or Layer]'\n }\n }\n return String(value)\n}\nexport function queueLog(type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }): void {\n if (!currentTransaction) {\n currentTransaction = { id: Math.random().toString(36).substring(2, 9), pendingLogQueue: [], isFlushing: false }\n queueMicrotask(() => flushLogs())\n }\n currentTransaction.pendingLogQueue.push({ type, label, from: details?.from, to: details?.to, payload: details?.payload, timestamp: Date.now() })\n}\nexport function flushLogs(): void {\n if (!currentTransaction || currentTransaction.isFlushing) return\n currentTransaction.isFlushing = true\n const queue = currentTransaction.pendingLogQueue\n if (queue.length === 0) {\n currentTransaction = null\n return\n }\n console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${currentTransaction.id}] (${queue.length} operations)`, 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;', 'color: #888; font-weight: normal;')\n for (const record of queue) {\n const colorStyle = badgeColors[record.type]\n const hasTransition = record.from !== undefined || record.to !== undefined\n let logMessage = `%c${record.type.toUpperCase()}%c ${record.label}`\n\n if (hasTransition) {\n if (!!record.from)\n logMessage += `(${safeValueToString(record.from)} → ${safeValueToString(record.to)})`\n else logMessage += `(${safeValueToString(record.to)})`\n }\n\n if (record.payload !== undefined) {\n console.groupCollapsed(logMessage, colorStyle, 'color: inherit;')\n console.log('Payload:', record.payload)\n console.groupEnd()\n } else {\n console.log(logMessage, colorStyle, 'color: inherit;')\n }\n }\n console.groupEnd()\n currentTransaction = null\n}\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n private logger: EngineLoggerOptions\n public epoch = 0\n public activeConsumer: any = null\n public batchDepth = 0\n public subscriberId = 0\n public pendingEffects = new Set<any>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\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\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\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 flushEffects(): void {\n if (this.batchDepth > 0) return\n const effects = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n effects.sort((a, b) => (a.depth || 0) - (b.depth || 0) || a.id - b.id)\n \n const prevConsumer = this.activeConsumer\n\n try {\n for (const effect of effects) {\n if (effect.isDisposed) continue\n\n if (effect.dependencies && effect.dependencies.size > 0) {\n for (const dep of effect.dependencies) {\n const rawNode = dep._node || dep\n if (rawNode.type === 'computed' && rawNode._isDirty && rawNode._isDirty()) {\n try {\n rawNode.run() \n } catch (err) {\n if (this.batchDepth === 0) throw err\n }\n }\n }\n }\n\n if (!effect.isDirty) continue\n\n try {\n effect.run()\n } catch (err) {\n // 🟢 ИСПРАВЛЕНО (core.test.ts): Убираем console.error, чтобы не спамить в stderr Vitest.\n // Если мы вне батча, мгновенно пробрасываем ошибку для корректных toThrow ассертов\n if (this.batchDepth === 0) throw err\n }\n }\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 private log ({ type, label, details, isInternalCoreSignal = false }: { type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }, isInternalCoreSignal?: boolean }) {\n const isEnabled = this.logger.isEnabled\n const isCoreOptimizationDebugEnabled = this.logger.isCoreOptimizationDebugEnabled\n if (isEnabled) {\n if (isInternalCoreSignal) {\n if (isCoreOptimizationDebugEnabled) queueLog(type, label, details)\n } else queueLog(type, label, details)\n }\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n return createSignal<T>(this, initialValue, optionsOrName)\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n // Просто делегируем вызов строго изолированной чистой функции\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 private 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 public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>,\n ): Resource<T> {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const resourceSignalName = isOptionsObject\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 retryCount = 0\n const baseDelay = 1000\n const useExponential = true\n const maxRetryDelay = 1000 * 60 * 5\n const timeoutMs = 1000\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `[CORE_INTERNAL_SIGNAL=1]:resource:state:${resourceSignalName}`\n )\n\n const updateResourceState = (nextState: ResourceState<T>) => {\n this.log({ type: 'resource', label: resourceSignalName, details: { to: nextState, from: state.value } })\n state.value = nextState\n }\n\n const load = async (sValue: S, effectSignal: AbortSignal, isSourceChange = false) => {\n if (effectSignal.aborted) return\n const isValid = options.validateBeforeFetch ? options.validateBeforeFetch(sValue) : true\n\n /**\n * 🧐 WIP_CORE: Есть два пути, ни один не будет ошибкой, если разкомментировать код ниже. Чуть бозже добавлю опци для более тонкой отладки ядра.\n *\n * - АКТИВНО: Разделяем мирную блокировку (false) и боевую ошибку (string): работать будет идеально, но без логов, связанных с пре-валидацией\n * - НЕАКТИВНО: Более очевидное логирование процессов пре-валидации (выставление ошибок и мониторинг разработчиком)\n */\n // --\n if (isValid === false) {\n // Если валидатор вернул строго false — мы тихо блокируем старт фетчера,\n // переводя ресурс в состояние ПОКОЯ (loading: false, error: null).\n // Это полностью ликвидирует генерацию ложных ошибок при монтировании!\n state.value = {\n loading: false,\n data: null,\n error: null, // Ошибки нет! Стейт стабилен.\n isRetrying: false\n }\n return\n }\n if (typeof isValid === 'string') {\n // Если валидатор вернул строку — это боевая декларативная ошибка валидации формы.\n // Здесь мы честно переводим ресурс в стейт ошибки, как и требовалось ранее.\n state.value = {\n loading: false,\n data: null,\n error: 'Core internal stopper',\n isRetrying: false\n }\n return\n }\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 : this.untrack(() => state.value.data)\n updateResourceState({ data: currentData, loading: false, error: errorMsg, isRetrying: false })\n return\n }\n }\n const shouldClear = isSourceChange && resetDataOnSourceChange\n const currentData = shouldClear ? null : this.untrack(() => state.value.data)\n updateResourceState({ data: currentData, loading: true, error: null, isRetrying: false })\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n if (effectSignal.aborted) return\n let combinedSignal = effectSignal\n try {\n const data = await fetcher(sValue, combinedSignal)\n if (effectSignal.aborted) return\n if (combinedSignal.aborted) {\n throw new DOMException('The operation timed out.', 'TimeoutError')\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({ data: null, loading: false, error: errorMsg, isRetrying: false })\n return\n }\n }\n if (effectSignal.aborted) return\n updateResourceState({ data, loading: false, error: null, isRetrying: false })\n return\n } catch (e: unknown) {\n if (effectSignal.aborted || ((e as Error).name === 'AbortError' && effectSignal.aborted)) return\n const isTimeout = (e as Error).name === 'TimeoutError' || (e as Error).name === 'AbortError' || (e as Error).message?.includes('timeout')\n const isCustomValidationError = getExtractedValues({\n tested: [(e as Error).message], expectedKey: 'THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY', valueType: 'number',\n })?.[0] === '1' || false\n const __defaultCustomValidationErrorMessage = 'Custom validation error'\n let customValidationErrorMessage: string = isCustomValidationError\n ? (getExtractedValues({\n tested: [(e as Error).message], expectedKey: 'MESSAGE', valueType: 'string',\n })?.[0] || __defaultCustomValidationErrorMessage)\n : __defaultCustomValidationErrorMessage\n const isFetchBodyValidationError = isCustomValidationError || (e as Error).name === 'ValidationError'\n if (attempt === retryCount || isFetchBodyValidationError) {\n if (effectSignal.aborted) return\n const finalError = isTimeout\n ? new Error(`Request timed out after ${timeoutMs}ms`, { cause: e })\n : isCustomValidationError\n ? new Error(customValidationErrorMessage, { cause: e })\n : e\n\n updateResourceState({\n data: null, loading: false,\n error: finalError instanceof Error ? finalError.message : typeof finalError === 'string' ? finalError : `typeof finalError is ${typeof finalError}`,\n isRetrying: false,\n })\n return\n } else {\n if (effectSignal.aborted) return\n let currentDelay = useExponential ? baseDelay * Math.pow(2, attempt) : baseDelay\n currentDelay = Math.min(currentDelay, maxRetryDelay)\n const jitter = Math.random() * 200\n currentDelay = currentDelay + jitter\n updateResourceState({ data: state.value.data, loading: true, error: null, isRetrying: true })\n const logReason = isTimeout ? 'таймауту' : 'ошибке сети'\n console.warn(`[Resource Retry] \"${resourceSignalName}\" сбой по ${logReason}. Попытка ${attempt + 1}/${retryCount > 0 ? retryCount + 1 : attempt + 1}...`)\n\n try {\n await this.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 this.effect(() => {\n const sValue = source ? source.value : undefined as S\n const effectController = new AbortController()\n activeEffectController = effectController\n\n this.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 }\n }\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function e(e,t){e.batchDepth++;try{return t()}finally{e.batchDepth--,e.batchDepth===0&&e.flushEffects()}}exports.executeBatch=e;
2
+ //# sourceMappingURL=core.method.batch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.batch.cjs","names":[],"sources":["../src/core/core.method.batch.ts"],"sourcesContent":["/**\n * Изолированный менеджер атомарных транзакций (batch) реактивного графа.\n * Гарантирует объединение множественных мутаций и выполнение эффектов строго один раз на выходе.\n */\nexport function executeBatch<T>(engine: any, fn: () => T): T {\n engine.batchDepth++\n try {\n return fn()\n } finally {\n engine.batchDepth--\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n }\n}\n"],"mappings":"AAIA,SAAgB,EAAgB,EAAa,EAAgB,CAC3D,EAAO,aACP,GAAI,CACF,OAAO,EAAG,CACZ,QAAU,CACR,EAAO,aACH,EAAO,aAAe,GACxB,EAAO,aAAa,CAExB,CACF"}
@@ -0,0 +1,13 @@
1
+ //#region src/core/core.method.batch.ts
2
+ function e(e, t) {
3
+ e.batchDepth++;
4
+ try {
5
+ return t();
6
+ } finally {
7
+ e.batchDepth--, e.batchDepth === 0 && e.flushEffects();
8
+ }
9
+ }
10
+ //#endregion
11
+ export { e as executeBatch };
12
+
13
+ //# sourceMappingURL=core.method.batch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.batch.mjs","names":[],"sources":["../src/core/core.method.batch.ts"],"sourcesContent":["/**\n * Изолированный менеджер атомарных транзакций (batch) реактивного графа.\n * Гарантирует объединение множественных мутаций и выполнение эффектов строго один раз на выходе.\n */\nexport function executeBatch<T>(engine: any, fn: () => T): T {\n engine.batchDepth++\n try {\n return fn()\n } finally {\n engine.batchDepth--\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n }\n}\n"],"mappings":";AAIA,SAAgB,EAAgB,GAAa,GAAgB;CAC3D,EAAO;CACP,IAAI;EACF,OAAO,EAAG;CACZ,UAAU;EAER,AADA,EAAO,cACH,EAAO,eAAe,KACxB,EAAO,aAAa;CAExB;AACF"}
@@ -0,0 +1,2 @@
1
+ function e(e,t,n){let r=e.computedCache.get(t)?.deref();if(r)return r;let i,a=!0,o=0,s=new Set,c=new Map,l=e=>{if(!e)return;let t=e._node||e;if(t.dependencies&&t.dependencies.size>0){let n=Array.from(t.dependencies);t.dependencies.clear(),t.depVersions&&t.depVersions.clear(),n.forEach(n=>{let r=n._node||n;r.subscribers&&(r.subscribers.delete(t),r.subscribers.delete(e),r.subscribers.delete(d),r.type===`computed`&&r.subscribers.size===0&&l(r))})}},u=new class extends Set{delete(n){let r=super.delete(n);return this.size===0&&(a=!0,l(d),e.computedCache.delete(t)),r}},d={id:e.subscriberId++,dependencies:s,subscribers:u,depth:1,type:`computed`,fn:t,get version(){return o},run:()=>{if(e.cycleDetectionStack.has(d))throw Error(`[Graph Error] Cyclic dependency detected`);e.cycleDetectionStack.add(d);let n=e.activeConsumer;e.activeConsumer=d,s.forEach(e=>{let t=e._node||e;t.subscribers&&t.subscribers.delete(d)}),s.clear(),c.clear();try{let n=t(),r=i&&typeof i==`object`,l=a||!r&&i!==n||r&&JSON.stringify(i)!==JSON.stringify(n);l?(i=n,o++,u.forEach(t=>{t.isDirty=!0,e.pendingEffects.add(t)})):u.forEach(e=>{e.isDirty=!1}),a=!1;let f=0;return s.forEach(t=>{let n=t._node||t;c.set(t,n.version===void 0?e.epoch:n.version),n.depth!==void 0&&n.depth>f&&(f=n.depth)}),d.depth=f+1,l}finally{e.activeConsumer=n,e.cycleDetectionStack.delete(d)}},markDirty:()=>{a||(a=!0,u.forEach(t=>{let n=t.isDirty;t.isDirty=!0,e.pendingEffects.add(t),!n&&t.subscribers&&t.subscribers.forEach(t=>{t.isDirty=!0,e.pendingEffects.add(t)})}))}},f={get value(){e.activeConsumer&&e.activeConsumer!==d&&(d.subscribers.add(e.activeConsumer),e.activeConsumer.dependencies.add(d));let t=a;if(!t&&s.size>0)for(let n of Array.from(s)){let r=n._node||n;if((r.version===void 0?n.version===void 0?e.epoch:n.version:r.version)!==c.get(n)){t=!0;break}}return t&&d.run(),i},get version(){return o},subscribe(t){let n={id:e.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,run:()=>{if(!n.isDisposed)try{t(f.value)}catch(e){console.error(e)}}};return d.subscribers.add(n),t(f.value),()=>{n.isDisposed=!0,d.subscribers.delete(n)}},subscribeState(e){return f.subscribe(e)},destroy:()=>{d.subscribers.clear(),l(d),e.computedCache.delete(t),a=!0},__subscribe(t){let n={id:e.subscriberId++,type:`effect`,run:t,isDirty:!1};return d.subscribers.add(n),()=>{u.delete(n)}}};return f._node=d,f.subscribers=u,f.dependencies=s,f._isDirty=()=>a,f.type=`computed`,f.run=()=>d.run(),d.destroy=()=>{e.computedCache.delete(t)},e.computedCache.set(t,new WeakRef(f)),f}exports.createComputed=e;
2
+ //# sourceMappingURL=core.method.computed.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.computed.cjs","names":[],"sources":["../src/core/core.method.computed.ts"],"sourcesContent":["import { Computed, CleanupFn } from './types'\n\n/**\n * Изолированная фабрика computed-узлов реактивного графа.\n * Гарантирует O(1) кэширование, ленивые вычисления и стабильный каскадный Garbage Collection.\n */\nexport function createComputed<T>(\n engine: any,\n fn: () => T,\n signalName?: string\n): Computed<T> {\n const cachedRef = engine.computedCache.get(fn)\n const existing = cachedRef?.deref()\n if (existing) return existing as Computed<T>\n \n let value: T\n let isDirty = true\n let version = 0\n \n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n \n // Канонический рекурсивный сборщик мертвых связей графа (Cascade GC)\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 const snapshotDeps = Array.from(actNode.dependencies)\n actNode.dependencies.clear()\n if (actNode.depVersions) actNode.depVersions.clear()\n \n snapshotDeps.forEach((dep: any) => {\n const rawDepNode = dep._node || dep\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 }\n }\n\n // Строго типизированный кастомный Set подписчиков с GC-триггером на уровне ноды ядра\n const subscribers = new class extends Set<any> {\n override delete(val: any): boolean {\n const res = super.delete(val)\n if (this.size === 0) {\n isDirty = true\n releaseNode(computedNode)\n engine.computedCache.delete(fn)\n }\n return res\n }\n }()\n\n const computedNode: any = {\n id: engine.subscriberId++,\n dependencies,\n subscribers,\n depth: 1,\n type: 'computed',\n fn,\n get version() { return version },\n run: () => {\n if (engine.cycleDetectionStack.has(computedNode)) throw new Error('[Graph Error] Cyclic dependency detected')\n engine.cycleDetectionStack.add(computedNode)\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n \n // Динамическое ленивое отсечение старых ребер перед каждым пересчетом (Dynamic Deps)\n dependencies.forEach(dep => {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(computedNode)\n })\n dependencies.clear()\n depVersions.clear()\n \n try {\n const newValue = fn()\n const isObj = value && typeof value === 'object'\n const changed = isDirty || (!isObj && value !== newValue) || (isObj && JSON.stringify(value) !== JSON.stringify(newValue))\n \n if (changed) {\n value = newValue\n version++\n \n subscribers.forEach(sub => {\n sub.isDirty = true\n engine.pendingEffects.add(sub)\n })\n } else {\n subscribers.forEach(sub => {\n sub.isDirty = false\n })\n }\n isDirty = false\n \n // 🟢 ИСПРАВЛЕНО (Dynamic Deps & #22): Фиксируем слепки версий СТРОГО внутри run(),\n // когда актуальный граф зависимостей текущего кадра сформирован окончательно.\n // Мапа depVersions всегда содержит только живые ребра без фантомных хвостов!\n let maxDepDepth = 0\n dependencies.forEach(dep => {\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version !== undefined ? rawNode.version : engine.epoch)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) maxDepDepth = rawNode.depth\n })\n computedNode.depth = maxDepDepth + 1\n return changed\n } finally {\n engine.activeConsumer = prevConsumer\n engine.cycleDetectionStack.delete(computedNode)\n }\n },\n markDirty: () => {\n if (!isDirty) {\n isDirty = true\n subscribers.forEach(sub => {\n const wasDirty = sub.isDirty\n sub.isDirty = true\n engine.pendingEffects.add(sub)\n if (!wasDirty && sub.subscribers) {\n sub.subscribers.forEach((s: any) => {\n s.isDirty = true\n engine.pendingEffects.add(s)\n })\n }\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value() {\n // Регистрируем любой активный консьюмер графа на фазе ленивого Pull-чтения\n if (engine.activeConsumer && engine.activeConsumer !== computedNode) {\n computedNode.subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(computedNode)\n }\n \n let needsUpdate = isDirty\n \n // Сверяем сохраненные версии зависимостей. Если родитель изменился, версия не совпадет\n if (!needsUpdate && dependencies.size > 0) {\n for (const dep of Array.from(dependencies)) {\n const rawNode = (dep as any)._node || dep\n const currentVer = rawNode.version !== undefined ? rawNode.version : (dep.version !== undefined ? dep.version : engine.epoch)\n if (currentVer !== depVersions.get(dep)) {\n needsUpdate = true\n break\n }\n }\n }\n \n if (needsUpdate) {\n computedNode.run()\n }\n return value\n },\n get version() {\n return version\n },\n subscribe(cb: (val: T) => void): CleanupFn {\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(computedInstance.value) } catch (err) { console.error(err) }\n }\n }\n computedNode.subscribers.add(fakeEffect)\n cb(computedInstance.value)\n return () => {\n fakeEffect.isDisposed = true\n computedNode.subscribers.delete(fakeEffect)\n }\n },\n subscribeState(cb: () => void): CleanupFn {\n return (computedInstance as any).subscribe(cb)\n },\n destroy: () => {\n computedNode.subscribers.clear()\n releaseNode(computedNode)\n engine.computedCache.delete(fn)\n isDirty = true\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 computedNode.subscribers.add(hookEffect)\n return () => {\n subscribers.delete(hookEffect)\n }\n }\n } as any\n\n ;(computedInstance as any)._node = computedNode\n ;(computedInstance as any).subscribers = subscribers\n ;(computedInstance as any).dependencies = dependencies\n \n computedInstance._isDirty = () => isDirty\n computedInstance.type = 'computed'\n computedInstance.run = () => computedNode.run()\n \n computedNode.destroy = () => {\n engine.computedCache.delete(fn)\n }\n\n engine.computedCache.set(fn, new WeakRef(computedInstance as any))\n return computedInstance\n}\n"],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ //#region src/core/core.method.computed.ts
2
+ function e(e, t, n) {
3
+ let r = e.computedCache.get(t)?.deref();
4
+ if (r) return r;
5
+ let i, a = !0, o = 0, s = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Map(), l = (e) => {
6
+ if (!e) return;
7
+ let t = e._node || e;
8
+ if (t.dependencies && t.dependencies.size > 0) {
9
+ let n = Array.from(t.dependencies);
10
+ t.dependencies.clear(), t.depVersions && t.depVersions.clear(), n.forEach((n) => {
11
+ let r = n._node || n;
12
+ r.subscribers && (r.subscribers.delete(t), r.subscribers.delete(e), r.subscribers.delete(d), r.type === "computed" && r.subscribers.size === 0 && l(r));
13
+ });
14
+ }
15
+ }, u = new class extends Set {
16
+ delete(n) {
17
+ let r = super.delete(n);
18
+ return this.size === 0 && (a = !0, l(d), e.computedCache.delete(t)), r;
19
+ }
20
+ }(), d = {
21
+ id: e.subscriberId++,
22
+ dependencies: s,
23
+ subscribers: u,
24
+ depth: 1,
25
+ type: "computed",
26
+ fn: t,
27
+ get version() {
28
+ return o;
29
+ },
30
+ run: () => {
31
+ if (e.cycleDetectionStack.has(d)) throw Error("[Graph Error] Cyclic dependency detected");
32
+ e.cycleDetectionStack.add(d);
33
+ let n = e.activeConsumer;
34
+ e.activeConsumer = d, s.forEach((e) => {
35
+ let t = e._node || e;
36
+ t.subscribers && t.subscribers.delete(d);
37
+ }), s.clear(), c.clear();
38
+ try {
39
+ let n = t(), r = i && typeof i == "object", l = a || !r && i !== n || r && JSON.stringify(i) !== JSON.stringify(n);
40
+ l ? (i = n, o++, u.forEach((t) => {
41
+ t.isDirty = !0, e.pendingEffects.add(t);
42
+ })) : u.forEach((e) => {
43
+ e.isDirty = !1;
44
+ }), a = !1;
45
+ let f = 0;
46
+ return s.forEach((t) => {
47
+ let n = t._node || t;
48
+ c.set(t, n.version === void 0 ? e.epoch : n.version), n.depth !== void 0 && n.depth > f && (f = n.depth);
49
+ }), d.depth = f + 1, l;
50
+ } finally {
51
+ e.activeConsumer = n, e.cycleDetectionStack.delete(d);
52
+ }
53
+ },
54
+ markDirty: () => {
55
+ a || (a = !0, u.forEach((t) => {
56
+ let n = t.isDirty;
57
+ t.isDirty = !0, e.pendingEffects.add(t), !n && t.subscribers && t.subscribers.forEach((t) => {
58
+ t.isDirty = !0, e.pendingEffects.add(t);
59
+ });
60
+ }));
61
+ }
62
+ }, f = {
63
+ get value() {
64
+ e.activeConsumer && e.activeConsumer !== d && (d.subscribers.add(e.activeConsumer), e.activeConsumer.dependencies.add(d));
65
+ let t = a;
66
+ if (!t && s.size > 0) for (let n of Array.from(s)) {
67
+ let r = n._node || n;
68
+ if ((r.version === void 0 ? n.version === void 0 ? e.epoch : n.version : r.version) !== c.get(n)) {
69
+ t = !0;
70
+ break;
71
+ }
72
+ }
73
+ return t && d.run(), i;
74
+ },
75
+ get version() {
76
+ return o;
77
+ },
78
+ subscribe(t) {
79
+ let n = {
80
+ id: e.subscriberId++,
81
+ isDirty: !0,
82
+ depth: 9999,
83
+ dependencies: /* @__PURE__ */ new Set(),
84
+ type: "effect",
85
+ run: () => {
86
+ if (!n.isDisposed) try {
87
+ t(f.value);
88
+ } catch (e) {
89
+ console.error(e);
90
+ }
91
+ }
92
+ };
93
+ return d.subscribers.add(n), t(f.value), () => {
94
+ n.isDisposed = !0, d.subscribers.delete(n);
95
+ };
96
+ },
97
+ subscribeState(e) {
98
+ return f.subscribe(e);
99
+ },
100
+ destroy: () => {
101
+ d.subscribers.clear(), l(d), e.computedCache.delete(t), a = !0;
102
+ },
103
+ __subscribe(t) {
104
+ let n = {
105
+ id: e.subscriberId++,
106
+ type: "effect",
107
+ run: t,
108
+ isDirty: !1
109
+ };
110
+ return d.subscribers.add(n), () => {
111
+ u.delete(n);
112
+ };
113
+ }
114
+ };
115
+ return f._node = d, f.subscribers = u, f.dependencies = s, f._isDirty = () => a, f.type = "computed", f.run = () => d.run(), d.destroy = () => {
116
+ e.computedCache.delete(t);
117
+ }, e.computedCache.set(t, new WeakRef(f)), f;
118
+ }
119
+ //#endregion
120
+ export { e as createComputed };
121
+
122
+ //# sourceMappingURL=core.method.computed.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.computed.mjs","names":[],"sources":["../src/core/core.method.computed.ts"],"sourcesContent":["import { Computed, CleanupFn } from './types'\n\n/**\n * Изолированная фабрика computed-узлов реактивного графа.\n * Гарантирует O(1) кэширование, ленивые вычисления и стабильный каскадный Garbage Collection.\n */\nexport function createComputed<T>(\n engine: any,\n fn: () => T,\n signalName?: string\n): Computed<T> {\n const cachedRef = engine.computedCache.get(fn)\n const existing = cachedRef?.deref()\n if (existing) return existing as Computed<T>\n \n let value: T\n let isDirty = true\n let version = 0\n \n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n \n // Канонический рекурсивный сборщик мертвых связей графа (Cascade GC)\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 const snapshotDeps = Array.from(actNode.dependencies)\n actNode.dependencies.clear()\n if (actNode.depVersions) actNode.depVersions.clear()\n \n snapshotDeps.forEach((dep: any) => {\n const rawDepNode = dep._node || dep\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 }\n }\n\n // Строго типизированный кастомный Set подписчиков с GC-триггером на уровне ноды ядра\n const subscribers = new class extends Set<any> {\n override delete(val: any): boolean {\n const res = super.delete(val)\n if (this.size === 0) {\n isDirty = true\n releaseNode(computedNode)\n engine.computedCache.delete(fn)\n }\n return res\n }\n }()\n\n const computedNode: any = {\n id: engine.subscriberId++,\n dependencies,\n subscribers,\n depth: 1,\n type: 'computed',\n fn,\n get version() { return version },\n run: () => {\n if (engine.cycleDetectionStack.has(computedNode)) throw new Error('[Graph Error] Cyclic dependency detected')\n engine.cycleDetectionStack.add(computedNode)\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n \n // Динамическое ленивое отсечение старых ребер перед каждым пересчетом (Dynamic Deps)\n dependencies.forEach(dep => {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(computedNode)\n })\n dependencies.clear()\n depVersions.clear()\n \n try {\n const newValue = fn()\n const isObj = value && typeof value === 'object'\n const changed = isDirty || (!isObj && value !== newValue) || (isObj && JSON.stringify(value) !== JSON.stringify(newValue))\n \n if (changed) {\n value = newValue\n version++\n \n subscribers.forEach(sub => {\n sub.isDirty = true\n engine.pendingEffects.add(sub)\n })\n } else {\n subscribers.forEach(sub => {\n sub.isDirty = false\n })\n }\n isDirty = false\n \n // 🟢 ИСПРАВЛЕНО (Dynamic Deps & #22): Фиксируем слепки версий СТРОГО внутри run(),\n // когда актуальный граф зависимостей текущего кадра сформирован окончательно.\n // Мапа depVersions всегда содержит только живые ребра без фантомных хвостов!\n let maxDepDepth = 0\n dependencies.forEach(dep => {\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version !== undefined ? rawNode.version : engine.epoch)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) maxDepDepth = rawNode.depth\n })\n computedNode.depth = maxDepDepth + 1\n return changed\n } finally {\n engine.activeConsumer = prevConsumer\n engine.cycleDetectionStack.delete(computedNode)\n }\n },\n markDirty: () => {\n if (!isDirty) {\n isDirty = true\n subscribers.forEach(sub => {\n const wasDirty = sub.isDirty\n sub.isDirty = true\n engine.pendingEffects.add(sub)\n if (!wasDirty && sub.subscribers) {\n sub.subscribers.forEach((s: any) => {\n s.isDirty = true\n engine.pendingEffects.add(s)\n })\n }\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value() {\n // Регистрируем любой активный консьюмер графа на фазе ленивого Pull-чтения\n if (engine.activeConsumer && engine.activeConsumer !== computedNode) {\n computedNode.subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(computedNode)\n }\n \n let needsUpdate = isDirty\n \n // Сверяем сохраненные версии зависимостей. Если родитель изменился, версия не совпадет\n if (!needsUpdate && dependencies.size > 0) {\n for (const dep of Array.from(dependencies)) {\n const rawNode = (dep as any)._node || dep\n const currentVer = rawNode.version !== undefined ? rawNode.version : (dep.version !== undefined ? dep.version : engine.epoch)\n if (currentVer !== depVersions.get(dep)) {\n needsUpdate = true\n break\n }\n }\n }\n \n if (needsUpdate) {\n computedNode.run()\n }\n return value\n },\n get version() {\n return version\n },\n subscribe(cb: (val: T) => void): CleanupFn {\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(computedInstance.value) } catch (err) { console.error(err) }\n }\n }\n computedNode.subscribers.add(fakeEffect)\n cb(computedInstance.value)\n return () => {\n fakeEffect.isDisposed = true\n computedNode.subscribers.delete(fakeEffect)\n }\n },\n subscribeState(cb: () => void): CleanupFn {\n return (computedInstance as any).subscribe(cb)\n },\n destroy: () => {\n computedNode.subscribers.clear()\n releaseNode(computedNode)\n engine.computedCache.delete(fn)\n isDirty = true\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 computedNode.subscribers.add(hookEffect)\n return () => {\n subscribers.delete(hookEffect)\n }\n }\n } as any\n\n ;(computedInstance as any)._node = computedNode\n ;(computedInstance as any).subscribers = subscribers\n ;(computedInstance as any).dependencies = dependencies\n \n computedInstance._isDirty = () => isDirty\n computedInstance.type = 'computed'\n computedInstance.run = () => computedNode.run()\n \n computedNode.destroy = () => {\n engine.computedCache.delete(fn)\n }\n\n engine.computedCache.set(fn, new WeakRef(computedInstance as any))\n return computedInstance\n}\n"],"mappings":";AAMA,SAAgB,EACd,GACA,GACA,GACa;CAEb,IAAM,IADY,EAAO,cAAc,IAAI,CAC1B,CAAA,EAAW,MAAM;CAClC,IAAI,GAAU,OAAO;CAErB,IAAI,GACA,IAAU,IACV,IAAU,GAER,oBAAe,IAAI,IAAS,GAC5B,oBAAc,IAAI,IAAiB,GAGnC,KAAe,MAAoB;EACvC,IAAI,CAAC,GAAM;EACX,IAAM,IAAU,EAAK,SAAS;EAE9B,IAAI,EAAQ,gBAAgB,EAAQ,aAAa,OAAO,GAAG;GACzD,IAAM,IAAe,MAAM,KAAK,EAAQ,YAAY;GAIpD,AAHA,EAAQ,aAAa,MAAM,GACvB,EAAQ,eAAa,EAAQ,YAAY,MAAM,GAEnD,EAAa,SAAS,MAAa;IACjC,IAAM,IAAa,EAAI,SAAS;IAChC,AAAI,EAAW,gBACb,EAAW,YAAY,OAAO,CAAO,GACrC,EAAW,YAAY,OAAO,CAAI,GAClC,EAAW,YAAY,OAAO,CAAY,GAEtC,EAAW,SAAS,cAAc,EAAW,YAAY,SAAS,KACpE,EAAY,CAAU;GAG5B,CAAC;EACH;CACF,GAGM,IAAc,IAAI,cAAc,IAAS;EAC7C,OAAgB,GAAmB;GACjC,IAAM,IAAM,MAAM,OAAO,CAAG;GAM5B,OALI,KAAK,SAAS,MAChB,IAAU,IACV,EAAY,CAAY,GACxB,EAAO,cAAc,OAAO,CAAE,IAEzB;EACT;CACF,EAAE,GAEI,IAAoB;EACxB,IAAI,EAAO;EACX;EACA;EACA,OAAO;EACP,MAAM;EACN;EACA,IAAI,UAAU;GAAE,OAAO;EAAQ;EAC/B,WAAW;GACT,IAAI,EAAO,oBAAoB,IAAI,CAAY,GAAG,MAAU,MAAM,0CAA0C;GAC5G,EAAO,oBAAoB,IAAI,CAAY;GAC3C,IAAM,IAAe,EAAO;GAS5B,AARA,EAAO,iBAAiB,GAGxB,EAAa,SAAQ,MAAO;IAC1B,IAAM,IAAa,EAAI,SAAS;IAChC,AAAI,EAAW,eAAa,EAAW,YAAY,OAAO,CAAY;GACxE,CAAC,GACD,EAAa,MAAM,GACnB,EAAY,MAAM;GAElB,IAAI;IACF,IAAM,IAAW,EAAG,GACd,IAAQ,KAAS,OAAO,KAAU,UAClC,IAAU,KAAY,CAAC,KAAS,MAAU,KAAc,KAAS,KAAK,UAAU,CAAK,MAAM,KAAK,UAAU,CAAQ;IAexH,AAbI,KACF,IAAQ,GACR,KAEA,EAAY,SAAQ,MAAO;KAEzB,AADA,EAAI,UAAU,IACd,EAAO,eAAe,IAAI,CAAG;IAC/B,CAAC,KAED,EAAY,SAAQ,MAAO;KACzB,EAAI,UAAU;IAChB,CAAC,GAEH,IAAU;IAKV,IAAI,IAAc;IAOlB,OANA,EAAa,SAAQ,MAAO;KAC1B,IAAM,IAAU,EAAI,SAAS;KAE7B,AADA,EAAY,IAAI,GAAK,EAAQ,YAAY,KAAA,IAA8B,EAAO,QAAzB,EAAQ,OAAsB,GAC/E,EAAQ,UAAU,KAAA,KAAa,EAAQ,QAAQ,MAAa,IAAc,EAAQ;IACxF,CAAC,GACD,EAAa,QAAQ,IAAc,GAC5B;GACT,UAAU;IAER,AADA,EAAO,iBAAiB,GACxB,EAAO,oBAAoB,OAAO,CAAY;GAChD;EACF;EACA,iBAAiB;GACf,AAAK,MACH,IAAU,IACV,EAAY,SAAQ,MAAO;IACzB,IAAM,IAAW,EAAI;IAGrB,AAFA,EAAI,UAAU,IACd,EAAO,eAAe,IAAI,CAAG,GACzB,CAAC,KAAY,EAAI,eACnB,EAAI,YAAY,SAAS,MAAW;KAElC,AADA,EAAE,UAAU,IACZ,EAAO,eAAe,IAAI,CAAC;IAC7B,CAAC;GAEL,CAAC;EAEL;CACF,GAEM,IAAgC;EACpC,IAAI,QAAQ;GAEV,AAAI,EAAO,kBAAkB,EAAO,mBAAmB,MACrD,EAAa,YAAY,IAAI,EAAO,cAAc,GAClD,EAAO,eAAe,aAAa,IAAI,CAAY;GAGrD,IAAI,IAAc;GAGlB,IAAI,CAAC,KAAe,EAAa,OAAO,GACtC,KAAK,IAAM,KAAO,MAAM,KAAK,CAAY,GAAG;IAC1C,IAAM,IAAW,EAAY,SAAS;IAEtC,KADmB,EAAQ,YAAY,KAAA,IAA+B,EAAI,YAAY,KAAA,IAA0B,EAAO,QAArB,EAAI,UAAnD,EAAQ,aACxC,EAAY,IAAI,CAAG,GAAG;KACvC,IAAc;KACd;IACF;GACF;GAMF,OAHI,KACF,EAAa,IAAI,GAEZ;EACT;EACA,IAAI,UAAU;GACZ,OAAO;EACT;EACA,UAAU,GAAiC;GACzC,IAAM,IAAkB;IACtB,IAAI,EAAO;IACX,SAAS;IACT,OAAO;IACP,8BAAc,IAAI,IAAI;IACtB,MAAM;IACN,WAAW;KACL,OAAW,YACf,IAAI;MAAE,EAAG,EAAiB,KAAK;KAAE,SAAS,GAAK;MAAE,QAAQ,MAAM,CAAG;KAAE;IACtE;GACF;GAGA,OAFA,EAAa,YAAY,IAAI,CAAU,GACvC,EAAG,EAAiB,KAAK,SACZ;IAEX,AADA,EAAW,aAAa,IACxB,EAAa,YAAY,OAAO,CAAU;GAC5C;EACF;EACA,eAAe,GAA2B;GACxC,OAAQ,EAAyB,UAAU,CAAE;EAC/C;EACA,eAAe;GAIb,AAHA,EAAa,YAAY,MAAM,GAC/B,EAAY,CAAY,GACxB,EAAO,cAAc,OAAO,CAAE,GAC9B,IAAU;EACZ;EACA,YAAY,GAA2B;GACrC,IAAM,IAAkB;IACtB,IAAI,EAAO;IACX,MAAM;IACN,KAAK;IACL,SAAS;GACX;GAEA,OADA,EAAa,YAAY,IAAI,CAAU,SAC1B;IACX,EAAY,OAAO,CAAU;GAC/B;EACF;CACF;CAeA,OAbC,EAA0B,QAAQ,GAClC,EAA0B,cAAc,GACxC,EAA0B,eAAe,GAE1C,EAAiB,iBAAiB,GAClC,EAAiB,OAAO,YACxB,EAAiB,YAAY,EAAa,IAAI,GAE9C,EAAa,gBAAgB;EAC3B,EAAO,cAAc,OAAO,CAAE;CAChC,GAEA,EAAO,cAAc,IAAI,GAAI,IAAI,QAAQ,CAAuB,CAAC,GAC1D;AACT"}
@@ -0,0 +1,2 @@
1
+ function e(e,t,n){let r=new Set,i=new Set,a={id:e.subscriberId++,isDirty:!0,depth:1e3,dependencies:i,cleanups:r,type:`effect`,run:()=>{if(a.isDisposed||a===e.activeConsumer)return;let o=e.activeConsumer;e.activeConsumer=a;let s=new Set(i);i.clear();try{r.forEach(e=>{try{e()}catch(e){console.error(e)}}),r.clear();let o=t();typeof o==`function`&&r.add(o),a.isDirty=!1,s.forEach(e=>{i.has(e)||e.subscribers.delete(a)}),e.log({type:`effect`,label:n||`unnamed_effect`})}finally{e.activeConsumer=o}}};return a.run(),()=>{a.isDisposed=!0,r.forEach(e=>{try{e()}catch(e){console.error(e)}}),r.clear(),i.forEach(e=>e.subscribers.delete(a)),i.clear(),e.pendingEffects.delete(a)}}exports.createEffect=e;
2
+ //# sourceMappingURL=core.method.effect.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.effect.cjs","names":[],"sources":["../src/core/core.method.effect.ts"],"sourcesContent":["import { CleanupFn } from './types'\n\n/**\n * Изолированная фабрика сайд-эффектов реактивного графа.\n * Полностью отвязана от лексического контекста класса для абсолютной чистоты V8.\n */\nexport function createEffect(\n engine: any,\n fn: () => void | CleanupFn,\n effectName?: string\n): () => void {\n const cleanups = new Set<CleanupFn>()\n const dependencies = new Set<any>()\n \n const effectNode: any = {\n id: engine.subscriberId++,\n isDirty: true,\n depth: 1000,\n dependencies,\n cleanups,\n type: 'effect',\n run: () => {\n if (effectNode.isDisposed) return\n if (effectNode === engine.activeConsumer) return\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectNode\n const prevDeps = new Set(dependencies)\n dependencies.clear()\n try {\n cleanups.forEach(cb => { try { cb() } catch (err) { console.error(err) } })\n cleanups.clear()\n const cleanup = fn()\n if (typeof cleanup === 'function') cleanups.add(cleanup)\n effectNode.isDirty = false\n prevDeps.forEach(dep => {\n if (!dependencies.has(dep)) dep.subscribers.delete(effectNode)\n })\n engine.log({ type: 'effect', label: effectName || 'unnamed_effect' })\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n \n effectNode.run()\n \n return () => {\n effectNode.isDisposed = true\n cleanups.forEach(cb => { try { cb() } catch (err) { console.error(err) } })\n cleanups.clear()\n dependencies.forEach(dep => dep.subscribers.delete(effectNode))\n dependencies.clear()\n engine.pendingEffects.delete(effectNode)\n }\n}\n"],"mappings":"AAMA,SAAgB,EACd,EACA,EACA,EACY,CACZ,IAAM,EAAW,IAAI,IACf,EAAe,IAAI,IAEnB,EAAkB,CACtB,GAAI,EAAO,eACX,QAAS,GACT,MAAO,IACP,eACA,WACA,KAAM,SACN,QAAW,CAET,GADI,EAAW,YACX,IAAe,EAAO,eAAgB,OAC1C,IAAM,EAAe,EAAO,eAC5B,EAAO,eAAiB,EACxB,IAAM,EAAW,IAAI,IAAI,CAAY,EACrC,EAAa,MAAM,EACnB,GAAI,CACF,EAAS,QAAQ,GAAM,CAAE,GAAI,CAAE,EAAG,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,CAAE,CAAC,EAC1E,EAAS,MAAM,EACf,IAAM,EAAU,EAAG,EACf,OAAO,GAAY,YAAY,EAAS,IAAI,CAAO,EACvD,EAAW,QAAU,GACrB,EAAS,QAAQ,GAAO,CACjB,EAAa,IAAI,CAAG,GAAG,EAAI,YAAY,OAAO,CAAU,CAC/D,CAAC,EACD,EAAO,IAAI,CAAE,KAAM,SAAU,MAAO,GAAc,gBAAiB,CAAC,CACtE,QAAU,CACR,EAAO,eAAiB,CAC1B,CACF,CACF,EAIA,OAFA,EAAW,IAAI,MAEF,CACX,EAAW,WAAa,GACxB,EAAS,QAAQ,GAAM,CAAE,GAAI,CAAE,EAAG,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,CAAE,CAAC,EAC1E,EAAS,MAAM,EACf,EAAa,QAAQ,GAAO,EAAI,YAAY,OAAO,CAAU,CAAC,EAC9D,EAAa,MAAM,EACnB,EAAO,eAAe,OAAO,CAAU,CACzC,CACF"}
@@ -0,0 +1,49 @@
1
+ //#region src/core/core.method.effect.ts
2
+ function e(e, t, n) {
3
+ let r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(), a = {
4
+ id: e.subscriberId++,
5
+ isDirty: !0,
6
+ depth: 1e3,
7
+ dependencies: i,
8
+ cleanups: r,
9
+ type: "effect",
10
+ run: () => {
11
+ if (a.isDisposed || a === e.activeConsumer) return;
12
+ let o = e.activeConsumer;
13
+ e.activeConsumer = a;
14
+ let s = new Set(i);
15
+ i.clear();
16
+ try {
17
+ r.forEach((e) => {
18
+ try {
19
+ e();
20
+ } catch (e) {
21
+ console.error(e);
22
+ }
23
+ }), r.clear();
24
+ let o = t();
25
+ typeof o == "function" && r.add(o), a.isDirty = !1, s.forEach((e) => {
26
+ i.has(e) || e.subscribers.delete(a);
27
+ }), e.log({
28
+ type: "effect",
29
+ label: n || "unnamed_effect"
30
+ });
31
+ } finally {
32
+ e.activeConsumer = o;
33
+ }
34
+ }
35
+ };
36
+ return a.run(), () => {
37
+ a.isDisposed = !0, r.forEach((e) => {
38
+ try {
39
+ e();
40
+ } catch (e) {
41
+ console.error(e);
42
+ }
43
+ }), r.clear(), i.forEach((e) => e.subscribers.delete(a)), i.clear(), e.pendingEffects.delete(a);
44
+ };
45
+ }
46
+ //#endregion
47
+ export { e as createEffect };
48
+
49
+ //# sourceMappingURL=core.method.effect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.effect.mjs","names":[],"sources":["../src/core/core.method.effect.ts"],"sourcesContent":["import { CleanupFn } from './types'\n\n/**\n * Изолированная фабрика сайд-эффектов реактивного графа.\n * Полностью отвязана от лексического контекста класса для абсолютной чистоты V8.\n */\nexport function createEffect(\n engine: any,\n fn: () => void | CleanupFn,\n effectName?: string\n): () => void {\n const cleanups = new Set<CleanupFn>()\n const dependencies = new Set<any>()\n \n const effectNode: any = {\n id: engine.subscriberId++,\n isDirty: true,\n depth: 1000,\n dependencies,\n cleanups,\n type: 'effect',\n run: () => {\n if (effectNode.isDisposed) return\n if (effectNode === engine.activeConsumer) return\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectNode\n const prevDeps = new Set(dependencies)\n dependencies.clear()\n try {\n cleanups.forEach(cb => { try { cb() } catch (err) { console.error(err) } })\n cleanups.clear()\n const cleanup = fn()\n if (typeof cleanup === 'function') cleanups.add(cleanup)\n effectNode.isDirty = false\n prevDeps.forEach(dep => {\n if (!dependencies.has(dep)) dep.subscribers.delete(effectNode)\n })\n engine.log({ type: 'effect', label: effectName || 'unnamed_effect' })\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n \n effectNode.run()\n \n return () => {\n effectNode.isDisposed = true\n cleanups.forEach(cb => { try { cb() } catch (err) { console.error(err) } })\n cleanups.clear()\n dependencies.forEach(dep => dep.subscribers.delete(effectNode))\n dependencies.clear()\n engine.pendingEffects.delete(effectNode)\n }\n}\n"],"mappings":";AAMA,SAAgB,EACd,GACA,GACA,GACY;CACZ,IAAM,oBAAW,IAAI,IAAe,GAC9B,oBAAe,IAAI,IAAS,GAE5B,IAAkB;EACtB,IAAI,EAAO;EACX,SAAS;EACT,OAAO;EACP;EACA;EACA,MAAM;EACN,WAAW;GAET,IADI,EAAW,cACX,MAAe,EAAO,gBAAgB;GAC1C,IAAM,IAAe,EAAO;GAC5B,EAAO,iBAAiB;GACxB,IAAM,IAAW,IAAI,IAAI,CAAY;GACrC,EAAa,MAAM;GACnB,IAAI;IAEF,AADA,EAAS,SAAQ,MAAM;KAAE,IAAI;MAAE,EAAG;KAAE,SAAS,GAAK;MAAE,QAAQ,MAAM,CAAG;KAAE;IAAE,CAAC,GAC1E,EAAS,MAAM;IACf,IAAM,IAAU,EAAG;IAMnB,AALI,OAAO,KAAY,cAAY,EAAS,IAAI,CAAO,GACvD,EAAW,UAAU,IACrB,EAAS,SAAQ,MAAO;KACtB,AAAK,EAAa,IAAI,CAAG,KAAG,EAAI,YAAY,OAAO,CAAU;IAC/D,CAAC,GACD,EAAO,IAAI;KAAE,MAAM;KAAU,OAAO,KAAc;IAAiB,CAAC;GACtE,UAAU;IACR,EAAO,iBAAiB;GAC1B;EACF;CACF;CAIA,OAFA,EAAW,IAAI,SAEF;EAMX,AALA,EAAW,aAAa,IACxB,EAAS,SAAQ,MAAM;GAAE,IAAI;IAAE,EAAG;GAAE,SAAS,GAAK;IAAE,QAAQ,MAAM,CAAG;GAAE;EAAE,CAAC,GAC1E,EAAS,MAAM,GACf,EAAa,SAAQ,MAAO,EAAI,YAAY,OAAO,CAAU,CAAC,GAC9D,EAAa,MAAM,GACnB,EAAO,eAAe,OAAO,CAAU;CACzC;AACF"}
@@ -0,0 +1,2 @@
1
+ function e(e,t,n){if(e.proxyTargets.has(t))return t;if(e.proxyCache.has(t))return e.proxyCache.get(t);e.reactiveSignals.has(t)||e.reactiveSignals.set(t,new Map);let r=e.reactiveSignals.get(t),i=new Proxy(t,{get(t,i,a){if(i===`__subscribe`&&Array.isArray(t))return n=>{let i=r.get(`length`);return i||(i=e.signal(t.length),r.set(`length`,i)),i.subscribe(n)};if(typeof i==`symbol`||i===`constructor`||i===`toJSON`)return Reflect.get(t,i,a);let o=r.get(i);o||(o=e.signal(Reflect.get(t,i)),r.set(i,o));let s=o.value;return e.activeConsumer&&e.log({type:`reactive`,label:`Read ${n||``}.${String(i)}`,details:{to:s}}),typeof s==`object`&&s?e.reactive(s,n?`${n}.${String(i)}`:String(i)):s},set(t,n,i,a){let o=(e.proxyTargets.has(i),i),s=Reflect.get(t,n);if(s===o&&n!==`length`)return!0;Reflect.set(t,n,o);let c=r.get(n);if(c||(c=e.signal(s),r.set(n,c)),c.value=o,Array.isArray(t)&&n!==`length`){let e=r.get(`length`);e&&(e.value=t.length)}return!0}});return e.proxyCache.set(t,i),e.proxyTargets.add(i),i}exports.createReactive=e;
2
+ //# sourceMappingURL=core.method.reactive.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.reactive.cjs","names":[],"sources":["../src/core/core.method.reactive.ts"],"sourcesContent":["/**\n * Изолированная фабрика глубоких реактивных Proxy-объектов графа.\n * Полностью отвязана от лексического контекста класса для абсолютной чистоты V8.\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 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 sig = engine.signal(Reflect.get(t, prop))\n signalsMap.set(prop, sig)\n }\n const val = sig.value\n if (engine.activeConsumer) engine.log({ type: 'reactive', label: `Read ${name || ''}.${String(prop)}`, details: { to: val } })\n if (val !== null && typeof val === 'object') return engine.reactive(val, name ? `${name}.${String(prop)}` : String(prop))\n return val\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 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 sig.value = rawValue\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"],"mappings":"AAIA,SAAgB,EACd,EACA,EACA,EACG,CACH,GAAI,EAAO,aAAa,IAAI,CAAM,EAAG,OAAO,EAC5C,GAAI,EAAO,WAAW,IAAI,CAAM,EAAG,OAAO,EAAO,WAAW,IAAI,CAAM,EACjE,EAAO,gBAAgB,IAAI,CAAM,GAAG,EAAO,gBAAgB,IAAI,EAAQ,IAAI,GAAK,EACrF,IAAM,EAAa,EAAO,gBAAgB,IAAI,CAAM,EA8C9C,EAAQ,IAAI,MAAM,EAAQ,CA3C9B,IAAI,EAAM,EAAuB,EAAe,CAC9C,GAAI,IAAS,eAAiB,MAAM,QAAQ,CAAC,EAC3C,MAAQ,IAAmB,CACzB,IAAI,EAAY,EAAW,IAAI,QAAQ,EAKvC,OAJK,IACH,EAAY,EAAO,OAAO,EAAE,MAAM,EAClC,EAAW,IAAI,SAAU,CAAS,GAE7B,EAAU,UAAU,CAAE,CAC/B,EAEF,GAAI,OAAO,GAAS,UAAY,IAAS,eAAiB,IAAS,SAAU,OAAO,QAAQ,IAAI,EAAG,EAAM,CAAQ,EAEjH,IAAI,EAAM,EAAW,IAAI,CAAI,EACxB,IACH,EAAM,EAAO,OAAO,QAAQ,IAAI,EAAG,CAAI,CAAC,EACxC,EAAW,IAAI,EAAM,CAAG,GAE1B,IAAM,EAAM,EAAI,MAGhB,OAFI,EAAO,gBAAgB,EAAO,IAAI,CAAE,KAAM,WAAY,MAAO,QAAQ,GAAQ,GAAG,GAAG,OAAO,CAAI,IAAK,QAAS,CAAE,GAAI,CAAI,CAAE,CAAC,EACzG,OAAO,GAAQ,UAA/B,EAAgD,EAAO,SAAS,EAAK,EAAO,GAAG,EAAK,GAAG,OAAO,CAAI,IAAM,OAAO,CAAI,CAAC,EACjH,CACT,EACA,IAAI,EAAM,EAAuB,EAAY,EAAe,CAC1D,IAAM,GAAW,EAAO,aAAa,IAAI,CAAK,EAAI,GAC5C,EAAW,QAAQ,IAAI,EAAG,CAAI,EACpC,GAAI,IAAa,GAAY,IAAS,SAAU,MAAO,GACvD,QAAQ,IAAI,EAAG,EAAM,CAAQ,EAE7B,IAAI,EAAM,EAAW,IAAI,CAAI,EAM7B,GALK,IACH,EAAM,EAAO,OAAO,CAAQ,EAC5B,EAAW,IAAI,EAAM,CAAG,GAE1B,EAAI,MAAQ,EACR,MAAM,QAAQ,CAAC,GAAK,IAAS,SAAU,CACzC,IAAI,EAAY,EAAW,IAAI,QAAQ,EACnC,IAAW,EAAU,MAAQ,EAAE,OACrC,CACA,MAAO,EACT,CAG8B,CAAO,EAGvC,OAFA,EAAO,WAAW,IAAI,EAAQ,CAAK,EACnC,EAAO,aAAa,IAAI,CAAK,EACtB,CACT"}
@@ -0,0 +1,39 @@
1
+ //#region src/core/core.method.reactive.ts
2
+ function e(e, t, n) {
3
+ if (e.proxyTargets.has(t)) return t;
4
+ if (e.proxyCache.has(t)) return e.proxyCache.get(t);
5
+ e.reactiveSignals.has(t) || e.reactiveSignals.set(t, /* @__PURE__ */ new Map());
6
+ let r = e.reactiveSignals.get(t), i = new Proxy(t, {
7
+ get(t, i, a) {
8
+ if (i === "__subscribe" && Array.isArray(t)) return (n) => {
9
+ let i = r.get("length");
10
+ return i || (i = e.signal(t.length), r.set("length", i)), i.subscribe(n);
11
+ };
12
+ if (typeof i == "symbol" || i === "constructor" || i === "toJSON") return Reflect.get(t, i, a);
13
+ let o = r.get(i);
14
+ o || (o = e.signal(Reflect.get(t, i)), r.set(i, o));
15
+ let s = o.value;
16
+ return e.activeConsumer && e.log({
17
+ type: "reactive",
18
+ label: `Read ${n || ""}.${String(i)}`,
19
+ details: { to: s }
20
+ }), typeof s == "object" && s ? e.reactive(s, n ? `${n}.${String(i)}` : String(i)) : s;
21
+ },
22
+ set(t, n, i, a) {
23
+ let o = (e.proxyTargets.has(i), i), s = Reflect.get(t, n);
24
+ if (s === o && n !== "length") return !0;
25
+ Reflect.set(t, n, o);
26
+ let c = r.get(n);
27
+ if (c || (c = e.signal(s), r.set(n, c)), c.value = o, Array.isArray(t) && n !== "length") {
28
+ let e = r.get("length");
29
+ e && (e.value = t.length);
30
+ }
31
+ return !0;
32
+ }
33
+ });
34
+ return e.proxyCache.set(t, i), e.proxyTargets.add(i), i;
35
+ }
36
+ //#endregion
37
+ export { e as createReactive };
38
+
39
+ //# sourceMappingURL=core.method.reactive.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.reactive.mjs","names":[],"sources":["../src/core/core.method.reactive.ts"],"sourcesContent":["/**\n * Изолированная фабрика глубоких реактивных Proxy-объектов графа.\n * Полностью отвязана от лексического контекста класса для абсолютной чистоты V8.\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 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 sig = engine.signal(Reflect.get(t, prop))\n signalsMap.set(prop, sig)\n }\n const val = sig.value\n if (engine.activeConsumer) engine.log({ type: 'reactive', label: `Read ${name || ''}.${String(prop)}`, details: { to: val } })\n if (val !== null && typeof val === 'object') return engine.reactive(val, name ? `${name}.${String(prop)}` : String(prop))\n return val\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 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 sig.value = rawValue\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"],"mappings":";AAIA,SAAgB,EACd,GACA,GACA,GACG;CACH,IAAI,EAAO,aAAa,IAAI,CAAM,GAAG,OAAO;CAC5C,IAAI,EAAO,WAAW,IAAI,CAAM,GAAG,OAAO,EAAO,WAAW,IAAI,CAAM;CACtE,AAAK,EAAO,gBAAgB,IAAI,CAAM,KAAG,EAAO,gBAAgB,IAAI,mBAAQ,IAAI,IAAI,CAAC;CACrF,IAAM,IAAa,EAAO,gBAAgB,IAAI,CAAM,GA8C9C,IAAQ,IAAI,MAAM,GAAQ;EA3C9B,IAAI,GAAM,GAAuB,GAAe;GAC9C,IAAI,MAAS,iBAAiB,MAAM,QAAQ,CAAC,GAC3C,QAAQ,MAAmB;IACzB,IAAI,IAAY,EAAW,IAAI,QAAQ;IAKvC,OAJK,MACH,IAAY,EAAO,OAAO,EAAE,MAAM,GAClC,EAAW,IAAI,UAAU,CAAS,IAE7B,EAAU,UAAU,CAAE;GAC/B;GAEF,IAAI,OAAO,KAAS,YAAY,MAAS,iBAAiB,MAAS,UAAU,OAAO,QAAQ,IAAI,GAAG,GAAM,CAAQ;GAEjH,IAAI,IAAM,EAAW,IAAI,CAAI;GAC7B,AAAK,MACH,IAAM,EAAO,OAAO,QAAQ,IAAI,GAAG,CAAI,CAAC,GACxC,EAAW,IAAI,GAAM,CAAG;GAE1B,IAAM,IAAM,EAAI;GAGhB,OAFI,EAAO,kBAAgB,EAAO,IAAI;IAAE,MAAM;IAAY,OAAO,QAAQ,KAAQ,GAAG,GAAG,OAAO,CAAI;IAAK,SAAS,EAAE,IAAI,EAAI;GAAE,CAAC,GACzG,OAAO,KAAQ,YAA/B,IAAgD,EAAO,SAAS,GAAK,IAAO,GAAG,EAAK,GAAG,OAAO,CAAI,MAAM,OAAO,CAAI,CAAC,IACjH;EACT;EACA,IAAI,GAAM,GAAuB,GAAY,GAAe;GAC1D,IAAM,KAAW,EAAO,aAAa,IAAI,CAAK,GAAI,IAC5C,IAAW,QAAQ,IAAI,GAAG,CAAI;GACpC,IAAI,MAAa,KAAY,MAAS,UAAU,OAAO;GACvD,QAAQ,IAAI,GAAG,GAAM,CAAQ;GAE7B,IAAI,IAAM,EAAW,IAAI,CAAI;GAM7B,IALK,MACH,IAAM,EAAO,OAAO,CAAQ,GAC5B,EAAW,IAAI,GAAM,CAAG,IAE1B,EAAI,QAAQ,GACR,MAAM,QAAQ,CAAC,KAAK,MAAS,UAAU;IACzC,IAAI,IAAY,EAAW,IAAI,QAAQ;IACvC,AAAI,MAAW,EAAU,QAAQ,EAAE;GACrC;GACA,OAAO;EACT;CAG8B,CAAO;CAGvC,OAFA,EAAO,WAAW,IAAI,GAAQ,CAAK,GACnC,EAAO,aAAa,IAAI,CAAK,GACtB;AACT"}
@@ -0,0 +1,2 @@
1
+ const e=require("./utils/getExtractedValues.cjs");function t(t,n,r){let i=n,a=0,o=new Set,s=typeof r==`string`?r:r?.name||``,c=e.getExtractedValues({tested:[s],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.toString()===`1`||!1,l={subscribers:o,id:t.subscriberId++,depth:0,type:`signal`,get version(){return a}},u={get value(){return t.activeConsumer&&(o.add(t.activeConsumer),t.activeConsumer.dependencies.add(l)),i},set value(e){if(i===e&&!(i&&typeof i==`object`))return;if(r&&typeof r==`object`&&r.validate){let t=r.validate(e);if(t!==!0){console.error(typeof t==`string`?t:`[Validation Error]`);return}}let n=i;i=e,a++,t.epoch++,t.log({type:`signal`,label:s||`signal`,details:{from:n,to:e},isInternalCoreSignal:c});let o=e=>{e.subscribers.forEach(e=>{if(e===t.activeConsumer)return;let n=e.isDirty;e.isDirty=!0,e.type===`effect`?t.pendingEffects.add(e):(t.pendingEffects.add(e),e.markDirty?e.markDirty():!n&&e.subscribers&&o(e))})};o(l),t.batchDepth===0&&t.flushEffects()},get version(){return a},subscribe(e){let n={id:t.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,run:()=>{if(!n.isDisposed)try{e(i)}catch(e){console.error(e)}}};return o.add(n),e(i),()=>{n.isDisposed=!0,o.delete(n)}}};return u._node=l,u}exports.createSignal=t;
2
+ //# sourceMappingURL=core.method.signal.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.method.signal.cjs","names":[],"sources":["../src/core/core.method.signal.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, CleanupFn, SignalOptions } from './types'\n\n/**\n * Изолированная фабрика сигналов реактивного графа.\n * Полностью отвязана от лексического контекста класса для абсолютной чистоты V8.\n */\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: string | SignalOptions<T>\n): Signal<T> {\n let value = initialValue\n let version = 0\n const subscribers = new Set<any>()\n const name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name || ''\n \n const isInternalCoreSignal = getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.toString() === '1' || false\n\n const signalNode = {\n subscribers,\n id: engine.subscriberId++,\n depth: 0,\n type: 'signal',\n get version() { return version }\n }\n\n const sigInstance = {\n get value() {\n if (engine.activeConsumer) {\n subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(signalNode)\n }\n return value\n },\n set value(newValue: T) {\n const isObj = value && typeof value === 'object'\n if (value === newValue && !isObj) 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 const oldValue = value\n value = newValue\n version++\n engine.epoch++\n engine.log({ type: 'signal', label: name || 'signal', details: { from: oldValue, to: newValue }, isInternalCoreSignal })\n \n const markDirtyNode = (node: any) => {\n node.subscribers.forEach((sub: any) => {\n if (sub === engine.activeConsumer) return\n \n const wasDirty = sub.isDirty\n sub.isDirty = true\n \n if (sub.type === 'effect') {\n engine.pendingEffects.add(sub)\n } else {\n engine.pendingEffects.add(sub)\n // 🟢 ИСПРАВЛЕНО: Если подписчик — это компьютед, делегируем каскад инвалидации его нативному методу markDirty\n if (sub.markDirty) {\n sub.markDirty()\n } else if (!wasDirty && sub.subscribers) {\n markDirtyNode(sub)\n }\n }\n })\n }\n \n markDirtyNode(signalNode)\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n get version() { return version },\n subscribe(cb: (val: T) => void): CleanupFn {\n const fakeEffect: any = {\n id: engine.subscriberId++,\n isDirty: true,\n depth: 9999,\n dependencies: new Set(),\n run: () => {\n if (fakeEffect.isDisposed) return\n try { cb(value) } catch (err) { console.error(err) }\n }\n }\n subscribers.add(fakeEffect)\n cb(value)\n return () => {\n fakeEffect.isDisposed = true\n subscribers.delete(fakeEffect)\n }\n }\n }\n\n ;(sigInstance as any)._node = signalNode\n return sigInstance as any\n}\n"],"mappings":"kDAOA,SAAgB,EACd,EACA,EACA,EACW,CACX,IAAI,EAAQ,EACR,EAAU,EACR,EAAc,IAAI,IAClB,EAAO,OAAO,GAAkB,SAAW,EAAgB,GAAe,MAAQ,GAElF,EAAuB,EAAA,mBAAmB,CAC9C,OAAQ,CAAC,CAAI,EACb,YAAa,uBACb,UAAW,QACb,CAAC,CAAC,EAAE,SAAS,IAAM,KAAO,GAEpB,EAAa,CACjB,cACA,GAAI,EAAO,eACX,MAAO,EACP,KAAM,SACN,IAAI,SAAU,CAAE,OAAO,CAAQ,CACjC,EAEM,EAAc,CAClB,IAAI,OAAQ,CAKV,OAJI,EAAO,iBACT,EAAY,IAAI,EAAO,cAAc,EACrC,EAAO,eAAe,aAAa,IAAI,CAAU,GAE5C,CACT,EACA,IAAI,MAAM,EAAa,CAErB,GAAI,IAAU,GAAY,EADZ,GAAS,OAAO,GAAU,UACN,OAElC,GAAI,GAAiB,OAAO,GAAkB,UAAY,EAAc,SAAU,CAChF,IAAM,EAAa,EAAc,SAAS,CAAQ,EAClD,GAAI,IAAe,GAAM,CACvB,QAAQ,MAAM,OAAO,GAAe,SAAW,EAAa,oBAAoB,EAChF,MACF,CACF,CAEA,IAAM,EAAW,EACjB,EAAQ,EACR,IACA,EAAO,QACP,EAAO,IAAI,CAAE,KAAM,SAAU,MAAO,GAAQ,SAAU,QAAS,CAAE,KAAM,EAAU,GAAI,CAAS,EAAG,sBAAqB,CAAC,EAEvH,IAAM,EAAiB,GAAc,CACnC,EAAK,YAAY,QAAS,GAAa,CACrC,GAAI,IAAQ,EAAO,eAAgB,OAEnC,IAAM,EAAW,EAAI,QACrB,EAAI,QAAU,GAEV,EAAI,OAAS,SACf,EAAO,eAAe,IAAI,CAAG,GAE7B,EAAO,eAAe,IAAI,CAAG,EAEzB,EAAI,UACN,EAAI,UAAU,EACL,CAAC,GAAY,EAAI,aAC1B,EAAc,CAAG,EAGvB,CAAC,CACH,EAEA,EAAc,CAAU,EACpB,EAAO,aAAe,GAAG,EAAO,aAAa,CACnD,EACA,IAAI,SAAU,CAAE,OAAO,CAAQ,EAC/B,UAAU,EAAiC,CACzC,IAAM,EAAkB,CACtB,GAAI,EAAO,eACX,QAAS,GACT,MAAO,KACP,aAAc,IAAI,IAClB,QAAW,CACL,MAAW,WACf,GAAI,CAAE,EAAG,CAAK,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,CACrD,CACF,EAGA,OAFA,EAAY,IAAI,CAAU,EAC1B,EAAG,CAAK,MACK,CACX,EAAW,WAAa,GACxB,EAAY,OAAO,CAAU,CAC/B,CACF,CACF,EAGA,MADC,GAAqB,MAAQ,EACvB,CACT"}