@pravosleva/reactive-engine 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,5 +13,5 @@ export declare function useComputed<T>(computed: Computed<T>): T;
13
13
  * Хук для реактивного отслеживания асинхронного ресурса.
14
14
  * Возвращает объект состояния { data, loading, error }
15
15
  */
16
- export declare function useResource<T>(resource: Resource<T>): import('.').ResourceState<T>;
16
+ export declare function useResource<T>(resource: Resource<T>): Resource<T>;
17
17
  //# sourceMappingURL=_react-bindings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_react-bindings.d.ts","sourceRoot":"","sources":["../src/_react-bindings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAQnD,eAAO,MAAM,MAAM,gBAAuB,CAAA;AAK1C;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAGjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,gCAGnD"}
1
+ {"version":3,"file":"_react-bindings.d.ts","sourceRoot":"","sources":["../src/_react-bindings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAQnD,eAAO,MAAM,MAAM,gBAAuB,CAAA;AAK1C;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAGjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,eAGnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"core.method.signal.d.ts","sourceRoot":"","sources":["../../src/core/core.method.signal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAa,aAAa,EAAE,MAAM,SAAS,CAAA;AAE1D,wBAAgB,YAAY,CAAC,CAAC,EAC5B,MAAM,EAAE,GAAG,EACX,YAAY,EAAE,CAAC,EACf,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GACxC,MAAM,CAAC,CAAC,CAAC,CA4FX"}
1
+ {"version":3,"file":"core.method.signal.d.ts","sourceRoot":"","sources":["../../src/core/core.method.signal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAa,aAAa,EAAE,MAAM,SAAS,CAAA;AAE1D,wBAAgB,YAAY,CAAC,CAAC,EAC5B,MAAM,EAAE,GAAG,EACX,YAAY,EAAE,CAAC,EACf,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GACxC,MAAM,CAAC,CAAC,CAAC,CA+FX"}
@@ -143,7 +143,23 @@ export interface LogDetailMap {
143
143
  reactive: ReactiveDetail;
144
144
  }
145
145
  export interface ISignalLike<V> {
146
+ /**
147
+ * Публичный геттер с автоматическим динамическим трекингом зависимостей графа
148
+ */
146
149
  value: V;
150
+ /**
151
+ * Безопасное чтение значения из кэша БЕЗ трекинга зависимостей.
152
+ * Предотвращает гонку планировщиков и лишние транзакции во время рендера React/Vue.
153
+ */
154
+ valueWithoutTracking: V;
155
+ /**
156
+ * Активная Push-подписка на каждое изменение значения узла
157
+ */
147
158
  subscribe: (cb: (v: V) => void) => CleanupFn;
159
+ /**
160
+ * Пассивный системный хук подписки на завершение реактивной транзакции.
161
+ * Позволяет UI-мостам просыпаться строго один раз за тик, ликвидируя IDLE PULL дубли.
162
+ */
163
+ __subscribe?: (cb: () => void) => CleanupFn;
148
164
  }
149
165
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +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`})?.[0]===`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}),o.forEach(e=>{let n=e._node||e;n.isDirty=!0,n.type===`effect`&&t.pendingEffects.add(e),n.markDirty&&n.markDirty()}),t.batchDepth===0&&t.flushEffects()},get version(){return a},subscribe(e){let n={id:t.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,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;
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`})?.[0]===`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},get valueWithoutTracking(){return 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}),o.forEach(e=>{let n=e._node||e;n.isDirty=!0,n.type===`effect`&&t.pendingEffects.add(e),n.markDirty&&n.markDirty()}),t.batchDepth===0&&t.flushEffects()},get version(){return a},subscribe(e){let n={id:t.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,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
2
  //# sourceMappingURL=core.method.signal.cjs.map
@@ -1 +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\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 })?.[0] === '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\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n // ⚛️ Синхронное каскадное уведомление подписчиков\n subscribers.forEach((sub: any) => {\n const rawSub = sub._node || sub\n\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) {\n rawSub.markDirty()\n }\n })\n\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 type: 'effect',\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":"kDAGA,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,GAAG,KAAO,KAAO,GAEb,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,EAER,IACA,EAAO,QAEP,EAAO,IAAI,CACT,KAAM,SACN,MAAO,GAAQ,SACf,QAAS,CAAE,KAAM,EAAU,GAAI,CAAS,EACxC,sBACF,CAAC,EAGD,EAAY,QAAS,GAAa,CAChC,IAAM,EAAS,EAAI,OAAS,EAE5B,EAAO,QAAU,GACb,EAAO,OAAS,UAClB,EAAO,eAAe,IAAI,CAAG,EAE3B,EAAO,WACT,EAAO,UAAU,CAErB,CAAC,EAEG,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,KAAM,SACN,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"}
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\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 })?.[0] === '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 get valueWithoutTracking() {\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\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n // ⚛️ Синхронное каскадное уведомление подписчиков\n subscribers.forEach((sub: any) => {\n const rawSub = sub._node || sub\n\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) {\n rawSub.markDirty()\n }\n })\n\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 type: 'effect',\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":"kDAGA,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,GAAG,KAAO,KAAO,GAEb,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,sBAAuB,CACzB,OAAO,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,EAER,IACA,EAAO,QAEP,EAAO,IAAI,CACT,KAAM,SACN,MAAO,GAAQ,SACf,QAAS,CAAE,KAAM,EAAU,GAAI,CAAS,EACxC,sBACF,CAAC,EAGD,EAAY,QAAS,GAAa,CAChC,IAAM,EAAS,EAAI,OAAS,EAE5B,EAAO,QAAU,GACb,EAAO,OAAS,UAClB,EAAO,eAAe,IAAI,CAAG,EAE3B,EAAO,WACT,EAAO,UAAU,CAErB,CAAC,EAEG,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,KAAM,SACN,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"}
@@ -17,6 +17,9 @@ function t(t, n, r) {
17
17
  get value() {
18
18
  return t.activeConsumer && (o.add(t.activeConsumer), t.activeConsumer.dependencies.add(l)), i;
19
19
  },
20
+ get valueWithoutTracking() {
21
+ return i;
22
+ },
20
23
  set value(e) {
21
24
  if (i === e && !(i && typeof i == "object")) return;
22
25
  if (r && typeof r == "object" && r.validate) {
@@ -1 +1 @@
1
- {"version":3,"file":"core.method.signal.mjs","names":[],"sources":["../src/core/core.method.signal.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, CleanupFn, SignalOptions } from './types'\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 })?.[0] === '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\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n // ⚛️ Синхронное каскадное уведомление подписчиков\n subscribers.forEach((sub: any) => {\n const rawSub = sub._node || sub\n\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) {\n rawSub.markDirty()\n }\n })\n\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 type: 'effect',\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":";;AAGA,SAAgB,EACd,GACA,GACA,GACW;CACX,IAAI,IAAQ,GACR,IAAU,GACR,oBAAc,IAAI,IAAS,GAC3B,IAAO,OAAO,KAAkB,WAAW,IAAgB,GAAe,QAAQ,IAElF,IAAuB,EAAmB;EAC9C,QAAQ,CAAC,CAAI;EACb,aAAa;EACb,WAAW;CACb,CAAC,CAAC,GAAG,OAAO,OAAO,IAEb,IAAa;EACjB;EACA,IAAI,EAAO;EACX,OAAO;EACP,MAAM;EACN,IAAI,UAAU;GAAE,OAAO;EAAQ;CACjC,GAEM,IAAc;EAClB,IAAI,QAAQ;GAKV,OAJI,EAAO,mBACT,EAAY,IAAI,EAAO,cAAc,GACrC,EAAO,eAAe,aAAa,IAAI,CAAU,IAE5C;EACT;EACA,IAAI,MAAM,GAAa;GAErB,IAAI,MAAU,KAAY,EADZ,KAAS,OAAO,KAAU,WACN;GAElC,IAAI,KAAiB,OAAO,KAAkB,YAAY,EAAc,UAAU;IAChF,IAAM,IAAa,EAAc,SAAS,CAAQ;IAClD,IAAI,MAAe,IAAM;KACvB,QAAQ,MAAM,OAAO,KAAe,WAAW,IAAa,oBAAoB;KAChF;IACF;GACF;GAEA,IAAM,IAAW;GA0BjB,AAzBA,IAAQ,GAER,KACA,EAAO,SAEP,EAAO,IAAI;IACT,MAAM;IACN,OAAO,KAAQ;IACf,SAAS;KAAE,MAAM;KAAU,IAAI;IAAS;IACxC;GACF,CAAC,GAGD,EAAY,SAAS,MAAa;IAChC,IAAM,IAAS,EAAI,SAAS;IAM5B,AAJA,EAAO,UAAU,IACb,EAAO,SAAS,YAClB,EAAO,eAAe,IAAI,CAAG,GAE3B,EAAO,aACT,EAAO,UAAU;GAErB,CAAC,GAEG,EAAO,eAAe,KAAG,EAAO,aAAa;EACnD;EACA,IAAI,UAAU;GAAE,OAAO;EAAQ;EAC/B,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,CAAK;KAAE,SAAS,GAAK;MAAE,QAAQ,MAAM,CAAG;KAAE;IACrD;GACF;GAGA,OAFA,EAAY,IAAI,CAAU,GAC1B,EAAG,CAAK,SACK;IAEX,AADA,EAAW,aAAa,IACxB,EAAY,OAAO,CAAU;GAC/B;EACF;CACF;CAGA,OADC,EAAqB,QAAQ,GACvB;AACT"}
1
+ {"version":3,"file":"core.method.signal.mjs","names":[],"sources":["../src/core/core.method.signal.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, CleanupFn, SignalOptions } from './types'\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 })?.[0] === '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 get valueWithoutTracking() {\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\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n // ⚛️ Синхронное каскадное уведомление подписчиков\n subscribers.forEach((sub: any) => {\n const rawSub = sub._node || sub\n\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) {\n rawSub.markDirty()\n }\n })\n\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 type: 'effect',\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":";;AAGA,SAAgB,EACd,GACA,GACA,GACW;CACX,IAAI,IAAQ,GACR,IAAU,GACR,oBAAc,IAAI,IAAS,GAC3B,IAAO,OAAO,KAAkB,WAAW,IAAgB,GAAe,QAAQ,IAElF,IAAuB,EAAmB;EAC9C,QAAQ,CAAC,CAAI;EACb,aAAa;EACb,WAAW;CACb,CAAC,CAAC,GAAG,OAAO,OAAO,IAEb,IAAa;EACjB;EACA,IAAI,EAAO;EACX,OAAO;EACP,MAAM;EACN,IAAI,UAAU;GAAE,OAAO;EAAQ;CACjC,GAEM,IAAc;EAClB,IAAI,QAAQ;GAKV,OAJI,EAAO,mBACT,EAAY,IAAI,EAAO,cAAc,GACrC,EAAO,eAAe,aAAa,IAAI,CAAU,IAE5C;EACT;EACA,IAAI,uBAAuB;GACzB,OAAO;EACT;EACA,IAAI,MAAM,GAAa;GAErB,IAAI,MAAU,KAAY,EADZ,KAAS,OAAO,KAAU,WACN;GAElC,IAAI,KAAiB,OAAO,KAAkB,YAAY,EAAc,UAAU;IAChF,IAAM,IAAa,EAAc,SAAS,CAAQ;IAClD,IAAI,MAAe,IAAM;KACvB,QAAQ,MAAM,OAAO,KAAe,WAAW,IAAa,oBAAoB;KAChF;IACF;GACF;GAEA,IAAM,IAAW;GA0BjB,AAzBA,IAAQ,GAER,KACA,EAAO,SAEP,EAAO,IAAI;IACT,MAAM;IACN,OAAO,KAAQ;IACf,SAAS;KAAE,MAAM;KAAU,IAAI;IAAS;IACxC;GACF,CAAC,GAGD,EAAY,SAAS,MAAa;IAChC,IAAM,IAAS,EAAI,SAAS;IAM5B,AAJA,EAAO,UAAU,IACb,EAAO,SAAS,YAClB,EAAO,eAAe,IAAI,CAAG,GAE3B,EAAO,aACT,EAAO,UAAU;GAErB,CAAC,GAEG,EAAO,eAAe,KAAG,EAAO,aAAa;EACnD;EACA,IAAI,UAAU;GAAE,OAAO;EAAQ;EAC/B,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,CAAK;KAAE,SAAS,GAAK;MAAE,QAAQ,MAAM,CAAG;KAAE;IACrD;GACF;GAGA,OAFA,EAAY,IAAI,CAAU,GAC1B,EAAG,CAAK,SACK;IAEX,AADA,EAAW,aAAa,IACxB,EAAY,OAAO,CAAU;GAC/B;EACF;CACF;CAGA,OADC,EAAqB,QAAQ,GACvB;AACT"}
@@ -1,2 +1,2 @@
1
- let e=require("react");function t(t){if(typeof t!=`object`||!t)return t;let n=`subscribe`in t&&typeof t.subscribe==`function`,r=(0,e.useRef)({version:0,unsubscribe:null,listeners:new Set});return(0,e.useSyncExternalStore)(e=>{if(r.current.listeners.add(e),!r.current.unsubscribe){let e=!0,i=()=>{e||(r.current.version++,r.current.listeners.forEach(e=>e()))};n?r.current.unsubscribe=t.subscribe(i):`__subscribe`in t&&typeof t.__subscribe==`function`&&(r.current.unsubscribe=t.__subscribe(i)),e=!1}return()=>{r.current.listeners.delete(e),r.current.listeners.size===0&&r.current.unsubscribe&&(r.current.unsubscribe(),r.current.unsubscribe=null)}},()=>r.current.version,()=>r.current.version),n?t.value:t}exports.useReactiveValue=t;
1
+ let e=require("react");function t(t){let n=t&&typeof t==`object`&&`__subscribe`in t;if(!(t&&typeof t==`object`&&`subscribe`in t)&&!n)return t;let r=(t._node||t).engine||t.engine,[i,a]=(0,e.useState)(()=>r&&`untrack`in r?r.untrack(()=>t.value===void 0?t:t.value):t.value===void 0?t:t.value);return(0,e.useEffect)(()=>{let e=`__subscribe`in t&&typeof t.__subscribe==`function`?t.__subscribe(()=>{let e=t.value===void 0?t:t.value;a(e)}):t.subscribe(e=>a(e));return()=>e()},[t]),(0,e.useDebugValue)(i),i}exports.useReactiveValue=t;
2
2
  //# sourceMappingURL=useReactiveValue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useRef } from 'react'\nimport { ISignalLike } from '../../core/types'\n\nexport function useReactiveValue<T>(item: T): T extends ISignalLike<infer V> ? V : T {\n if (item === null || item === undefined || typeof item !== 'object') {\n return item as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n const storeRef = useRef<{\n version: number\n unsubscribe: (() => void) | null\n listeners: Set<() => void>\n }>({\n version: 0,\n unsubscribe: null,\n listeners: new Set()\n })\n\n const subscribeStore = (cb: () => void) => {\n storeRef.current.listeners.add(cb)\n\n if (!storeRef.current.unsubscribe) {\n let isInitializing = true\n\n const triggerUpdate = () => {\n if (isInitializing) return\n storeRef.current.version++\n storeRef.current.listeners.forEach(listener => listener())\n }\n\n if (isSignal) {\n storeRef.current.unsubscribe = (item as any).subscribe(triggerUpdate)\n } else if ('__subscribe' in item && typeof (item as any).__subscribe === 'function') {\n // Нативно подписываемся на сквозной эмиттер Proxy-коллекции ядра\n storeRef.current.unsubscribe = (item as any).__subscribe(triggerUpdate)\n }\n\n isInitializing = false\n }\n\n return () => {\n storeRef.current.listeners.delete(cb)\n if (storeRef.current.listeners.size === 0 && storeRef.current.unsubscribe) {\n storeRef.current.unsubscribe()\n storeRef.current.unsubscribe = null\n }\n }\n }\n\n // useSyncExternalStore реагирует строго на инкремент версии, перезапуская ререндер\n useSyncExternalStore(\n subscribeStore,\n () => storeRef.current.version,\n () => storeRef.current.version\n )\n\n const rawValue = isSignal ? (item as any).value : item\n\n // Возвращаем оригинальный Proxy-объект напрямую! Ссылочная идентичность инпутов в React сохраняется на 100%\n return rawValue as any\n}\n"],"mappings":"uBAGA,SAAgB,EAAoB,EAAiD,CACnF,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAO,EAGT,IAAM,EAAW,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAEzF,GAAA,EAAA,EAAA,OAAA,CAIH,CACD,QAAS,EACT,YAAa,KACb,UAAW,IAAI,GACjB,CAAC,EA2CD,OATA,EAAA,EAAA,qBAAA,CAhCwB,GAAmB,CAGzC,GAFA,EAAS,QAAQ,UAAU,IAAI,CAAE,EAE7B,CAAC,EAAS,QAAQ,YAAa,CACjC,IAAI,EAAiB,GAEf,MAAsB,CACtB,IACJ,EAAS,QAAQ,UACjB,EAAS,QAAQ,UAAU,QAAQ,GAAY,EAAS,CAAC,EAC3D,EAEI,EACF,EAAS,QAAQ,YAAe,EAAa,UAAU,CAAa,EAC3D,gBAAiB,GAAQ,OAAQ,EAAa,aAAgB,aAEvE,EAAS,QAAQ,YAAe,EAAa,YAAY,CAAa,GAGxE,EAAiB,EACnB,CAEA,UAAa,CACX,EAAS,QAAQ,UAAU,OAAO,CAAE,EAChC,EAAS,QAAQ,UAAU,OAAS,GAAK,EAAS,QAAQ,cAC5D,EAAS,QAAQ,YAAY,EAC7B,EAAS,QAAQ,YAAc,KAEnC,CACF,MAKQ,EAAS,QAAQ,YACjB,EAAS,QAAQ,OACzB,EAEiB,EAAY,EAAa,MAAQ,CAIpD"}
1
+ {"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useState, useEffect, useDebugValue } from 'react'\nimport { ISignalLike } from '../../core/types'\n\nexport function useReactiveValue<V>(signal: ISignalLike<V> | any): V {\n const isProxy = signal && typeof signal === 'object' && '__subscribe' in signal\n const isSignal = signal && typeof signal === 'object' && 'subscribe' in signal\n\n if (!isSignal && !isProxy) {\n return signal\n }\n\n // Находим корневой инстанс ядра реактивности фреймворка\n const rawNode = (signal as any)._node || signal\n const engine = rawNode.engine || (signal as any).engine\n\n // РЕАКТИВНЫЙ БУФЕР ДЛЯ REACT 18 CONCURRENT MODE\n // Инициализируем локальный стейт React строго актуальным значением из кэша.\n // Использование engine.untrack() защищает стартовый рендер в StrictMode от утечки контекста!\n const [localState, setLocalState] = useState(() => {\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n return signal.value !== undefined ? signal.value : signal\n })\n\n useEffect(() => {\n // Выбираем пассивный системный хук __subscribe для computed и proxy,\n // чтобы просыпаться строго один раз в конце транзакции, убирая дубли из консоли\n const hasHook = '__subscribe' in signal && typeof (signal as any).__subscribe === 'function'\n\n const triggerStoreUpdate = () => {\n // Актуализируем ленивое значение кэша строго на этапе закрытия транзакции ядра\n const freshValue = signal.value !== undefined ? signal.value : signal\n\n // Проталкиваем изменения в локальный стейт React.\n // Если это массив, React зафиксирует новую ссылку и сделает ровно 1 ререндер!\n setLocalState(freshValue)\n }\n\n const unsubscribe = hasHook\n ? (signal as any).__subscribe(triggerStoreUpdate)\n : signal.subscribe((newValue: any) => setLocalState(newValue))\n\n return () => unsubscribe()\n }, [signal])\n\n useDebugValue(localState)\n\n // Возвращаем локальный изолированный стейт. Во время фазы рендера React\n // хук больше не дергает внутренние геттеры ядра, полностью блокируя Render Loop\n // и гарантируя 100% стабильность ссылочных типов данных в renderHook!\n return localState\n}\n"],"mappings":"uBAGA,SAAgB,EAAoB,EAAiC,CACnE,IAAM,EAAU,GAAU,OAAO,GAAW,UAAY,gBAAiB,EAGzE,GAAI,EAFa,GAAU,OAAO,GAAW,UAAY,cAAe,IAEvD,CAAC,EAChB,OAAO,EAKT,IAAM,GADW,EAAe,OAAS,EAAA,CAClB,QAAW,EAAe,OAK3C,CAAC,EAAY,IAAA,EAAA,EAAA,SAAA,KACb,GAAU,YAAa,EAClB,EAAO,YAAe,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAAe,EAE3E,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAC5C,EA4BD,OA1BA,EAAA,EAAA,UAAA,KAAgB,CAcd,IAAM,EAXU,gBAAiB,GAAU,OAAQ,EAAe,aAAgB,WAY7E,EAAe,gBAVa,CAE/B,IAAM,EAAa,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,MAIvD,EAAc,CAAU,CAC1B,CAGkD,EAC9C,EAAO,UAAW,GAAkB,EAAc,CAAQ,CAAC,EAE/D,UAAa,EAAY,CAC3B,EAAG,CAAC,CAAM,CAAC,GAEX,EAAA,EAAA,cAAA,CAAc,CAAU,EAKjB,CACT"}
@@ -1,3 +1,3 @@
1
1
  import { ISignalLike } from '../../core/types';
2
- export declare function useReactiveValue<T>(item: T): T extends ISignalLike<infer V> ? V : T;
2
+ export declare function useReactiveValue<V>(signal: ISignalLike<V> | any): V;
3
3
  //# sourceMappingURL=useReactiveValue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useReactiveValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CA2DnF"}
1
+ {"version":3,"file":"useReactiveValue.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useReactiveValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAiDnE"}
@@ -1,25 +1,18 @@
1
- import { useRef as e, useSyncExternalStore as t } from "react";
1
+ import { useDebugValue as e, useEffect as t, useState as n } from "react";
2
2
  //#region src/react/hooks/useReactiveValue.ts
3
- function n(n) {
4
- if (typeof n != "object" || !n) return n;
5
- let r = "subscribe" in n && typeof n.subscribe == "function", i = e({
6
- version: 0,
7
- unsubscribe: null,
8
- listeners: /* @__PURE__ */ new Set()
9
- });
10
- return t((e) => {
11
- if (i.current.listeners.add(e), !i.current.unsubscribe) {
12
- let e = !0, t = () => {
13
- e || (i.current.version++, i.current.listeners.forEach((e) => e()));
14
- };
15
- r ? i.current.unsubscribe = n.subscribe(t) : "__subscribe" in n && typeof n.__subscribe == "function" && (i.current.unsubscribe = n.__subscribe(t)), e = !1;
16
- }
17
- return () => {
18
- i.current.listeners.delete(e), i.current.listeners.size === 0 && i.current.unsubscribe && (i.current.unsubscribe(), i.current.unsubscribe = null);
19
- };
20
- }, () => i.current.version, () => i.current.version), r ? n.value : n;
3
+ function r(r) {
4
+ let i = r && typeof r == "object" && "__subscribe" in r;
5
+ if (!(r && typeof r == "object" && "subscribe" in r) && !i) return r;
6
+ let a = (r._node || r).engine || r.engine, [o, s] = n(() => a && "untrack" in a ? a.untrack(() => r.value === void 0 ? r : r.value) : r.value === void 0 ? r : r.value);
7
+ return t(() => {
8
+ let e = "__subscribe" in r && typeof r.__subscribe == "function" ? r.__subscribe(() => {
9
+ let e = r.value === void 0 ? r : r.value;
10
+ s(e);
11
+ }) : r.subscribe((e) => s(e));
12
+ return () => e();
13
+ }, [r]), e(o), o;
21
14
  }
22
15
  //#endregion
23
- export { n as useReactiveValue };
16
+ export { r as useReactiveValue };
24
17
 
25
18
  //# sourceMappingURL=useReactiveValue.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useRef } from 'react'\nimport { ISignalLike } from '../../core/types'\n\nexport function useReactiveValue<T>(item: T): T extends ISignalLike<infer V> ? V : T {\n if (item === null || item === undefined || typeof item !== 'object') {\n return item as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n const storeRef = useRef<{\n version: number\n unsubscribe: (() => void) | null\n listeners: Set<() => void>\n }>({\n version: 0,\n unsubscribe: null,\n listeners: new Set()\n })\n\n const subscribeStore = (cb: () => void) => {\n storeRef.current.listeners.add(cb)\n\n if (!storeRef.current.unsubscribe) {\n let isInitializing = true\n\n const triggerUpdate = () => {\n if (isInitializing) return\n storeRef.current.version++\n storeRef.current.listeners.forEach(listener => listener())\n }\n\n if (isSignal) {\n storeRef.current.unsubscribe = (item as any).subscribe(triggerUpdate)\n } else if ('__subscribe' in item && typeof (item as any).__subscribe === 'function') {\n // Нативно подписываемся на сквозной эмиттер Proxy-коллекции ядра\n storeRef.current.unsubscribe = (item as any).__subscribe(triggerUpdate)\n }\n\n isInitializing = false\n }\n\n return () => {\n storeRef.current.listeners.delete(cb)\n if (storeRef.current.listeners.size === 0 && storeRef.current.unsubscribe) {\n storeRef.current.unsubscribe()\n storeRef.current.unsubscribe = null\n }\n }\n }\n\n // useSyncExternalStore реагирует строго на инкремент версии, перезапуская ререндер\n useSyncExternalStore(\n subscribeStore,\n () => storeRef.current.version,\n () => storeRef.current.version\n )\n\n const rawValue = isSignal ? (item as any).value : item\n\n // Возвращаем оригинальный Proxy-объект напрямую! Ссылочная идентичность инпутов в React сохраняется на 100%\n return rawValue as any\n}\n"],"mappings":";;AAGA,SAAgB,EAAoB,GAAiD;CACnF,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO;CAGT,IAAM,IAAW,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAEzF,IAAW,EAId;EACD,SAAS;EACT,aAAa;EACb,2BAAW,IAAI,IAAI;CACrB,CAAC;CA2CD,OATA,GAhCwB,MAAmB;EAGzC,IAFA,EAAS,QAAQ,UAAU,IAAI,CAAE,GAE7B,CAAC,EAAS,QAAQ,aAAa;GACjC,IAAI,IAAiB,IAEf,UAAsB;IACtB,MACJ,EAAS,QAAQ,WACjB,EAAS,QAAQ,UAAU,SAAQ,MAAY,EAAS,CAAC;GAC3D;GASA,AAPI,IACF,EAAS,QAAQ,cAAe,EAAa,UAAU,CAAa,IAC3D,iBAAiB,KAAQ,OAAQ,EAAa,eAAgB,eAEvE,EAAS,QAAQ,cAAe,EAAa,YAAY,CAAa,IAGxE,IAAiB;EACnB;EAEA,aAAa;GAEX,AADA,EAAS,QAAQ,UAAU,OAAO,CAAE,GAChC,EAAS,QAAQ,UAAU,SAAS,KAAK,EAAS,QAAQ,gBAC5D,EAAS,QAAQ,YAAY,GAC7B,EAAS,QAAQ,cAAc;EAEnC;CACF,SAKQ,EAAS,QAAQ,eACjB,EAAS,QAAQ,OACzB,GAEiB,IAAY,EAAa,QAAQ;AAIpD"}
1
+ {"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useState, useEffect, useDebugValue } from 'react'\nimport { ISignalLike } from '../../core/types'\n\nexport function useReactiveValue<V>(signal: ISignalLike<V> | any): V {\n const isProxy = signal && typeof signal === 'object' && '__subscribe' in signal\n const isSignal = signal && typeof signal === 'object' && 'subscribe' in signal\n\n if (!isSignal && !isProxy) {\n return signal\n }\n\n // Находим корневой инстанс ядра реактивности фреймворка\n const rawNode = (signal as any)._node || signal\n const engine = rawNode.engine || (signal as any).engine\n\n // РЕАКТИВНЫЙ БУФЕР ДЛЯ REACT 18 CONCURRENT MODE\n // Инициализируем локальный стейт React строго актуальным значением из кэша.\n // Использование engine.untrack() защищает стартовый рендер в StrictMode от утечки контекста!\n const [localState, setLocalState] = useState(() => {\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n return signal.value !== undefined ? signal.value : signal\n })\n\n useEffect(() => {\n // Выбираем пассивный системный хук __subscribe для computed и proxy,\n // чтобы просыпаться строго один раз в конце транзакции, убирая дубли из консоли\n const hasHook = '__subscribe' in signal && typeof (signal as any).__subscribe === 'function'\n\n const triggerStoreUpdate = () => {\n // Актуализируем ленивое значение кэша строго на этапе закрытия транзакции ядра\n const freshValue = signal.value !== undefined ? signal.value : signal\n\n // Проталкиваем изменения в локальный стейт React.\n // Если это массив, React зафиксирует новую ссылку и сделает ровно 1 ререндер!\n setLocalState(freshValue)\n }\n\n const unsubscribe = hasHook\n ? (signal as any).__subscribe(triggerStoreUpdate)\n : signal.subscribe((newValue: any) => setLocalState(newValue))\n\n return () => unsubscribe()\n }, [signal])\n\n useDebugValue(localState)\n\n // Возвращаем локальный изолированный стейт. Во время фазы рендера React\n // хук больше не дергает внутренние геттеры ядра, полностью блокируя Render Loop\n // и гарантируя 100% стабильность ссылочных типов данных в renderHook!\n return localState\n}\n"],"mappings":";;AAGA,SAAgB,EAAoB,GAAiC;CACnE,IAAM,IAAU,KAAU,OAAO,KAAW,YAAY,iBAAiB;CAGzE,IAAI,EAFa,KAAU,OAAO,KAAW,YAAY,eAAe,MAEvD,CAAC,GAChB,OAAO;CAKT,IAAM,KADW,EAAe,SAAS,EAAA,CAClB,UAAW,EAAe,QAK3C,CAAC,GAAY,KAAiB,QAC9B,KAAU,aAAa,IAClB,EAAO,cAAe,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO,KAAe,IAE3E,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO,KAC5C;CA4BD,OA1BA,QAAgB;EAcd,IAAM,IAXU,iBAAiB,KAAU,OAAQ,EAAe,eAAgB,aAY7E,EAAe,kBAVa;GAE/B,IAAM,IAAa,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO;GAIvD,EAAc,CAAU;EAC1B,CAGkD,IAC9C,EAAO,WAAW,MAAkB,EAAc,CAAQ,CAAC;EAE/D,aAAa,EAAY;CAC3B,GAAG,CAAC,CAAM,CAAC,GAEX,EAAc,CAAU,GAKjB;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../src/react/index.ts"],"sourcesContent":["// Точка входа субпакета \"@pravosleva/reactive-engine/react\"\nimport { ReactiveEngineCore } from '../core/core'\nimport { useReactiveValue } from './hooks/useReactiveValue'\nimport { ISignalLike } from '../core/types'\n\nclass ExtendedReactiveEngine extends ReactiveEngineCore {\n public use<T>(item: T): T extends ISignalLike<infer V> ? V : T {\n return useReactiveValue(item)\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine, useReactiveValue as use }\nexport { useReactiveValue }\nexport { useReactiveSubscription } from './hooks/useReactiveSubscription'\n"],"mappings":"6LAKA,IAAM,EAAN,cAAqC,EAAA,cAAmB,CACtD,IAAc,EAAiD,CAC7D,OAAO,EAAA,iBAAiB,CAAI,CAC9B,CACF"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/react/index.ts"],"sourcesContent":["// Точка входа субпакета \"@pravosleva/reactive-engine/react\"\nimport { ReactiveEngineCore } from '../core/core'\nimport { useReactiveValue } from './hooks/useReactiveValue'\nimport { ISignalLike } from '../core/types'\n\nclass ExtendedReactiveEngine extends ReactiveEngineCore {\n /**\n * Сценарий 1: На вход подан легитимный реактивный примитив (Signal или Computed)\n */\n public use<V>(item: ISignalLike<V>): V;\n\n /**\n * Сценарий 2: На вход подан Proxy-объект, массив или обычный примитив\n */\n public use<T>(item: T): T;\n\n /**\n * Исполняемая сигнатура метода\n */\n public use(item: any): any {\n return useReactiveValue(item)\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine, useReactiveValue as use }\nexport { useReactiveValue }\nexport { useReactiveSubscription } from './hooks/useReactiveSubscription'\n"],"mappings":"6LAKA,IAAM,EAAN,cAAqC,EAAA,cAAmB,CActD,IAAW,EAAgB,CACzB,OAAO,EAAA,iBAAiB,CAAI,CAC9B,CACF"}
@@ -2,7 +2,14 @@ import { ReactiveEngineCore } from '../core/core';
2
2
  import { useReactiveValue } from './hooks/useReactiveValue';
3
3
  import { ISignalLike } from '../core/types';
4
4
  declare class ExtendedReactiveEngine extends ReactiveEngineCore {
5
- use<T>(item: T): T extends ISignalLike<infer V> ? V : T;
5
+ /**
6
+ * Сценарий 1: На вход подан легитимный реактивный примитив (Signal или Computed)
7
+ */
8
+ use<V>(item: ISignalLike<V>): V;
9
+ /**
10
+ * Сценарий 2: На вход подан Proxy-объект, массив или обычный примитив
11
+ */
12
+ use<T>(item: T): T;
6
13
  }
7
14
  export { ExtendedReactiveEngine as ReactiveEngine, useReactiveValue as use };
8
15
  export { useReactiveValue };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,cAAM,sBAAuB,SAAQ,kBAAkB;IAC9C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CAG/D;AAED,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,gBAAgB,IAAI,GAAG,EAAE,CAAA;AAC5E,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,cAAM,sBAAuB,SAAQ,kBAAkB;IACrD;;OAEG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;IAEtC;;OAEG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC;CAQ1B;AAED,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,gBAAgB,IAAI,GAAG,EAAE,CAAA;AAC5E,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/react/index.ts"],"sourcesContent":["// Точка входа субпакета \"@pravosleva/reactive-engine/react\"\nimport { ReactiveEngineCore } from '../core/core'\nimport { useReactiveValue } from './hooks/useReactiveValue'\nimport { ISignalLike } from '../core/types'\n\nclass ExtendedReactiveEngine extends ReactiveEngineCore {\n public use<T>(item: T): T extends ISignalLike<infer V> ? V : T {\n return useReactiveValue(item)\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine, useReactiveValue as use }\nexport { useReactiveValue }\nexport { useReactiveSubscription } from './hooks/useReactiveSubscription'\n"],"mappings":";;;;AAKA,IAAM,IAAN,cAAqC,EAAmB;CACtD,IAAc,GAAiD;EAC7D,OAAO,EAAiB,CAAI;CAC9B;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/react/index.ts"],"sourcesContent":["// Точка входа субпакета \"@pravosleva/reactive-engine/react\"\nimport { ReactiveEngineCore } from '../core/core'\nimport { useReactiveValue } from './hooks/useReactiveValue'\nimport { ISignalLike } from '../core/types'\n\nclass ExtendedReactiveEngine extends ReactiveEngineCore {\n /**\n * Сценарий 1: На вход подан легитимный реактивный примитив (Signal или Computed)\n */\n public use<V>(item: ISignalLike<V>): V;\n\n /**\n * Сценарий 2: На вход подан Proxy-объект, массив или обычный примитив\n */\n public use<T>(item: T): T;\n\n /**\n * Исполняемая сигнатура метода\n */\n public use(item: any): any {\n return useReactiveValue(item)\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine, useReactiveValue as use }\nexport { useReactiveValue }\nexport { useReactiveSubscription } from './hooks/useReactiveSubscription'\n"],"mappings":";;;;AAKA,IAAM,IAAN,cAAqC,EAAmB;CActD,IAAW,GAAgB;EACzB,OAAO,EAAiB,CAAI;CAC9B;AACF"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pravosleva/reactive-engine v2.1.0
2
+ * @pravosleva/reactive-engine v2.1.1
3
3
  * High-performance transactional reactive engine with microtask batching.
4
4
  *
5
5
  * @license MIT
@@ -9,5 +9,5 @@
9
9
  * @contact Telegram Channel: https://t.me/bash_exp_ru/3393
10
10
  * @contact Developer Telegram: https://t.me/pravosleva
11
11
  */
12
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactiveEngineLib={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=({tested:e,expectedKey:t,valueType:n})=>{let r=[];if(!e||!Array.isArray(e))return r;for(let i=0,a=e.length;i<a;i++){let a=e[i];if(typeof a!=`string`)continue;let o;switch(n){case`number`:o=RegExp(`\\[${t}=(?<value>\\d+)\\]`,`g`);break;default:o=RegExp(`\\[${t}=(?<value>.*?)\\]`,`g`);break}for(let e of a.matchAll(o))e?.groups&&r.push(e.groups.value)}return r};function n(e,t,n){let r=e.computedCache.get(t)?.deref();if(r)return r;let i,a=!0,o=0,s=!1,c=new Set,l=new Map,u=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(p),r.type===`computed`&&r.subscribers.size===0&&u(r))})}},d=new class extends Set{delete(n){let r=super.delete(n);return this.size===0&&(a=!0,s=!0,u(p),e.computedCache.delete(t)),r}},f=t=>{if(!t)return!1;let n=t._node||t,r=n.subscribers&&n.subscribers.size>0;if(r&&!n.versionCheckRequired)return!1;let i=!1,a=Array.from(n.dependencies||[]);for(let e of a){let t=e._node||e;t.type===`computed`&&(t.versionCheckRequired||!r)&&f(t)}let o=e.activeConsumer;for(let t of a){let a=t._node||t;if(a.type===`computed`&&(a.isDirty||a.versionCheckRequired||!r)){e.activeConsumer=a;try{a.run()}finally{e.activeConsumer=o}}let s=a.version===void 0?t.version===void 0?e.epoch:t.version:a.version;(!n.depVersions.has(t)||s!==n.depVersions.get(t))&&(i=!0),n.depVersions.set(t,s)}return e.activeConsumer=o,n.versionCheckRequired=!1,i},p={id:e.subscriberId++,dependencies:c,subscribers:d,depth:1,type:`computed`,fn:t,get version(){return o},get versionCheckRequired(){return s},set versionCheckRequired(e){s=e},get depVersions(){return l},run:()=>{if(e.cycleDetectionStack.has(p))throw Error(`[Graph Error] Cyclic dependency detected`);e.cycleDetectionStack.add(p);let r=e.activeConsumer;e.activeConsumer=p;let u=Array.from(c),f=new Map(l);c.forEach(e=>{let t=e._node||e;t.subscribers&&t.subscribers.delete(p)}),c.clear(),l.clear();try{let r=t(),h=a||i&&typeof i==`object`||r&&typeof r==`object`||i!==r;if(h){let s=a?void 0:typeof i==`object`&&i?JSON.parse(JSON.stringify(i)):i;i=r,o++,e.log&&e.log({type:`computed`,label:n||`computed:[${t.name||p.id}]`,details:{from:s,to:r}}),d.forEach(t=>{let n=t._node||t;n.isDirty=!0,n.type===`effect`&&e.pendingEffects.add(t),n.markDirty&&n.markDirty()})}else d.forEach(t=>{let n=t._node||t;n.depVersions&&n.depVersions.set(m,o),n.type===`effect`&&(n.isDirty=!1,e.pendingEffects.delete(t))});a=!1,s=!1;let g=0,_=c.size===u.length;return c.forEach(t=>{let n=t._node||t,r=n.version===void 0?t.version===void 0?e.epoch:t.version:n.version;l.set(t,r),n.depth!==void 0&&n.depth>g&&(g=n.depth),_&&!u.includes(t)&&(_=!1)}),(_&&f.size>0||!_&&f.size>0)&&f.forEach((e,t)=>{if(l.has(t)){let n=t._node||t;l.set(t,n.version===void 0?e:n.version)}}),p.depth=g+1,h}finally{e.activeConsumer=r,e.cycleDetectionStack.delete(p)}},markDirty:()=>{s||(s=!0,d.forEach(t=>{let n=t._node||t;n.isDirty=!0,n.type===`effect`&&e.pendingEffects.add(t),n.markDirty&&n.markDirty()}))}},m={get value(){e.activeConsumer&&e.activeConsumer!==p&&(p.subscribers.add(e.activeConsumer),e.activeConsumer.dependencies.add(p));let r=f(p),u=a||r;if(!u&&c.size>0)for(let t of Array.from(c)){let n=t._node||t;if((n.version===void 0?t.version===void 0?e.epoch:t.version:n.version)!==l.get(t)){u=!0;break}}return u?p.run():(s&&e.log&&e.log({type:`computed`,label:n||`computed:[${t.name||p.id}]`,details:{from:i,to:i}}),s=!1,d.forEach(e=>{let t=e._node||e;t.depVersions&&t.depVersions.set(m,o)})),i},get valueWithoutTracking(){return 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(m.value)}catch(e){console.error(e)}}};return p.subscribers.add(n),t(m.value),()=>{n.isDisposed=!0,p.subscribers.delete(n)}},subscribeState(e){return m.subscribe(e)},destroy:()=>{p.subscribers.clear(),u(p),e.computedCache.delete(t),a=!0},__subscribe(t){let n={id:e.subscriberId++,type:`effect`,run:t,isDirty:!1};return p.subscribers.add(n),()=>{d.delete(n)}}};return m._node=p,m.subscribers=d,m.dependencies=c,m._isDirty=()=>a||s,m.type=`computed`,m.run=()=>p.run(),p.destroy=()=>{e.computedCache.delete(t)},e.computedCache.set(t,new WeakRef(m)),m}function r(e,n,r){let i=n,a=0,o=new Set,s=typeof r==`string`?r:r?.name||``,c=t({tested:[s],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.[0]===`1`||!1,l={subscribers:o,id:e.subscriberId++,depth:0,type:`signal`,get version(){return a}},u={get value(){return e.activeConsumer&&(o.add(e.activeConsumer),e.activeConsumer.dependencies.add(l)),i},set value(t){if(i===t&&!(i&&typeof i==`object`))return;if(r&&typeof r==`object`&&r.validate){let e=r.validate(t);if(e!==!0){console.error(typeof e==`string`?e:`[Validation Error]`);return}}let n=i;i=t,a++,e.epoch++,e.log({type:`signal`,label:s||`signal`,details:{from:n,to:t},isInternalCoreSignal:c}),o.forEach(t=>{let n=t._node||t;n.isDirty=!0,n.type===`effect`&&e.pendingEffects.add(t),n.markDirty&&n.markDirty()}),e.batchDepth===0&&e.flushEffects()},get version(){return a},subscribe(t){let n={id:e.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,run:()=>{if(!n.isDisposed)try{t(i)}catch(e){console.error(e)}}};return o.add(n),t(i),()=>{n.isDisposed=!0,o.delete(n)}}};return u._node=l,u}function i(e,t){e.batchDepth++;try{return t()}finally{e.batchDepth--,e.batchDepth===0&&e.flushEffects()}}function a(e,t){let n=e.activeConsumer;e.activeConsumer=null;try{return t()}finally{e.activeConsumer=n}}function o(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}function s(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)}}var c=class{static churnTracker=new Map;static TIME_WINDOW_MS=1e3;static CHURN_WARNING_THRESHOLD=3;static CHURN_CRITICAL_THRESHOLD=6;static isDeepEqual(e,t){return e===t?!0:typeof e!=`object`||typeof t!=`object`||e===null||t===null?!1:JSON.stringify(e)===JSON.stringify(t)}static analyzeSignalChurn(e){let t=Date.now();this.churnTracker.has(e)||this.churnTracker.set(e,[]);let n=this.churnTracker.get(e),r=t-this.TIME_WINDOW_MS,i=n.filter(e=>e>r);i.push(t),this.churnTracker.set(e,i);let a=i.length,o=(this.TIME_WINDOW_MS/1e3).toFixed(1);return a>=this.CHURN_CRITICAL_THRESHOLD?{marker:`🔴`,info:`[CRITICAL CHURN] (${a} изм./${o}s) — Нужен debounce!`}:a>=this.CHURN_WARNING_THRESHOLD?{marker:`🟡`,info:`[WARNING CHURN] (${a} изм./${o}s)`}:{marker:`🟢`,info:`[STABLE] (${a} изм./${o}s)`}}static processLog(e,t,n){let{type:r,label:i,details:a,isInternalCoreSignal:o=!1}=n;if(!e.isEnabled||o&&!e.isCoreOptimizationDebugEnabled)return;if(a&&`from`in a&&`to`in a&&this.isDeepEqual(a.from,a.to)){if(r===`computed`){t(r,`🔵 [IDLE PULL] ${i} (Значение кэша не изменилось)`,a);return}return}let s=``;if(r===`signal`||r===`resource`||r===`computed`){let e=this.analyzeSignalChurn(i);s=e.marker===`🟢`?` ${e.marker}`:` ${e.marker} ${e.info}`}t(r,`${i}${s}`,a)}},l={signal:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,computed:`background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,effect:`background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,batch:`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,resource:`background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,reactive:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`},u=null;function d(e){if(e===null)return`null`;if(e===void 0)return`undefined`;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[Cyclic Object or Layer]`}return String(e)}function f(e,t,n){u||(u={id:Math.random().toString(36).substring(2,9),pendingLogQueue:[],isFlushing:!1},queueMicrotask(()=>p())),u.pendingLogQueue.push({type:e,label:t,from:n?.from,to:n?.to,payload:n?.payload,timestamp:Date.now()})}function p(){if(!u||u.isFlushing)return;u.isFlushing=!0;let e=u.pendingLogQueue;if(e.length===0){u=null;return}console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${u.id}] (${e.length} operations)`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #888; font-weight: normal;`);for(let t of e){let e=l[t.type],n=t.from!==void 0||t.to!==void 0,r=`%c${t.type.toUpperCase()}%c ${t.label}`;n&&(t.from?r+=` ${d(t.from)} → ${d(t.to)}`:r+=` (${d(t.to)})`),t.payload===void 0?console.log(r,e,`color: inherit;`):(console.groupCollapsed(r,e,`color: inherit;`),console.log(`Payload:`,t.payload),console.groupEnd())}console.groupEnd(),u=null}var m=class{frameworkPrefix=`core`;logger;epoch=0;activeConsumer=null;batchDepth=0;subscriberId=0;pendingEffects=new Set;computedCache=new Map;diRegistry=new Map;diCache=new Map;proxyCache=new WeakMap;proxyTargets=new WeakSet;reactiveSignals=new WeakMap;cycleDetectionStack=new Set;constructor(e){this.logger=e?.logger||{isEnabled:!1}}queueLog(e,t,n){f(e,t,n)}flushEffects(){if(this.batchDepth>0)return;let e=Array.from(this.pendingEffects);this.pendingEffects.clear(),e.sort((e,t)=>(e.depth||0)-(t.depth||0)||e.id-t.id);let t=this.activeConsumer;try{for(let t of e)if(!t.isDisposed){if(t.dependencies&&t.dependencies.size>0)for(let e of t.dependencies){let t=e._node||e;if(t.type===`computed`&&t._isDirty&&t._isDirty())try{this.untrack(()=>{e.value})}catch(e){if(this.batchDepth===0)throw e}}if(t.isDirty)try{t.run()}catch(e){if(this.batchDepth===0)throw e}}}finally{this.activeConsumer=t}}batch(e){return i(this,e)}log({type:e,label:t,details:n,isInternalCoreSignal:r=!1}){c.processLog(this.logger,f,{type:e,label:t,details:n,isInternalCoreSignal:r})}signal(e,t){return r(this,e,t)}computed(e,t){return n(this,e,t)}effect(e,t){return s(this,e,t)}untrack(e){return a(this,e)}reactive(e,t){return o(this,e,t)}provide(e,t){this.diRegistry.set(e,t),this.diCache.delete(e)}inject(e){if(e==null)throw Error(`[DI Error] Token is empty`);if(this.diCache.has(e))return this.diCache.get(e);if(this.cycleDetectionStack.has(e))throw Error(`[DI Error] Cyclic dependency detected`);this.cycleDetectionStack.add(e);try{if(this.diRegistry.has(e)){let t=this.diRegistry.get(e);if(typeof t==`function`){if(t._isMockFunction){let n=t(this);return n===void 0?t:(this.diCache.set(e,n),n)}let n=t.toString();if(!(n.startsWith(`class `)||n.startsWith(`class{`)||t.prototype&&t.prototype.constructor===t&&!n.startsWith(`function`)&&!n.includes(`=>`))){let n=t(this);return this.diCache.set(e,n),n}return t}return t}if(typeof e==`function`){let t=new e(this);return this.diCache.set(e,t),t}throw Error(`[DI Error] Token not found`)}finally{this.cycleDetectionStack.delete(e)}}delay(e,t){return new Promise((n,r)=>{if(t.aborted)return r(new DOMException(`Aborted`,`AbortError`));let i=setTimeout(()=>{t.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};t.addEventListener(`abort`,a,{once:!0})})}resource(e,n,r){let i=r&&typeof r==`object`,a=i?r.name||`unnamed_resource`:r||`unnamed_resource`,o=i?r:{},s=o.resetDataOnSourceChange??!0,c=o.responseValidate,l=o.validateBeforeFetch,u=this.signal({data:null,loading:!0,error:null,isRetrying:!1},`[CORE_INTERNAL_SIGNAL=1]:resource:state:${a}`),d=e=>{this.log({type:`resource`,label:a,details:{to:e,from:u.value}}),u.value=e},f=async(n,r,i=!1)=>{if(r.aborted)return;if(o.validateBeforeFetch&&o.validateBeforeFetch(n),l){let e=l(n);if(e===!1||typeof e==`string`){if(r.aborted)return;let t=typeof e==`string`?e:`Pre-fetch validation failed for resource`,n=i?null:this.untrack(()=>u.value.data);d({data:n,loading:!1,error:t,isRetrying:!1});return}}let f=i&&s?null:this.untrack(()=>u.value.data);d({data:f,loading:!0,error:null,isRetrying:!1});for(let i=0;i<=0;i++){if(r.aborted)return;let o=r;try{let t=await e(n,o);if(r.aborted)return;if(o.aborted)throw new DOMException(`The operation timed out.`,`TimeoutError`);if(c){let e=c(t);if(e===!1||typeof e==`string`){if(r.aborted)return;d({data:null,loading:!1,error:typeof e==`string`?e:`Validation failed`,isRetrying:!1});return}}if(r.aborted)return;d({data:t,loading:!1,error:null,isRetrying:!1});return}catch(e){if(r.aborted||e.name===`AbortError`&&r.aborted)return;let n=e.name===`TimeoutError`||e.name===`AbortError`||e.message?.includes(`timeout`),o=t({tested:[e.message],expectedKey:`THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY`,valueType:`number`})?.[0]===`1`||!1,s=o&&t({tested:[e.message],expectedKey:`MESSAGE`,valueType:`string`})?.[0]||`Custom validation error`,c=o||e.name===`ValidationError`;if(i===0||c){if(r.aborted)return;let t=n?Error(`Request timed out after 1000ms`,{cause:e}):o?Error(s,{cause:e}):e;d({data:null,loading:!1,error:t instanceof Error?t.message:typeof t==`string`?t:`typeof finalError is ${typeof t}`,isRetrying:!1});return}else{if(r.aborted)return;let e=1e3*2**i;e=Math.min(e,3e5);let t=Math.random()*200;e+=t,d({data:u.value.data,loading:!0,error:null,isRetrying:!0}),console.warn(`[Resource Retry] "${a}" сбой по ${n?`таймауту`:`ошибке сети`}. Попытка ${i+1}/${i+1}...`);try{if(await this.delay(e,r),r.aborted)return}catch{return}}}}},p=null;return this.effect(()=>{let e=n?n.value:void 0,t=new AbortController;return p=t,this.untrack(()=>{f(e,t.signal,!0)}),()=>t.abort()},`[CORE_INTERNAL_SIGNAL=1]:effect`),{get data(){return u.value.data},get loading(){return u.value.loading},get error(){return u.value.error},get isRetrying(){return u.value.isRetrying},get value(){return u.value},refetch:()=>{p?.abort(),p=new AbortController,f(n?n.value:void 0,p.signal,!1)},subscribe:e=>u.subscribe(e)}}},h=class extends m{},g=class extends h{autoLogQueue=[];isHardFlushScheduled=!1;queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,meta:n,timestamp:Date.now()}),this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>this.flushLogs()))}flushLogs(){this.isHardFlushScheduled=!1,this.autoLogQueue.length!==0&&(typeof process<`u`&&process.env.NODE_ENV!==`test`&&(console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`),this.autoLogQueue.forEach(e=>console.log(`[${e.type.toUpperCase()}] ${e.name}`,e.meta||``)),console.groupEnd()),this.autoLogQueue=[])}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t),a=!1,o={get value(){if(a)return i.value;let e=typeof performance<`u`?performance.now():0,t=i.value;return e&&n.queueLog(`computed`,r,{value:t,duration:`${(performance.now()-e).toFixed(3)}ms`}),t},subscribe:e=>i.subscribe(e),destroy(){a=!0,i.destroy()}};return`_node`in i&&Object.defineProperty(o,"_node",{value:i._node,enumerable:!1}),o}},_=class{engine;constructor(e){this.engine=e,this.onInit()}createNumericSignal(e,t){return this.engine.signal(e,{name:t,validate:e=>typeof e==`number`&&!isNaN(e)})}createComputed(e){return this.engine.computed(e)}createSignal(e,t){return this.engine.signal(e,t)}onInit(){}},v=_,y=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=_,e.BaseREService=v,e.BaseREServiceEnhanced=y,e.ReactiveEngine=h,e.ReactiveEngineAutolog=g,e.ReactiveEngineAutomatic=m,e.ReactiveEngineCore=m,e.flushLogs=p,e.queueLog=f});
12
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactiveEngineLib={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=({tested:e,expectedKey:t,valueType:n})=>{let r=[];if(!e||!Array.isArray(e))return r;for(let i=0,a=e.length;i<a;i++){let a=e[i];if(typeof a!=`string`)continue;let o;switch(n){case`number`:o=RegExp(`\\[${t}=(?<value>\\d+)\\]`,`g`);break;default:o=RegExp(`\\[${t}=(?<value>.*?)\\]`,`g`);break}for(let e of a.matchAll(o))e?.groups&&r.push(e.groups.value)}return r};function n(e,t,n){let r=e.computedCache.get(t)?.deref();if(r)return r;let i,a=!0,o=0,s=!1,c=new Set,l=new Map,u=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(p),r.type===`computed`&&r.subscribers.size===0&&u(r))})}},d=new class extends Set{delete(n){let r=super.delete(n);return this.size===0&&(a=!0,s=!0,u(p),e.computedCache.delete(t)),r}},f=t=>{if(!t)return!1;let n=t._node||t,r=n.subscribers&&n.subscribers.size>0;if(r&&!n.versionCheckRequired)return!1;let i=!1,a=Array.from(n.dependencies||[]);for(let e of a){let t=e._node||e;t.type===`computed`&&(t.versionCheckRequired||!r)&&f(t)}let o=e.activeConsumer;for(let t of a){let a=t._node||t;if(a.type===`computed`&&(a.isDirty||a.versionCheckRequired||!r)){e.activeConsumer=a;try{a.run()}finally{e.activeConsumer=o}}let s=a.version===void 0?t.version===void 0?e.epoch:t.version:a.version;(!n.depVersions.has(t)||s!==n.depVersions.get(t))&&(i=!0),n.depVersions.set(t,s)}return e.activeConsumer=o,n.versionCheckRequired=!1,i},p={id:e.subscriberId++,dependencies:c,subscribers:d,depth:1,type:`computed`,fn:t,get version(){return o},get versionCheckRequired(){return s},set versionCheckRequired(e){s=e},get depVersions(){return l},run:()=>{if(e.cycleDetectionStack.has(p))throw Error(`[Graph Error] Cyclic dependency detected`);e.cycleDetectionStack.add(p);let r=e.activeConsumer;e.activeConsumer=p;let u=Array.from(c),f=new Map(l);c.forEach(e=>{let t=e._node||e;t.subscribers&&t.subscribers.delete(p)}),c.clear(),l.clear();try{let r=t(),h=a||i&&typeof i==`object`||r&&typeof r==`object`||i!==r;if(h){let s=a?void 0:typeof i==`object`&&i?JSON.parse(JSON.stringify(i)):i;i=r,o++,e.log&&e.log({type:`computed`,label:n||`computed:[${t.name||p.id}]`,details:{from:s,to:r}}),d.forEach(t=>{let n=t._node||t;n.isDirty=!0,n.type===`effect`&&e.pendingEffects.add(t),n.markDirty&&n.markDirty()})}else d.forEach(t=>{let n=t._node||t;n.depVersions&&n.depVersions.set(m,o),n.type===`effect`&&(n.isDirty=!1,e.pendingEffects.delete(t))});a=!1,s=!1;let g=0,_=c.size===u.length;return c.forEach(t=>{let n=t._node||t,r=n.version===void 0?t.version===void 0?e.epoch:t.version:n.version;l.set(t,r),n.depth!==void 0&&n.depth>g&&(g=n.depth),_&&!u.includes(t)&&(_=!1)}),(_&&f.size>0||!_&&f.size>0)&&f.forEach((e,t)=>{if(l.has(t)){let n=t._node||t;l.set(t,n.version===void 0?e:n.version)}}),p.depth=g+1,h}finally{e.activeConsumer=r,e.cycleDetectionStack.delete(p)}},markDirty:()=>{s||(s=!0,d.forEach(t=>{let n=t._node||t;n.isDirty=!0,n.type===`effect`&&e.pendingEffects.add(t),n.markDirty&&n.markDirty()}))}},m={get value(){e.activeConsumer&&e.activeConsumer!==p&&(p.subscribers.add(e.activeConsumer),e.activeConsumer.dependencies.add(p));let r=f(p),u=a||r;if(!u&&c.size>0)for(let t of Array.from(c)){let n=t._node||t;if((n.version===void 0?t.version===void 0?e.epoch:t.version:n.version)!==l.get(t)){u=!0;break}}return u?p.run():(s&&e.log&&e.log({type:`computed`,label:n||`computed:[${t.name||p.id}]`,details:{from:i,to:i}}),s=!1,d.forEach(e=>{let t=e._node||e;t.depVersions&&t.depVersions.set(m,o)})),i},get valueWithoutTracking(){return 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(m.value)}catch(e){console.error(e)}}};return p.subscribers.add(n),t(m.value),()=>{n.isDisposed=!0,p.subscribers.delete(n)}},subscribeState(e){return m.subscribe(e)},destroy:()=>{p.subscribers.clear(),u(p),e.computedCache.delete(t),a=!0},__subscribe(t){let n={id:e.subscriberId++,type:`effect`,run:t,isDirty:!1};return p.subscribers.add(n),()=>{d.delete(n)}}};return m._node=p,m.subscribers=d,m.dependencies=c,m._isDirty=()=>a||s,m.type=`computed`,m.run=()=>p.run(),p.destroy=()=>{e.computedCache.delete(t)},e.computedCache.set(t,new WeakRef(m)),m}function r(e,n,r){let i=n,a=0,o=new Set,s=typeof r==`string`?r:r?.name||``,c=t({tested:[s],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.[0]===`1`||!1,l={subscribers:o,id:e.subscriberId++,depth:0,type:`signal`,get version(){return a}},u={get value(){return e.activeConsumer&&(o.add(e.activeConsumer),e.activeConsumer.dependencies.add(l)),i},get valueWithoutTracking(){return i},set value(t){if(i===t&&!(i&&typeof i==`object`))return;if(r&&typeof r==`object`&&r.validate){let e=r.validate(t);if(e!==!0){console.error(typeof e==`string`?e:`[Validation Error]`);return}}let n=i;i=t,a++,e.epoch++,e.log({type:`signal`,label:s||`signal`,details:{from:n,to:t},isInternalCoreSignal:c}),o.forEach(t=>{let n=t._node||t;n.isDirty=!0,n.type===`effect`&&e.pendingEffects.add(t),n.markDirty&&n.markDirty()}),e.batchDepth===0&&e.flushEffects()},get version(){return a},subscribe(t){let n={id:e.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,run:()=>{if(!n.isDisposed)try{t(i)}catch(e){console.error(e)}}};return o.add(n),t(i),()=>{n.isDisposed=!0,o.delete(n)}}};return u._node=l,u}function i(e,t){e.batchDepth++;try{return t()}finally{e.batchDepth--,e.batchDepth===0&&e.flushEffects()}}function a(e,t){let n=e.activeConsumer;e.activeConsumer=null;try{return t()}finally{e.activeConsumer=n}}function o(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}function s(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)}}var c=class{static churnTracker=new Map;static TIME_WINDOW_MS=1e3;static CHURN_WARNING_THRESHOLD=3;static CHURN_CRITICAL_THRESHOLD=6;static isDeepEqual(e,t){return e===t?!0:typeof e!=`object`||typeof t!=`object`||e===null||t===null?!1:JSON.stringify(e)===JSON.stringify(t)}static analyzeSignalChurn(e){let t=Date.now();this.churnTracker.has(e)||this.churnTracker.set(e,[]);let n=this.churnTracker.get(e),r=t-this.TIME_WINDOW_MS,i=n.filter(e=>e>r);i.push(t),this.churnTracker.set(e,i);let a=i.length,o=(this.TIME_WINDOW_MS/1e3).toFixed(1);return a>=this.CHURN_CRITICAL_THRESHOLD?{marker:`🔴`,info:`[CRITICAL CHURN] (${a} изм./${o}s) — Нужен debounce!`}:a>=this.CHURN_WARNING_THRESHOLD?{marker:`🟡`,info:`[WARNING CHURN] (${a} изм./${o}s)`}:{marker:`🟢`,info:`[STABLE] (${a} изм./${o}s)`}}static processLog(e,t,n){let{type:r,label:i,details:a,isInternalCoreSignal:o=!1}=n;if(!e.isEnabled||o&&!e.isCoreOptimizationDebugEnabled)return;if(a&&`from`in a&&`to`in a&&this.isDeepEqual(a.from,a.to)){if(r===`computed`){t(r,`🔵 [IDLE PULL] ${i} (Значение кэша не изменилось)`,a);return}return}let s=``;if(r===`signal`||r===`resource`||r===`computed`){let e=this.analyzeSignalChurn(i);s=e.marker===`🟢`?` ${e.marker}`:` ${e.marker} ${e.info}`}t(r,`${i}${s}`,a)}},l={signal:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,computed:`background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,effect:`background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,batch:`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,resource:`background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,reactive:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`},u=null;function d(e){if(e===null)return`null`;if(e===void 0)return`undefined`;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[Cyclic Object or Layer]`}return String(e)}function f(e,t,n){u||(u={id:Math.random().toString(36).substring(2,9),pendingLogQueue:[],isFlushing:!1},queueMicrotask(()=>p())),u.pendingLogQueue.push({type:e,label:t,from:n?.from,to:n?.to,payload:n?.payload,timestamp:Date.now()})}function p(){if(!u||u.isFlushing)return;u.isFlushing=!0;let e=u.pendingLogQueue;if(e.length===0){u=null;return}console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${u.id}] (${e.length} operations)`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #888; font-weight: normal;`);for(let t of e){let e=l[t.type],n=t.from!==void 0||t.to!==void 0,r=`%c${t.type.toUpperCase()}%c ${t.label}`;n&&(t.from?r+=` ${d(t.from)} → ${d(t.to)}`:r+=` (${d(t.to)})`),t.payload===void 0?console.log(r,e,`color: inherit;`):(console.groupCollapsed(r,e,`color: inherit;`),console.log(`Payload:`,t.payload),console.groupEnd())}console.groupEnd(),u=null}var m=class{frameworkPrefix=`core`;logger;epoch=0;activeConsumer=null;batchDepth=0;subscriberId=0;pendingEffects=new Set;computedCache=new Map;diRegistry=new Map;diCache=new Map;proxyCache=new WeakMap;proxyTargets=new WeakSet;reactiveSignals=new WeakMap;cycleDetectionStack=new Set;constructor(e){this.logger=e?.logger||{isEnabled:!1}}queueLog(e,t,n){f(e,t,n)}flushEffects(){if(this.batchDepth>0)return;let e=Array.from(this.pendingEffects);this.pendingEffects.clear(),e.sort((e,t)=>(e.depth||0)-(t.depth||0)||e.id-t.id);let t=this.activeConsumer;try{for(let t of e)if(!t.isDisposed){if(t.dependencies&&t.dependencies.size>0)for(let e of t.dependencies){let t=e._node||e;if(t.type===`computed`&&t._isDirty&&t._isDirty())try{this.untrack(()=>{e.value})}catch(e){if(this.batchDepth===0)throw e}}if(t.isDirty)try{t.run()}catch(e){if(this.batchDepth===0)throw e}}}finally{this.activeConsumer=t}}batch(e){return i(this,e)}log({type:e,label:t,details:n,isInternalCoreSignal:r=!1}){c.processLog(this.logger,f,{type:e,label:t,details:n,isInternalCoreSignal:r})}signal(e,t){return r(this,e,t)}computed(e,t){return n(this,e,t)}effect(e,t){return s(this,e,t)}untrack(e){return a(this,e)}reactive(e,t){return o(this,e,t)}provide(e,t){this.diRegistry.set(e,t),this.diCache.delete(e)}inject(e){if(e==null)throw Error(`[DI Error] Token is empty`);if(this.diCache.has(e))return this.diCache.get(e);if(this.cycleDetectionStack.has(e))throw Error(`[DI Error] Cyclic dependency detected`);this.cycleDetectionStack.add(e);try{if(this.diRegistry.has(e)){let t=this.diRegistry.get(e);if(typeof t==`function`){if(t._isMockFunction){let n=t(this);return n===void 0?t:(this.diCache.set(e,n),n)}let n=t.toString();if(!(n.startsWith(`class `)||n.startsWith(`class{`)||t.prototype&&t.prototype.constructor===t&&!n.startsWith(`function`)&&!n.includes(`=>`))){let n=t(this);return this.diCache.set(e,n),n}return t}return t}if(typeof e==`function`){let t=new e(this);return this.diCache.set(e,t),t}throw Error(`[DI Error] Token not found`)}finally{this.cycleDetectionStack.delete(e)}}delay(e,t){return new Promise((n,r)=>{if(t.aborted)return r(new DOMException(`Aborted`,`AbortError`));let i=setTimeout(()=>{t.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};t.addEventListener(`abort`,a,{once:!0})})}resource(e,n,r){let i=r&&typeof r==`object`,a=i?r.name||`unnamed_resource`:r||`unnamed_resource`,o=i?r:{},s=o.resetDataOnSourceChange??!0,c=o.responseValidate,l=o.validateBeforeFetch,u=this.signal({data:null,loading:!0,error:null,isRetrying:!1},`[CORE_INTERNAL_SIGNAL=1]:resource:state:${a}`),d=e=>{this.log({type:`resource`,label:a,details:{to:e,from:u.value}}),u.value=e},f=async(n,r,i=!1)=>{if(r.aborted)return;if(o.validateBeforeFetch&&o.validateBeforeFetch(n),l){let e=l(n);if(e===!1||typeof e==`string`){if(r.aborted)return;let t=typeof e==`string`?e:`Pre-fetch validation failed for resource`,n=i?null:this.untrack(()=>u.value.data);d({data:n,loading:!1,error:t,isRetrying:!1});return}}let f=i&&s?null:this.untrack(()=>u.value.data);d({data:f,loading:!0,error:null,isRetrying:!1});for(let i=0;i<=0;i++){if(r.aborted)return;let o=r;try{let t=await e(n,o);if(r.aborted)return;if(o.aborted)throw new DOMException(`The operation timed out.`,`TimeoutError`);if(c){let e=c(t);if(e===!1||typeof e==`string`){if(r.aborted)return;d({data:null,loading:!1,error:typeof e==`string`?e:`Validation failed`,isRetrying:!1});return}}if(r.aborted)return;d({data:t,loading:!1,error:null,isRetrying:!1});return}catch(e){if(r.aborted||e.name===`AbortError`&&r.aborted)return;let n=e.name===`TimeoutError`||e.name===`AbortError`||e.message?.includes(`timeout`),o=t({tested:[e.message],expectedKey:`THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY`,valueType:`number`})?.[0]===`1`||!1,s=o&&t({tested:[e.message],expectedKey:`MESSAGE`,valueType:`string`})?.[0]||`Custom validation error`,c=o||e.name===`ValidationError`;if(i===0||c){if(r.aborted)return;let t=n?Error(`Request timed out after 1000ms`,{cause:e}):o?Error(s,{cause:e}):e;d({data:null,loading:!1,error:t instanceof Error?t.message:typeof t==`string`?t:`typeof finalError is ${typeof t}`,isRetrying:!1});return}else{if(r.aborted)return;let e=1e3*2**i;e=Math.min(e,3e5);let t=Math.random()*200;e+=t,d({data:u.value.data,loading:!0,error:null,isRetrying:!0}),console.warn(`[Resource Retry] "${a}" сбой по ${n?`таймауту`:`ошибке сети`}. Попытка ${i+1}/${i+1}...`);try{if(await this.delay(e,r),r.aborted)return}catch{return}}}}},p=null;return this.effect(()=>{let e=n?n.value:void 0,t=new AbortController;return p=t,this.untrack(()=>{f(e,t.signal,!0)}),()=>t.abort()},`[CORE_INTERNAL_SIGNAL=1]:effect`),{get data(){return u.value.data},get loading(){return u.value.loading},get error(){return u.value.error},get isRetrying(){return u.value.isRetrying},get value(){return u.value},refetch:()=>{p?.abort(),p=new AbortController,f(n?n.value:void 0,p.signal,!1)},subscribe:e=>u.subscribe(e)}}},h=class extends m{},g=class extends h{autoLogQueue=[];isHardFlushScheduled=!1;queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,meta:n,timestamp:Date.now()}),this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>this.flushLogs()))}flushLogs(){this.isHardFlushScheduled=!1,this.autoLogQueue.length!==0&&(typeof process<`u`&&process.env.NODE_ENV!==`test`&&(console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`),this.autoLogQueue.forEach(e=>console.log(`[${e.type.toUpperCase()}] ${e.name}`,e.meta||``)),console.groupEnd()),this.autoLogQueue=[])}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t),a=!1,o={get value(){if(a)return i.value;let e=typeof performance<`u`?performance.now():0,t=i.value;return e&&n.queueLog(`computed`,r,{value:t,duration:`${(performance.now()-e).toFixed(3)}ms`}),t},subscribe:e=>i.subscribe(e),destroy(){a=!0,i.destroy()}};return`_node`in i&&Object.defineProperty(o,"_node",{value:i._node,enumerable:!1}),o}},_=class{engine;constructor(e){this.engine=e,this.onInit()}createNumericSignal(e,t){return this.engine.signal(e,{name:t,validate:e=>typeof e==`number`&&!isNaN(e)})}createComputed(e){return this.engine.computed(e)}createSignal(e,t){return this.engine.signal(e,t)}onInit(){}},v=_,y=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=_,e.BaseREService=v,e.BaseREServiceEnhanced=y,e.ReactiveEngine=h,e.ReactiveEngineAutolog=g,e.ReactiveEngineAutomatic=m,e.ReactiveEngineCore=m,e.flushLogs=p,e.queueLog=f});
13
13
  //# sourceMappingURL=reactive-engine.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/utils/getExtractedValues.ts","../src/core/core.method.computed.ts","../src/core/core.method.signal.ts","../src/core/core.method.batch.ts","../src/core/core.method.untrack.ts","../src/core/core.method.reactive.ts","../src/core/core.method.effect.ts","../src/core/core.logger.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = []\n if (!tested || !Array.isArray(tested)) return results // Предохранитель от пустых массивов\n\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i]\n if (typeof t !== 'string') continue // ЗАЩИТА: Пропускаем всё, что не является валидной строкой\n\n let regex\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g')\n break\n case 'string':\n default:\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g')\n break\n }\n\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value) }\n }\n }\n return results\n}\n","import { Computed, CleanupFn } from './types'\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 let versionCheckRequired = false\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n\n const releaseNode = (node: any): void => {\n if (!node) return\n const actNode = node._node || node\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 if (rawDepNode.type === 'computed' && rawDepNode.subscribers.size === 0) {\n releaseNode(rawDepNode)\n }\n }\n })\n }\n }\n\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 versionCheckRequired = true\n releaseNode(computedNode)\n engine.computedCache.delete(fn)\n }\n return res\n }\n }()\n\n // 🟢 КАНОНИЧЕСКИЙ ТОПОЛОГИЧЕСКИЙ ВАЛИДАТОР ГРАФА (Сверху Вниз)\n // Рекурсивно проверяет родителей и возвращает true, если выше по цепочке была хоть одна мутация.\n const checkUpstreamModifications = (node: any): boolean => {\n if (!node) return false\n const actNode = node._node || node\n\n // Чисто ленивые цепочки без эффектов (subscribers.size === 0) обязаны всегда рекурсивно\n // опрашивать предков, так как до них ленивое клеймение markDirty физически не долетает!\n const hasActiveSubscribers = actNode.subscribers && actNode.subscribers.size > 0\n if (hasActiveSubscribers && !actNode.versionCheckRequired) {\n return false\n }\n\n let hasChangedParent = false\n const depsArray = Array.from(actNode.dependencies || [])\n\n // 1. ФАЗА 1: Рекурсивно погружаемся в дедушек до самых корней графа\n for (const dep of depsArray) {\n const rawDep = (dep as any)._node || dep\n if (rawDep.type === 'computed' && (rawDep.versionCheckRequired || !hasActiveSubscribers)) {\n checkUpstreamModifications(rawDep)\n }\n }\n\n // 2. ФАЗА 2: Атомарно сверяем версии рёбер графа строго после схождения верхних каскадов.\n // Временная подмена activeConsumer гарантирует кристальную чистоту Dynamic Deps!\n const savedConsumer = engine.activeConsumer\n for (const dep of depsArray) {\n const rawDep = (dep as any)._node || dep\n\n if (rawDep.type === 'computed' && (rawDep.isDirty || rawDep.versionCheckRequired || !hasActiveSubscribers)) {\n engine.activeConsumer = rawDep\n try {\n rawDep.run()\n } finally {\n engine.activeConsumer = savedConsumer\n }\n }\n\n const currentVer = rawDep.version !== undefined ? rawDep.version : ((dep as any).version !== undefined ? (dep as any).version : engine.epoch)\n\n // СИНХРОНИЗАЦИЯ РЕБРА СВЯЗИ ВРЕМЕНИ ГРАФА:\n // Сверяем актуальную версию родителя со старым слепком в депо-версиях ребенка.\n if (!actNode.depVersions.has(dep) || currentVer !== actNode.depVersions.get(dep)) {\n hasChangedParent = true\n }\n\n // Атомарно перезаписываем свежую актуальную версию родителя в локальный слепок ребенка,\n // намертво защищая глубокие ленивые матрешки от протухания кэша!\n actNode.depVersions.set(dep, currentVer)\n }\n engine.activeConsumer = savedConsumer\n\n actNode.versionCheckRequired = false\n return hasChangedParent\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 get versionCheckRequired() { return versionCheckRequired },\n set versionCheckRequired(val: boolean) { versionCheckRequired = val },\n get depVersions() { return depVersions },\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 const oldDeps = Array.from(dependencies)\n const oldVersions = new Map(depVersions)\n\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') || (newValue && typeof newValue === 'object')\n\n // КРИСТАЛЬНО ЧИСТОЕ СРАВНЕНИЕ ИЗМЕНЕНИЙ ПО ЗНАЧЕНИЮ (Value Equality)\n const changed = isDirty || isObj || value !== newValue\n\n if (changed) {\n const previousValueSnapshot = isDirty ? undefined : (typeof value === 'object' && value !== null ? JSON.parse(JSON.stringify(value)) : value)\n value = newValue\n version++ // Растет строго при фактическом изменении значения!\n\n if (engine.log) {\n engine.log({\n type: 'computed',\n label: signalName || `computed:[${fn.name || computedNode.id}]`,\n details: { from: previousValueSnapshot, to: newValue }\n })\n }\n\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) rawSub.markDirty()\n })\n } else {\n // VALUE EQUALITY CUT: Значение примитива не изменилось!\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n if (rawSub.depVersions) {\n rawSub.depVersions.set(computedInstance, version)\n }\n if (rawSub.type === 'effect') {\n rawSub.isDirty = false\n engine.pendingEffects.delete(sub)\n }\n })\n }\n\n isDirty = false\n versionCheckRequired = false\n\n let maxDepDepth = 0\n let hasSameDeps = dependencies.size === oldDeps.length\n\n dependencies.forEach(dep => {\n const rawNode = dep._node || dep\n const currentVer = rawNode.version !== undefined ? rawNode.version : (dep.version !== undefined ? dep.version : engine.epoch)\n depVersions.set(dep, currentVer)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) maxDepDepth = rawNode.depth\n if (hasSameDeps && !oldDeps.includes(dep)) hasSameDeps = false\n })\n\n // ПАТТЕРН МЕЖКАДРОВОЙ СИНХРОНИЗАЦИИ: Если состав родителей стабилен, мы восстанавливаем\n // точные числовые тайминги версий из старого кадра, спасая длинные ленивые цепочки!\n if (hasSameDeps && oldVersions.size > 0) {\n oldVersions.forEach((ver, dep) => {\n if (depVersions.has(dep)) {\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version !== undefined ? rawNode.version : ver)\n }\n })\n } else if (!hasSameDeps && oldVersions.size > 0) {\n oldVersions.forEach((ver, dep) => {\n if (depVersions.has(dep)) {\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version !== undefined ? rawNode.version : ver)\n }\n })\n }\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 (!versionCheckRequired) {\n versionCheckRequired = true\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) rawSub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value() {\n if (engine.activeConsumer && engine.activeConsumer !== computedNode) {\n computedNode.subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(computedNode)\n }\n\n // 1. ФАЗА СВЕРХУ ВНИЗ: Рекурсивно опрашиваем родителей, выявляя сквозные мутации версий\n const upstreamChanged = checkUpstreamModifications(computedNode)\n\n // 2. ВТОРАЯ ФАЗА: Строгая атомарная сверка версий ребер графа строго после Pull каскада\n let needsUpdate = isDirty || upstreamChanged\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 } else {\n // Логируем холостой проход строго на уровне геттера для полной прозрачной отладки кэша\n if (versionCheckRequired && engine.log) {\n engine.log({\n type: 'computed',\n label: signalName || `computed:[${fn.name || computedNode.id}]`,\n details: { from: value, to: value }\n })\n }\n versionCheckRequired = false\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n if (rawSub.depVersions) {\n rawSub.depVersions.set(computedInstance, version)\n }\n })\n }\n return value\n },\n get valueWithoutTracking() { return value },\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 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;(computedInstance as any)._node = computedNode\n ;(computedInstance as any).subscribers = subscribers\n ;(computedInstance as any).dependencies = dependencies\n computedInstance._isDirty = () => isDirty || versionCheckRequired\n computedInstance.type = 'computed'\n computedInstance.run = () => computedNode.run()\n computedNode.destroy = () => {\n engine.computedCache.delete(fn)\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as any))\n return computedInstance\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, CleanupFn, SignalOptions } from './types'\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 })?.[0] === '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\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n // ⚛️ Синхронное каскадное уведомление подписчиков\n subscribers.forEach((sub: any) => {\n const rawSub = sub._node || sub\n\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) {\n rawSub.markDirty()\n }\n })\n\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 type: 'effect',\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","/**\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","/**\n * Изолированный менеджер контекста untrack реактивного графа.\n * Временно замораживает автоматический сбор зависимостей, подменяя activeConsumer на null.\n */\nexport function executeUntrack<T>(engine: any, fn: () => T): T {\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = null\n try {\n return fn()\n } finally {\n engine.activeConsumer = prevConsumer\n }\n}\n","/**\n * Изолированная фабрика глубоких реактивных Proxy-объектов графа.\n * Полностью отвязана от лексического контекста класса для абсолютной чистоты 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","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","import { LogEventType } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n this.churnTracker.set(label, activeHistory)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return {\n marker: '🔴',\n info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!`\n }\n }\n\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return {\n marker: '🟡',\n info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n return {\n marker: '🟢',\n info: `[STABLE] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n // 1. ОБРАБОТКА ХОЛОСТЫХ ВЫЗОВОВ (Value Equality Cut)\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n // ⚛️ ФИКС: Выводим холостые pull-вызовы вычислений ИСКЛЮЧИТЕЛЬНО в режиме тонкой отладки кэша!\n if (type === 'computed') {\n // if (engineLogger.isCoreOptimizationDebugEnabled) {\n // queueLogFn(type, `🔵 [IDLE PULL] ${label} (Значение кэша не изменилось)`, details);\n // }\n queueLogFn(type, `🔵 [IDLE PULL] ${label} (Значение кэша не изменилось)`, details)\n return\n }\n // Для остальных типов (batch, effect) холостой мусор полностью глушим\n return\n }\n }\n\n // 2. SIGNAL CHURN DETECTION: Обсчет частоты обновлений и дребезга\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n // Отправляем очищенный лог в системную очередь\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n\n}\n\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, Computed, IEffect, EngineLoggerOptions, LogEventType, CleanupFn, TransactionContext, LogRecord, SignalOptions, ResourceOptions, ResourceState, Resource } from './types'\nimport { createComputed } from './core.method.computed'\nimport { createSignal } from './core.method.signal'\nimport { executeBatch } from './core.method.batch'\nimport { executeUntrack } from './core.method.untrack'\nimport { createReactive } from './core.method.reactive'\nimport { createEffect } from './core.method.effect'\nimport { ReactiveDebounceLogger } from './core.logger'\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 this.untrack(() => {\n const _actualizeLazyCache = dep.value\n })\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 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 ReactiveDebounceLogger.processLog(this.logger, queueLog, {\n type,\n label,\n details,\n isInternalCoreSignal\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","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/utils/getExtractedValues.ts","../src/core/core.method.computed.ts","../src/core/core.method.signal.ts","../src/core/core.method.batch.ts","../src/core/core.method.untrack.ts","../src/core/core.method.reactive.ts","../src/core/core.method.effect.ts","../src/core/core.logger.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = []\n if (!tested || !Array.isArray(tested)) return results // Предохранитель от пустых массивов\n\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i]\n if (typeof t !== 'string') continue // ЗАЩИТА: Пропускаем всё, что не является валидной строкой\n\n let regex\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g')\n break\n case 'string':\n default:\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g')\n break\n }\n\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value) }\n }\n }\n return results\n}\n","import { Computed, CleanupFn } from './types'\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 let versionCheckRequired = false\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n\n const releaseNode = (node: any): void => {\n if (!node) return\n const actNode = node._node || node\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 if (rawDepNode.type === 'computed' && rawDepNode.subscribers.size === 0) {\n releaseNode(rawDepNode)\n }\n }\n })\n }\n }\n\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 versionCheckRequired = true\n releaseNode(computedNode)\n engine.computedCache.delete(fn)\n }\n return res\n }\n }()\n\n // 🟢 КАНОНИЧЕСКИЙ ТОПОЛОГИЧЕСКИЙ ВАЛИДАТОР ГРАФА (Сверху Вниз)\n // Рекурсивно проверяет родителей и возвращает true, если выше по цепочке была хоть одна мутация.\n const checkUpstreamModifications = (node: any): boolean => {\n if (!node) return false\n const actNode = node._node || node\n\n // Чисто ленивые цепочки без эффектов (subscribers.size === 0) обязаны всегда рекурсивно\n // опрашивать предков, так как до них ленивое клеймение markDirty физически не долетает!\n const hasActiveSubscribers = actNode.subscribers && actNode.subscribers.size > 0\n if (hasActiveSubscribers && !actNode.versionCheckRequired) {\n return false\n }\n\n let hasChangedParent = false\n const depsArray = Array.from(actNode.dependencies || [])\n\n // 1. ФАЗА 1: Рекурсивно погружаемся в дедушек до самых корней графа\n for (const dep of depsArray) {\n const rawDep = (dep as any)._node || dep\n if (rawDep.type === 'computed' && (rawDep.versionCheckRequired || !hasActiveSubscribers)) {\n checkUpstreamModifications(rawDep)\n }\n }\n\n // 2. ФАЗА 2: Атомарно сверяем версии рёбер графа строго после схождения верхних каскадов.\n // Временная подмена activeConsumer гарантирует кристальную чистоту Dynamic Deps!\n const savedConsumer = engine.activeConsumer\n for (const dep of depsArray) {\n const rawDep = (dep as any)._node || dep\n\n if (rawDep.type === 'computed' && (rawDep.isDirty || rawDep.versionCheckRequired || !hasActiveSubscribers)) {\n engine.activeConsumer = rawDep\n try {\n rawDep.run()\n } finally {\n engine.activeConsumer = savedConsumer\n }\n }\n\n const currentVer = rawDep.version !== undefined ? rawDep.version : ((dep as any).version !== undefined ? (dep as any).version : engine.epoch)\n\n // СИНХРОНИЗАЦИЯ РЕБРА СВЯЗИ ВРЕМЕНИ ГРАФА:\n // Сверяем актуальную версию родителя со старым слепком в депо-версиях ребенка.\n if (!actNode.depVersions.has(dep) || currentVer !== actNode.depVersions.get(dep)) {\n hasChangedParent = true\n }\n\n // Атомарно перезаписываем свежую актуальную версию родителя в локальный слепок ребенка,\n // намертво защищая глубокие ленивые матрешки от протухания кэша!\n actNode.depVersions.set(dep, currentVer)\n }\n engine.activeConsumer = savedConsumer\n\n actNode.versionCheckRequired = false\n return hasChangedParent\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 get versionCheckRequired() { return versionCheckRequired },\n set versionCheckRequired(val: boolean) { versionCheckRequired = val },\n get depVersions() { return depVersions },\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 const oldDeps = Array.from(dependencies)\n const oldVersions = new Map(depVersions)\n\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') || (newValue && typeof newValue === 'object')\n\n // КРИСТАЛЬНО ЧИСТОЕ СРАВНЕНИЕ ИЗМЕНЕНИЙ ПО ЗНАЧЕНИЮ (Value Equality)\n const changed = isDirty || isObj || value !== newValue\n\n if (changed) {\n const previousValueSnapshot = isDirty ? undefined : (typeof value === 'object' && value !== null ? JSON.parse(JSON.stringify(value)) : value)\n value = newValue\n version++ // Растет строго при фактическом изменении значения!\n\n if (engine.log) {\n engine.log({\n type: 'computed',\n label: signalName || `computed:[${fn.name || computedNode.id}]`,\n details: { from: previousValueSnapshot, to: newValue }\n })\n }\n\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) rawSub.markDirty()\n })\n } else {\n // VALUE EQUALITY CUT: Значение примитива не изменилось!\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n if (rawSub.depVersions) {\n rawSub.depVersions.set(computedInstance, version)\n }\n if (rawSub.type === 'effect') {\n rawSub.isDirty = false\n engine.pendingEffects.delete(sub)\n }\n })\n }\n\n isDirty = false\n versionCheckRequired = false\n\n let maxDepDepth = 0\n let hasSameDeps = dependencies.size === oldDeps.length\n\n dependencies.forEach(dep => {\n const rawNode = dep._node || dep\n const currentVer = rawNode.version !== undefined ? rawNode.version : (dep.version !== undefined ? dep.version : engine.epoch)\n depVersions.set(dep, currentVer)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) maxDepDepth = rawNode.depth\n if (hasSameDeps && !oldDeps.includes(dep)) hasSameDeps = false\n })\n\n // ПАТТЕРН МЕЖКАДРОВОЙ СИНХРОНИЗАЦИИ: Если состав родителей стабилен, мы восстанавливаем\n // точные числовые тайминги версий из старого кадра, спасая длинные ленивые цепочки!\n if (hasSameDeps && oldVersions.size > 0) {\n oldVersions.forEach((ver, dep) => {\n if (depVersions.has(dep)) {\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version !== undefined ? rawNode.version : ver)\n }\n })\n } else if (!hasSameDeps && oldVersions.size > 0) {\n oldVersions.forEach((ver, dep) => {\n if (depVersions.has(dep)) {\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version !== undefined ? rawNode.version : ver)\n }\n })\n }\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 (!versionCheckRequired) {\n versionCheckRequired = true\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) rawSub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value() {\n if (engine.activeConsumer && engine.activeConsumer !== computedNode) {\n computedNode.subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(computedNode)\n }\n\n // 1. ФАЗА СВЕРХУ ВНИЗ: Рекурсивно опрашиваем родителей, выявляя сквозные мутации версий\n const upstreamChanged = checkUpstreamModifications(computedNode)\n\n // 2. ВТОРАЯ ФАЗА: Строгая атомарная сверка версий ребер графа строго после Pull каскада\n let needsUpdate = isDirty || upstreamChanged\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 } else {\n // Логируем холостой проход строго на уровне геттера для полной прозрачной отладки кэша\n if (versionCheckRequired && engine.log) {\n engine.log({\n type: 'computed',\n label: signalName || `computed:[${fn.name || computedNode.id}]`,\n details: { from: value, to: value }\n })\n }\n versionCheckRequired = false\n subscribers.forEach(sub => {\n const rawSub = sub._node || sub\n if (rawSub.depVersions) {\n rawSub.depVersions.set(computedInstance, version)\n }\n })\n }\n return value\n },\n get valueWithoutTracking() { return value },\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 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;(computedInstance as any)._node = computedNode\n ;(computedInstance as any).subscribers = subscribers\n ;(computedInstance as any).dependencies = dependencies\n computedInstance._isDirty = () => isDirty || versionCheckRequired\n computedInstance.type = 'computed'\n computedInstance.run = () => computedNode.run()\n computedNode.destroy = () => {\n engine.computedCache.delete(fn)\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as any))\n return computedInstance\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, CleanupFn, SignalOptions } from './types'\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 })?.[0] === '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 get valueWithoutTracking() {\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\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n // ⚛️ Синхронное каскадное уведомление подписчиков\n subscribers.forEach((sub: any) => {\n const rawSub = sub._node || sub\n\n rawSub.isDirty = true\n if (rawSub.type === 'effect') {\n engine.pendingEffects.add(sub)\n }\n if (rawSub.markDirty) {\n rawSub.markDirty()\n }\n })\n\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 type: 'effect',\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","/**\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","/**\n * Изолированный менеджер контекста untrack реактивного графа.\n * Временно замораживает автоматический сбор зависимостей, подменяя activeConsumer на null.\n */\nexport function executeUntrack<T>(engine: any, fn: () => T): T {\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = null\n try {\n return fn()\n } finally {\n engine.activeConsumer = prevConsumer\n }\n}\n","/**\n * Изолированная фабрика глубоких реактивных Proxy-объектов графа.\n * Полностью отвязана от лексического контекста класса для абсолютной чистоты 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","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","import { LogEventType } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n this.churnTracker.set(label, activeHistory)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return {\n marker: '🔴',\n info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!`\n }\n }\n\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return {\n marker: '🟡',\n info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n return {\n marker: '🟢',\n info: `[STABLE] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n // 1. ОБРАБОТКА ХОЛОСТЫХ ВЫЗОВОВ (Value Equality Cut)\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n // ⚛️ ФИКС: Выводим холостые pull-вызовы вычислений ИСКЛЮЧИТЕЛЬНО в режиме тонкой отладки кэша!\n if (type === 'computed') {\n // if (engineLogger.isCoreOptimizationDebugEnabled) {\n // queueLogFn(type, `🔵 [IDLE PULL] ${label} (Значение кэша не изменилось)`, details);\n // }\n queueLogFn(type, `🔵 [IDLE PULL] ${label} (Значение кэша не изменилось)`, details)\n return\n }\n // Для остальных типов (batch, effect) холостой мусор полностью глушим\n return\n }\n }\n\n // 2. SIGNAL CHURN DETECTION: Обсчет частоты обновлений и дребезга\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n // Отправляем очищенный лог в системную очередь\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n\n}\n\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, Computed, IEffect, EngineLoggerOptions, LogEventType, CleanupFn, TransactionContext, LogRecord, SignalOptions, ResourceOptions, ResourceState, Resource } from './types'\nimport { createComputed } from './core.method.computed'\nimport { createSignal } from './core.method.signal'\nimport { executeBatch } from './core.method.batch'\nimport { executeUntrack } from './core.method.untrack'\nimport { createReactive } from './core.method.reactive'\nimport { createEffect } from './core.method.effect'\nimport { ReactiveDebounceLogger } from './core.logger'\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 this.untrack(() => {\n const _actualizeLazyCache = dep.value\n })\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 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 ReactiveDebounceLogger.processLog(this.logger, queueLog, {\n type,\n label,\n details,\n isInternalCoreSignal\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","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"yRAAA,IAAa,GAAsB,CACjC,SAAQ,cAAa,eAKP,CACd,IAAM,EAAoB,CAAC,EAC3B,GAAI,CAAC,GAAU,CAAC,MAAM,QAAQ,CAAM,EAAG,OAAO,EAE9C,IAAK,IAAI,EAAI,EAAG,EAAM,EAAO,OAAQ,EAAI,EAAK,IAAK,CACjD,IAAM,EAAI,EAAO,GACjB,GAAI,OAAO,GAAM,SAAU,SAE3B,IAAI,EACJ,OAAQ,EAAR,CACA,IAAK,SACH,EAAY,OAAO,MAAM,EAAY,oBAAqB,GAAG,EAC7D,MAEF,QACE,EAAY,OAAO,MAAM,EAAY,mBAAoB,GAAG,EAC5D,KACF,CAEA,IAAK,IAAM,KAAK,EAAE,SAAS,CAAK,EAC1B,GAAG,QAAU,EAAQ,KAAK,EAAE,OAAO,KAAK,CAEhD,CACA,OAAO,CACT,EC5BA,SAAgB,EACd,EACA,EACA,EACa,CAEb,IAAM,EADY,EAAO,cAAc,IAAI,CAC1B,CAAA,EAAW,MAAM,EAClC,GAAI,EAAU,OAAO,EAErB,IAAI,EACA,EAAU,GACV,EAAU,EACV,EAAuB,GAErB,EAAe,IAAI,IACnB,EAAc,IAAI,IAElB,EAAe,GAAoB,CACvC,GAAI,CAAC,EAAM,OACX,IAAM,EAAU,EAAK,OAAS,EAC9B,GAAI,EAAQ,cAAgB,EAAQ,aAAa,KAAO,EAAG,CACzD,IAAM,EAAe,MAAM,KAAK,EAAQ,YAAY,EACpD,EAAQ,aAAa,MAAM,EACvB,EAAQ,aAAa,EAAQ,YAAY,MAAM,EAEnD,EAAa,QAAS,GAAa,CACjC,IAAM,EAAa,EAAI,OAAS,EAC5B,EAAW,cACb,EAAW,YAAY,OAAO,CAAO,EACrC,EAAW,YAAY,OAAO,CAAI,EAClC,EAAW,YAAY,OAAO,CAAY,EACtC,EAAW,OAAS,YAAc,EAAW,YAAY,OAAS,GACpE,EAAY,CAAU,EAG5B,CAAC,CACH,CACF,EAEM,EAAc,IAAI,cAAc,GAAS,CAC7C,OAAgB,EAAmB,CACjC,IAAM,EAAM,MAAM,OAAO,CAAG,EAO5B,OANI,KAAK,OAAS,IAChB,EAAU,GACV,EAAuB,GACvB,EAAY,CAAY,EACxB,EAAO,cAAc,OAAO,CAAE,GAEzB,CACT,CACF,EAIM,EAA8B,GAAuB,CACzD,GAAI,CAAC,EAAM,MAAO,GAClB,IAAM,EAAU,EAAK,OAAS,EAIxB,EAAuB,EAAQ,aAAe,EAAQ,YAAY,KAAO,EAC/E,GAAI,GAAwB,CAAC,EAAQ,qBACnC,MAAO,GAGT,IAAI,EAAmB,GACjB,EAAY,MAAM,KAAK,EAAQ,cAAgB,CAAC,CAAC,EAGvD,IAAK,IAAM,KAAO,EAAW,CAC3B,IAAM,EAAU,EAAY,OAAS,EACjC,EAAO,OAAS,aAAe,EAAO,sBAAwB,CAAC,IACjE,EAA2B,CAAM,CAErC,CAIA,IAAM,EAAgB,EAAO,eAC7B,IAAK,IAAM,KAAO,EAAW,CAC3B,IAAM,EAAU,EAAY,OAAS,EAErC,GAAI,EAAO,OAAS,aAAe,EAAO,SAAW,EAAO,sBAAwB,CAAC,GAAuB,CAC1G,EAAO,eAAiB,EACxB,GAAI,CACF,EAAO,IAAI,CACb,QAAU,CACR,EAAO,eAAiB,CAC1B,CACF,CAEA,IAAM,EAAa,EAAO,UAAY,IAAA,GAA+B,EAAY,UAAY,IAAA,GAAmC,EAAO,MAA7B,EAAY,QAApE,EAAO,SAIrD,CAAC,EAAQ,YAAY,IAAI,CAAG,GAAK,IAAe,EAAQ,YAAY,IAAI,CAAG,KAC7E,EAAmB,IAKrB,EAAQ,YAAY,IAAI,EAAK,CAAU,CACzC,CAIA,MAHA,GAAO,eAAiB,EAExB,EAAQ,qBAAuB,GACxB,CACT,EAEM,EAAoB,CACxB,GAAI,EAAO,eACX,eACA,cACA,MAAO,EACP,KAAM,WACN,KACA,IAAI,SAAU,CAAE,OAAO,CAAQ,EAC/B,IAAI,sBAAuB,CAAE,OAAO,CAAqB,EACzD,IAAI,qBAAqB,EAAc,CAAE,EAAuB,CAAI,EACpE,IAAI,aAAc,CAAE,OAAO,CAAY,EACvC,QAAW,CACT,GAAI,EAAO,oBAAoB,IAAI,CAAY,EAAG,MAAU,MAAM,0CAA0C,EAC5G,EAAO,oBAAoB,IAAI,CAAY,EAC3C,IAAM,EAAe,EAAO,eAC5B,EAAO,eAAiB,EAExB,IAAM,EAAU,MAAM,KAAK,CAAY,EACjC,EAAc,IAAI,IAAI,CAAW,EAEvC,EAAa,QAAQ,GAAO,CAC1B,IAAM,EAAa,EAAI,OAAS,EAC5B,EAAW,aAAa,EAAW,YAAY,OAAO,CAAY,CACxE,CAAC,EACD,EAAa,MAAM,EACnB,EAAY,MAAM,EAElB,GAAI,CACF,IAAM,EAAW,EAAG,EAId,EAAU,GAHD,GAAS,OAAO,GAAU,UAAc,GAAY,OAAO,GAAa,UAGnD,IAAU,EAE9C,GAAI,EAAS,CACX,IAAM,EAAwB,EAAU,IAAA,GAAa,OAAO,GAAU,UAAY,EAAiB,KAAK,MAAM,KAAK,UAAU,CAAK,CAAC,EAAI,EACvI,EAAQ,EACR,IAEI,EAAO,KACT,EAAO,IAAI,CACT,KAAM,WACN,MAAO,GAAc,aAAa,EAAG,MAAQ,EAAa,GAAG,GAC7D,QAAS,CAAE,KAAM,EAAuB,GAAI,CAAS,CACvD,CAAC,EAGH,EAAY,QAAQ,GAAO,CACzB,IAAM,EAAS,EAAI,OAAS,EAC5B,EAAO,QAAU,GACb,EAAO,OAAS,UAClB,EAAO,eAAe,IAAI,CAAG,EAE3B,EAAO,WAAW,EAAO,UAAU,CACzC,CAAC,CACH,MAEE,EAAY,QAAQ,GAAO,CACzB,IAAM,EAAS,EAAI,OAAS,EACxB,EAAO,aACT,EAAO,YAAY,IAAI,EAAkB,CAAO,EAE9C,EAAO,OAAS,WAClB,EAAO,QAAU,GACjB,EAAO,eAAe,OAAO,CAAG,EAEpC,CAAC,EAGH,EAAU,GACV,EAAuB,GAEvB,IAAI,EAAc,EACd,EAAc,EAAa,OAAS,EAAQ,OA6BhD,OA3BA,EAAa,QAAQ,GAAO,CAC1B,IAAM,EAAU,EAAI,OAAS,EACvB,EAAa,EAAQ,UAAY,IAAA,GAA+B,EAAI,UAAY,IAAA,GAA0B,EAAO,MAArB,EAAI,QAAnD,EAAQ,QAC3D,EAAY,IAAI,EAAK,CAAU,EAC3B,EAAQ,QAAU,IAAA,IAAa,EAAQ,MAAQ,IAAa,EAAc,EAAQ,OAClF,GAAe,CAAC,EAAQ,SAAS,CAAG,IAAG,EAAc,GAC3D,CAAC,GAIG,GAAe,EAAY,KAAO,GAO3B,CAAC,GAAe,EAAY,KAAO,IAN5C,EAAY,SAAS,EAAK,IAAQ,CAChC,GAAI,EAAY,IAAI,CAAG,EAAG,CACxB,IAAM,EAAU,EAAI,OAAS,EAC7B,EAAY,IAAI,EAAK,EAAQ,UAAY,IAAA,GAA8B,EAAlB,EAAQ,OAAa,CAC5E,CACF,CAAC,EAUH,EAAa,MAAQ,EAAc,EAC5B,CACT,QAAU,CACR,EAAO,eAAiB,EACxB,EAAO,oBAAoB,OAAO,CAAY,CAChD,CACF,EACA,cAAiB,CACV,IACH,EAAuB,GACvB,EAAY,QAAQ,GAAO,CACzB,IAAM,EAAS,EAAI,OAAS,EAC5B,EAAO,QAAU,GACb,EAAO,OAAS,UAClB,EAAO,eAAe,IAAI,CAAG,EAE3B,EAAO,WAAW,EAAO,UAAU,CACzC,CAAC,EAEL,CACF,EAEM,EAAgC,CACpC,IAAI,OAAQ,CACN,EAAO,gBAAkB,EAAO,iBAAmB,IACrD,EAAa,YAAY,IAAI,EAAO,cAAc,EAClD,EAAO,eAAe,aAAa,IAAI,CAAY,GAIrD,IAAM,EAAkB,EAA2B,CAAY,EAG3D,EAAc,GAAW,EAE7B,GAAI,CAAC,GAAe,EAAa,KAAO,EACtC,IAAK,IAAM,KAAO,MAAM,KAAK,CAAY,EAAG,CAC1C,IAAM,EAAW,EAAY,OAAS,EAEtC,IADmB,EAAQ,UAAY,IAAA,GAA+B,EAAI,UAAY,IAAA,GAA0B,EAAO,MAArB,EAAI,QAAnD,EAAQ,WACxC,EAAY,IAAI,CAAG,EAAG,CACvC,EAAc,GACd,KACF,CACF,CAsBF,OAnBI,EACF,EAAa,IAAI,GAGb,GAAwB,EAAO,KACjC,EAAO,IAAI,CACT,KAAM,WACN,MAAO,GAAc,aAAa,EAAG,MAAQ,EAAa,GAAG,GAC7D,QAAS,CAAE,KAAM,EAAO,GAAI,CAAM,CACpC,CAAC,EAEH,EAAuB,GACvB,EAAY,QAAQ,GAAO,CACzB,IAAM,EAAS,EAAI,OAAS,EACxB,EAAO,aACT,EAAO,YAAY,IAAI,EAAkB,CAAO,CAEpD,CAAC,GAEI,CACT,EACA,IAAI,sBAAuB,CAAE,OAAO,CAAM,EAC1C,IAAI,SAAU,CAAE,OAAO,CAAQ,EAC/B,UAAU,EAAiC,CACzC,IAAM,EAAkB,CACtB,GAAI,EAAO,eACX,QAAS,GACT,MAAO,KACP,aAAc,IAAI,IAClB,KAAM,SACN,QAAW,CACL,MAAW,WACf,GAAI,CAAE,EAAG,EAAiB,KAAK,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,CACtE,CACF,EAGA,OAFA,EAAa,YAAY,IAAI,CAAU,EACvC,EAAG,EAAiB,KAAK,MACZ,CACX,EAAW,WAAa,GACxB,EAAa,YAAY,OAAO,CAAU,CAC5C,CACF,EACA,eAAe,EAA2B,CACxC,OAAQ,EAAyB,UAAU,CAAE,CAC/C,EACA,YAAe,CACb,EAAa,YAAY,MAAM,EAC/B,EAAY,CAAY,EACxB,EAAO,cAAc,OAAO,CAAE,EAC9B,EAAU,EACZ,EACA,YAAY,EAA2B,CACrC,IAAM,EAAkB,CACtB,GAAI,EAAO,eACX,KAAM,SACN,IAAK,EACL,QAAS,EACX,EAEA,OADA,EAAa,YAAY,IAAI,CAAU,MAC1B,CACX,EAAY,OAAO,CAAU,CAC/B,CACF,CACF,EAWA,MAVD,GAA0B,MAAQ,EAChC,EAA0B,YAAc,EACxC,EAA0B,aAAe,EAC1C,EAAiB,aAAiB,GAAW,EAC7C,EAAiB,KAAO,WACxB,EAAiB,QAAY,EAAa,IAAI,EAC9C,EAAa,YAAgB,CAC3B,EAAO,cAAc,OAAO,CAAE,CAChC,EACA,EAAO,cAAc,IAAI,EAAI,IAAI,QAAQ,CAAuB,CAAC,EAC1D,CACT,CC1UA,SAAgB,EACd,EACA,EACA,EACW,CACX,IAAI,EAAQ,EACR,EAAU,EACR,EAAc,IAAI,IAClB,EAAO,OAAO,GAAkB,SAAW,EAAgB,GAAe,MAAQ,GAElF,EAAuB,EAAmB,CAC9C,OAAQ,CAAC,CAAI,EACb,YAAa,uBACb,UAAW,QACb,CAAC,CAAC,GAAG,KAAO,KAAO,GAEb,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,sBAAuB,CACzB,OAAO,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,EAER,IACA,EAAO,QAEP,EAAO,IAAI,CACT,KAAM,SACN,MAAO,GAAQ,SACf,QAAS,CAAE,KAAM,EAAU,GAAI,CAAS,EACxC,sBACF,CAAC,EAGD,EAAY,QAAS,GAAa,CAChC,IAAM,EAAS,EAAI,OAAS,EAE5B,EAAO,QAAU,GACb,EAAO,OAAS,UAClB,EAAO,eAAe,IAAI,CAAG,EAE3B,EAAO,WACT,EAAO,UAAU,CAErB,CAAC,EAEG,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,KAAM,SACN,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,CClGA,SAAgB,EAAgB,EAAa,EAAgB,CAC3D,EAAO,aACP,GAAI,CACF,OAAO,EAAG,CACZ,QAAU,CACR,EAAO,aACH,EAAO,aAAe,GACxB,EAAO,aAAa,CAExB,CACF,CCVA,SAAgB,EAAkB,EAAa,EAAgB,CAC7D,IAAM,EAAe,EAAO,eAC5B,EAAO,eAAiB,KACxB,GAAI,CACF,OAAO,EAAG,CACZ,QAAU,CACR,EAAO,eAAiB,CAC1B,CACF,CCRA,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,CCxDA,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,CC9CA,IAAa,EAAb,KAAoC,CAClC,OAAe,aAAe,IAAI,IAElC,OAAwB,eAAiB,IACzC,OAAwB,wBAA0B,EAClD,OAAwB,yBAA2B,EAEnD,OAAe,YAAY,EAAY,EAAqB,CAG1D,OAFI,IAAM,EAAU,GAChB,OAAO,GAAM,UAAY,OAAO,GAAM,UAAY,IAAM,MAAQ,IAAM,KAAa,GAChF,KAAK,UAAU,CAAC,IAAM,KAAK,UAAU,CAAC,CAC/C,CAEA,OAAe,mBAAmB,EAAiD,CACjF,IAAM,EAAM,KAAK,IAAI,EAChB,KAAK,aAAa,IAAI,CAAK,GAC9B,KAAK,aAAa,IAAI,EAAO,CAAC,CAAC,EAGjC,IAAM,EAAU,KAAK,aAAa,IAAI,CAAK,EACrC,EAAS,EAAM,KAAK,eACpB,EAAgB,EAAQ,OAAO,GAAM,EAAK,CAAM,EACtD,EAAc,KAAK,CAAG,EACtB,KAAK,aAAa,IAAI,EAAO,CAAa,EAE1C,IAAM,EAAc,EAAc,OAC5B,GAAe,KAAK,eAAiB,IAAA,CAAM,QAAQ,CAAC,EAgB1D,OAdI,GAAe,KAAK,yBACf,CACL,OAAQ,KACR,KAAM,qBAAqB,EAAY,QAAQ,EAAY,qBAC7D,EAGE,GAAe,KAAK,wBACf,CACL,OAAQ,KACR,KAAM,oBAAoB,EAAY,QAAQ,EAAY,GAC5D,EAGK,CACL,OAAQ,KACR,KAAM,aAAa,EAAY,QAAQ,EAAY,GACrD,CACF,CAEA,OAAc,WACZ,EACA,EACA,EACA,CACA,GAAM,CAAE,OAAM,QAAO,UAAS,uBAAuB,IAAU,EAG/D,GADI,CAAC,EAAa,WACd,GAAwB,CAAC,EAAa,+BAAgC,OAG1E,GAAI,GAAW,SAAU,GAAW,OAAQ,GACtC,KAAK,YAAY,EAAQ,KAAM,EAAQ,EAAE,EAAG,CAE9C,GAAI,IAAS,WAAY,CAIvB,EAAW,EAAM,kBAAkB,EAAM,gCAAiC,CAAO,EACjF,MACF,CAEA,MACF,CAIF,IAAI,EAAY,GAChB,GAAI,IAAS,UAAY,IAAS,YAAc,IAAS,WAAY,CACnE,IAAM,EAAQ,KAAK,mBAAmB,CAAK,EAC3C,EAAY,EAAM,SAAW,KAAO,IAAI,EAAM,SAAW,IAAI,EAAM,OAAO,GAAG,EAAM,MACrF,CAGA,EAAW,EAAM,GAAG,IAAQ,IAAa,CAAO,CAClD,CAEF,EC5EM,EAA4C,CAChD,OAAQ,6FACR,SAAU,6FACV,OAAQ,6FACR,MAAO,6FACP,SAAU,6FACV,SAAU,4FACZ,EACI,EAAgD,KACpD,SAAS,EAAkB,EAAwB,CACjD,GAAI,IAAU,KAAM,MAAO,OAC3B,GAAI,IAAU,IAAA,GAAW,MAAO,YAChC,GAAI,OAAO,GAAU,SACnB,GAAI,CACF,OAAO,KAAK,UAAU,CAAK,CAC7B,MAAY,CACV,MAAO,0BACT,CAEF,OAAO,OAAO,CAAK,CACrB,CACA,SAAgB,EAAS,EAAoB,EAAe,EAAqE,CAC1H,IACH,EAAqB,CAAE,GAAI,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAG,CAAC,EAAG,gBAAiB,CAAC,EAAG,WAAY,EAAM,EAC9G,mBAAqB,EAAU,CAAC,GAElC,EAAmB,gBAAgB,KAAK,CAAE,OAAM,QAAO,KAAM,GAAS,KAAM,GAAI,GAAS,GAAI,QAAS,GAAS,QAAS,UAAW,KAAK,IAAI,CAAE,CAAC,CACjJ,CACA,SAAgB,GAAkB,CAChC,GAAI,CAAC,GAAsB,EAAmB,WAAY,OAC1D,EAAmB,WAAa,GAChC,IAAM,EAAQ,EAAmB,gBACjC,GAAI,EAAM,SAAW,EAAG,CACtB,EAAqB,KACrB,MACF,CACA,QAAQ,eAAe,iCAAiC,EAAmB,GAAG,KAAK,EAAM,OAAO,cAAe,6FAA8F,mCAAmC,EAChP,IAAK,IAAM,KAAU,EAAO,CAC1B,IAAM,EAAa,EAAY,EAAO,MAChC,EAAgB,EAAO,OAAS,IAAA,IAAa,EAAO,KAAO,IAAA,GAC7D,EAAa,KAAK,EAAO,KAAK,YAAY,EAAE,KAAK,EAAO,QAExD,IACI,EAAO,KACX,GAAc,IAAI,EAAkB,EAAO,IAAI,EAAE,KAAK,EAAkB,EAAO,EAAE,IAC9E,GAAc,KAAK,EAAkB,EAAO,EAAE,EAAE,IAGnD,EAAO,UAAY,IAAA,GAKrB,QAAQ,IAAI,EAAY,EAAY,iBAAiB,GAJrD,QAAQ,eAAe,EAAY,EAAY,iBAAiB,EAChE,QAAQ,IAAI,WAAY,EAAO,OAAO,EACtC,QAAQ,SAAS,EAIrB,CACA,QAAQ,SAAS,EACjB,EAAqB,IACvB,CACA,IAAa,EAAb,KAAgC,CAC9B,gBAA4B,OAC5B,OACA,MAAe,EACf,eAA6B,KAC7B,WAAoB,EACpB,aAAsB,EACtB,eAAwB,IAAI,IAC5B,cAAuB,IAAI,IAC3B,WAAqB,IAAI,IACzB,QAAkB,IAAI,IACtB,WAAqB,IAAI,QACzB,aAAuB,IAAI,QAC3B,gBAA0B,IAAI,QAC9B,oBAA8B,IAAI,IAElC,YAAY,EAA4C,CACtD,KAAK,OAAS,GAAS,QAAU,CAAE,UAAW,EAAM,CACtD,CAEA,SAAgB,EAAoB,EAAe,EAAqE,CACtH,EAAS,EAAM,EAAO,CAAO,CAC/B,CAEA,cAA4B,CAC1B,GAAI,KAAK,WAAa,EAAG,OACzB,IAAM,EAAU,MAAM,KAAK,KAAK,cAAc,EAC9C,KAAK,eAAe,MAAM,EAC1B,EAAQ,MAAM,EAAG,KAAO,EAAE,OAAS,IAAM,EAAE,OAAS,IAAM,EAAE,GAAK,EAAE,EAAE,EAErE,IAAM,EAAe,KAAK,eAE1B,GAAI,CACF,IAAK,IAAM,KAAU,EACf,MAAO,WAEX,IAAI,EAAO,cAAgB,EAAO,aAAa,KAAO,EACpD,IAAK,IAAM,KAAO,EAAO,aAAc,CACrC,IAAM,EAAU,EAAI,OAAS,EAC7B,GAAI,EAAQ,OAAS,YAAc,EAAQ,UAAY,EAAQ,SAAS,EACtE,GAAI,CACF,KAAK,YAAc,CACW,EAAI,KAClC,CAAC,CACH,OAAS,EAAK,CACZ,GAAI,KAAK,aAAe,EAAG,MAAM,CACnC,CAEJ,CAGG,KAAO,QAEZ,GAAI,CACF,EAAO,IAAI,CACb,OAAS,EAAK,CACZ,GAAI,KAAK,aAAe,EAAG,MAAM,CACnC,CATE,CAWN,QAAU,CACR,KAAK,eAAiB,CACxB,CACF,CAEA,MAAgB,EAAgB,CAC9B,OAAO,EAAgB,KAAM,CAAE,CACjC,CAEA,IAAa,CAAE,OAAM,QAAO,UAAS,uBAAuB,IAA+I,CACzM,EAAuB,WAAW,KAAK,OAAQ,EAAU,CACvD,OACA,QACA,UACA,sBACF,CAAC,CACH,CAEA,OAAiB,EAAiB,EAAsD,CACtF,OAAO,EAAgB,KAAM,EAAc,CAAa,CAC1D,CAEA,SAAmB,EAAa,EAAkC,CAEhE,OAAO,EAAkB,KAAM,EAAI,CAAU,CAC/C,CAEA,OAAc,EAA4B,EAAiC,CACzE,OAAO,EAAa,KAAM,EAAI,CAAU,CAC1C,CAEA,QAAkB,EAAgB,CAChC,OAAO,EAAkB,KAAM,CAAE,CACnC,CAEA,SAAkC,EAAW,EAAkB,CAC7D,OAAO,EAAkB,KAAM,EAAQ,CAAI,CAC7C,CAEA,QAAkB,EAA0B,EAAsC,CAChF,KAAK,WAAW,IAAI,EAAO,CAAc,EACzC,KAAK,QAAQ,OAAO,CAAK,CAC3B,CAEA,OAAiB,EAA6B,CAC5C,GAAI,GAAiC,KAAM,MAAU,MAAM,2BAA2B,EACtF,GAAI,KAAK,QAAQ,IAAI,CAAK,EAAG,OAAO,KAAK,QAAQ,IAAI,CAAK,EAC1D,GAAI,KAAK,oBAAoB,IAAI,CAAK,EAAG,MAAU,MAAM,uCAAuC,EAChG,KAAK,oBAAoB,IAAI,CAAK,EAClC,GAAI,CACF,GAAI,KAAK,WAAW,IAAI,CAAK,EAAG,CAC9B,IAAM,EAAQ,KAAK,WAAW,IAAI,CAAK,EACvC,GAAI,OAAO,GAAU,WAAY,CAC/B,GAAK,EAAc,gBAAiB,CAClC,IAAM,EAAW,EAAmB,IAAI,EAKxC,OAJI,IAAY,IAAA,GAIT,GAHL,KAAK,QAAQ,IAAI,EAAO,CAAO,EACxB,EAGX,CACA,IAAM,EAAM,EAAM,SAAS,EAE3B,GAAI,EADY,EAAI,WAAW,QAAQ,GAAK,EAAI,WAAW,QAAQ,GAAM,EAAM,WAAa,EAAM,UAAU,cAAgB,GAAS,CAAC,EAAI,WAAW,UAAU,GAAK,CAAC,EAAI,SAAS,IAAI,GACxK,CACZ,IAAM,EAAY,EAAqB,IAAI,EAE3C,OADA,KAAK,QAAQ,IAAI,EAAO,CAAQ,EACzB,CACT,CACA,OAAO,CACT,CACA,OAAO,CACT,CACA,GAAI,OAAO,GAAU,WAAY,CAC/B,IAAM,EAAW,IAAK,EAAyB,IAAI,EAEnD,OADA,KAAK,QAAQ,IAAI,EAAO,CAAQ,EACzB,CACT,CACA,MAAU,MAAM,4BAA4B,CAC9C,QAAU,CACR,KAAK,oBAAoB,OAAO,CAAK,CACvC,CACF,CAEA,MAAc,EAAY,EAAoC,CAC5D,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,GAAI,EAAO,QACT,OAAO,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,EAGzD,IAAM,EAAY,eAAiB,CACjC,EAAO,oBAAoB,QAAS,CAAO,EAC3C,EAAQ,CACV,EAAG,CAAE,EAEC,MAAgB,CACpB,aAAa,CAAS,EACtB,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,CAClD,EAEA,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,CAC1D,CAAC,CACH,CAEA,SACE,EACA,EACA,EACa,CACb,IAAM,EAAkB,GAAiB,OAAO,GAAkB,SAC5D,EAAqB,EACrB,EAAwC,MAAQ,mBACjD,GAA4B,mBAE3B,EAA0C,EAC3C,EACD,CAAC,EAEC,EAA0B,EAAQ,yBAA2B,GAC7D,EAAmB,EAAQ,iBAC3B,EAAsB,EAAQ,oBAM9B,EAAQ,KAAK,OACjB,CAAE,KAAM,KAAM,QAAS,GAAM,MAAO,KAAM,WAAY,EAAM,EAC5D,2CAA2C,GAC7C,EAEM,EAAuB,GAAgC,CAC3D,KAAK,IAAI,CAAE,KAAM,WAAY,MAAO,EAAoB,QAAS,CAAE,GAAI,EAAW,KAAM,EAAM,KAAM,CAAE,CAAC,EACvG,EAAM,MAAQ,CAChB,EAEM,EAAO,MAAO,EAAW,EAA2B,EAAiB,KAAU,CACnF,GAAI,EAAa,QAAS,OAkC1B,GAjCgB,EAAQ,qBAAsB,EAAQ,oBAAoB,CAAM,EAiC5E,EAAqB,CACvB,IAAM,EAAsB,EAAoB,CAAM,EACtD,GAAI,IAAwB,IAAS,OAAO,GAAwB,SAAU,CAC5E,GAAI,EAAa,QAAS,OAC1B,IAAM,EAAW,OAAO,GAAwB,SAC5C,EACA,2CAEE,EAAc,EAAiB,KAAO,KAAK,YAAc,EAAM,MAAM,IAAI,EAC/E,EAAoB,CAAE,KAAM,EAAa,QAAS,GAAO,MAAO,EAAU,WAAY,EAAM,CAAC,EAC7F,MACF,CACF,CAEA,IAAM,EADc,GAAkB,EACJ,KAAO,KAAK,YAAc,EAAM,MAAM,IAAI,EAC5E,EAAoB,CAAE,KAAM,EAAa,QAAS,GAAM,MAAO,KAAM,WAAY,EAAM,CAAC,EACxF,IAAK,IAAI,EAAU,EAAG,GAAW,EAAY,IAAW,CACtD,GAAI,EAAa,QAAS,OAC1B,IAAI,EAAiB,EACrB,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,EAAQ,CAAc,EACjD,GAAI,EAAa,QAAS,OAC1B,GAAI,EAAe,QACjB,MAAM,IAAI,aAAa,2BAA4B,cAAc,EAEnE,GAAI,EAAkB,CACpB,IAAM,EAAmB,EAAiB,CAAI,EAC9C,GAAI,IAAqB,IAAS,OAAO,GAAqB,SAAU,CACtE,GAAI,EAAa,QAAS,OAE1B,EAAoB,CAAE,KAAM,KAAM,QAAS,GAAO,MADjC,OAAO,GAAqB,SAAW,EAAmB,oBACR,WAAY,EAAM,CAAC,EACtF,MACF,CACF,CACA,GAAI,EAAa,QAAS,OAC1B,EAAoB,CAAE,OAAM,QAAS,GAAO,MAAO,KAAM,WAAY,EAAM,CAAC,EAC5E,MACF,OAAS,EAAY,CACnB,GAAI,EAAa,SAAa,EAAY,OAAS,cAAgB,EAAa,QAAU,OAC1F,IAAM,EAAa,EAAY,OAAS,gBAAmB,EAAY,OAAS,cAAiB,EAAY,SAAS,SAAS,SAAS,EAClI,EAA0B,EAAmB,CACjD,OAAQ,CAAE,EAAY,OAAO,EAAG,YAAa,yCAA0C,UAAW,QACpG,CAAC,CAAC,GAAG,KAAO,KAAO,GAEf,EAAuC,GACtC,EAAmB,CACpB,OAAQ,CAAE,EAAY,OAAO,EAAG,YAAa,UAAW,UAAW,QACrE,CAAC,CAAC,GAAG,IACH,0BACE,EAA6B,GAA4B,EAAY,OAAS,kBACpF,GAAI,IAAY,GAAc,EAA4B,CACxD,GAAI,EAAa,QAAS,OAC1B,IAAM,EAAa,EACX,MAAM,iCAA0C,CAAE,MAAO,CAAE,CAAC,EAChE,EACM,MAAM,EAA8B,CAAE,MAAO,CAAE,CAAC,EACpD,EAEN,EAAoB,CAClB,KAAM,KAAM,QAAS,GACrB,MAAO,aAAsB,MAAQ,EAAW,QAAU,OAAO,GAAe,SAAW,EAAa,wBAAwB,OAAO,IACvI,WAAY,EACd,CAAC,EACD,MACF,KAAO,CACL,GAAI,EAAa,QAAS,OAC1B,IAAI,EAAgC,IAAqB,GAAG,EAC5D,EAAe,KAAK,IAAI,EAAc,GAAa,EACnD,IAAM,EAAS,KAAK,OAAO,EAAI,IAC/B,GAA8B,EAC9B,EAAoB,CAAE,KAAM,EAAM,MAAM,KAAM,QAAS,GAAM,MAAO,KAAM,WAAY,EAAK,CAAC,EAE5F,QAAQ,KAAK,qBAAqB,EAAmB,YADnC,EAAY,WAAa,cACgC,YAAY,EAAU,EAAE,GAAqC,EAAU,EAAE,IAAI,EAExJ,GAAI,CAEF,GADA,MAAM,KAAK,MAAM,EAAc,CAAY,EACvC,EAAa,QAAS,MAC5B,MAAqB,CACnB,MACF,CACF,CACF,CACF,CACF,EAEI,EAAiD,KAcrD,OAZA,KAAK,WAAa,CAChB,IAAM,EAAS,EAAS,EAAO,MAAQ,IAAA,GACjC,EAAmB,IAAI,gBAO7B,MANA,GAAyB,EAEzB,KAAK,YAAc,CACjB,EAAK,EAAa,EAAiB,OAAQ,EAAI,CACjD,CAAC,MAEY,EAAiB,MAAM,CACtC,EAAG,iCAAiC,EAE7B,CACL,IAAI,MAAO,CAAE,OAAO,EAAM,MAAM,IAAK,EACrC,IAAI,SAAU,CAAE,OAAO,EAAM,MAAM,OAAQ,EAC3C,IAAI,OAAQ,CAAE,OAAO,EAAM,MAAM,KAAM,EACvC,IAAI,YAAa,CAAE,OAAO,EAAM,MAAM,UAAW,EACjD,IAAI,OAAQ,CAAE,OAAO,EAAM,KAAM,EACjC,YAAe,CACb,GAAwB,MAAM,EAC9B,EAAyB,IAAI,gBAC7B,EAAK,EAAS,EAAO,MAAQ,IAAA,GAAgB,EAAuB,OAAQ,EAAK,CACnF,EACA,UAAY,GAAwC,EAAM,UAAU,CAAE,CACxE,CACF,CACF,EChaa,EAAb,cAA6C,CAAmB,CAAC,ECMpD,EAAb,cAA2C,CAAwB,CACjE,aAAkC,CAAC,EACnC,qBAA8B,GAE9B,SAAgB,EAAc,EAAc,EAAkB,CAC5D,KAAK,aAAa,KAAK,CAAE,OAAM,OAAM,OAAM,UAAW,KAAK,IAAI,CAAE,CAAC,EAC7D,KAAK,uBACR,KAAK,qBAAuB,GAC5B,mBAAqB,KAAK,UAAU,CAAC,EAEzC,CAEA,WAAyB,CACvB,KAAK,qBAAuB,GACxB,KAAK,aAAa,SAAW,IAC7B,OAAO,QAAY,KAAA,QAAA,IAAA,WAAwC,SAC7D,QAAQ,MAAM,iCAAiC,KAAK,aAAa,OAAO,UAAU,EAClF,KAAK,aAAa,QAAQ,GAAO,QAAQ,IAAI,IAAI,EAAI,KAAK,YAAY,EAAE,IAAI,EAAI,OAAQ,EAAI,MAAQ,EAAE,CAAC,EACvG,QAAQ,SAAS,GAEnB,KAAK,aAAe,CAAC,EACvB,CAEA,SAA4B,EAAa,EAAkC,CACzE,IAAM,EAAS,KACT,EAAO,GAAc,mBACrB,EAAmB,MAAM,SAAS,EAAI,CAAU,EAClD,EAAc,GAEZ,EAAuC,CAC3C,IAAI,OAAW,CACb,GAAI,EAAa,OAAO,EAAiB,MACzC,IAAM,EAAY,OAAO,YAAgB,IAAc,YAAY,IAAI,EAAI,EACrE,EAAM,EAAiB,MAK7B,OAHI,GACF,EAAO,SAAS,WAAY,EAAM,CAAE,MAAO,EAAK,SAAU,IAAI,YAAY,IAAI,EAAI,EAAA,CAAW,QAAQ,CAAC,EAAE,GAAI,CAAC,EAExG,CACT,EACA,UAAY,GAAO,EAAiB,UAAU,CAAE,EAChD,SAAU,CACR,EAAc,GACd,EAAiB,QAAQ,CAC3B,CACF,EASA,MAPI,UAAW,GACb,OAAO,eAAe,EAAyB,QAAS,CACtD,MAAQ,EAAyB,MACjC,WAAY,EACd,CAAC,EAGI,CACT,CACF,EC9DsB,EAAtB,KAAsC,CACd,OAAtB,YAAY,EAA2C,CAAjC,KAAA,OAAA,EAEpB,KAAK,OAAO,CACd,CAGA,oBAA8B,EAAa,EAAc,CACvD,OAAO,KAAK,OAAO,OAAO,EAAK,CAC7B,OACA,SAAW,GAAM,OAAO,GAAM,UAAY,CAAC,MAAM,CAAC,CACpD,CAAC,CACH,CAEA,eAA4B,EAAa,CACvC,OAAO,KAAK,OAAO,SAAS,CAAE,CAChC,CAEA,aAA0B,EAAQ,EAAe,CAC/C,OAAO,KAAK,OAAO,OAAO,EAAK,CAAI,CACrC,CAIA,QAAyB,CAAE,CAC7B,EAEa,EAAgB,EC3BP,EAAtB,KAA4C,CACpB,OAAtB,YAAY,EAAsC,CAA5B,KAAA,OAAA,EACpB,eAAiB,KAAK,OAAO,EAAG,CAAC,CACnC,CAEA,QAAyB,CAAE,CAC7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },