@pravosleva/reactive-engine 2.6.0 → 2.6.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=core.advanced.diamond-glitch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.advanced.diamond-glitch.test.d.ts","sourceRoot":"","sources":["../../src/core/core.advanced.diamond-glitch.test.ts"],"names":[],"mappings":""}
@@ -19,29 +19,47 @@ export type Token<T> = string | symbol | {
19
19
  new (engine: ReactiveEngineCore, ...args: any[]): T;
20
20
  };
21
21
  export type Factory<T> = (engine: ReactiveEngineCore) => T;
22
+ /**
23
+ * ⚛️ БАЗОВЫЙ ИНТЕРФЕЙС-КОНТРАКТ ДЛЯ ЛЮБЫХ СИГНАЛОПОДОБНЫХ УЗЛОВ
24
+ */
25
+ export interface ISignalLike<V> {
26
+ /**
27
+ * Публичный геттер с автоматическим динамическим трекингом зависимостей графа
28
+ */
29
+ readonly value: V;
30
+ /**
31
+ * Безопасное чтение значения из кэша БЕЗ трекинга зависимостей.
32
+ */
33
+ valueWithoutTracking?: V;
34
+ /**
35
+ * Активная Push-подписка на каждое изменение значения узла
36
+ */
37
+ subscribe: (cb: (v: V) => void) => CleanupFn;
38
+ /**
39
+ * Пассивный системный хук подписки на завершение реактивной транзакции.
40
+ */
41
+ __subscribe?: (cb: () => void) => CleanupFn;
42
+ }
22
43
  /**
23
44
  * Интерфейс атомарного Сигнала графа.
45
+ * ⚛️ ТЕПЕРЬ ЯВНО НАСЛЕДУЕТ ISignalLike<T> ДЛЯ ГАРАНТИРОВАННОГО ВЫВОДА ТИПОВ
24
46
  */
25
- export interface Signal<T> {
47
+ export interface Signal<T> extends ISignalLike<T> {
26
48
  value: T;
27
- subscribe: (cb: (val: T) => void) => CleanupFn;
28
49
  destroy: () => void;
29
50
  }
30
51
  /**
31
52
  * Интерфейс синхронно-ленивого Вычисляемого свойства.
53
+ * ⚛️ ТЕПЕРЬ ЯВНО НАСЛЕДУЕТ ISignalLike<T> ДЛЯ КЭШИРОВАНИЯ И ВЫВОДА ТИПОВ
32
54
  */
33
- export interface Computed<T> {
55
+ export interface Computed<T> extends ISignalLike<T> {
34
56
  readonly value: T;
35
- subscribe: (cb: (val: T) => void) => CleanupFn;
36
57
  destroy: () => void;
37
58
  _isDirty?: () => boolean;
38
59
  dependencies?: Set<any>;
39
60
  run?: () => void;
40
61
  type?: any;
41
62
  }
42
- /**
43
- * Интерфейс побочного Эффекта планировщика.
44
- */
45
63
  export interface IEffect {
46
64
  id: number;
47
65
  run: () => void;
@@ -54,48 +72,28 @@ export interface IEffect {
54
72
  fn?: () => void;
55
73
  _node?: any;
56
74
  }
57
- /**
58
- * Опции конфигурации Сигналов.
59
- */
60
75
  export interface SignalOptions<T> {
61
76
  name?: string;
62
77
  validate?: (value: T) => boolean | string;
63
78
  }
64
- /**
65
- * Состояние асинхронного ресурса.
66
- */
67
79
  export interface ResourceState<T> {
68
80
  data: T | null;
69
81
  loading: boolean;
70
82
  error: string | null;
71
83
  isRetrying?: boolean;
72
84
  }
73
- /**
74
- * Контракт асинхронного Ресурса ядра.
75
- */
76
85
  export interface Resource<T> extends ResourceState<T> {
77
86
  refetch: () => void;
78
87
  subscribe: (cb: (val: ResourceState<T>) => void) => CleanupFn;
79
88
  readonly value: ResourceState<T>;
80
89
  destroy: () => void;
81
90
  }
82
- /**
83
- * Настройки конфигурации асинхронного Ресурса.
84
- * Полностью очищены от legacy-параметров ретраев и таймаутов.
85
- */
86
91
  export interface ResourceOptions<T, S = void> {
87
- /** Уникальное имя ресурса для трассировки и логирования */
88
92
  name?: string;
89
- /** Принудительный сброс данных в null при изменении источника (true по умолчанию) */
90
93
  resetDataOnSourceChange?: boolean;
91
- /** Декларативная пре-валидация параметров ДО отправки запроса в сеть */
92
94
  validateBeforeFetch?: (source: S) => boolean | string;
93
- /** Валидация структуры ответа сервера после успешного разрешения промиса */
94
95
  responseValidate?: (data: T) => boolean | string;
95
96
  }
96
- /**
97
- * Параметры продвинутой системы логирования транзакций.
98
- */
99
97
  export interface EngineLoggerOptions {
100
98
  instanceName?: string;
101
99
  isEnabled: boolean;
@@ -133,9 +131,6 @@ export interface ReactiveDetail {
133
131
  oldValue: unknown;
134
132
  newValue: unknown;
135
133
  }
136
- /**
137
- * Карта маппинга категорий логов для безопасной работы метода queueLog.
138
- */
139
134
  export interface LogDetailMap {
140
135
  signal: SignalLogDetail;
141
136
  computed: ComputedLogDetail;
@@ -144,24 +139,4 @@ export interface LogDetailMap {
144
139
  resource: ResourceLogDetail;
145
140
  reactive: ReactiveDetail;
146
141
  }
147
- export interface ISignalLike<V> {
148
- /**
149
- * Публичный геттер с автоматическим динамическим трекингом зависимостей графа
150
- */
151
- value: V;
152
- /**
153
- * Безопасное чтение значения из кэша БЕЗ трекинга зависимостей.
154
- * Предотвращает гонку планировщиков и лишние транзакции во время рендера React/Vue.
155
- */
156
- valueWithoutTracking: V;
157
- /**
158
- * Активная Push-подписка на каждое изменение значения узла
159
- */
160
- subscribe: (cb: (v: V) => void) => CleanupFn;
161
- /**
162
- * Пассивный системный хук подписки на завершение реактивной транзакции.
163
- * Позволяет UI-мостам просыпаться строго один раз за тик, ликвидируя IDLE PULL дубли.
164
- */
165
- __subscribe?: (cb: () => void) => CleanupFn;
166
- }
167
142
  //# 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=typeof r==`string`?r:r?.name,s=!!o&&e.getExtractedValues({tested:[o],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.[0]===`1`||!1,c=new Set,l=!1,u=n,d={type:`signal`,get version(){return a},subscribers:c},f=()=>{for(let e of c){let n=e._node||e;if(n.type===`effect`)n.isDirty=!0,t.scheduleEffect(e);else if(n.type===`computed`)n.markDirty&&n.markDirty(2);else if(typeof e==`function`)try{e(i)}catch(e){console.error(e)}else if(e&&typeof e.run==`function`)try{e.run()}catch(e){console.error(e)}}},p={get value(){let e=t.activeConsumer;return e&&(c.add(t.activeConsumer),t.activeConsumer.dependencies.add(p),e.activeRunId!==void 0&&(p._lastSeenInRunId=e.activeRunId)),i},set value(e){if(Object.is(i,e)&&!(i===e&&typeof i==`object`&&i))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}}if(t.batchDepth>0){l||(l=!0,u=i),i=e,t.batchedSignals.add(p);return}let n=i;i=e,a++,t.epoch++,t.log({type:`signal`,label:o||`signal`,details:{from:n,to:e},isInternalCoreSignal:s}),f(),t.batchDepth===0&&t.flushEffects()},get version(){return a},type:`signal`,subscribe(e){return c.add(e),e(i),()=>{c.delete(e)}},_flushBatch:()=>{if(l){if(!Object.is(u,i)||typeof i==`object`&&i){a++,t.epoch++,t.log({type:`signal`,label:o||`signal_batched`,details:{from:u,to:i},isInternalCoreSignal:s});for(let e of c){let n=e._node||e;if(n.type===`effect`)n.isDirty=!0,t.scheduleEffect(e);else if(n.markDirty)n.markDirty(2);else if(typeof e==`function`)try{e(i)}catch(e){console.error(e)}}}l=!1,u=i}},get hasBatchValue(){return l},destroy:()=>{c&&c.clear(),t.batchedSignals&&t.batchedSignals.delete(p),l=!1,i=void 0,u=void 0}};return p._node=d,p.subscribers=c,p}exports.createSignal=t;
1
+ const e=require("./utils/getExtractedValues.cjs");function t(t,n,r){let i=n,a=0,o=typeof r==`string`?r:r?.name,s=!!o&&e.getExtractedValues({tested:[o],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.[0]===`1`||!1,c=new Set,l=!1,u=n,d={type:`signal`,get version(){return a},subscribers:c},f=()=>{for(let e of c){let n=e._node||e;if(n.type===`effect`)n.isDirty=!0,t.scheduleEffect(e);else if(n.type===`computed`)n.markDirty&&n.markDirty(2);else if(typeof e==`function`)try{e(i)}catch(e){console.error(e)}else if(e&&typeof e.run==`function`)try{e.run()}catch(e){console.error(e)}}},p={get value(){let e=t.activeConsumer;return e&&(c.add(e),e.dependencies.add(p),e.activeRunId!==void 0&&(p._lastSeenInRunId=e.activeRunId)),i},set value(e){if(Object.is(i,e)&&!(i===e&&typeof i==`object`&&i))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}}if(t.batchDepth>0){l||(l=!0,u=i),i=e,t.batchedSignals.add(p);return}let n=i;i=e,a++,t.epoch++,t.log({type:`signal`,label:o||`signal`,details:{from:n,to:e},isInternalCoreSignal:s}),f(),t.batchDepth===0&&t.flushEffects()},get version(){return a},type:`signal`,subscribe(e){return c.add(e),e(i),()=>{c.delete(e)}},_flushBatch:()=>{if(l){if(!Object.is(u,i)||typeof i==`object`&&i){a++,t.epoch++,t.log({type:`signal`,label:o||`signal_batched`,details:{from:u,to:i},isInternalCoreSignal:s});for(let e of c){let n=e._node||e;if(n.type===`effect`)n.isDirty=!0,t.scheduleEffect(e);else if(n.markDirty)n.markDirty(2);else if(typeof e==`function`)try{e(i)}catch(e){console.error(e)}}}l=!1,u=i}},get hasBatchValue(){return l},destroy:()=>{c&&c.clear(),t.batchedSignals&&t.batchedSignals.delete(p),l=!1,i=void 0,u=void 0}};return p._node=d,p.subscribers=c,p}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, SignalOptions } from './types'\n\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: SignalOptions<T> | string\n): Signal<T> {\n let value = initialValue\n let version = 0\n let name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name\n const isInternalCoreSignal = !!name && getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.[0] === '1' || false\n const subscribers = new Set<any>()\n\n let hasBatchValue = false\n let batchInitialValue: T = initialValue\n\n const signalNode = {\n type: 'signal',\n get version() { return version },\n subscribers\n }\n\n const notifySubscribers = () => {\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.type === 'computed') {\n if (rawSub.markDirty) rawSub.markDirty(2)\n } else {\n if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n } else if (sub && typeof sub.run === 'function') {\n try { sub.run() } catch (err) { console.error(err) }\n }\n }\n }\n }\n\n const signalInstance: Signal<T> = {\n get value() {\n const consumer = engine.activeConsumer\n if (consumer) {\n subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(signalInstance)\n\n if (consumer.activeRunId !== undefined) {\n (signalInstance as any)._lastSeenInRunId = consumer.activeRunId\n }\n }\n return value\n },\n\n set value(newValue: T) {\n const isObjectKick = value === newValue && value !== null && typeof value === 'object'\n if (Object.is(value, newValue) && !isObjectKick) return\n\n if (optionsOrName && typeof optionsOrName === 'object' && optionsOrName.validate) {\n const validation = optionsOrName.validate(newValue)\n if (validation !== true) {\n console.error(typeof validation === 'string' ? validation : '[Validation Error]')\n return\n }\n }\n\n if (engine.batchDepth > 0) {\n if (!hasBatchValue) {\n hasBatchValue = true\n batchInitialValue = value\n }\n value = newValue\n engine.batchedSignals.add(signalInstance)\n return\n }\n\n const oldValue = value\n value = newValue\n\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n notifySubscribers()\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n\n get version() { return version },\n type: 'signal',\n\n subscribe(cb: (val: T) => void) {\n subscribers.add(cb)\n cb(value)\n return () => { subscribers.delete(cb) }\n },\n\n _flushBatch: () => {\n if (!hasBatchValue) return\n\n const wasChanged = !Object.is(batchInitialValue, value) || (value !== null && typeof value === 'object')\n\n if (wasChanged) {\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal_batched',\n details: { from: batchInitialValue, to: value },\n isInternalCoreSignal\n })\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(2)\n } else if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n }\n }\n }\n\n hasBatchValue = false\n batchInitialValue = value\n },\n\n get hasBatchValue() { return hasBatchValue },\n\n // ⚛️ ФИКС ДЛЯ РЕЛИЗА 2.5.0: Метод тотальной деструкции сигнала\n destroy: () => {\n if (subscribers) {\n subscribers.clear()\n }\n if (engine.batchedSignals) {\n engine.batchedSignals.delete(signalInstance)\n }\n hasBatchValue = false\n // Помогаем GC, убирая ссылки на тяжелые объекты\n value = undefined as any\n batchInitialValue = undefined as any\n }\n } as any\n\n ;(signalInstance as any)._node = signalNode\n ;(signalInstance as any).subscribers = subscribers\n return signalInstance\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.method.signal.cjs","names":[],"sources":["../src/core/core.method.signal.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, SignalOptions } from './types'\n\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: SignalOptions<T> | string\n): Signal<T> {\n let value = initialValue\n let version = 0\n let name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name\n const isInternalCoreSignal = !!name && getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.[0] === '1' || false\n const subscribers = new Set<any>()\n\n let hasBatchValue = false\n let batchInitialValue: T = initialValue\n\n const signalNode = {\n type: 'signal',\n get version() { return version },\n subscribers\n }\n\n const notifySubscribers = () => {\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.type === 'computed') {\n if (rawSub.markDirty) rawSub.markDirty(2)\n } else {\n if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n } else if (sub && typeof sub.run === 'function') {\n try { sub.run() } catch (err) { console.error(err) }\n }\n }\n }\n }\n\n const signalInstance: Signal<T> = {\n get value() {\n // 🛡️ АТОМАРНАЯ СТАБИЛИЗАЦИЯ ДЛЯ ПРОДА:\n // Фиксируем ссылку локально и работаем строго с ней, защищая граф от асинхронных гонок Webpack Scope Hoisting\n const consumer = engine.activeConsumer\n if (consumer) {\n subscribers.add(consumer)\n consumer.dependencies.add(signalInstance)\n\n if (consumer.activeRunId !== undefined) {\n (signalInstance as any)._lastSeenInRunId = consumer.activeRunId\n }\n }\n return value\n },\n\n set value(newValue: T) {\n const isObjectKick = value === newValue && value !== null && typeof value === 'object'\n if (Object.is(value, newValue) && !isObjectKick) return\n\n if (optionsOrName && typeof optionsOrName === 'object' && optionsOrName.validate) {\n const validation = optionsOrName.validate(newValue)\n if (validation !== true) {\n console.error(typeof validation === 'string' ? validation : '[Validation Error]')\n return\n }\n }\n\n if (engine.batchDepth > 0) {\n if (!hasBatchValue) {\n hasBatchValue = true\n batchInitialValue = value\n }\n value = newValue\n engine.batchedSignals.add(signalInstance)\n return\n }\n\n const oldValue = value\n value = newValue\n\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n notifySubscribers()\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n\n get version() { return version },\n type: 'signal',\n\n subscribe(cb: (val: T) => void) {\n subscribers.add(cb)\n cb(value)\n return () => { subscribers.delete(cb) }\n },\n\n _flushBatch: () => {\n if (!hasBatchValue) return\n\n const wasChanged = !Object.is(batchInitialValue, value) || (value !== null && typeof value === 'object')\n\n if (wasChanged) {\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal_batched',\n details: { from: batchInitialValue, to: value },\n isInternalCoreSignal\n })\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(2)\n } else if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n }\n }\n }\n\n hasBatchValue = false\n batchInitialValue = value\n },\n\n get hasBatchValue() { return hasBatchValue },\n\n destroy: () => {\n if (subscribers) {\n subscribers.clear()\n }\n if (engine.batchedSignals) {\n engine.batchedSignals.delete(signalInstance)\n }\n hasBatchValue = false\n value = undefined as any\n batchInitialValue = undefined as any\n }\n } as any\n\n ;(signalInstance as any)._node = signalNode\n ;(signalInstance as any).subscribers = subscribers\n return signalInstance\n}\n"],"mappings":"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"}
@@ -30,7 +30,7 @@ function t(t, n, r) {
30
30
  }, p = {
31
31
  get value() {
32
32
  let e = t.activeConsumer;
33
- return e && (c.add(t.activeConsumer), t.activeConsumer.dependencies.add(p), e.activeRunId !== void 0 && (p._lastSeenInRunId = e.activeRunId)), i;
33
+ return e && (c.add(e), e.dependencies.add(p), e.activeRunId !== void 0 && (p._lastSeenInRunId = e.activeRunId)), i;
34
34
  },
35
35
  set value(e) {
36
36
  if (Object.is(i, e) && !(i === e && typeof i == "object" && i)) return;
@@ -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, SignalOptions } from './types'\n\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: SignalOptions<T> | string\n): Signal<T> {\n let value = initialValue\n let version = 0\n let name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name\n const isInternalCoreSignal = !!name && getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.[0] === '1' || false\n const subscribers = new Set<any>()\n\n let hasBatchValue = false\n let batchInitialValue: T = initialValue\n\n const signalNode = {\n type: 'signal',\n get version() { return version },\n subscribers\n }\n\n const notifySubscribers = () => {\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.type === 'computed') {\n if (rawSub.markDirty) rawSub.markDirty(2)\n } else {\n if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n } else if (sub && typeof sub.run === 'function') {\n try { sub.run() } catch (err) { console.error(err) }\n }\n }\n }\n }\n\n const signalInstance: Signal<T> = {\n get value() {\n const consumer = engine.activeConsumer\n if (consumer) {\n subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(signalInstance)\n\n if (consumer.activeRunId !== undefined) {\n (signalInstance as any)._lastSeenInRunId = consumer.activeRunId\n }\n }\n return value\n },\n\n set value(newValue: T) {\n const isObjectKick = value === newValue && value !== null && typeof value === 'object'\n if (Object.is(value, newValue) && !isObjectKick) return\n\n if (optionsOrName && typeof optionsOrName === 'object' && optionsOrName.validate) {\n const validation = optionsOrName.validate(newValue)\n if (validation !== true) {\n console.error(typeof validation === 'string' ? validation : '[Validation Error]')\n return\n }\n }\n\n if (engine.batchDepth > 0) {\n if (!hasBatchValue) {\n hasBatchValue = true\n batchInitialValue = value\n }\n value = newValue\n engine.batchedSignals.add(signalInstance)\n return\n }\n\n const oldValue = value\n value = newValue\n\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n notifySubscribers()\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n\n get version() { return version },\n type: 'signal',\n\n subscribe(cb: (val: T) => void) {\n subscribers.add(cb)\n cb(value)\n return () => { subscribers.delete(cb) }\n },\n\n _flushBatch: () => {\n if (!hasBatchValue) return\n\n const wasChanged = !Object.is(batchInitialValue, value) || (value !== null && typeof value === 'object')\n\n if (wasChanged) {\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal_batched',\n details: { from: batchInitialValue, to: value },\n isInternalCoreSignal\n })\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(2)\n } else if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n }\n }\n }\n\n hasBatchValue = false\n batchInitialValue = value\n },\n\n get hasBatchValue() { return hasBatchValue },\n\n // ⚛️ ФИКС ДЛЯ РЕЛИЗА 2.5.0: Метод тотальной деструкции сигнала\n destroy: () => {\n if (subscribers) {\n subscribers.clear()\n }\n if (engine.batchedSignals) {\n engine.batchedSignals.delete(signalInstance)\n }\n hasBatchValue = false\n // Помогаем GC, убирая ссылки на тяжелые объекты\n value = undefined as any\n batchInitialValue = undefined as any\n }\n } as any\n\n ;(signalInstance as any)._node = signalNode\n ;(signalInstance as any).subscribers = subscribers\n return signalInstance\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.method.signal.mjs","names":[],"sources":["../src/core/core.method.signal.ts"],"sourcesContent":["import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, SignalOptions } from './types'\n\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: SignalOptions<T> | string\n): Signal<T> {\n let value = initialValue\n let version = 0\n let name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name\n const isInternalCoreSignal = !!name && getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.[0] === '1' || false\n const subscribers = new Set<any>()\n\n let hasBatchValue = false\n let batchInitialValue: T = initialValue\n\n const signalNode = {\n type: 'signal',\n get version() { return version },\n subscribers\n }\n\n const notifySubscribers = () => {\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.type === 'computed') {\n if (rawSub.markDirty) rawSub.markDirty(2)\n } else {\n if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n } else if (sub && typeof sub.run === 'function') {\n try { sub.run() } catch (err) { console.error(err) }\n }\n }\n }\n }\n\n const signalInstance: Signal<T> = {\n get value() {\n // 🛡️ АТОМАРНАЯ СТАБИЛИЗАЦИЯ ДЛЯ ПРОДА:\n // Фиксируем ссылку локально и работаем строго с ней, защищая граф от асинхронных гонок Webpack Scope Hoisting\n const consumer = engine.activeConsumer\n if (consumer) {\n subscribers.add(consumer)\n consumer.dependencies.add(signalInstance)\n\n if (consumer.activeRunId !== undefined) {\n (signalInstance as any)._lastSeenInRunId = consumer.activeRunId\n }\n }\n return value\n },\n\n set value(newValue: T) {\n const isObjectKick = value === newValue && value !== null && typeof value === 'object'\n if (Object.is(value, newValue) && !isObjectKick) return\n\n if (optionsOrName && typeof optionsOrName === 'object' && optionsOrName.validate) {\n const validation = optionsOrName.validate(newValue)\n if (validation !== true) {\n console.error(typeof validation === 'string' ? validation : '[Validation Error]')\n return\n }\n }\n\n if (engine.batchDepth > 0) {\n if (!hasBatchValue) {\n hasBatchValue = true\n batchInitialValue = value\n }\n value = newValue\n engine.batchedSignals.add(signalInstance)\n return\n }\n\n const oldValue = value\n value = newValue\n\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n notifySubscribers()\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n\n get version() { return version },\n type: 'signal',\n\n subscribe(cb: (val: T) => void) {\n subscribers.add(cb)\n cb(value)\n return () => { subscribers.delete(cb) }\n },\n\n _flushBatch: () => {\n if (!hasBatchValue) return\n\n const wasChanged = !Object.is(batchInitialValue, value) || (value !== null && typeof value === 'object')\n\n if (wasChanged) {\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal_batched',\n details: { from: batchInitialValue, to: value },\n isInternalCoreSignal\n })\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(2)\n } else if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n }\n }\n }\n\n hasBatchValue = false\n batchInitialValue = value\n },\n\n get hasBatchValue() { return hasBatchValue },\n\n destroy: () => {\n if (subscribers) {\n subscribers.clear()\n }\n if (engine.batchedSignals) {\n engine.batchedSignals.delete(signalInstance)\n }\n hasBatchValue = false\n value = undefined as any\n batchInitialValue = undefined as any\n }\n } as any\n\n ;(signalInstance as any)._node = signalNode\n ;(signalInstance as any).subscribers = subscribers\n return signalInstance\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo, useRef, useState } 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 const rawNode = (signal as any)._node || signal\n const engine = rawNode.engine || (signal as any).engine\n\n // Локальный тикет рендеринга для useSyncExternalStore.\n // Это ЕДИНСТВЕННЫЙ детерминированный источник истины для React Concurrent Mode.\n const [ticket, setTicket] = useState(0)\n\n // 🟢 КАНОНИЧЕСКИЙ ВЕРСИОННЫЙ СНАПШOТ useSyncExternalStore С СИНХРOННЫМ ПOДТЯГИВАНИЕМ КЭША\n useSyncExternalStore(\n // 1. Фаза подписки: Доверяем push-уведомлениям Ядра для запуска ререндера React\n useMemo(() => (onStoreChange: () => void) => {\n const triggerStoreRerender = () => {\n setTicket((t) => t + 1)\n onStoreChange()\n }\n\n // Для вычисляемых свойств используем скрытый __subscribe, который ловит markDirty(1)\n if (rawNode.type === 'computed' && typeof (signal as any).__subscribe === 'function') {\n return (signal as any).__subscribe(triggerStoreRerender)\n }\n\n if (rawNode.type !== 'computed' && '__subscribe' in signal && typeof (signal as any).__subscribe === 'function') {\n return (signal as any).__subscribe(triggerStoreRerender)\n }\n\n return signal.subscribe(triggerStoreRerender)\n }, [signal, rawNode]),\n\n // 2. getSnapshot: Чистая, snapshot-безопасная O(1) операция!\n // Мы СТРОГО возвращаем локальный ticket, изолируя React от бесконечного инкремента engine.epoch.\n // Это намертво защищает от краша \"Maximum update depth exceeded\"!\n () => ticket,\n\n // SSR Снапшот\n () => 0\n )\n\n useDebugValue(ticket)\n\n // ⚛️ ТОПОЛОГИЧЕСКИЙ Pull (Безопасный Рендеринг из O(1) кэша ядра):\n // Вычисляем граф и стягиваем свежее значение непосредственно в теле рендера.\n // Оборачиваем в untrack, чтобы сам рендеринг React не создавал паразитных связей.\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n\n return signal.value !== undefined ? signal.value : signal\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,EAGT,IAAM,EAAW,EAAe,OAAS,EACnC,EAAS,EAAQ,QAAW,EAAe,OAI3C,CAAC,EAAQ,IAAA,EAAA,EAAA,SAAA,CAAsB,CAAC,EAyCtC,OAtCA,EAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,QAAA,KAEiB,GAA8B,CAC3C,IAAM,MAA6B,CACjC,EAAW,GAAM,EAAI,CAAC,EACtB,EAAc,CAChB,EAWA,OARI,EAAQ,OAAS,YAAc,OAAQ,EAAe,aAAgB,YAItE,EAAQ,OAAS,YAAc,gBAAiB,GAAU,OAAQ,EAAe,aAAgB,WAC3F,EAAe,YAAY,CAAoB,EAGlD,EAAO,UAAU,CAAoB,CAC9C,EAAG,CAAC,EAAQ,CAAO,CAAC,MAKd,MAGA,CACR,GAEA,EAAA,EAAA,cAAA,CAAc,CAAM,EAKhB,GAAU,YAAa,EAClB,EAAO,YAAe,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAAe,EAG3E,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAC7C"}
1
+ {"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo, useState } from 'react'\nimport { ISignalLike } from '../../core/types'\n\n/**\n * ⚛️ УЛЬТИМАТИВНЫЙ ХУК ДЛЯ СТЯГИВАНИЯ ДАННЫХ ИЗ ГРАФА В СРЕДУ REACT\n * Автоматически выводит тип внутренней структуры данных (V) из любого сигнала или вычисляемого свойства.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): V;\nexport function useReactiveValue<T extends object>(proxy: T): T;\nexport function useReactiveValue<T>(primitive: T): T;\nexport function useReactiveValue(signal: any): any {\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 const rawNode = signal._node || signal\n const engine = rawNode.engine || signal.engine\n\n // Локальный тикет рендеринга для useSyncExternalStore.\n const [ticket, setTicket] = useState(0)\n\n // 🟢 КАНОНИЧЕСКИЙ ВЕРСИОННЫЙ СНАПШOТ useSyncExternalStore С СИНХРOННЫМ ПOДТЯГИВАНИЕМ КЭША\n useSyncExternalStore(\n useMemo(() => (onStoreChange: () => void) => {\n const triggerStoreRerender = () => {\n setTicket((t) => t + 1)\n onStoreChange()\n }\n\n if (rawNode.type === 'computed' && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n if (rawNode.type !== 'computed' && '__subscribe' in signal && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n return signal.subscribe(triggerStoreRerender)\n }, [signal, rawNode]),\n\n () => ticket,\n () => 0\n )\n\n useDebugValue(ticket)\n\n // ⚛️ ТОПОЛОГИЧЕСКИЙ Pull: Стягиваем свежее значение в теле рендера под untrack\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n\n return signal.value !== undefined ? signal.value : signal\n}\n"],"mappings":"uBAUA,SAAgB,EAAiB,EAAkB,CACjD,IAAM,EAAU,GAAU,OAAO,GAAW,UAAY,gBAAiB,EAGzE,GAAI,EAFa,GAAU,OAAO,GAAW,UAAY,cAAe,IAEvD,CAAC,EAChB,OAAO,EAGT,IAAM,EAAU,EAAO,OAAS,EAC1B,EAAS,EAAQ,QAAU,EAAO,OAGlC,CAAC,EAAQ,IAAA,EAAA,EAAA,SAAA,CAAsB,CAAC,EAgCtC,OA7BA,EAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,QAAA,KACiB,GAA8B,CAC3C,IAAM,MAA6B,CACjC,EAAW,GAAM,EAAI,CAAC,EACtB,EAAc,CAChB,EAUA,OARI,EAAQ,OAAS,YAAc,OAAO,EAAO,aAAgB,YAI7D,EAAQ,OAAS,YAAc,gBAAiB,GAAU,OAAO,EAAO,aAAgB,WACnF,EAAO,YAAY,CAAoB,EAGzC,EAAO,UAAU,CAAoB,CAC9C,EAAG,CAAC,EAAQ,CAAO,CAAC,MAEd,MACA,CACR,GAEA,EAAA,EAAA,cAAA,CAAc,CAAM,EAGhB,GAAU,YAAa,EAClB,EAAO,YAAe,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAAe,EAG3E,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAC7C"}
@@ -1,3 +1,9 @@
1
1
  import { ISignalLike } from '../../core/types';
2
- export declare function useReactiveValue<V>(signal: ISignalLike<V> | any): V;
2
+ /**
3
+ * ⚛️ УЛЬТИМАТИВНЫЙ ХУК ДЛЯ СТЯГИВАНИЯ ДАННЫХ ИЗ ГРАФА В СРЕДУ REACT
4
+ * Автоматически выводит тип внутренней структуры данных (V) из любого сигнала или вычисляемого свойства.
5
+ */
6
+ export declare function useReactiveValue<V>(signal: ISignalLike<V>): V;
7
+ export declare function useReactiveValue<T extends object>(proxy: T): T;
8
+ export declare function useReactiveValue<T>(primitive: T): T;
3
9
  //# 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,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAuDnE"}
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;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/D,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAChE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo, useRef, useState } 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 const rawNode = (signal as any)._node || signal\n const engine = rawNode.engine || (signal as any).engine\n\n // Локальный тикет рендеринга для useSyncExternalStore.\n // Это ЕДИНСТВЕННЫЙ детерминированный источник истины для React Concurrent Mode.\n const [ticket, setTicket] = useState(0)\n\n // 🟢 КАНОНИЧЕСКИЙ ВЕРСИОННЫЙ СНАПШOТ useSyncExternalStore С СИНХРOННЫМ ПOДТЯГИВАНИЕМ КЭША\n useSyncExternalStore(\n // 1. Фаза подписки: Доверяем push-уведомлениям Ядра для запуска ререндера React\n useMemo(() => (onStoreChange: () => void) => {\n const triggerStoreRerender = () => {\n setTicket((t) => t + 1)\n onStoreChange()\n }\n\n // Для вычисляемых свойств используем скрытый __subscribe, который ловит markDirty(1)\n if (rawNode.type === 'computed' && typeof (signal as any).__subscribe === 'function') {\n return (signal as any).__subscribe(triggerStoreRerender)\n }\n\n if (rawNode.type !== 'computed' && '__subscribe' in signal && typeof (signal as any).__subscribe === 'function') {\n return (signal as any).__subscribe(triggerStoreRerender)\n }\n\n return signal.subscribe(triggerStoreRerender)\n }, [signal, rawNode]),\n\n // 2. getSnapshot: Чистая, snapshot-безопасная O(1) операция!\n // Мы СТРОГО возвращаем локальный ticket, изолируя React от бесконечного инкремента engine.epoch.\n // Это намертво защищает от краша \"Maximum update depth exceeded\"!\n () => ticket,\n\n // SSR Снапшот\n () => 0\n )\n\n useDebugValue(ticket)\n\n // ⚛️ ТОПОЛОГИЧЕСКИЙ Pull (Безопасный Рендеринг из O(1) кэша ядра):\n // Вычисляем граф и стягиваем свежее значение непосредственно в теле рендера.\n // Оборачиваем в untrack, чтобы сам рендеринг React не создавал паразитных связей.\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n\n return signal.value !== undefined ? signal.value : signal\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;CAGT,IAAM,IAAW,EAAe,SAAS,GACnC,IAAS,EAAQ,UAAW,EAAe,QAI3C,CAAC,GAAQ,KAAa,EAAS,CAAC;CAyCtC,OAtCA,EAEE,SAAe,MAA8B;EAC3C,IAAM,UAA6B;GAEjC,AADA,GAAW,MAAM,IAAI,CAAC,GACtB,EAAc;EAChB;EAWA,OARI,EAAQ,SAAS,cAAc,OAAQ,EAAe,eAAgB,cAItE,EAAQ,SAAS,cAAc,iBAAiB,KAAU,OAAQ,EAAe,eAAgB,aAC3F,EAAe,YAAY,CAAoB,IAGlD,EAAO,UAAU,CAAoB;CAC9C,GAAG,CAAC,GAAQ,CAAO,CAAC,SAKd,SAGA,CACR,GAEA,EAAc,CAAM,GAKhB,KAAU,aAAa,IAClB,EAAO,cAAe,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO,KAAe,IAG3E,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO;AAC7C"}
1
+ {"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo, useState } from 'react'\nimport { ISignalLike } from '../../core/types'\n\n/**\n * ⚛️ УЛЬТИМАТИВНЫЙ ХУК ДЛЯ СТЯГИВАНИЯ ДАННЫХ ИЗ ГРАФА В СРЕДУ REACT\n * Автоматически выводит тип внутренней структуры данных (V) из любого сигнала или вычисляемого свойства.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): V;\nexport function useReactiveValue<T extends object>(proxy: T): T;\nexport function useReactiveValue<T>(primitive: T): T;\nexport function useReactiveValue(signal: any): any {\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 const rawNode = signal._node || signal\n const engine = rawNode.engine || signal.engine\n\n // Локальный тикет рендеринга для useSyncExternalStore.\n const [ticket, setTicket] = useState(0)\n\n // 🟢 КАНОНИЧЕСКИЙ ВЕРСИОННЫЙ СНАПШOТ useSyncExternalStore С СИНХРOННЫМ ПOДТЯГИВАНИЕМ КЭША\n useSyncExternalStore(\n useMemo(() => (onStoreChange: () => void) => {\n const triggerStoreRerender = () => {\n setTicket((t) => t + 1)\n onStoreChange()\n }\n\n if (rawNode.type === 'computed' && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n if (rawNode.type !== 'computed' && '__subscribe' in signal && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n return signal.subscribe(triggerStoreRerender)\n }, [signal, rawNode]),\n\n () => ticket,\n () => 0\n )\n\n useDebugValue(ticket)\n\n // ⚛️ ТОПОЛОГИЧЕСКИЙ Pull: Стягиваем свежее значение в теле рендера под untrack\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n\n return signal.value !== undefined ? signal.value : signal\n}\n"],"mappings":";;AAUA,SAAgB,EAAiB,GAAkB;CACjD,IAAM,IAAU,KAAU,OAAO,KAAW,YAAY,iBAAiB;CAGzE,IAAI,EAFa,KAAU,OAAO,KAAW,YAAY,eAAe,MAEvD,CAAC,GAChB,OAAO;CAGT,IAAM,IAAU,EAAO,SAAS,GAC1B,IAAS,EAAQ,UAAU,EAAO,QAGlC,CAAC,GAAQ,KAAa,EAAS,CAAC;CAgCtC,OA7BA,EACE,SAAe,MAA8B;EAC3C,IAAM,UAA6B;GAEjC,AADA,GAAW,MAAM,IAAI,CAAC,GACtB,EAAc;EAChB;EAUA,OARI,EAAQ,SAAS,cAAc,OAAO,EAAO,eAAgB,cAI7D,EAAQ,SAAS,cAAc,iBAAiB,KAAU,OAAO,EAAO,eAAgB,aACnF,EAAO,YAAY,CAAoB,IAGzC,EAAO,UAAU,CAAoB;CAC9C,GAAG,CAAC,GAAQ,CAAO,CAAC,SAEd,SACA,CACR,GAEA,EAAc,CAAM,GAGhB,KAAU,aAAa,IAClB,EAAO,cAAe,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO,KAAe,IAG3E,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO;AAC7C"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pravosleva/reactive-engine v2.6.0
2
+ * @pravosleva/reactive-engine v2.6.2-beta.0
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`});function t(e,t,n){let r=e.computedCache.get(t);if(r)return r;let i,a=!0,o=0,s=!1,c=-1,l=2,u=new Set,d=new Map,f=new Set,p=new Set,m=e=>{if(!e)return;let t=e._node||e;if(t.dependencies&&t.dependencies.size>0){for(let n of t.dependencies){let r=n,i=r._node||r;i.subscribers&&(i.subscribers.delete(t),i.subscribers.delete(e),i.subscribers.delete(_),i.type===`computed`&&i.subscribers.size===0&&m(i))}t.dependencies.clear(),t.depVersions&&t.depVersions.clear()}},h=t=>{if(!s||l===2)return t.run();if(p&&p.size>0&&t.verifiedInEpoch===e.epoch&&e.batchDepth===0&&l===0)return!1;let n=!1;if(u&&u.size>0)for(let t of u){let r=t._node||t;if(r.type===`computed`&&r.state>0&&r.update&&r.verifiedInEpoch!==e.epoch&&r.update(),t.hasBatchValue||d.get(t)!==r.version){n=!0;break}}return t.verifiedInEpoch=e.epoch,n||a?t.run():(l=0,!1)},g=0,_={id:e.subscriberId++,dependencies:u,subscribers:p,ownedEffects:f,depth:1,type:`computed`,fn:t,get version(){return o},get state(){return l},set state(e){l=e},get depVersions(){return d},verifiedInEpoch:-1,update:()=>h(_),run:()=>{if(c===e.epoch&&s&&l===0&&e.batchDepth===0)return!1;let r=e.epoch;if(c=r,_.verifiedInEpoch=r,e.cycleDetectionStack.has(_))throw Error(`[Graph Error] Cyclic dependency detected`);e.cycleDetectionStack.add(_);let p=e.activeConsumer,m=e.activeOwner;e.activeConsumer=_,e.activeOwner=_,g++,_.activeRunId=g;let h=u.size>0?Array.from(u):null;u.clear();try{if(f.size>0){for(let e of f)e&&typeof e.dispose==`function`&&e.dispose();f.clear()}let p=t();if(h!==null){let e=h.length===u.size;for(let t of h){let n=t;if(!e||!u.has(n)){let e=n._node||n;e.subscribers&&e.subscribers.delete(_),d.delete(n)}}}let m=a||!Object.is(i,p);if(m){let t=a?void 0:typeof i==`object`&&i?JSON.parse(JSON.stringify(i)):i;i=p,o++,e.log&&n&&e.log({type:`computed`,label:n,details:{from:t,to:p}})}a=!1,l=0,s=!0;let g=0;for(let e of u){let t=e,n=t._node||t;d.set(t,n.version),n.subscribers&&n.subscribers.add(_),n.depth!==void 0&&n.depth>g&&(g=n.depth)}return _.depth=g+1,e.epoch!==r&&(c=-1,_.verifiedInEpoch=-1,l=2),m}finally{e.activeConsumer=p,e.activeOwner=m,e.cycleDetectionStack.delete(_)}},markDirty:t=>{if(!(l>=t)){l=t;for(let t of p){let n=t._node||t;n.type===`effect`?(n.isDirty=!0,e.scheduleEffect(t)):n.markDirty&&n.markDirty(1)}}}},v={get value(){let t=e.activeConsumer;if(t&&t!==_){p.add(t),t.dependencies.add(_);let e=_.depth||1,n=t._node||t;n.depth!==void 0&&e>=n.depth&&(n.depth=e+1),t.activeRunId!==void 0&&(_._lastSeenInRunId=t.activeRunId)}return h(_),t&&t.depVersions&&t.depVersions.set(v,o),i},get valueWithoutTracking(){return i},get version(){return o},get dependencies(){return u},subscribe(t){let n=this,r={id:e.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,run:()=>{if(!r.isDisposed)try{t(n.value)}catch(e){console.error(e)}}};return p.add(r),t(this.value),()=>{r.isDisposed=!0,p.delete(r),r.dependencies.clear()}},subscribeState(e){return v.subscribe(e)},destroy:()=>{m(_),p&&p.clear(),e.computedCache.delete(t),u.clear(),d.clear(),f.clear(),a=!0,l=2,s=!1},__subscribe(t){let n={id:e.subscriberId++,type:`effect`,run:t,isDirty:!1};return p.add(n),()=>{p.delete(n)}}};return v.run=()=>_.run(),e.computedCache.set(t,v),v._node=_,v.subscribers=p,v}var n=({tested:e,expectedKey:t,valueType:n})=>{let r=[];if(!e||!Array.isArray(e))return r;for(let i=0,a=e.length;i<a;i++){let a=e[i];if(typeof a!=`string`)continue;let o;switch(n){case`number`:o=RegExp(`\\[${t}=(?<value>\\d+)\\]`,`g`);break;default:o=RegExp(`\\[${t}=(?<value>.*?)\\]`,`g`);break}for(let e of a.matchAll(o))e?.groups&&r.push(e.groups.value)}return r};function r(e,t,r){let i=t,a=0,o=typeof r==`string`?r:r?.name,s=!!o&&n({tested:[o],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.[0]===`1`||!1,c=new Set,l=!1,u=t,d={type:`signal`,get version(){return a},subscribers:c},f=()=>{for(let t of c){let n=t._node||t;if(n.type===`effect`)n.isDirty=!0,e.scheduleEffect(t);else if(n.type===`computed`)n.markDirty&&n.markDirty(2);else if(typeof t==`function`)try{t(i)}catch(e){console.error(e)}else if(t&&typeof t.run==`function`)try{t.run()}catch(e){console.error(e)}}},p={get value(){let t=e.activeConsumer;return t&&(c.add(e.activeConsumer),e.activeConsumer.dependencies.add(p),t.activeRunId!==void 0&&(p._lastSeenInRunId=t.activeRunId)),i},set value(t){if(Object.is(i,t)&&!(i===t&&typeof i==`object`&&i))return;if(r&&typeof r==`object`&&r.validate){let e=r.validate(t);if(e!==!0){console.error(typeof e==`string`?e:`[Validation Error]`);return}}if(e.batchDepth>0){l||(l=!0,u=i),i=t,e.batchedSignals.add(p);return}let n=i;i=t,a++,e.epoch++,e.log({type:`signal`,label:o||`signal`,details:{from:n,to:t},isInternalCoreSignal:s}),f(),e.batchDepth===0&&e.flushEffects()},get version(){return a},type:`signal`,subscribe(e){return c.add(e),e(i),()=>{c.delete(e)}},_flushBatch:()=>{if(l){if(!Object.is(u,i)||typeof i==`object`&&i){a++,e.epoch++,e.log({type:`signal`,label:o||`signal_batched`,details:{from:u,to:i},isInternalCoreSignal:s});for(let t of c){let n=t._node||t;if(n.type===`effect`)n.isDirty=!0,e.scheduleEffect(t);else if(n.markDirty)n.markDirty(2);else if(typeof t==`function`)try{t(i)}catch(e){console.error(e)}}}l=!1,u=i}},get hasBatchValue(){return l},destroy:()=>{c&&c.clear(),e.batchedSignals&&e.batchedSignals.delete(p),l=!1,i=void 0,u=void 0}};return p._node=d,p.subscribers=c,p}function i(e,t){let n=e.activeConsumer;e.activeConsumer=null;try{return t()}finally{e.activeConsumer=n}}function a(e,t,n){if(e.proxyTargets.has(t))return t;if(e.proxyCache.has(t))return e.proxyCache.get(t);e.reactiveSignals.has(t)||e.reactiveSignals.set(t,new Map);let r=e.reactiveSignals.get(t),i=new Proxy(t,{get(t,i,a){if(i===`__subscribe`&&Array.isArray(t))return n=>{let i=r.get(`length`);return i||(i=e.signal(t.length),r.set(`length`,i)),i.subscribe(n)};if(Array.isArray(t)&&typeof i==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(i))return(...n)=>{let o;return e.batch(()=>{o=Reflect.get(t,i).apply(a,n);let e=r.get(`length`);e&&(e.value=t.length),r.forEach((e,n)=>{n!==`length`&&(e.value=Reflect.get(t,n))})}),o};if(typeof i==`symbol`||i===`constructor`||i===`toJSON`)return Reflect.get(t,i,a);let o=r.get(i);if(!o){let a=Reflect.get(t,i);o=e.signal(a),r.set(i,o),typeof a==`object`&&a&&(o._proxyCache=e.reactive(a,n?`${n}.${String(i)}`:String(i)))}return o._proxyCache===void 0?o.value:(o.value,o._proxyCache)},set(t,n,i,a){let o=(e.proxyTargets.has(i),i),s=Reflect.get(t,n);if(s===o&&n!==`length`)return!0;Reflect.set(t,n,o);let c=r.get(n);if(c||(c=e.signal(s),r.set(n,c)),c._proxyCache=void 0,c.value=o,Array.isArray(t)&&n!==`length`){let e=r.get(`length`);e&&(e.value=t.length)}return!0}});return e.proxyCache.set(t,i),e.proxyTargets.add(i),i}function o(e,t,n){let r=!1,i=!1,a=2,o=new Set,s=new Map,c=new Set,l=()=>{if(c.size>0){let t=e.activeConsumer,n=e.activeOwner;e.activeConsumer=null,e.activeOwner=null;for(let e of c)e.dispose&&e.dispose();c.clear(),e.activeConsumer=t,e.activeOwner=n}if(u.cleanups.size>0){let t=e.activeConsumer;e.activeConsumer=null;for(let e of u.cleanups)try{e()}catch(e){console.error(e)}u.cleanups.clear(),e.activeConsumer=t}},u={id:e.subscriberId++,dependencies:o,ownedEffects:c,cleanups:new Set,type:`effect`,depth:0,label:n,get isDirty(){return a>0},set isDirty(e){e&&(a=2)},get isDisposed(){return r},set isDisposed(e){r=e},get state(){return a},set state(e){a=e},get depVersions(){return s},get _node(){return u},markDirty:()=>{a>=1||(a=1,e.scheduleEffect(u))},run:()=>{if(r||i)return;i=!0,l();let n=e.activeConsumer,c=e.activeOwner;e.activeConsumer=u,e.activeOwner=u;let d=o.size>0?Array.from(o):null;o.clear();try{a=0;let e=t();if(typeof e==`function`&&u.cleanups.add(e),d!==null)for(let e of d){let t=e;if(!o.has(t)){let e=t._node||t;e.subscribers&&e.subscribers.delete(u),s.delete(t)}}let n=0;for(let e of o){let t=e,r=t._node||t;s.set(t,r.version),r.subscribers&&r.subscribers.add(u),r.depth!==void 0&&r.depth>n&&(n=r.depth)}u.depth=n+1}finally{i=!1,e.activeConsumer=n,e.activeOwner=c}},dispose:()=>{if(!r){r=!0,u.isDisposed=!0,l();for(let e of o){let t=e._node||e;t.subscribers&&t.subscribers.delete(u)}o.clear(),s.clear()}}},d=e.activeOwner?e.activeOwner._node||e.activeOwner:null;return d&&d.ownedEffects&&d.ownedEffects.add(u),u.run(),()=>{u.dispose()}}var s=class{static churnTracker=new Map;static TIME_WINDOW_MS=1e3;static CHURN_WARNING_THRESHOLD=3;static CHURN_CRITICAL_THRESHOLD=6;static isDeepEqual(e,t){return e===t?!0:typeof e!=`object`||typeof t!=`object`||e===null||t===null?!1:JSON.stringify(e)===JSON.stringify(t)}static analyzeSignalChurn(e){let t=Date.now();this.churnTracker.has(e)||this.churnTracker.set(e,[]);let n=this.churnTracker.get(e),r=t-this.TIME_WINDOW_MS,i=n.filter(e=>e>r);i.push(t);let a=i.length,o=(this.TIME_WINDOW_MS/1e3).toFixed(1);return i.length<=1?(this.churnTracker.delete(e),{marker:`🟢`,info:`[STABLE] (1 изм./${o}s)`}):(this.churnTracker.set(e,i),a>=this.CHURN_CRITICAL_THRESHOLD?{marker:`🔴`,info:`[CRITICAL CHURN] (${a} изм./${o}s) — Нужен debounce!`}:a>=this.CHURN_WARNING_THRESHOLD?{marker:`🟡`,info:`[WARNING CHURN] (${a} изм./${o}s)`}:{marker:`🟢`,info:`[STABLE] (${a} изм./${o}s)`})}static processLog(e,t,n){let{type:r,label:i,details:a,isInternalCoreSignal:o=!1}=n;if(!e.isEnabled||o&&!e.isCoreOptimizationDebugEnabled)return;if(a&&`from`in a&&`to`in a&&this.isDeepEqual(a.from,a.to)){if(r===`computed`){t(r,`🔵 [IDLE PULL] ${i} (Значение кэша не изменилось)`,a);return}return}let s=``;if(r===`signal`||r===`resource`||r===`computed`){let e=this.analyzeSignalChurn(i);s=e.marker===`🟢`?` ${e.marker}`:` ${e.marker} ${e.info}`}t(r,`${i}${s}`,a)}};function c(e,t,r,i){let a=i&&typeof i==`object`,o=a?i.name||`unnamed_resource`:i||`unnamed_resource`,s=a?i:{},c=s.resetDataOnSourceChange??!0,l=s.responseValidate,u=s.validateBeforeFetch,d=e.signal({data:null,loading:!0,error:null,isRetrying:!1},`[CORE_INTERNAL_SIGNAL=1]:resource:state:${o}`),f=t=>{e.log({type:`resource`,label:o,details:{to:t,from:d.value}}),d.value=t},p=async(r,i,a=!1)=>{if(i.aborted)return;if(s.validateBeforeFetch&&s.validateBeforeFetch(r),u){let t=u(r);if(t===!1||typeof t==`string`){if(i.aborted)return;let n=typeof t==`string`?t:`Pre-fetch validation failed for resource`,r=a?null:e.untrack(()=>d.value.data);f({data:r,loading:!1,error:n,isRetrying:!1});return}}let p=a&&c?null:e.untrack(()=>d.value.data);f({data:p,loading:!0,error:null,isRetrying:!1});for(let a=0;a<=0;a++){if(i.aborted)return;let s=i;try{let e=await t(r,s);if(i.aborted)return;if(s.aborted)throw new DOMException(`The operation timed out.`,`TimeoutError`);if(l){let t=l(e);if(t===!1||typeof t==`string`){if(i.aborted)return;f({data:null,loading:!1,error:typeof t==`string`?t:`Validation failed`,isRetrying:!1});return}}if(i.aborted)return;f({data:e,loading:!1,error:null,isRetrying:!1});return}catch(t){if(i.aborted||t.name===`AbortError`&&i.aborted)return;let r=t.name===`TimeoutError`||t.name===`AbortError`||t.message?.includes(`timeout`),s=n({tested:[t.message],expectedKey:`THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY`,valueType:`number`})?.[0]===`1`||!1,c=s&&n({tested:[t.message],expectedKey:`MESSAGE`,valueType:`string`})?.[0]||`Custom validation error`,l=s||t.name===`ValidationError`;if(a===0||l){if(i.aborted)return;let e=r?Error(`Request timed out after 1000ms`,{cause:t}):s?Error(c,{cause:t}):t;f({data:null,loading:!1,error:e instanceof Error?e.message:typeof e==`string`?e:`typeof finalError is ${typeof e}`,isRetrying:!1});return}else{if(i.aborted)return;let t=1e3*2**a;t=Math.min(t,3e5);let n=Math.random()*200;t+=n,f({data:d.value.data,loading:!0,error:null,isRetrying:!0}),console.warn(`[Resource Retry] "${o}" сбой по ${r?`таймауту`:`ошибке сети`}. Попытка ${a+1}/${a+1}...`);try{if(await e.delay(t,i),i.aborted)return}catch{return}}}}},m=null,h=e.effect(()=>{let t=r?r.value:void 0,n=new AbortController;return m=n,e.untrack(()=>{p(t,n.signal,!0)}),()=>n.abort()},`[CORE_INTERNAL_SIGNAL=1]:effect`);return{get data(){return d.value.data},get loading(){return d.value.loading},get error(){return d.value.error},get isRetrying(){return d.value.isRetrying},get value(){return d.value},refetch:()=>{m?.abort(),m=new AbortController,p(r?r.value:void 0,m.signal,!1)},subscribe:e=>d.subscribe(e),destroy:()=>{m?.abort(),m=null,typeof h==`function`&&h(),d.destroy&&d.destroy()}}}var l={signal:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,computed:`background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,effect:`background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,batch:`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,resource:`background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,reactive:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`},u=null;function d(e){if(e===null)return`null`;if(e===void 0)return`undefined`;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[Cyclic Object or Layer]`}return String(e)}function f(e,t,n){u||(u={id:Math.random().toString(36).substring(2,9),pendingLogQueue:[],isFlushing:!1},queueMicrotask(()=>p())),u.pendingLogQueue.push({type:e,label:t,from:n?.from,to:n?.to,payload:n?.payload,timestamp:Date.now()})}function p(){if(!u||u.isFlushing)return;u.isFlushing=!0;let e=u.pendingLogQueue;if(e.length===0){u=null;return}console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${u.id}] (${e.length} operations)`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #888; font-weight: normal;`);for(let t of e){let e=l[t.type],n=t.from!==void 0||t.to!==void 0,r=`%c${t.type.toUpperCase()}%c ${t.label}`;n&&(t.from?r+=` ${d(t.from)} → ${d(t.to)}`:r+=` (${d(t.to)})`),t.payload===void 0?console.log(r,e,`color: inherit;`):(console.groupCollapsed(r,e,`color: inherit;`),console.log(`Payload:`,t.payload),console.groupEnd())}console.groupEnd(),u=null}var m=class{frameworkPrefix=`core`;logger;epoch=0;activeConsumer=null;batchDepth=0;subscriberId=0;pendingEffects=[];maxPendingDepth=0;computedCache=new WeakMap;diRegistry=new Map;diCache=new Map;proxyCache=new WeakMap;proxyTargets=new WeakSet;reactiveSignals=new WeakMap;cycleDetectionStack=new Set;batchedSignals=new Set;activeOwner=null;pendingCleanups=new Set;queueCleanup(e){this.pendingCleanups.add(e)}constructor(e){this.logger=e?.logger||{isEnabled:!1}}scheduleEffect(e){let t=e.depth||0;this.pendingEffects[t]||(this.pendingEffects[t]=new Set),this.pendingEffects[t].add(e),t>this.maxPendingDepth&&(this.maxPendingDepth=t)}queueLog(e,t,n){f(e,t,n)}batch(e){this.batchDepth++;try{return e()}finally{if(this.batchDepth--,this.batchDepth===0){if(this.batchedSignals.size>0){for(let e of this.batchedSignals)e._flushBatch&&e._flushBatch();this.batchedSignals.clear()}this.flushEffects()}}}flushEffects(){if(this.batchDepth>0)return;let e=this.activeConsumer;try{for(let e=0;e<=this.maxPendingDepth;e++){let t=this.pendingEffects[e];if(!t||t.size===0)continue;let n=Array.from(t);t.clear();for(let t of n)if(!t.isDisposed&&t.isDirty){if(t.dependencies&&t.dependencies.size>0){let e=!1;for(let n of t.dependencies){let r=n._node||n;r.type===`computed`&&r.state>0&&r.update&&r.update(),t.depVersions&&t.depVersions.get(n)!==r.version&&(e=!0)}if(!e&&t.dependencies.size>0){t.isDirty=!1;continue}}try{t.run()}catch(t){for(let t=e;t<=this.maxPendingDepth;t++){let e=this.pendingEffects[t];if(e){for(let t of e)t.isDirty=!1;e.clear()}}throw this.maxPendingDepth=0,t}}if(e>0){let t=!1;for(let n=0;n<e;n++)if(this.pendingEffects[n]&&this.pendingEffects[n].size>0){t=!0;break}t&&(e=-1)}}this.maxPendingDepth=0}finally{this.activeConsumer=e}}log(e){!this.logger||!this.logger.isEnabled||s.processLog(this.logger,f,e)}signal(e,t){return r(this,e,t)}computed(e,n){return t(this,e,n)}effect(e,t){return o(this,e,t)}untrack(e){return i(this,e)}reactive(e,t){return a(this,e,t)}provide(e,t){this.diRegistry.set(e,t),this.diCache.delete(e)}inject(e){if(e==null)throw Error(`[DI Error] Token is empty`);if(this.diCache.has(e))return this.diCache.get(e);if(this.cycleDetectionStack.has(e))throw Error(`[DI Error] Cyclic dependency detected`);this.cycleDetectionStack.add(e);try{if(this.diRegistry.has(e)){let t=this.diRegistry.get(e);if(typeof t==`function`){if(t._isMockFunction){let n=t(this);return n===void 0?t:(this.diCache.set(e,n),n)}let n=t.toString();if(!(n.startsWith(`class `)||n.startsWith(`class{`)||t.prototype&&t.prototype.constructor===t&&!n.startsWith(`function`)&&!n.includes(`=>`))){let n=t(this);return this.diCache.set(e,n),n}return t}return t}if(typeof e==`function`){let t=new e(this);return this.diCache.set(e,t),t}throw Error(`[DI Error] Token not found`)}finally{this.cycleDetectionStack.delete(e)}}delay(e,t){return new Promise((n,r)=>{if(t.aborted)return r(new DOMException(`Aborted`,`AbortError`));let i=setTimeout(()=>{t.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};t.addEventListener(`abort`,a,{once:!0})})}resource(e,t,n){return c(this,e,t,n)}},h=class extends m{},g=class extends h{autoLogQueue=[];isHardFlushScheduled=!1;queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,meta:n,timestamp:Date.now()}),this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>this.flushLogs()))}flushLogs(){this.isHardFlushScheduled=!1,this.autoLogQueue.length!==0&&(typeof process<`u`&&process.env.NODE_ENV!==`test`&&(console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`),this.autoLogQueue.forEach(e=>console.log(`[${e.type.toUpperCase()}] ${e.name}`,e.meta||``)),console.groupEnd()),this.autoLogQueue=[])}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t),a=!1,o={get value(){if(a)return i.value;let e=typeof performance<`u`?performance.now():0,t=i.value;return e&&n.queueLog(`computed`,r,{value:t,duration:`${(performance.now()-e).toFixed(3)}ms`}),t},subscribe:e=>i.subscribe(e),destroy(){a=!0,i.destroy()}};return`_node`in i&&Object.defineProperty(o,"_node",{value:i._node,enumerable:!1}),o}},_=new m({logger:{isEnabled:!1}}),v=(e,t)=>_.signal(e,t),y=(e,t)=>_.computed(e,t),b=(e,t)=>_.effect(e,t),x=e=>_.batch(e),S=e=>_.untrack(e);function C(){_=new m({logger:{isEnabled:!1}})}var w=class{engine;constructor(e){this.engine=e,this.onInit()}createNumericSignal(e,t){return this.engine.signal(e,{name:t,validate:e=>typeof e==`number`&&!isNaN(e)})}createComputed(e){return this.engine.computed(e)}createSignal(e,t){return this.engine.signal(e,t)}onInit(){}},T=w,E=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=w,e.BaseREService=T,e.BaseREServiceEnhanced=E,e.ReactiveEngine=h,e.ReactiveEngineAutolog=g,e.ReactiveEngineAutomatic=m,e.ReactiveEngineCore=m,e.batch=x,e.computed=y,e.effect=b,e.flushLogs=p,e.queueLog=f,e.resetGlobalReactiveEngine=C,e.signal=v,e.untrack=S});
12
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactiveEngineLib={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e,t,n){let r=e.computedCache.get(t);if(r)return r;let i,a=!0,o=0,s=!1,c=-1,l=2,u=new Set,d=new Map,f=new Set,p=new Set,m=e=>{if(!e)return;let t=e._node||e;if(t.dependencies&&t.dependencies.size>0){for(let n of t.dependencies){let r=n,i=r._node||r;i.subscribers&&(i.subscribers.delete(t),i.subscribers.delete(e),i.subscribers.delete(_),i.type===`computed`&&i.subscribers.size===0&&m(i))}t.dependencies.clear(),t.depVersions&&t.depVersions.clear()}},h=t=>{if(!s||l===2)return t.run();if(p&&p.size>0&&t.verifiedInEpoch===e.epoch&&e.batchDepth===0&&l===0)return!1;let n=!1;if(u&&u.size>0)for(let t of u){let r=t._node||t;if(r.type===`computed`&&r.state>0&&r.update&&r.verifiedInEpoch!==e.epoch&&r.update(),t.hasBatchValue||d.get(t)!==r.version){n=!0;break}}return t.verifiedInEpoch=e.epoch,n||a?t.run():(l=0,!1)},g=0,_={id:e.subscriberId++,dependencies:u,subscribers:p,ownedEffects:f,depth:1,type:`computed`,fn:t,get version(){return o},get state(){return l},set state(e){l=e},get depVersions(){return d},verifiedInEpoch:-1,update:()=>h(_),run:()=>{if(c===e.epoch&&s&&l===0&&e.batchDepth===0)return!1;let r=e.epoch;if(c=r,_.verifiedInEpoch=r,e.cycleDetectionStack.has(_))throw Error(`[Graph Error] Cyclic dependency detected`);e.cycleDetectionStack.add(_);let p=e.activeConsumer,m=e.activeOwner;e.activeConsumer=_,e.activeOwner=_,g++,_.activeRunId=g;let h=u.size>0?Array.from(u):null;u.clear();try{if(f.size>0){for(let e of f)e&&typeof e.dispose==`function`&&e.dispose();f.clear()}let p=t();if(h!==null){let e=h.length===u.size;for(let t of h){let n=t;if(!e||!u.has(n)){let e=n._node||n;e.subscribers&&e.subscribers.delete(_),d.delete(n)}}}let m=a||!Object.is(i,p);if(m){let t=a?void 0:typeof i==`object`&&i?JSON.parse(JSON.stringify(i)):i;i=p,o++,e.log&&n&&e.log({type:`computed`,label:n,details:{from:t,to:p}})}a=!1,l=0,s=!0;let g=0;for(let e of u){let t=e,n=t._node||t;d.set(t,n.version),n.subscribers&&n.subscribers.add(_),n.depth!==void 0&&n.depth>g&&(g=n.depth)}return _.depth=g+1,e.epoch!==r&&(c=-1,_.verifiedInEpoch=-1,l=2),m}finally{e.activeConsumer=p,e.activeOwner=m,e.cycleDetectionStack.delete(_)}},markDirty:t=>{if(!(l>=t)){l=t;for(let t of p){let n=t._node||t;n.type===`effect`?(n.isDirty=!0,e.scheduleEffect(t)):n.markDirty&&n.markDirty(1)}}}},v={get value(){let t=e.activeConsumer;if(t&&t!==_){p.add(t),t.dependencies.add(_);let e=_.depth||1,n=t._node||t;n.depth!==void 0&&e>=n.depth&&(n.depth=e+1),t.activeRunId!==void 0&&(_._lastSeenInRunId=t.activeRunId)}return h(_),t&&t.depVersions&&t.depVersions.set(v,o),i},get valueWithoutTracking(){return i},get version(){return o},get dependencies(){return u},subscribe(t){let n=this,r={id:e.subscriberId++,isDirty:!0,depth:9999,dependencies:new Set,type:`effect`,run:()=>{if(!r.isDisposed)try{t(n.value)}catch(e){console.error(e)}}};return p.add(r),t(this.value),()=>{r.isDisposed=!0,p.delete(r),r.dependencies.clear()}},subscribeState(e){return v.subscribe(e)},destroy:()=>{m(_),p&&p.clear(),e.computedCache.delete(t),u.clear(),d.clear(),f.clear(),a=!0,l=2,s=!1},__subscribe(t){let n={id:e.subscriberId++,type:`effect`,run:t,isDirty:!1};return p.add(n),()=>{p.delete(n)}}};return v.run=()=>_.run(),e.computedCache.set(t,v),v._node=_,v.subscribers=p,v}var n=({tested:e,expectedKey:t,valueType:n})=>{let r=[];if(!e||!Array.isArray(e))return r;for(let i=0,a=e.length;i<a;i++){let a=e[i];if(typeof a!=`string`)continue;let o;switch(n){case`number`:o=RegExp(`\\[${t}=(?<value>\\d+)\\]`,`g`);break;default:o=RegExp(`\\[${t}=(?<value>.*?)\\]`,`g`);break}for(let e of a.matchAll(o))e?.groups&&r.push(e.groups.value)}return r};function r(e,t,r){let i=t,a=0,o=typeof r==`string`?r:r?.name,s=!!o&&n({tested:[o],expectedKey:`CORE_INTERNAL_SIGNAL`,valueType:`number`})?.[0]===`1`||!1,c=new Set,l=!1,u=t,d={type:`signal`,get version(){return a},subscribers:c},f=()=>{for(let t of c){let n=t._node||t;if(n.type===`effect`)n.isDirty=!0,e.scheduleEffect(t);else if(n.type===`computed`)n.markDirty&&n.markDirty(2);else if(typeof t==`function`)try{t(i)}catch(e){console.error(e)}else if(t&&typeof t.run==`function`)try{t.run()}catch(e){console.error(e)}}},p={get value(){let t=e.activeConsumer;return t&&(c.add(t),t.dependencies.add(p),t.activeRunId!==void 0&&(p._lastSeenInRunId=t.activeRunId)),i},set value(t){if(Object.is(i,t)&&!(i===t&&typeof i==`object`&&i))return;if(r&&typeof r==`object`&&r.validate){let e=r.validate(t);if(e!==!0){console.error(typeof e==`string`?e:`[Validation Error]`);return}}if(e.batchDepth>0){l||(l=!0,u=i),i=t,e.batchedSignals.add(p);return}let n=i;i=t,a++,e.epoch++,e.log({type:`signal`,label:o||`signal`,details:{from:n,to:t},isInternalCoreSignal:s}),f(),e.batchDepth===0&&e.flushEffects()},get version(){return a},type:`signal`,subscribe(e){return c.add(e),e(i),()=>{c.delete(e)}},_flushBatch:()=>{if(l){if(!Object.is(u,i)||typeof i==`object`&&i){a++,e.epoch++,e.log({type:`signal`,label:o||`signal_batched`,details:{from:u,to:i},isInternalCoreSignal:s});for(let t of c){let n=t._node||t;if(n.type===`effect`)n.isDirty=!0,e.scheduleEffect(t);else if(n.markDirty)n.markDirty(2);else if(typeof t==`function`)try{t(i)}catch(e){console.error(e)}}}l=!1,u=i}},get hasBatchValue(){return l},destroy:()=>{c&&c.clear(),e.batchedSignals&&e.batchedSignals.delete(p),l=!1,i=void 0,u=void 0}};return p._node=d,p.subscribers=c,p}function i(e,t){let n=e.activeConsumer;e.activeConsumer=null;try{return t()}finally{e.activeConsumer=n}}function a(e,t,n){if(e.proxyTargets.has(t))return t;if(e.proxyCache.has(t))return e.proxyCache.get(t);e.reactiveSignals.has(t)||e.reactiveSignals.set(t,new Map);let r=e.reactiveSignals.get(t),i=new Proxy(t,{get(t,i,a){if(i===`__subscribe`&&Array.isArray(t))return n=>{let i=r.get(`length`);return i||(i=e.signal(t.length),r.set(`length`,i)),i.subscribe(n)};if(Array.isArray(t)&&typeof i==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(i))return(...n)=>{let o;return e.batch(()=>{o=Reflect.get(t,i).apply(a,n);let e=r.get(`length`);e&&(e.value=t.length),r.forEach((e,n)=>{n!==`length`&&(e.value=Reflect.get(t,n))})}),o};if(typeof i==`symbol`||i===`constructor`||i===`toJSON`)return Reflect.get(t,i,a);let o=r.get(i);if(!o){let a=Reflect.get(t,i);o=e.signal(a),r.set(i,o),typeof a==`object`&&a&&(o._proxyCache=e.reactive(a,n?`${n}.${String(i)}`:String(i)))}return o._proxyCache===void 0?o.value:(o.value,o._proxyCache)},set(t,n,i,a){let o=(e.proxyTargets.has(i),i),s=Reflect.get(t,n);if(s===o&&n!==`length`)return!0;Reflect.set(t,n,o);let c=r.get(n);if(c||(c=e.signal(s),r.set(n,c)),c._proxyCache=void 0,c.value=o,Array.isArray(t)&&n!==`length`){let e=r.get(`length`);e&&(e.value=t.length)}return!0}});return e.proxyCache.set(t,i),e.proxyTargets.add(i),i}function o(e,t,n){let r=!1,i=!1,a=2,o=new Set,s=new Map,c=new Set,l=()=>{if(c.size>0){let t=e.activeConsumer,n=e.activeOwner;e.activeConsumer=null,e.activeOwner=null;for(let e of c)e.dispose&&e.dispose();c.clear(),e.activeConsumer=t,e.activeOwner=n}if(u.cleanups.size>0){let t=e.activeConsumer;e.activeConsumer=null;for(let e of u.cleanups)try{e()}catch(e){console.error(e)}u.cleanups.clear(),e.activeConsumer=t}},u={id:e.subscriberId++,dependencies:o,ownedEffects:c,cleanups:new Set,type:`effect`,depth:0,label:n,get isDirty(){return a>0},set isDirty(e){e&&(a=2)},get isDisposed(){return r},set isDisposed(e){r=e},get state(){return a},set state(e){a=e},get depVersions(){return s},get _node(){return u},markDirty:()=>{a>=1||(a=1,e.scheduleEffect(u))},run:()=>{if(r||i)return;i=!0,l();let n=e.activeConsumer,c=e.activeOwner;e.activeConsumer=u,e.activeOwner=u;let d=o.size>0?Array.from(o):null;o.clear();try{a=0;let e=t();if(typeof e==`function`&&u.cleanups.add(e),d!==null)for(let e of d){let t=e;if(!o.has(t)){let e=t._node||t;e.subscribers&&e.subscribers.delete(u),s.delete(t)}}let n=0;for(let e of o){let t=e,r=t._node||t;s.set(t,r.version),r.subscribers&&r.subscribers.add(u),r.depth!==void 0&&r.depth>n&&(n=r.depth)}u.depth=n+1}finally{i=!1,e.activeConsumer=n,e.activeOwner=c}},dispose:()=>{if(!r){r=!0,u.isDisposed=!0,l();for(let e of o){let t=e._node||e;t.subscribers&&t.subscribers.delete(u)}o.clear(),s.clear()}}},d=e.activeOwner?e.activeOwner._node||e.activeOwner:null;return d&&d.ownedEffects&&d.ownedEffects.add(u),u.run(),()=>{u.dispose()}}var s=class{static churnTracker=new Map;static TIME_WINDOW_MS=1e3;static CHURN_WARNING_THRESHOLD=3;static CHURN_CRITICAL_THRESHOLD=6;static isDeepEqual(e,t){return e===t?!0:typeof e!=`object`||typeof t!=`object`||e===null||t===null?!1:JSON.stringify(e)===JSON.stringify(t)}static analyzeSignalChurn(e){let t=Date.now();this.churnTracker.has(e)||this.churnTracker.set(e,[]);let n=this.churnTracker.get(e),r=t-this.TIME_WINDOW_MS,i=n.filter(e=>e>r);i.push(t);let a=i.length,o=(this.TIME_WINDOW_MS/1e3).toFixed(1);return i.length<=1?(this.churnTracker.delete(e),{marker:`🟢`,info:`[STABLE] (1 изм./${o}s)`}):(this.churnTracker.set(e,i),a>=this.CHURN_CRITICAL_THRESHOLD?{marker:`🔴`,info:`[CRITICAL CHURN] (${a} изм./${o}s) — Нужен debounce!`}:a>=this.CHURN_WARNING_THRESHOLD?{marker:`🟡`,info:`[WARNING CHURN] (${a} изм./${o}s)`}:{marker:`🟢`,info:`[STABLE] (${a} изм./${o}s)`})}static processLog(e,t,n){let{type:r,label:i,details:a,isInternalCoreSignal:o=!1}=n;if(!e.isEnabled||o&&!e.isCoreOptimizationDebugEnabled)return;if(a&&`from`in a&&`to`in a&&this.isDeepEqual(a.from,a.to)){if(r===`computed`){t(r,`🔵 [IDLE PULL] ${i} (Значение кэша не изменилось)`,a);return}return}let s=``;if(r===`signal`||r===`resource`||r===`computed`){let e=this.analyzeSignalChurn(i);s=e.marker===`🟢`?` ${e.marker}`:` ${e.marker} ${e.info}`}t(r,`${i}${s}`,a)}};function c(e,t,r,i){let a=i&&typeof i==`object`,o=a?i.name||`unnamed_resource`:i||`unnamed_resource`,s=a?i:{},c=s.resetDataOnSourceChange??!0,l=s.responseValidate,u=s.validateBeforeFetch,d=e.signal({data:null,loading:!0,error:null,isRetrying:!1},`[CORE_INTERNAL_SIGNAL=1]:resource:state:${o}`),f=t=>{e.log({type:`resource`,label:o,details:{to:t,from:d.value}}),d.value=t},p=async(r,i,a=!1)=>{if(i.aborted)return;if(s.validateBeforeFetch&&s.validateBeforeFetch(r),u){let t=u(r);if(t===!1||typeof t==`string`){if(i.aborted)return;let n=typeof t==`string`?t:`Pre-fetch validation failed for resource`,r=a?null:e.untrack(()=>d.value.data);f({data:r,loading:!1,error:n,isRetrying:!1});return}}let p=a&&c?null:e.untrack(()=>d.value.data);f({data:p,loading:!0,error:null,isRetrying:!1});for(let a=0;a<=0;a++){if(i.aborted)return;let s=i;try{let e=await t(r,s);if(i.aborted)return;if(s.aborted)throw new DOMException(`The operation timed out.`,`TimeoutError`);if(l){let t=l(e);if(t===!1||typeof t==`string`){if(i.aborted)return;f({data:null,loading:!1,error:typeof t==`string`?t:`Validation failed`,isRetrying:!1});return}}if(i.aborted)return;f({data:e,loading:!1,error:null,isRetrying:!1});return}catch(t){if(i.aborted||t.name===`AbortError`&&i.aborted)return;let r=t.name===`TimeoutError`||t.name===`AbortError`||t.message?.includes(`timeout`),s=n({tested:[t.message],expectedKey:`THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY`,valueType:`number`})?.[0]===`1`||!1,c=s&&n({tested:[t.message],expectedKey:`MESSAGE`,valueType:`string`})?.[0]||`Custom validation error`,l=s||t.name===`ValidationError`;if(a===0||l){if(i.aborted)return;let e=r?Error(`Request timed out after 1000ms`,{cause:t}):s?Error(c,{cause:t}):t;f({data:null,loading:!1,error:e instanceof Error?e.message:typeof e==`string`?e:`typeof finalError is ${typeof e}`,isRetrying:!1});return}else{if(i.aborted)return;let t=1e3*2**a;t=Math.min(t,3e5);let n=Math.random()*200;t+=n,f({data:d.value.data,loading:!0,error:null,isRetrying:!0}),console.warn(`[Resource Retry] "${o}" сбой по ${r?`таймауту`:`ошибке сети`}. Попытка ${a+1}/${a+1}...`);try{if(await e.delay(t,i),i.aborted)return}catch{return}}}}},m=null,h=e.effect(()=>{let t=r?r.value:void 0,n=new AbortController;return m=n,e.untrack(()=>{p(t,n.signal,!0)}),()=>n.abort()},`[CORE_INTERNAL_SIGNAL=1]:effect`);return{get data(){return d.value.data},get loading(){return d.value.loading},get error(){return d.value.error},get isRetrying(){return d.value.isRetrying},get value(){return d.value},refetch:()=>{m?.abort(),m=new AbortController,p(r?r.value:void 0,m.signal,!1)},subscribe:e=>d.subscribe(e),destroy:()=>{m?.abort(),m=null,typeof h==`function`&&h(),d.destroy&&d.destroy()}}}var l={signal:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,computed:`background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,effect:`background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,batch:`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,resource:`background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,reactive:`background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`},u=null;function d(e){if(e===null)return`null`;if(e===void 0)return`undefined`;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[Cyclic Object or Layer]`}return String(e)}function f(e,t,n){u||(u={id:Math.random().toString(36).substring(2,9),pendingLogQueue:[],isFlushing:!1},queueMicrotask(()=>p())),u.pendingLogQueue.push({type:e,label:t,from:n?.from,to:n?.to,payload:n?.payload,timestamp:Date.now()})}function p(){if(!u||u.isFlushing)return;u.isFlushing=!0;let e=u.pendingLogQueue;if(e.length===0){u=null;return}console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${u.id}] (${e.length} operations)`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #888; font-weight: normal;`);for(let t of e){let e=l[t.type],n=t.from!==void 0||t.to!==void 0,r=`%c${t.type.toUpperCase()}%c ${t.label}`;n&&(t.from?r+=` ${d(t.from)} → ${d(t.to)}`:r+=` (${d(t.to)})`),t.payload===void 0?console.log(r,e,`color: inherit;`):(console.groupCollapsed(r,e,`color: inherit;`),console.log(`Payload:`,t.payload),console.groupEnd())}console.groupEnd(),u=null}var m=class{frameworkPrefix=`core`;logger;epoch=0;activeConsumer=null;batchDepth=0;subscriberId=0;pendingEffects=[];maxPendingDepth=0;computedCache=new WeakMap;diRegistry=new Map;diCache=new Map;proxyCache=new WeakMap;proxyTargets=new WeakSet;reactiveSignals=new WeakMap;cycleDetectionStack=new Set;batchedSignals=new Set;activeOwner=null;pendingCleanups=new Set;queueCleanup(e){this.pendingCleanups.add(e)}constructor(e){this.logger=e?.logger||{isEnabled:!1}}scheduleEffect(e){let t=e.depth||0;this.pendingEffects[t]||(this.pendingEffects[t]=new Set),this.pendingEffects[t].add(e),t>this.maxPendingDepth&&(this.maxPendingDepth=t)}queueLog(e,t,n){f(e,t,n)}batch(e){this.batchDepth++;try{return e()}finally{if(this.batchDepth--,this.batchDepth===0){if(this.batchedSignals.size>0){for(let e of this.batchedSignals)e._flushBatch&&e._flushBatch();this.batchedSignals.clear()}this.flushEffects()}}}flushEffects(){if(this.batchDepth>0)return;let e=this.activeConsumer;try{for(let e=0;e<=this.maxPendingDepth;e++){let t=this.pendingEffects[e];if(!t||t.size===0)continue;let n=Array.from(t);t.clear();for(let t of n)if(!t.isDisposed&&t.isDirty){if(t.dependencies&&t.dependencies.size>0){let e=!1;for(let n of t.dependencies){let r=n._node||n;r.type===`computed`&&r.state>0&&r.update&&r.update(),t.depVersions&&t.depVersions.get(n)!==r.version&&(e=!0)}if(!e&&t.dependencies.size>0){t.isDirty=!1;continue}}try{t.run()}catch(t){for(let t=e;t<=this.maxPendingDepth;t++){let e=this.pendingEffects[t];if(e){for(let t of e)t.isDirty=!1;e.clear()}}throw this.maxPendingDepth=0,t}}if(e>0){let t=!1;for(let n=0;n<e;n++)if(this.pendingEffects[n]&&this.pendingEffects[n].size>0){t=!0;break}t&&(e=-1)}}this.maxPendingDepth=0}finally{this.activeConsumer=e}}log(e){!this.logger||!this.logger.isEnabled||s.processLog(this.logger,f,e)}signal(e,t){return r(this,e,t)}computed(e,n){return t(this,e,n)}effect(e,t){return o(this,e,t)}untrack(e){return i(this,e)}reactive(e,t){return a(this,e,t)}provide(e,t){this.diRegistry.set(e,t),this.diCache.delete(e)}inject(e){if(e==null)throw Error(`[DI Error] Token is empty`);if(this.diCache.has(e))return this.diCache.get(e);if(this.cycleDetectionStack.has(e))throw Error(`[DI Error] Cyclic dependency detected`);this.cycleDetectionStack.add(e);try{if(this.diRegistry.has(e)){let t=this.diRegistry.get(e);if(typeof t==`function`){if(t._isMockFunction){let n=t(this);return n===void 0?t:(this.diCache.set(e,n),n)}let n=t.toString();if(!(n.startsWith(`class `)||n.startsWith(`class{`)||t.prototype&&t.prototype.constructor===t&&!n.startsWith(`function`)&&!n.includes(`=>`))){let n=t(this);return this.diCache.set(e,n),n}return t}return t}if(typeof e==`function`){let t=new e(this);return this.diCache.set(e,t),t}throw Error(`[DI Error] Token not found`)}finally{this.cycleDetectionStack.delete(e)}}delay(e,t){return new Promise((n,r)=>{if(t.aborted)return r(new DOMException(`Aborted`,`AbortError`));let i=setTimeout(()=>{t.removeEventListener(`abort`,a),n()},e),a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};t.addEventListener(`abort`,a,{once:!0})})}resource(e,t,n){return c(this,e,t,n)}},h=class extends m{},g=class extends h{autoLogQueue=[];isHardFlushScheduled=!1;queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,meta:n,timestamp:Date.now()}),this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>this.flushLogs()))}flushLogs(){this.isHardFlushScheduled=!1,this.autoLogQueue.length!==0&&(typeof process<`u`&&process.env.NODE_ENV!==`test`&&(console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`),this.autoLogQueue.forEach(e=>console.log(`[${e.type.toUpperCase()}] ${e.name}`,e.meta||``)),console.groupEnd()),this.autoLogQueue=[])}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t),a=!1,o={get value(){if(a)return i.value;let e=typeof performance<`u`?performance.now():0,t=i.value;return e&&n.queueLog(`computed`,r,{value:t,duration:`${(performance.now()-e).toFixed(3)}ms`}),t},subscribe:e=>i.subscribe(e),destroy(){a=!0,i.destroy()}};return`_node`in i&&Object.defineProperty(o,"_node",{value:i._node,enumerable:!1}),o}},_=new m({logger:{isEnabled:!1}}),v=(e,t)=>_.signal(e,t),y=(e,t)=>_.computed(e,t),b=(e,t)=>_.effect(e,t),x=e=>_.batch(e),S=e=>_.untrack(e);function C(){_=new m({logger:{isEnabled:!1}})}var w=class{engine;constructor(e){this.engine=e,this.onInit()}createNumericSignal(e,t){return this.engine.signal(e,{name:t,validate:e=>typeof e==`number`&&!isNaN(e)})}createComputed(e){return this.engine.computed(e)}createSignal(e,t){return this.engine.signal(e,t)}onInit(){}},T=w,E=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=w,e.BaseREService=T,e.BaseREServiceEnhanced=E,e.ReactiveEngine=h,e.ReactiveEngineAutolog=g,e.ReactiveEngineAutomatic=m,e.ReactiveEngineCore=m,e.batch=x,e.computed=y,e.effect=b,e.flushLogs=p,e.queueLog=f,e.resetGlobalReactiveEngine=C,e.signal=v,e.untrack=S});
13
13
  //# sourceMappingURL=reactive-engine.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.method.computed.ts","../src/utils/getExtractedValues.ts","../src/core/core.method.signal.ts","../src/core/core.method.untrack.ts","../src/core/core.method.reactive.ts","../src/core/core.method.effect.ts","../src/core/core.logger.ts","../src/core/core.method.resource.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/core.global.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { Computed, CleanupFn } from './types'\n\nexport function createComputed<T>(\n engine: any,\n fn: () => T,\n signalName?: string\n): Computed<T> {\n // 1. Ультимативный канонический WeakMap путь (строго по ссылке на объект-функцию)\n // Работает со скоростью нативной ссылки в V8, полностью исключая утечки памяти\n const existing = engine.computedCache.get(fn)\n if (existing) return existing as Computed<T>\n\n let value: T\n let isDirty = true\n let version = 0\n let isInitialized = false\n let evaluatedInEpoch = -1\n let state = 2 // 2 = DIRTY, 1 = CHECK, 0 = STABLE\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n const ownedEffects = new Set<any>()\n const subscribers = new Set<any>()\n\n const releaseNode = (node: any): void => {\n if (!node) return\n const actNode = node._node || node\n\n if (actNode.dependencies && actNode.dependencies.size > 0) {\n for (const unknownDep of actNode.dependencies) {\n const dep = unknownDep as any\n const rawDepNode = dep._node || dep\n\n if (rawDepNode.subscribers) {\n rawDepNode.subscribers.delete(actNode)\n rawDepNode.subscribers.delete(node)\n rawDepNode.subscribers.delete(computedNode)\n\n if (rawDepNode.type === 'computed' && rawDepNode.subscribers.size === 0) {\n releaseNode(rawDepNode)\n }\n }\n }\n actNode.dependencies.clear()\n if (actNode.depVersions) actNode.depVersions.clear()\n }\n }\n\n const updateIfNecessary = (node: any): boolean => {\n if (!isInitialized || state === 2) {\n return node.run()\n }\n\n // ⚛️ КОРРЕКТНЫЙ МЕМОИЗАЦИОННЫЙ ГВАРД (Pull-совместимый проход):\n // Если у узла есть активные подписчики (observed), мы можем оптимизировать расчет через эпохи.\n // Но если подписчиков НЕТ (unobserved), мы ОБЯЗАНЫ пропустить быстрый выход по эпохам\n // и честно проверить, изменились ли версии родителей ниже.\n if (subscribers && subscribers.size > 0) {\n if (node.verifiedInEpoch === engine.epoch && engine.batchDepth === 0 && state === 0) {\n return false\n }\n }\n\n let hasChangedParent = false\n\n if (dependencies && dependencies.size > 0) {\n for (const dep of dependencies) {\n const rawDep = dep._node || dep\n\n if (rawDep.type === 'computed' && rawDep.state > 0) {\n // ⚛️ ЗАЩИТА ОТ КАСКАДНОГО ОБХОДА:\n // Вызываем update() родителя только если он еще не был верифицирован в текущей эпохе.\n // Это ликвидирует квадратичную рекурсию на динамических структурах графа!\n if (rawDep.update && rawDep.verifiedInEpoch !== engine.epoch) {\n rawDep.update()\n }\n }\n\n // Если родитель имеет отложенное батч-значение (hasBatchValue)\n // или его версия изменилась — кэш невалиден!\n if (dep.hasBatchValue || depVersions.get(dep) !== rawDep.version) {\n hasChangedParent = true\n break\n }\n }\n }\n\n node.verifiedInEpoch = engine.epoch\n\n if (hasChangedParent || isDirty) {\n return node.run()\n }\n\n state = 0\n return false\n }\n\n let currentRunId = 0\n\n const computedNode: any = {\n id: engine.subscriberId++,\n dependencies,\n subscribers,\n ownedEffects,\n depth: 1,\n type: 'computed',\n fn,\n get version() { return version },\n get state() { return state },\n set state(val: number) { state = val },\n get depVersions() { return depVersions },\n verifiedInEpoch: -1, // Перенесено напрямую на объект ноды для ультимативного O(1)\n update: () => updateIfNecessary(computedNode),\n run: () => {\n // Стандартный быстрый выход для стабильных эпох\n if (evaluatedInEpoch === engine.epoch && isInitialized && state === 0 && engine.batchDepth === 0) {\n return false\n }\n\n // Запоминаем стартовую эпоху до вызова функции пользователя\n const startEpoch = engine.epoch\n evaluatedInEpoch = startEpoch\n computedNode.verifiedInEpoch = startEpoch\n\n if (engine.cycleDetectionStack.has(computedNode)) {\n throw new Error('[Graph Error] Cyclic dependency detected')\n }\n engine.cycleDetectionStack.add(computedNode)\n\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n\n engine.activeConsumer = computedNode\n engine.activeOwner = computedNode\n\n currentRunId++\n computedNode.activeRunId = currentRunId\n\n const oldDeps = dependencies.size > 0 ? Array.from(dependencies) : null\n dependencies.clear()\n\n try {\n if (ownedEffects.size > 0) {\n for (const child of ownedEffects) {\n if (child && typeof child.dispose === 'function') {\n child.dispose()\n }\n }\n ownedEffects.clear()\n }\n\n // Выполняем пользовательскую функцию (здесь могут произойти inner writes из тестов #179, #180, #186)\n const newValue = fn()\n\n if (oldDeps !== null) {\n const isSizeIdentical = oldDeps.length === dependencies.size\n for (const unknownDep of oldDeps) {\n const dep = unknownDep as any\n if (!isSizeIdentical || !dependencies.has(dep)) {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(computedNode)\n depVersions.delete(dep)\n }\n }\n }\n\n const changed = isDirty || !Object.is(value, newValue)\n\n if (changed) {\n const previousValueSnapshot = isDirty ? undefined : (typeof value === 'object' && value !== null ? JSON.parse(JSON.stringify(value)) : value)\n value = newValue\n version++\n\n if (engine.log && signalName) {\n engine.log({\n type: 'computed',\n label: signalName,\n details: { from: previousValueSnapshot, to: newValue }\n })\n }\n }\n\n isDirty = false\n state = 0\n isInitialized = true\n\n let maxDepDepth = 0\n for (const unknownDep of dependencies) {\n const dep = unknownDep as any\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version)\n if (rawNode.subscribers) rawNode.subscribers.add(computedNode)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) {\n maxDepDepth = rawNode.depth\n }\n }\n\n computedNode.depth = maxDepDepth + 1\n\n // ⚡ ФИКС ДЛЯ INNER WRITES (#179, #180, #186):\n // Если во время исполнения fn() эпоха ядра сдвинулась (был вложенный сеттер),\n // мы обязаны сбросить кэш верификации этой эпохи, чтобы последующие цепочки\n // зависимостей внутри этого же тика пересчитали свои значения нативно.\n if (engine.epoch !== startEpoch) {\n evaluatedInEpoch = -1\n computedNode.verifiedInEpoch = -1\n state = 2 // Переводим в DIRTY для немедленной инвалидации\n }\n\n return changed\n } finally {\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n engine.cycleDetectionStack.delete(computedNode)\n }\n },\n markDirty: (parentState: number) => {\n if (state >= parentState) return\n state = parentState\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(1)\n }\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value() {\n const consumer = engine.activeConsumer\n if (consumer && consumer !== computedNode) {\n subscribers.add(consumer)\n consumer.dependencies.add(computedNode)\n\n const currentDepth = computedNode.depth || 1\n const consumerRaw = consumer._node || consumer\n if (consumerRaw.depth !== undefined && currentDepth >= consumerRaw.depth) {\n consumerRaw.depth = currentDepth + 1\n }\n\n if (consumer.activeRunId !== undefined) {\n computedNode._lastSeenInRunId = consumer.activeRunId\n }\n }\n\n updateIfNecessary(computedNode)\n\n if (consumer && consumer.depVersions) {\n consumer.depVersions.set(computedInstance, version)\n }\n return value\n },\n get valueWithoutTracking() { return value },\n get version() { return version },\n get dependencies() { return dependencies },\n\n subscribe(cb: (val: T) => void): CleanupFn {\n const self = this\n const fakeEffect: any = {\n id: engine.subscriberId++,\n isDirty: true,\n depth: 9999,\n dependencies: new Set(),\n type: 'effect',\n run: () => {\n if (fakeEffect.isDisposed) return\n try { cb(self.value) } catch (err) { console.error(err) }\n }\n }\n subscribers.add(fakeEffect)\n cb(this.value)\n return () => {\n fakeEffect.isDisposed = true\n subscribers.delete(fakeEffect)\n fakeEffect.dependencies.clear()\n }\n },\n subscribeState(cb: () => void): CleanupFn {\n return (computedInstance as any).subscribe(cb)\n },\n destroy: () => {\n releaseNode(computedNode)\n if (subscribers) subscribers.clear()\n engine.computedCache.delete(fn)\n\n dependencies.clear()\n depVersions.clear()\n ownedEffects.clear()\n\n isDirty = true\n state = 2\n isInitialized = false\n },\n __subscribe(cb: () => void): CleanupFn {\n const hookEffect: any = {\n id: engine.subscriberId++,\n type: 'effect',\n run: cb,\n isDirty: false\n }\n subscribers.add(hookEffect)\n return () => {\n subscribers.delete(hookEffect)\n }\n }\n } as any\n\n computedInstance.run = () => computedNode.run()\n engine.computedCache.set(fn, computedInstance)\n\n ;(computedInstance as any)._node = computedNode\n ;(computedInstance as any).subscribers = subscribers\n\n return computedInstance\n}\n","export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = []\n if (!tested || !Array.isArray(tested)) return results // Предохранитель от пустых массивов\n\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i]\n if (typeof t !== 'string') continue // ЗАЩИТА: Пропускаем всё, что не является валидной строкой\n\n let regex\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g')\n break\n case 'string':\n default:\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g')\n break\n }\n\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value) }\n }\n }\n return results\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, SignalOptions } from './types'\n\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: SignalOptions<T> | string\n): Signal<T> {\n let value = initialValue\n let version = 0\n let name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name\n const isInternalCoreSignal = !!name && getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.[0] === '1' || false\n const subscribers = new Set<any>()\n\n let hasBatchValue = false\n let batchInitialValue: T = initialValue\n\n const signalNode = {\n type: 'signal',\n get version() { return version },\n subscribers\n }\n\n const notifySubscribers = () => {\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.type === 'computed') {\n if (rawSub.markDirty) rawSub.markDirty(2)\n } else {\n if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n } else if (sub && typeof sub.run === 'function') {\n try { sub.run() } catch (err) { console.error(err) }\n }\n }\n }\n }\n\n const signalInstance: Signal<T> = {\n get value() {\n const consumer = engine.activeConsumer\n if (consumer) {\n subscribers.add(engine.activeConsumer)\n engine.activeConsumer.dependencies.add(signalInstance)\n\n if (consumer.activeRunId !== undefined) {\n (signalInstance as any)._lastSeenInRunId = consumer.activeRunId\n }\n }\n return value\n },\n\n set value(newValue: T) {\n const isObjectKick = value === newValue && value !== null && typeof value === 'object'\n if (Object.is(value, newValue) && !isObjectKick) return\n\n if (optionsOrName && typeof optionsOrName === 'object' && optionsOrName.validate) {\n const validation = optionsOrName.validate(newValue)\n if (validation !== true) {\n console.error(typeof validation === 'string' ? validation : '[Validation Error]')\n return\n }\n }\n\n if (engine.batchDepth > 0) {\n if (!hasBatchValue) {\n hasBatchValue = true\n batchInitialValue = value\n }\n value = newValue\n engine.batchedSignals.add(signalInstance)\n return\n }\n\n const oldValue = value\n value = newValue\n\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n notifySubscribers()\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n\n get version() { return version },\n type: 'signal',\n\n subscribe(cb: (val: T) => void) {\n subscribers.add(cb)\n cb(value)\n return () => { subscribers.delete(cb) }\n },\n\n _flushBatch: () => {\n if (!hasBatchValue) return\n\n const wasChanged = !Object.is(batchInitialValue, value) || (value !== null && typeof value === 'object')\n\n if (wasChanged) {\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal_batched',\n details: { from: batchInitialValue, to: value },\n isInternalCoreSignal\n })\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(2)\n } else if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n }\n }\n }\n\n hasBatchValue = false\n batchInitialValue = value\n },\n\n get hasBatchValue() { return hasBatchValue },\n\n // ⚛️ ФИКС ДЛЯ РЕЛИЗА 2.5.0: Метод тотальной деструкции сигнала\n destroy: () => {\n if (subscribers) {\n subscribers.clear()\n }\n if (engine.batchedSignals) {\n engine.batchedSignals.delete(signalInstance)\n }\n hasBatchValue = false\n // Помогаем GC, убирая ссылки на тяжелые объекты\n value = undefined as any\n batchInitialValue = undefined as any\n }\n } as any\n\n ;(signalInstance as any)._node = signalNode\n ;(signalInstance as any).subscribers = subscribers\n return signalInstance\n}\n","/**\n * Изолированный менеджер контекста untrack реактивного графа.\n * Временно замораживает автоматический сбор зависимостей, подменяя activeConsumer на null.\n */\nexport function executeUntrack<T>(engine: any, fn: () => T): T {\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = null\n try {\n return fn()\n } finally {\n engine.activeConsumer = prevConsumer\n }\n}\n","/**\n * * Изолированная фабрика глубоких реактивных Proxy-объектов графа.\n */\nexport function createReactive<T extends object>(\n engine: any,\n target: T,\n name?: string\n): T {\n if (engine.proxyTargets.has(target)) return target as any\n if (engine.proxyCache.has(target)) return engine.proxyCache.get(target) as any\n if (!engine.reactiveSignals.has(target)) engine.reactiveSignals.set(target, new Map())\n const signalsMap = engine.reactiveSignals.get(target)!\n\n const handler: ProxyHandler<T> = {\n get(t: T, prop: string | symbol, receiver: any) {\n if (prop === '__subscribe' && Array.isArray(t)) {\n return (cb: () => void) => {\n let lengthSig = signalsMap.get('length')\n if (!lengthSig) {\n lengthSig = engine.signal(t.length)\n signalsMap.set('length', lengthSig)\n }\n return lengthSig.subscribe(cb)\n }\n }\n\n if (Array.isArray(t) && typeof prop === 'string' && ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].includes(prop)) {\n return (...args: any[]) => {\n let result: any\n engine.batch(() => {\n result = (Reflect.get(t, prop) as Function).apply(receiver, args)\n\n let lengthSig = signalsMap.get('length')\n if (lengthSig) lengthSig.value = t.length\n\n signalsMap.forEach((sig: any, key: string) => {\n if (key !== 'length') sig.value = Reflect.get(t, key)\n })\n })\n return result\n }\n }\n\n if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'toJSON') return Reflect.get(t, prop, receiver)\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n const rawValue = Reflect.get(t, prop)\n sig = engine.signal(rawValue)\n signalsMap.set(prop, sig)\n\n // ⚡ ЛЕНИВОЕ КЭШИРОВАНИЕ НА ЧТЕНИИ (O(1) Hot Path):\n // Создаем прокси-обертку строго один раз при первом РЕАЛЬНОМ обращении к свойству,\n // а не принудительно при записи.\n if (rawValue !== null && typeof rawValue === 'object') {\n (sig as any)._proxyCache = engine.reactive(rawValue, name ? `${name}.${String(prop)}` : String(prop))\n }\n }\n\n if ((sig as any)._proxyCache !== undefined) {\n sig.value // Честная регистрация ребра для сохранения топологии глубины веток\n return (sig as any)._proxyCache\n }\n\n return sig.value\n },\n\n set(t: T, prop: string | symbol, value: any, receiver: any) {\n const rawValue = engine.proxyTargets.has(value) ? value : value\n const oldValue = Reflect.get(t, prop)\n\n if (oldValue === rawValue && prop !== 'length') return true\n Reflect.set(t, prop, rawValue)\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n sig = engine.signal(oldValue)\n signalsMap.set(prop, sig)\n }\n\n // ⚡ МЕГА-УСКOРЕНИЕ ДЛЯ СЕТТЕРOВ:\n // При записи мы просто СБРАСЫВАЕМ кэш прокси на узле в undefined.\n // Если бенчмарк захочет прочитать это свойство на следующей итерации,\n // ловушка геттера лениво создаст прокси. Если нет — мы сэкономили 100% ресурсов!\n (sig as any)._proxyCache = undefined\n sig.value = rawValue\n\n if (Array.isArray(t) && prop !== 'length') {\n let lengthSig = signalsMap.get('length')\n if (lengthSig) lengthSig.value = t.length\n }\n return true\n }\n }\n\n const proxy = new Proxy(target, handler)\n engine.proxyCache.set(target, proxy)\n engine.proxyTargets.add(proxy)\n return proxy\n}\n","import { IEffect, EffectFn, CleanupFn } from './types'\n\ninterface ICoreEffectNode extends IEffect {\n dependencies: Set<any>;\n depVersions: Map<any, number>;\n ownedEffects: Set<ICoreEffectNode>;\n type: string;\n depth: number;\n state: number;\n _node: any;\n dispose: () => void;\n}\n\nexport function createEffect(engine: any, fn: EffectFn, effectName?: string): () => void {\n let isDisposed = false\n let isRunning = false\n let state = 2 // 0 = STABLE, 1 = CHECK, 2 = DIRTY\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n const ownedEffects = new Set<ICoreEffectNode>()\n\n const runCleanupPhase = () => {\n // Каскадное уничтожение вложенных детей через быстрый for...of\n if (ownedEffects.size > 0) {\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n engine.activeConsumer = null\n engine.activeOwner = null\n\n for (const child of ownedEffects) {\n if (child.dispose) child.dispose()\n }\n ownedEffects.clear()\n\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n }\n\n // Изоляция ошибок в деструкторах пользователя через быстрый for...of\n if (effectNode.cleanups.size > 0) {\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = null\n\n for (const cleanup of effectNode.cleanups) {\n try {\n cleanup()\n } catch (err) {\n console.error(err)\n }\n }\n\n effectNode.cleanups.clear()\n engine.activeConsumer = prevConsumer\n }\n }\n\n const effectNode: ICoreEffectNode = {\n id: engine.subscriberId++,\n dependencies,\n ownedEffects,\n cleanups: new Set<CleanupFn>(),\n type: 'effect',\n depth: 0,\n label: effectName,\n\n get isDirty(): boolean { return state > 0 },\n set isDirty(val: boolean) { if (val) state = 2 },\n\n get isDisposed(): boolean { return isDisposed },\n set isDisposed(val: boolean) { isDisposed = val },\n\n get state(): number { return state },\n set state(val: number) { state = val },\n get depVersions(): Map<any, number> { return depVersions },\n get _node(): any { return effectNode },\n\n markDirty: () => {\n if (state >= 1) return\n state = 1\n engine.scheduleEffect(effectNode)\n },\n\n run: () => {\n if (isDisposed || isRunning) return\n isRunning = true\n\n runCleanupPhase()\n\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n\n engine.activeConsumer = effectNode\n engine.activeOwner = effectNode\n\n const oldDeps = dependencies.size > 0 ? Array.from(dependencies) : null\n dependencies.clear()\n\n try {\n state = 0 // Сбрасываем флаг грязи перед чтением графа\n\n const result = fn()\n if (typeof result === 'function') {\n effectNode.cleanups.add(result)\n }\n\n if (oldDeps !== null) {\n for (const unknownDep of oldDeps) {\n const dep = unknownDep as any\n if (!dependencies.has(dep)) {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(effectNode)\n depVersions.delete(dep)\n }\n }\n }\n\n let maxDepDepth = 0\n for (const unknownDep of dependencies) {\n const dep = unknownDep as any\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version)\n if (rawNode.subscribers) rawNode.subscribers.add(effectNode)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) {\n maxDepDepth = rawNode.depth\n }\n }\n effectNode.depth = maxDepDepth + 1\n\n } finally {\n isRunning = false\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n }\n },\n\n dispose: () => {\n if (isDisposed) return\n isDisposed = true\n effectNode.isDisposed = true\n\n runCleanupPhase()\n\n // ⚡ ОПТИМИЗАЦИЯ: Замена .forEach на быстрый for...of при полном уничтожении эффекта\n for (const dep of dependencies) {\n const rawNode = dep._node || dep\n if (rawNode.subscribers) rawNode.subscribers.delete(effectNode)\n }\n dependencies.clear()\n depVersions.clear()\n }\n }\n\n const actualOwnerNode = engine.activeOwner ? (engine.activeOwner._node || engine.activeOwner) : null\n\n if (actualOwnerNode && actualOwnerNode.ownedEffects) {\n actualOwnerNode.ownedEffects.add(effectNode)\n }\n\n effectNode.run()\n\n return () => {\n effectNode.dispose()\n }\n}\n","// core.logger.ts\nimport { LogEventType } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n // Фильтруем историю\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n // ⚛️ ФИКС УТЕЧКИ ПАМЯТИ: Если узел стабилен и старых логов нет,\n // удаляем ключ из Map целиком, чтобы не копить мусор\n if (activeHistory.length <= 1) {\n this.churnTracker.delete(label)\n return { marker: '🟢', info: `[STABLE] (1 изм./${intervalSec}s)` }\n } else {\n this.churnTracker.set(label, activeHistory)\n }\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return {\n marker: '🔴',\n info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!`\n }\n }\n\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return {\n marker: '🟡',\n info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n return {\n marker: '🟢',\n info: `[STABLE] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n if (type === 'computed') {\n queueLogFn(type, `🔵 [IDLE PULL] ${label} (Значение кэша не изменилось)`, details)\n return\n }\n return\n }\n }\n\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Resource, ResourceOptions, ResourceState, Signal } from './types'\n\n// Контракт ядра движка для безопасных вызовов методов с дженериками\ninterface IReactiveEngine {\n signal<V>(initialValue: V, optionsOrName?: any): Signal<V>;\n effect(fn: () => any, name?: string): () => void;\n untrack<V>(fn: () => V): V;\n log(params: any): void;\n delay(ms: number, signal: AbortSignal): Promise<void>;\n}\n\nexport function createResource<T, S = void>(\n engine: IReactiveEngine,\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n): Resource<T> {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const resourceSignalName = isOptionsObject\n ? ((optionsOrName as ResourceOptions<T, S>).name || 'unnamed_resource')\n : (optionsOrName as string) || 'unnamed_resource'\n\n const options: Partial<ResourceOptions<T, S>> = isOptionsObject\n ? (optionsOrName as ResourceOptions<T, S>)\n : {}\n\n const resetDataOnSourceChange = options.resetDataOnSourceChange ?? true\n const responseValidate = options.responseValidate\n const validateBeforeFetch = options.validateBeforeFetch\n const retryCount = 0\n const baseDelay = 1000\n const useExponential = true\n const maxRetryDelay = 1000 * 60 * 5\n const timeoutMs = 1000\n\n // Вызов скомпилируется успешно, так как метод signal теперь строго описан в интерфейсе\n const state = engine.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 engine.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 if (validateBeforeFetch) {\n const preValidationResult = validateBeforeFetch(sValue)\n if (preValidationResult === false || typeof preValidationResult === 'string') {\n if (effectSignal.aborted) return\n const errorMsg = typeof preValidationResult === 'string'\n ? preValidationResult\n : 'Pre-fetch validation failed for resource'\n\n const currentData = isSourceChange ? null : engine.untrack(() => state.value.data)\n updateResourceState({ data: currentData, loading: false, error: errorMsg, isRetrying: false })\n return\n }\n }\n const shouldClear = isSourceChange && resetDataOnSourceChange\n const currentData = shouldClear ? null : engine.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 engine.delay(currentDelay, effectSignal)\n if (effectSignal.aborted) return\n } catch (delayError) {\n return\n }\n }\n }\n }\n }\n\n let activeEffectController: AbortController | null = null\n\n const disposeInternalEffect = engine.effect(() => {\n const sValue = source ? source.value : undefined as S\n const effectController = new AbortController()\n activeEffectController = effectController\n\n engine.untrack(() => {\n load(sValue as S, effectController.signal, true)\n })\n\n return () => effectController.abort()\n }, '[CORE_INTERNAL_SIGNAL=1]:effect')\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get isRetrying() { return state.value.isRetrying },\n get value() { return state.value },\n refetch: () => {\n activeEffectController?.abort()\n activeEffectController = new AbortController()\n load(source ? source.value : undefined as S, activeEffectController.signal, false)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb),\n destroy: () => {\n activeEffectController?.abort()\n activeEffectController = null\n if (typeof disposeInternalEffect === 'function') {\n disposeInternalEffect()\n }\n if ((state as any).destroy) {\n (state as any).destroy()\n }\n }\n } as any\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, Computed, IEffect, EngineLoggerOptions, LogEventType, CleanupFn, TransactionContext, LogRecord, SignalOptions, ResourceOptions, ResourceState, Resource } from './types'\nimport { createComputed } from './core.method.computed'\nimport { createSignal } from './core.method.signal'\n// import { executeBatch } from './core.method.batch'\nimport { executeUntrack } from './core.method.untrack'\nimport { createReactive } from './core.method.reactive'\nimport { createEffect } from './core.method.effect'\nimport { ReactiveDebounceLogger } from './core.logger'\nimport { createResource } from './core.method.resource'\n\n// Тип для конструктора класса\ntype Constructor<T> = new (...args: any[]) => T\n// Тип для фабричной функции зависимостей\ntype Factory<T> = (engine: any) => T\n// Универсальный тип токена DI\ntype InjectionToken<T> = Constructor<T> | Factory<T> | symbol | string\n\nconst badgeColors: Record<LogEventType, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;'\n}\nlet currentTransaction: TransactionContext | null = null\nfunction safeValueToString(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value)\n } catch (e) {\n return '[Cyclic Object or Layer]'\n }\n }\n return String(value)\n}\nexport function queueLog(type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }): void {\n if (!currentTransaction) {\n currentTransaction = { id: Math.random().toString(36).substring(2, 9), pendingLogQueue: [], isFlushing: false }\n queueMicrotask(() => flushLogs())\n }\n currentTransaction.pendingLogQueue.push({ type, label, from: details?.from, to: details?.to, payload: details?.payload, timestamp: Date.now() })\n}\nexport function flushLogs(): void {\n if (!currentTransaction || currentTransaction.isFlushing) return\n currentTransaction.isFlushing = true\n const queue = currentTransaction.pendingLogQueue\n if (queue.length === 0) {\n currentTransaction = null\n return\n }\n console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${currentTransaction.id}] (${queue.length} operations)`, 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;', 'color: #888; font-weight: normal;')\n for (const record of queue) {\n const colorStyle = badgeColors[record.type]\n const hasTransition = record.from !== undefined || record.to !== undefined\n let logMessage = `%c${record.type.toUpperCase()}%c ${record.label}`\n\n if (hasTransition) {\n if (!!record.from)\n logMessage += ` ${safeValueToString(record.from)} → ${safeValueToString(record.to)}`\n else logMessage += ` (${safeValueToString(record.to)})`\n }\n\n if (record.payload !== undefined) {\n console.groupCollapsed(logMessage, colorStyle, 'color: inherit;')\n console.log('Payload:', record.payload)\n console.groupEnd()\n } else {\n console.log(logMessage, colorStyle, 'color: inherit;')\n }\n }\n console.groupEnd()\n currentTransaction = null\n}\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n private logger: EngineLoggerOptions\n public epoch = 0\n public activeConsumer: any = null\n public batchDepth = 0\n public subscriberId = 0\n public pendingEffects: Array<Set<any> | undefined> = []\n public maxPendingDepth = 0\n public computedCache = new WeakMap<Function, any>()\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private proxyCache = new WeakMap<object, any>()\n private proxyTargets = new WeakSet<object>()\n private reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n private cycleDetectionStack = new Set<unknown>()\n public batchedSignals = new Set<any>()\n public activeOwner: any = null\n // Системная очередь для отложенного батчинга деструкторов\n public pendingCleanups = new Set<() => void>()\n\n // Метод для регистрации отложенной очистки\n public queueCleanup(cleanup: () => void): void {\n this.pendingCleanups.add(cleanup)\n }\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public scheduleEffect(effect: any): void {\n const depth = effect.depth || 0\n if (!this.pendingEffects[depth]) {\n this.pendingEffects[depth] = new Set()\n }\n this.pendingEffects[depth]!.add(effect)\n if (depth > this.maxPendingDepth) {\n this.maxPendingDepth = depth\n }\n }\n\n public queueLog(type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }): void {\n queueLog(type, label, details)\n }\n\n public batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) {\n if (this.batchedSignals.size > 0) {\n for (const sig of this.batchedSignals) {\n if (sig._flushBatch) sig._flushBatch()\n }\n this.batchedSignals.clear()\n }\n\n this.flushEffects()\n }\n }\n }\n\n public flushEffects(): void {\n if (this.batchDepth > 0) return\n\n const prevConsumer = this.activeConsumer\n\n try {\n for (let depth = 0; depth <= this.maxPendingDepth; depth++) {\n const bucket = this.pendingEffects[depth]\n\n if (!bucket || bucket.size === 0) continue\n\n const effects = Array.from(bucket)\n bucket.clear()\n\n for (const effect of effects) {\n if (effect.isDisposed) continue\n\n // ⚡ ЗOЛОТOЙ СТАНДАРТ ОПТИМИЗАЦИИ (Early Dirty Check Bypass):\n // Переносим проверку грязи в самое начало цикла. Если эффект не был промаркирован\n // как DIRTY волной push-уведомлений, мы мгновенно пропускаем его, полностью\n // избавляя V8 от холостого обхода родителей и тяжелых хэш-поисков depVersions.get(dep).\n if (!effect.isDirty) continue\n\n if (effect.dependencies && effect.dependencies.size > 0) {\n let parentChanged = false\n\n for (const dep of effect.dependencies) {\n const rawNode = dep._node || dep\n\n if (rawNode.type === 'computed' && rawNode.state > 0) {\n if (rawNode.update) rawNode.update()\n }\n\n if (effect.depVersions && effect.depVersions.get(dep) !== rawNode.version) {\n parentChanged = true\n }\n }\n\n if (!parentChanged && effect.dependencies.size > 0) {\n effect.isDirty = false\n continue\n }\n }\n\n try {\n effect.run()\n } catch (err) {\n // ⚡ ФИКС ТЕСТА #177: Если один из эффектов выбросил исключение,\n // принудительно очищаем и гасим флаги грязи (isDirty) у всех оставшихся\n // в очереди эффектов текущего и последующих уровней глубины.\n for (let d = depth; d <= this.maxPendingDepth; d++) {\n const remainingBucket = this.pendingEffects[d]\n if (remainingBucket) {\n for (const remEffect of remainingBucket) {\n remEffect.isDirty = false\n }\n remainingBucket.clear()\n }\n }\n this.maxPendingDepth = 0\n throw err // Прокидываем ошибку дальше по спецификации\n }\n\n }\n\n if (depth > 0) {\n let hasEarlierEffects = false\n for (let i = 0; i < depth; i++) {\n if (this.pendingEffects[i] && this.pendingEffects[i]!.size > 0) {\n hasEarlierEffects = true\n break\n }\n }\n if (hasEarlierEffects) depth = -1\n }\n }\n this.maxPendingDepth = 0\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n\n // public batch<T>(fn: () => T): T {\n // return executeBatch<T>(this, fn)\n // }\n\n // ⚛️ ФИКС ДЛЯ РЕЛИЗА 2.5.0: Меняем private на public,\n // чтобы изолированные функции-методы имели легальный доступ к регистратору логов\n public log(params: any) {\n if (!this.logger || !this.logger.isEnabled) return\n ReactiveDebounceLogger.processLog(this.logger, queueLog, params)\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n return createSignal<T>(this, initialValue, optionsOrName)\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n // Просто делегируем вызов строго изолированной чистой функции\n return createComputed<T>(this, fn, signalName)\n }\n\n public effect(fn: () => void | CleanupFn, effectName?: string): () => void {\n return createEffect(this, fn, effectName)\n }\n\n public untrack<T>(fn: () => T): T {\n return executeUntrack<T>(this, fn)\n }\n\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n\n public provide<T>(token: InjectionToken<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n\n public inject<T>(token: InjectionToken<T>): T {\n if (token === undefined || token === null) throw new Error('[DI Error] Token is empty')\n if (this.diCache.has(token)) return this.diCache.get(token) as T\n if (this.cycleDetectionStack.has(token)) throw new Error('[DI Error] Cyclic dependency detected')\n this.cycleDetectionStack.add(token)\n try {\n if (this.diRegistry.has(token)) {\n const entry = this.diRegistry.get(token)\n if (typeof entry === 'function') {\n if ((entry as any)._isMockFunction) {\n const mockRes = (entry as Function)(this)\n if (mockRes !== undefined) {\n this.diCache.set(token, mockRes)\n return mockRes as T\n }\n return entry as unknown as T\n }\n const str = entry.toString()\n const isClass = str.startsWith('class ') || str.startsWith('class{') || (entry.prototype && entry.prototype.constructor === entry && !str.startsWith('function') && !str.includes('=>'))\n if (!isClass) {\n const resolved = (entry as Factory<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n return entry as unknown as T\n }\n return entry as T\n }\n if (typeof token === 'function') {\n const resolved = new (token as Constructor<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n throw new Error('[DI Error] Token not found')\n } finally {\n this.cycleDetectionStack.delete(token)\n }\n }\n\n public delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n\n /**\n * Создает умную реактивную декларативную обертку над асинхронными операциями\n * с автоматическим подавлением Race Conditions и встроенным методом .destroy().\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>,\n ): Resource<T> {\n // Передаем инстанс движка (this) как IReactiveEngine для соблюдения строгой типизации\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import { ReactiveEngineCore } from './core'\n\n// Единый глобальный инстанс по умолчанию\nlet globalEngine = new ReactiveEngineCore({ logger: { isEnabled: false } })\n\nexport const signal = <T>(initialValue: T, options?: any) => globalEngine.signal(initialValue, options)\nexport const computed = <T>(fn: () => T, name?: string) => globalEngine.computed(fn, name)\nexport const effect = (fn: () => any, name?: string) => globalEngine.effect(fn, name)\nexport const batch = <T>(fn: () => T): T => globalEngine.batch(fn)\nexport const untrack = <T>(fn: () => T): T => globalEngine.untrack(fn)\n\n/**\n * ⚡ ХУК ДЛЯ БЕНЧМАРКОВ И ТЕСТОВЫХ СРЕД:\n * Позволяет атомарно уничтожить старый граф реактивности и начать с чистого листа,\n * полностью исключая утечки памяти и пересечение эпох между тест-кейсами.\n */\nexport function resetGlobalReactiveEngine(): void {\n // Старый инстанс со всеми WeakMap и StringCache уходит в Garbage Collector\n globalEngine = new ReactiveEngineCore({ logger: { isEnabled: false } })\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"yRAEA,SAAgB,EACd,EACA,EACA,EACa,CAGb,IAAM,EAAW,EAAO,cAAc,IAAI,CAAE,EAC5C,GAAI,EAAU,OAAO,EAErB,IAAI,EACA,EAAU,GACV,EAAU,EACV,EAAgB,GAChB,EAAmB,GACnB,EAAQ,EAEN,EAAe,IAAI,IACnB,EAAc,IAAI,IAClB,EAAe,IAAI,IACnB,EAAc,IAAI,IAElB,EAAe,GAAoB,CACvC,GAAI,CAAC,EAAM,OACX,IAAM,EAAU,EAAK,OAAS,EAE9B,GAAI,EAAQ,cAAgB,EAAQ,aAAa,KAAO,EAAG,CACzD,IAAK,IAAM,KAAc,EAAQ,aAAc,CAC7C,IAAM,EAAM,EACN,EAAa,EAAI,OAAS,EAE5B,EAAW,cACb,EAAW,YAAY,OAAO,CAAO,EACrC,EAAW,YAAY,OAAO,CAAI,EAClC,EAAW,YAAY,OAAO,CAAY,EAEtC,EAAW,OAAS,YAAc,EAAW,YAAY,OAAS,GACpE,EAAY,CAAU,EAG5B,CACA,EAAQ,aAAa,MAAM,EACvB,EAAQ,aAAa,EAAQ,YAAY,MAAM,CACrD,CACF,EAEM,EAAqB,GAAuB,CAChD,GAAI,CAAC,GAAiB,IAAU,EAC9B,OAAO,EAAK,IAAI,EAOlB,GAAI,GAAe,EAAY,KAAO,GAChC,EAAK,kBAAoB,EAAO,OAAS,EAAO,aAAe,GAAK,IAAU,EAChF,MAAO,GAIX,IAAI,EAAmB,GAEvB,GAAI,GAAgB,EAAa,KAAO,EACtC,IAAK,IAAM,KAAO,EAAc,CAC9B,IAAM,EAAS,EAAI,OAAS,EAa5B,GAXI,EAAO,OAAS,YAAc,EAAO,MAAQ,GAI3C,EAAO,QAAU,EAAO,kBAAoB,EAAO,OACrD,EAAO,OAAO,EAMd,EAAI,eAAiB,EAAY,IAAI,CAAG,IAAM,EAAO,QAAS,CAChE,EAAmB,GACnB,KACF,CACF,CAUF,MAPA,GAAK,gBAAkB,EAAO,MAE1B,GAAoB,EACf,EAAK,IAAI,GAGlB,EAAQ,EACD,GACT,EAEI,EAAe,EAEb,EAAoB,CACxB,GAAI,EAAO,eACX,eACA,cACA,eACA,MAAO,EACP,KAAM,WACN,KACA,IAAI,SAAU,CAAE,OAAO,CAAQ,EAC/B,IAAI,OAAQ,CAAE,OAAO,CAAM,EAC3B,IAAI,MAAM,EAAa,CAAE,EAAQ,CAAI,EACrC,IAAI,aAAc,CAAE,OAAO,CAAY,EACvC,gBAAiB,GACjB,WAAc,EAAkB,CAAY,EAC5C,QAAW,CAET,GAAI,IAAqB,EAAO,OAAS,GAAiB,IAAU,GAAK,EAAO,aAAe,EAC7F,MAAO,GAIT,IAAM,EAAa,EAAO,MAI1B,GAHA,EAAmB,EACnB,EAAa,gBAAkB,EAE3B,EAAO,oBAAoB,IAAI,CAAY,EAC7C,MAAU,MAAM,0CAA0C,EAE5D,EAAO,oBAAoB,IAAI,CAAY,EAE3C,IAAM,EAAe,EAAO,eACtB,EAAY,EAAO,YAEzB,EAAO,eAAiB,EACxB,EAAO,YAAc,EAErB,IACA,EAAa,YAAc,EAE3B,IAAM,EAAU,EAAa,KAAO,EAAI,MAAM,KAAK,CAAY,EAAI,KACnE,EAAa,MAAM,EAEnB,GAAI,CACF,GAAI,EAAa,KAAO,EAAG,CACzB,IAAK,IAAM,KAAS,EACd,GAAS,OAAO,EAAM,SAAY,YACpC,EAAM,QAAQ,EAGlB,EAAa,MAAM,CACrB,CAGA,IAAM,EAAW,EAAG,EAEpB,GAAI,IAAY,KAAM,CACpB,IAAM,EAAkB,EAAQ,SAAW,EAAa,KACxD,IAAK,IAAM,KAAc,EAAS,CAChC,IAAM,EAAM,EACZ,GAAI,CAAC,GAAmB,CAAC,EAAa,IAAI,CAAG,EAAG,CAC9C,IAAM,EAAa,EAAI,OAAS,EAC5B,EAAW,aAAa,EAAW,YAAY,OAAO,CAAY,EACtE,EAAY,OAAO,CAAG,CACxB,CACF,CACF,CAEA,IAAM,EAAU,GAAW,CAAC,OAAO,GAAG,EAAO,CAAQ,EAErD,GAAI,EAAS,CACX,IAAM,EAAwB,EAAU,IAAA,GAAa,OAAO,GAAU,UAAY,EAAiB,KAAK,MAAM,KAAK,UAAU,CAAK,CAAC,EAAI,EACvI,EAAQ,EACR,IAEI,EAAO,KAAO,GAChB,EAAO,IAAI,CACT,KAAM,WACN,MAAO,EACP,QAAS,CAAE,KAAM,EAAuB,GAAI,CAAS,CACvD,CAAC,CAEL,CAEA,EAAU,GACV,EAAQ,EACR,EAAgB,GAEhB,IAAI,EAAc,EAClB,IAAK,IAAM,KAAc,EAAc,CACrC,IAAM,EAAM,EACN,EAAU,EAAI,OAAS,EAC7B,EAAY,IAAI,EAAK,EAAQ,OAAO,EAChC,EAAQ,aAAa,EAAQ,YAAY,IAAI,CAAY,EACzD,EAAQ,QAAU,IAAA,IAAa,EAAQ,MAAQ,IACjD,EAAc,EAAQ,MAE1B,CAcA,MAZA,GAAa,MAAQ,EAAc,EAM/B,EAAO,QAAU,IACnB,EAAmB,GACnB,EAAa,gBAAkB,GAC/B,EAAQ,GAGH,CACT,QAAU,CACR,EAAO,eAAiB,EACxB,EAAO,YAAc,EACrB,EAAO,oBAAoB,OAAO,CAAY,CAChD,CACF,EACA,UAAY,GAAwB,CAC9B,QAAS,GACb,GAAQ,EAER,IAAK,IAAM,KAAO,EAAa,CAC7B,IAAM,EAAS,EAAI,OAAS,EACxB,EAAO,OAAS,UAClB,EAAO,QAAU,GACjB,EAAO,eAAe,CAAG,GAChB,EAAO,WAChB,EAAO,UAAU,CAAC,CAEtB,CAVQ,CAWV,CACF,EAEM,EAAgC,CACpC,IAAI,OAAQ,CACV,IAAM,EAAW,EAAO,eACxB,GAAI,GAAY,IAAa,EAAc,CACzC,EAAY,IAAI,CAAQ,EACxB,EAAS,aAAa,IAAI,CAAY,EAEtC,IAAM,EAAe,EAAa,OAAS,EACrC,EAAc,EAAS,OAAS,EAClC,EAAY,QAAU,IAAA,IAAa,GAAgB,EAAY,QACjE,EAAY,MAAQ,EAAe,GAGjC,EAAS,cAAgB,IAAA,KAC3B,EAAa,iBAAmB,EAAS,YAE7C,CAOA,OALA,EAAkB,CAAY,EAE1B,GAAY,EAAS,aACvB,EAAS,YAAY,IAAI,EAAkB,CAAO,EAE7C,CACT,EACA,IAAI,sBAAuB,CAAE,OAAO,CAAM,EAC1C,IAAI,SAAU,CAAE,OAAO,CAAQ,EAC/B,IAAI,cAAe,CAAE,OAAO,CAAa,EAEzC,UAAU,EAAiC,CACzC,IAAM,EAAO,KACP,EAAkB,CACtB,GAAI,EAAO,eACX,QAAS,GACT,MAAO,KACP,aAAc,IAAI,IAClB,KAAM,SACN,QAAW,CACL,MAAW,WACf,GAAI,CAAE,EAAG,EAAK,KAAK,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,CAC1D,CACF,EAGA,OAFA,EAAY,IAAI,CAAU,EAC1B,EAAG,KAAK,KAAK,MACA,CACX,EAAW,WAAa,GACxB,EAAY,OAAO,CAAU,EAC7B,EAAW,aAAa,MAAM,CAChC,CACF,EACA,eAAe,EAA2B,CACxC,OAAQ,EAAyB,UAAU,CAAE,CAC/C,EACA,YAAe,CACb,EAAY,CAAY,EACpB,GAAa,EAAY,MAAM,EACnC,EAAO,cAAc,OAAO,CAAE,EAE9B,EAAa,MAAM,EACnB,EAAY,MAAM,EAClB,EAAa,MAAM,EAEnB,EAAU,GACV,EAAQ,EACR,EAAgB,EAClB,EACA,YAAY,EAA2B,CACrC,IAAM,EAAkB,CACtB,GAAI,EAAO,eACX,KAAM,SACN,IAAK,EACL,QAAS,EACX,EAEA,OADA,EAAY,IAAI,CAAU,MACb,CACX,EAAY,OAAO,CAAU,CAC/B,CACF,CACF,EAQA,MANA,GAAiB,QAAY,EAAa,IAAI,EAC9C,EAAO,cAAc,IAAI,EAAI,CAAgB,EAE5C,EAA0B,MAAQ,EAClC,EAA0B,YAAc,EAElC,CACT,CC/TA,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,EC3BA,SAAgB,EACd,EACA,EACA,EACW,CACX,IAAI,EAAQ,EACR,EAAU,EACV,EAAO,OAAO,GAAkB,SAAW,EAAgB,GAAe,KACxE,EAAuB,CAAC,CAAC,GAAQ,EAAmB,CACxD,OAAQ,CAAC,CAAI,EACb,YAAa,uBACb,UAAW,QACb,CAAC,CAAC,GAAG,KAAO,KAAO,GACb,EAAc,IAAI,IAEpB,EAAgB,GAChB,EAAuB,EAErB,EAAa,CACjB,KAAM,SACN,IAAI,SAAU,CAAE,OAAO,CAAQ,EAC/B,aACF,EAEM,MAA0B,CAC9B,IAAK,IAAM,KAAO,EAAa,CAC7B,IAAM,EAAS,EAAI,OAAS,EAC5B,GAAI,EAAO,OAAS,SAClB,EAAO,QAAU,GACjB,EAAO,eAAe,CAAG,OACpB,GAAI,EAAO,OAAS,WACrB,EAAO,WAAW,EAAO,UAAU,CAAC,OAExC,GAAI,OAAO,GAAQ,WACjB,GAAI,CAAE,EAAI,CAAK,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,MAC/C,GAAI,GAAO,OAAO,EAAI,KAAQ,WACnC,GAAI,CAAE,EAAI,IAAI,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,CAGzD,CACF,EAEM,EAA4B,CAChC,IAAI,OAAQ,CACV,IAAM,EAAW,EAAO,eASxB,OARI,IACF,EAAY,IAAI,EAAO,cAAc,EACrC,EAAO,eAAe,aAAa,IAAI,CAAc,EAEjD,EAAS,cAAgB,IAAA,KAC3B,EAAwB,iBAAmB,EAAS,cAGjD,CACT,EAEA,IAAI,MAAM,EAAa,CAErB,GAAI,OAAO,GAAG,EAAO,CAAQ,GAAK,EADb,IAAU,GAA8B,OAAO,GAAU,UAAnC,GACM,OAEjD,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,GAAI,EAAO,WAAa,EAAG,CACpB,IACH,EAAgB,GAChB,EAAoB,GAEtB,EAAQ,EACR,EAAO,eAAe,IAAI,CAAc,EACxC,MACF,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,EAED,EAAkB,EACd,EAAO,aAAe,GAAG,EAAO,aAAa,CACnD,EAEA,IAAI,SAAU,CAAE,OAAO,CAAQ,EAC/B,KAAM,SAEN,UAAU,EAAsB,CAG9B,OAFA,EAAY,IAAI,CAAE,EAClB,EAAG,CAAK,MACK,CAAE,EAAY,OAAO,CAAE,CAAE,CACxC,EAEA,gBAAmB,CACZ,KAIL,IAFmB,CAAC,OAAO,GAAG,EAAmB,CAAK,GAAwB,OAAO,GAAU,UAAnC,EAE5C,CACd,IACA,EAAO,QAEP,EAAO,IAAI,CACT,KAAM,SACN,MAAO,GAAQ,iBACf,QAAS,CAAE,KAAM,EAAmB,GAAI,CAAM,EAC9C,sBACF,CAAC,EAED,IAAK,IAAM,KAAO,EAAa,CAC7B,IAAM,EAAS,EAAI,OAAS,EAC5B,GAAI,EAAO,OAAS,SAClB,EAAO,QAAU,GACjB,EAAO,eAAe,CAAG,OACpB,GAAI,EAAO,UAChB,EAAO,UAAU,CAAC,OACb,GAAI,OAAO,GAAQ,WACxB,GAAI,CAAE,EAAI,CAAK,CAAE,OAAS,EAAK,CAAE,QAAQ,MAAM,CAAG,CAAE,CAExD,CACF,CAEA,EAAgB,GAChB,EAAoB,CAHpB,CAIF,EAEA,IAAI,eAAgB,CAAE,OAAO,CAAc,EAG3C,YAAe,CACT,GACF,EAAY,MAAM,EAEhB,EAAO,gBACT,EAAO,eAAe,OAAO,CAAc,EAE7C,EAAgB,GAEhB,EAAQ,IAAA,GACR,EAAoB,IAAA,EACtB,CACF,EAIA,MAFC,GAAwB,MAAQ,EAChC,EAAwB,YAAc,EAChC,CACT,CC5JA,SAAgB,EAAkB,EAAa,EAAgB,CAC7D,IAAM,EAAe,EAAO,eAC5B,EAAO,eAAiB,KACxB,GAAI,CACF,OAAO,EAAG,CACZ,QAAU,CACR,EAAO,eAAiB,CAC1B,CACF,CCTA,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,EAoF9C,EAAQ,IAAI,MAAM,EAAQ,CAjF9B,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,EAGF,GAAI,MAAM,QAAQ,CAAC,GAAK,OAAO,GAAS,UAAY,CAAC,OAAQ,MAAO,QAAS,UAAW,SAAU,OAAQ,SAAS,CAAC,CAAC,SAAS,CAAI,EAChI,OAAQ,GAAG,IAAgB,CACzB,IAAI,EAWJ,OAVA,EAAO,UAAY,CACjB,EAAU,QAAQ,IAAI,EAAG,CAAI,CAAC,CAAc,MAAM,EAAU,CAAI,EAEhE,IAAI,EAAY,EAAW,IAAI,QAAQ,EACnC,IAAW,EAAU,MAAQ,EAAE,QAEnC,EAAW,SAAS,EAAU,IAAgB,CACxC,IAAQ,WAAU,EAAI,MAAQ,QAAQ,IAAI,EAAG,CAAG,EACtD,CAAC,CACH,CAAC,EACM,CACT,EAGF,GAAI,OAAO,GAAS,UAAY,IAAS,eAAiB,IAAS,SAAU,OAAO,QAAQ,IAAI,EAAG,EAAM,CAAQ,EAEjH,IAAI,EAAM,EAAW,IAAI,CAAI,EAC7B,GAAI,CAAC,EAAK,CACR,IAAM,EAAW,QAAQ,IAAI,EAAG,CAAI,EACpC,EAAM,EAAO,OAAO,CAAQ,EAC5B,EAAW,IAAI,EAAM,CAAG,EAKC,OAAO,GAAa,UAAzC,IACF,EAAa,YAAc,EAAO,SAAS,EAAU,EAAO,GAAG,EAAK,GAAG,OAAO,CAAI,IAAM,OAAO,CAAI,CAAC,EAExG,CAOA,OALK,EAAY,cAAgB,IAAA,GAK1B,EAAI,OAJT,EAAI,MACI,EAAY,YAIxB,EAEA,IAAI,EAAM,EAAuB,EAAY,EAAe,CAC1D,IAAM,GAAW,EAAO,aAAa,IAAI,CAAK,EAAI,GAC5C,EAAW,QAAQ,IAAI,EAAG,CAAI,EAEpC,GAAI,IAAa,GAAY,IAAS,SAAU,MAAO,GACvD,QAAQ,IAAI,EAAG,EAAM,CAAQ,EAE7B,IAAI,EAAM,EAAW,IAAI,CAAI,EAa7B,GAZK,IACH,EAAM,EAAO,OAAO,CAAQ,EAC5B,EAAW,IAAI,EAAM,CAAG,GAO1B,EAAa,YAAc,IAAA,GAC3B,EAAI,MAAQ,EAER,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,CCtFA,SAAgB,EAAa,EAAa,EAAc,EAAiC,CACvF,IAAI,EAAa,GACb,EAAY,GACZ,EAAQ,EAEN,EAAe,IAAI,IACnB,EAAc,IAAI,IAClB,EAAe,IAAI,IAEnB,MAAwB,CAE5B,GAAI,EAAa,KAAO,EAAG,CACzB,IAAM,EAAe,EAAO,eACtB,EAAY,EAAO,YACzB,EAAO,eAAiB,KACxB,EAAO,YAAc,KAErB,IAAK,IAAM,KAAS,EACd,EAAM,SAAS,EAAM,QAAQ,EAEnC,EAAa,MAAM,EAEnB,EAAO,eAAiB,EACxB,EAAO,YAAc,CACvB,CAGA,GAAI,EAAW,SAAS,KAAO,EAAG,CAChC,IAAM,EAAe,EAAO,eAC5B,EAAO,eAAiB,KAExB,IAAK,IAAM,KAAW,EAAW,SAC/B,GAAI,CACF,EAAQ,CACV,OAAS,EAAK,CACZ,QAAQ,MAAM,CAAG,CACnB,CAGF,EAAW,SAAS,MAAM,EAC1B,EAAO,eAAiB,CAC1B,CACF,EAEM,EAA8B,CAClC,GAAI,EAAO,eACX,eACA,eACA,SAAU,IAAI,IACd,KAAM,SACN,MAAO,EACP,MAAO,EAEP,IAAI,SAAmB,CAAE,OAAO,EAAQ,CAAE,EAC1C,IAAI,QAAQ,EAAc,CAAM,IAAK,EAAQ,EAAE,EAE/C,IAAI,YAAsB,CAAE,OAAO,CAAW,EAC9C,IAAI,WAAW,EAAc,CAAE,EAAa,CAAI,EAEhD,IAAI,OAAgB,CAAE,OAAO,CAAM,EACnC,IAAI,MAAM,EAAa,CAAE,EAAQ,CAAI,EACrC,IAAI,aAAgC,CAAE,OAAO,CAAY,EACzD,IAAI,OAAa,CAAE,OAAO,CAAW,EAErC,cAAiB,CACX,GAAS,IACb,EAAQ,EACR,EAAO,eAAe,CAAU,EAClC,EAEA,QAAW,CACT,GAAI,GAAc,EAAW,OAC7B,EAAY,GAEZ,EAAgB,EAEhB,IAAM,EAAe,EAAO,eACtB,EAAY,EAAO,YAEzB,EAAO,eAAiB,EACxB,EAAO,YAAc,EAErB,IAAM,EAAU,EAAa,KAAO,EAAI,MAAM,KAAK,CAAY,EAAI,KACnE,EAAa,MAAM,EAEnB,GAAI,CACF,EAAQ,EAER,IAAM,EAAS,EAAG,EAKlB,GAJI,OAAO,GAAW,YACpB,EAAW,SAAS,IAAI,CAAM,EAG5B,IAAY,KACd,IAAK,IAAM,KAAc,EAAS,CAChC,IAAM,EAAM,EACZ,GAAI,CAAC,EAAa,IAAI,CAAG,EAAG,CAC1B,IAAM,EAAa,EAAI,OAAS,EAC5B,EAAW,aAAa,EAAW,YAAY,OAAO,CAAU,EACpE,EAAY,OAAO,CAAG,CACxB,CACF,CAGF,IAAI,EAAc,EAClB,IAAK,IAAM,KAAc,EAAc,CACrC,IAAM,EAAM,EACN,EAAU,EAAI,OAAS,EAC7B,EAAY,IAAI,EAAK,EAAQ,OAAO,EAChC,EAAQ,aAAa,EAAQ,YAAY,IAAI,CAAU,EACvD,EAAQ,QAAU,IAAA,IAAa,EAAQ,MAAQ,IACjD,EAAc,EAAQ,MAE1B,CACA,EAAW,MAAQ,EAAc,CAEnC,QAAU,CACR,EAAY,GACZ,EAAO,eAAiB,EACxB,EAAO,YAAc,CACvB,CACF,EAEA,YAAe,CACT,MAIJ,CAHA,EAAa,GACb,EAAW,WAAa,GAExB,EAAgB,EAGhB,IAAK,IAAM,KAAO,EAAc,CAC9B,IAAM,EAAU,EAAI,OAAS,EACzB,EAAQ,aAAa,EAAQ,YAAY,OAAO,CAAU,CAChE,CACA,EAAa,MAAM,EACnB,EAAY,MAAM,CARF,CASlB,CACF,EAEM,EAAkB,EAAO,YAAe,EAAO,YAAY,OAAS,EAAO,YAAe,KAQhG,OANI,GAAmB,EAAgB,cACrC,EAAgB,aAAa,IAAI,CAAU,EAG7C,EAAW,IAAI,MAEF,CACX,EAAW,QAAQ,CACrB,CACF,CC3JA,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,eAEpB,EAAgB,EAAQ,OAAO,GAAM,EAAK,CAAM,EACtD,EAAc,KAAK,CAAG,EAEtB,IAAM,EAAc,EAAc,OAC5B,GAAe,KAAK,eAAiB,IAAA,CAAM,QAAQ,CAAC,EAyB1D,OArBI,EAAc,QAAU,GAC1B,KAAK,aAAa,OAAO,CAAK,EACvB,CAAE,OAAQ,KAAM,KAAM,oBAAoB,EAAY,GAAI,IAEjE,KAAK,aAAa,IAAI,EAAO,CAAa,EAGxC,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,EACF,CAEA,OAAc,WACZ,EACA,EACA,EACA,CACA,GAAM,CAAE,OAAM,QAAO,UAAS,uBAAuB,IAAU,EAG/D,GADI,CAAC,EAAa,WACd,GAAwB,CAAC,EAAa,+BAAgC,OAE1E,GAAI,GAAW,SAAU,GAAW,OAAQ,GACtC,KAAK,YAAY,EAAQ,KAAM,EAAQ,EAAE,EAAG,CAC9C,GAAI,IAAS,WAAY,CACvB,EAAW,EAAM,kBAAkB,EAAM,gCAAiC,CAAO,EACjF,MACF,CACA,MACF,CAGF,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,CAEA,EAAW,EAAM,GAAG,IAAQ,IAAa,CAAO,CAClD,CACF,EClFA,SAAgB,EACd,EACA,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,oBAQ9B,EAAQ,EAAO,OACnB,CAAE,KAAM,KAAM,QAAS,GAAM,MAAO,KAAM,WAAY,EAAM,EAC5D,2CAA2C,GAC7C,EAEM,EAAuB,GAAgC,CAC3D,EAAO,IAAI,CAAE,KAAM,WAAY,MAAO,EAAoB,QAAS,CAAE,GAAI,EAAW,KAAM,EAAM,KAAM,CAAE,CAAC,EACzG,EAAM,MAAQ,CAChB,EAEM,EAAO,MAAO,EAAW,EAA2B,EAAiB,KAAU,CACnF,GAAI,EAAa,QAAS,OAG1B,GAFgB,EAAQ,qBAAsB,EAAQ,oBAAoB,CAAM,EAE5E,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,EAAO,YAAc,EAAM,MAAM,IAAI,EACjF,EAAoB,CAAE,KAAM,EAAa,QAAS,GAAO,MAAO,EAAU,WAAY,EAAM,CAAC,EAC7F,MACF,CACF,CAEA,IAAM,EADc,GAAkB,EACJ,KAAO,EAAO,YAAc,EAAM,MAAM,IAAI,EAC9E,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,EAAO,MAAM,EAAc,CAAY,EACzC,EAAa,QAAS,MAC5B,MAAqB,CACnB,MACF,CACF,CACF,CACF,CACF,EAEI,EAAiD,KAE/C,EAAwB,EAAO,WAAa,CAChD,IAAM,EAAS,EAAS,EAAO,MAAQ,IAAA,GACjC,EAAmB,IAAI,gBAO7B,MANA,GAAyB,EAEzB,EAAO,YAAc,CACnB,EAAK,EAAa,EAAiB,OAAQ,EAAI,CACjD,CAAC,MAEY,EAAiB,MAAM,CACtC,EAAG,iCAAiC,EAEpC,MAAO,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,EACtE,YAAe,CACb,GAAwB,MAAM,EAC9B,EAAyB,KACrB,OAAO,GAA0B,YACnC,EAAsB,EAEnB,EAAc,SACjB,EAAe,QAAQ,CAE3B,CACF,CACF,CC3JA,IAAM,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,eAAqD,CAAC,EACtD,gBAAyB,EACzB,cAAuB,IAAI,QAC3B,WAAqB,IAAI,IACzB,QAAkB,IAAI,IACtB,WAAqB,IAAI,QACzB,aAAuB,IAAI,QAC3B,gBAA0B,IAAI,QAC9B,oBAA8B,IAAI,IAClC,eAAwB,IAAI,IAC5B,YAA0B,KAE1B,gBAAyB,IAAI,IAG7B,aAAoB,EAA2B,CAC7C,KAAK,gBAAgB,IAAI,CAAO,CAClC,CAEA,YAAY,EAA4C,CACtD,KAAK,OAAS,GAAS,QAAU,CAAE,UAAW,EAAM,CACtD,CAEA,eAAsB,EAAmB,CACvC,IAAM,EAAQ,EAAO,OAAS,EACzB,KAAK,eAAe,KACvB,KAAK,eAAe,GAAS,IAAI,KAEnC,KAAK,eAAe,EAAM,CAAE,IAAI,CAAM,EAClC,EAAQ,KAAK,kBACf,KAAK,gBAAkB,EAE3B,CAEA,SAAgB,EAAoB,EAAe,EAAqE,CACtH,EAAS,EAAM,EAAO,CAAO,CAC/B,CAEA,MAAgB,EAAgB,CAC9B,KAAK,aACL,GAAI,CACF,OAAO,EAAG,CACZ,QAAU,CAER,GADA,KAAK,aACD,KAAK,aAAe,EAAG,CACzB,GAAI,KAAK,eAAe,KAAO,EAAG,CAChC,IAAK,IAAM,KAAO,KAAK,eACjB,EAAI,aAAa,EAAI,YAAY,EAEvC,KAAK,eAAe,MAAM,CAC5B,CAEA,KAAK,aAAa,CACpB,CACF,CACF,CAEA,cAA4B,CAC1B,GAAI,KAAK,WAAa,EAAG,OAEzB,IAAM,EAAe,KAAK,eAE1B,GAAI,CACF,IAAK,IAAI,EAAQ,EAAG,GAAS,KAAK,gBAAiB,IAAS,CAC1D,IAAM,EAAS,KAAK,eAAe,GAEnC,GAAI,CAAC,GAAU,EAAO,OAAS,EAAG,SAElC,IAAM,EAAU,MAAM,KAAK,CAAM,EACjC,EAAO,MAAM,EAEb,IAAK,IAAM,KAAU,EACf,MAAO,YAMN,EAAO,QAEZ,IAAI,EAAO,cAAgB,EAAO,aAAa,KAAO,EAAG,CACvD,IAAI,EAAgB,GAEpB,IAAK,IAAM,KAAO,EAAO,aAAc,CACrC,IAAM,EAAU,EAAI,OAAS,EAEzB,EAAQ,OAAS,YAAc,EAAQ,MAAQ,GAC7C,EAAQ,QAAQ,EAAQ,OAAO,EAGjC,EAAO,aAAe,EAAO,YAAY,IAAI,CAAG,IAAM,EAAQ,UAChE,EAAgB,GAEpB,CAEA,GAAI,CAAC,GAAiB,EAAO,aAAa,KAAO,EAAG,CAClD,EAAO,QAAU,GACjB,QACF,CACF,CAEA,GAAI,CACF,EAAO,IAAI,CACb,OAAS,EAAK,CAIZ,IAAK,IAAI,EAAI,EAAO,GAAK,KAAK,gBAAiB,IAAK,CAClD,IAAM,EAAkB,KAAK,eAAe,GAC5C,GAAI,EAAiB,CACnB,IAAK,IAAM,KAAa,EACtB,EAAU,QAAU,GAEtB,EAAgB,MAAM,CACxB,CACF,CAEA,KADA,MAAK,gBAAkB,EACjB,CACR,CAnBA,CAuBF,GAAI,EAAQ,EAAG,CACb,IAAI,EAAoB,GACxB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,IACzB,GAAI,KAAK,eAAe,IAAM,KAAK,eAAe,EAAE,CAAE,KAAO,EAAG,CAC9D,EAAoB,GACpB,KACF,CAEE,IAAmB,EAAQ,GACjC,CACF,CACA,KAAK,gBAAkB,CACzB,QAAU,CACR,KAAK,eAAiB,CACxB,CACF,CAQA,IAAW,EAAa,CAClB,CAAC,KAAK,QAAU,CAAC,KAAK,OAAO,WACjC,EAAuB,WAAW,KAAK,OAAQ,EAAU,CAAM,CACjE,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,MAAa,EAAY,EAAoC,CAC3D,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,CAMA,SACE,EACA,EACA,EACa,CAEb,OAAO,EAAqB,KAAM,EAAS,EAAQ,CAAa,CAClE,CACF,ECzUa,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,EC7DI,EAAe,IAAI,EAAmB,CAAE,OAAQ,CAAE,UAAW,EAAM,CAAE,CAAC,EAE7D,GAAa,EAAiB,IAAkB,EAAa,OAAO,EAAc,CAAO,EACzF,GAAe,EAAa,IAAkB,EAAa,SAAS,EAAI,CAAI,EAC5E,GAAU,EAAe,IAAkB,EAAa,OAAO,EAAI,CAAI,EACvE,EAAY,GAAmB,EAAa,MAAM,CAAE,EACpD,EAAc,GAAmB,EAAa,QAAQ,CAAE,EAOrE,SAAgB,GAAkC,CAEhD,EAAe,IAAI,EAAmB,CAAE,OAAQ,CAAE,UAAW,EAAM,CAAE,CAAC,CACxE,CCjBA,IAAsB,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"}
1
+ {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.method.computed.ts","../src/utils/getExtractedValues.ts","../src/core/core.method.signal.ts","../src/core/core.method.untrack.ts","../src/core/core.method.reactive.ts","../src/core/core.method.effect.ts","../src/core/core.logger.ts","../src/core/core.method.resource.ts","../src/core/core.ts","../src/core/core.automatic.ts","../src/core/core.autolog.ts","../src/core/core.global.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["import { Computed, CleanupFn } from './types'\n\nexport function createComputed<T>(\n engine: any,\n fn: () => T,\n signalName?: string\n): Computed<T> {\n // 1. Ультимативный канонический WeakMap путь (строго по ссылке на объект-функцию)\n // Работает со скоростью нативной ссылки в V8, полностью исключая утечки памяти\n const existing = engine.computedCache.get(fn)\n if (existing) return existing as Computed<T>\n\n let value: T\n let isDirty = true\n let version = 0\n let isInitialized = false\n let evaluatedInEpoch = -1\n let state = 2 // 2 = DIRTY, 1 = CHECK, 0 = STABLE\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n const ownedEffects = new Set<any>()\n const subscribers = new Set<any>()\n\n const releaseNode = (node: any): void => {\n if (!node) return\n const actNode = node._node || node\n\n if (actNode.dependencies && actNode.dependencies.size > 0) {\n for (const unknownDep of actNode.dependencies) {\n const dep = unknownDep as any\n const rawDepNode = dep._node || dep\n\n if (rawDepNode.subscribers) {\n rawDepNode.subscribers.delete(actNode)\n rawDepNode.subscribers.delete(node)\n rawDepNode.subscribers.delete(computedNode)\n\n if (rawDepNode.type === 'computed' && rawDepNode.subscribers.size === 0) {\n releaseNode(rawDepNode)\n }\n }\n }\n actNode.dependencies.clear()\n if (actNode.depVersions) actNode.depVersions.clear()\n }\n }\n\n const updateIfNecessary = (node: any): boolean => {\n if (!isInitialized || state === 2) {\n return node.run()\n }\n\n // ⚛️ КОРРЕКТНЫЙ МЕМОИЗАЦИОННЫЙ ГВАРД (Pull-совместимый проход):\n // Если у узла есть активные подписчики (observed), мы можем оптимизировать расчет через эпохи.\n // Но если подписчиков НЕТ (unobserved), мы ОБЯЗАНЫ пропустить быстрый выход по эпохам\n // и честно проверить, изменились ли версии родителей ниже.\n if (subscribers && subscribers.size > 0) {\n if (node.verifiedInEpoch === engine.epoch && engine.batchDepth === 0 && state === 0) {\n return false\n }\n }\n\n let hasChangedParent = false\n\n if (dependencies && dependencies.size > 0) {\n for (const dep of dependencies) {\n const rawDep = dep._node || dep\n\n if (rawDep.type === 'computed' && rawDep.state > 0) {\n // ⚛️ ЗАЩИТА ОТ КАСКАДНОГО ОБХОДА:\n // Вызываем update() родителя только если он еще не был верифицирован в текущей эпохе.\n // Это ликвидирует квадратичную рекурсию на динамических структурах графа!\n if (rawDep.update && rawDep.verifiedInEpoch !== engine.epoch) {\n rawDep.update()\n }\n }\n\n // Если родитель имеет отложенное батч-значение (hasBatchValue)\n // или его версия изменилась — кэш невалиден!\n if (dep.hasBatchValue || depVersions.get(dep) !== rawDep.version) {\n hasChangedParent = true\n break\n }\n }\n }\n\n node.verifiedInEpoch = engine.epoch\n\n if (hasChangedParent || isDirty) {\n return node.run()\n }\n\n state = 0\n return false\n }\n\n let currentRunId = 0\n\n const computedNode: any = {\n id: engine.subscriberId++,\n dependencies,\n subscribers,\n ownedEffects,\n depth: 1,\n type: 'computed',\n fn,\n get version() { return version },\n get state() { return state },\n set state(val: number) { state = val },\n get depVersions() { return depVersions },\n verifiedInEpoch: -1, // Перенесено напрямую на объект ноды для ультимативного O(1)\n update: () => updateIfNecessary(computedNode),\n run: () => {\n // Стандартный быстрый выход для стабильных эпох\n if (evaluatedInEpoch === engine.epoch && isInitialized && state === 0 && engine.batchDepth === 0) {\n return false\n }\n\n // Запоминаем стартовую эпоху до вызова функции пользователя\n const startEpoch = engine.epoch\n evaluatedInEpoch = startEpoch\n computedNode.verifiedInEpoch = startEpoch\n\n if (engine.cycleDetectionStack.has(computedNode)) {\n throw new Error('[Graph Error] Cyclic dependency detected')\n }\n engine.cycleDetectionStack.add(computedNode)\n\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n\n engine.activeConsumer = computedNode\n engine.activeOwner = computedNode\n\n currentRunId++\n computedNode.activeRunId = currentRunId\n\n const oldDeps = dependencies.size > 0 ? Array.from(dependencies) : null\n dependencies.clear()\n\n try {\n if (ownedEffects.size > 0) {\n for (const child of ownedEffects) {\n if (child && typeof child.dispose === 'function') {\n child.dispose()\n }\n }\n ownedEffects.clear()\n }\n\n // Выполняем пользовательскую функцию (здесь могут произойти inner writes из тестов #179, #180, #186)\n const newValue = fn()\n\n if (oldDeps !== null) {\n const isSizeIdentical = oldDeps.length === dependencies.size\n for (const unknownDep of oldDeps) {\n const dep = unknownDep as any\n if (!isSizeIdentical || !dependencies.has(dep)) {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(computedNode)\n depVersions.delete(dep)\n }\n }\n }\n\n const changed = isDirty || !Object.is(value, newValue)\n\n if (changed) {\n const previousValueSnapshot = isDirty ? undefined : (typeof value === 'object' && value !== null ? JSON.parse(JSON.stringify(value)) : value)\n value = newValue\n version++\n\n if (engine.log && signalName) {\n engine.log({\n type: 'computed',\n label: signalName,\n details: { from: previousValueSnapshot, to: newValue }\n })\n }\n }\n\n isDirty = false\n state = 0\n isInitialized = true\n\n let maxDepDepth = 0\n for (const unknownDep of dependencies) {\n const dep = unknownDep as any\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version)\n if (rawNode.subscribers) rawNode.subscribers.add(computedNode)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) {\n maxDepDepth = rawNode.depth\n }\n }\n\n computedNode.depth = maxDepDepth + 1\n\n // ⚡ ФИКС ДЛЯ INNER WRITES (#179, #180, #186):\n // Если во время исполнения fn() эпоха ядра сдвинулась (был вложенный сеттер),\n // мы обязаны сбросить кэш верификации этой эпохи, чтобы последующие цепочки\n // зависимостей внутри этого же тика пересчитали свои значения нативно.\n if (engine.epoch !== startEpoch) {\n evaluatedInEpoch = -1\n computedNode.verifiedInEpoch = -1\n state = 2 // Переводим в DIRTY для немедленной инвалидации\n }\n\n return changed\n } finally {\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n engine.cycleDetectionStack.delete(computedNode)\n }\n },\n markDirty: (parentState: number) => {\n if (state >= parentState) return\n state = parentState\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(1)\n }\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value() {\n const consumer = engine.activeConsumer\n if (consumer && consumer !== computedNode) {\n subscribers.add(consumer)\n consumer.dependencies.add(computedNode)\n\n const currentDepth = computedNode.depth || 1\n const consumerRaw = consumer._node || consumer\n if (consumerRaw.depth !== undefined && currentDepth >= consumerRaw.depth) {\n consumerRaw.depth = currentDepth + 1\n }\n\n if (consumer.activeRunId !== undefined) {\n computedNode._lastSeenInRunId = consumer.activeRunId\n }\n }\n\n updateIfNecessary(computedNode)\n\n if (consumer && consumer.depVersions) {\n consumer.depVersions.set(computedInstance, version)\n }\n return value\n },\n get valueWithoutTracking() { return value },\n get version() { return version },\n get dependencies() { return dependencies },\n\n subscribe(cb: (val: T) => void): CleanupFn {\n const self = this\n const fakeEffect: any = {\n id: engine.subscriberId++,\n isDirty: true,\n depth: 9999,\n dependencies: new Set(),\n type: 'effect',\n run: () => {\n if (fakeEffect.isDisposed) return\n try { cb(self.value) } catch (err) { console.error(err) }\n }\n }\n subscribers.add(fakeEffect)\n cb(this.value)\n return () => {\n fakeEffect.isDisposed = true\n subscribers.delete(fakeEffect)\n fakeEffect.dependencies.clear()\n }\n },\n subscribeState(cb: () => void): CleanupFn {\n return (computedInstance as any).subscribe(cb)\n },\n destroy: () => {\n releaseNode(computedNode)\n if (subscribers) subscribers.clear()\n engine.computedCache.delete(fn)\n\n dependencies.clear()\n depVersions.clear()\n ownedEffects.clear()\n\n isDirty = true\n state = 2\n isInitialized = false\n },\n __subscribe(cb: () => void): CleanupFn {\n const hookEffect: any = {\n id: engine.subscriberId++,\n type: 'effect',\n run: cb,\n isDirty: false\n }\n subscribers.add(hookEffect)\n return () => {\n subscribers.delete(hookEffect)\n }\n }\n } as any\n\n computedInstance.run = () => computedNode.run()\n engine.computedCache.set(fn, computedInstance)\n\n ;(computedInstance as any)._node = computedNode\n ;(computedInstance as any).subscribers = subscribers\n\n return computedInstance\n}\n","export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = []\n if (!tested || !Array.isArray(tested)) return results // Предохранитель от пустых массивов\n\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i]\n if (typeof t !== 'string') continue // ЗАЩИТА: Пропускаем всё, что не является валидной строкой\n\n let regex\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g')\n break\n case 'string':\n default:\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g')\n break\n }\n\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value) }\n }\n }\n return results\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, SignalOptions } from './types'\n\nexport function createSignal<T>(\n engine: any,\n initialValue: T,\n optionsOrName?: SignalOptions<T> | string\n): Signal<T> {\n let value = initialValue\n let version = 0\n let name = typeof optionsOrName === 'string' ? optionsOrName : optionsOrName?.name\n const isInternalCoreSignal = !!name && getExtractedValues({\n tested: [name],\n expectedKey: 'CORE_INTERNAL_SIGNAL',\n valueType: 'number',\n })?.[0] === '1' || false\n const subscribers = new Set<any>()\n\n let hasBatchValue = false\n let batchInitialValue: T = initialValue\n\n const signalNode = {\n type: 'signal',\n get version() { return version },\n subscribers\n }\n\n const notifySubscribers = () => {\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.type === 'computed') {\n if (rawSub.markDirty) rawSub.markDirty(2)\n } else {\n if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n } else if (sub && typeof sub.run === 'function') {\n try { sub.run() } catch (err) { console.error(err) }\n }\n }\n }\n }\n\n const signalInstance: Signal<T> = {\n get value() {\n // 🛡️ АТОМАРНАЯ СТАБИЛИЗАЦИЯ ДЛЯ ПРОДА:\n // Фиксируем ссылку локально и работаем строго с ней, защищая граф от асинхронных гонок Webpack Scope Hoisting\n const consumer = engine.activeConsumer\n if (consumer) {\n subscribers.add(consumer)\n consumer.dependencies.add(signalInstance)\n\n if (consumer.activeRunId !== undefined) {\n (signalInstance as any)._lastSeenInRunId = consumer.activeRunId\n }\n }\n return value\n },\n\n set value(newValue: T) {\n const isObjectKick = value === newValue && value !== null && typeof value === 'object'\n if (Object.is(value, newValue) && !isObjectKick) return\n\n if (optionsOrName && typeof optionsOrName === 'object' && optionsOrName.validate) {\n const validation = optionsOrName.validate(newValue)\n if (validation !== true) {\n console.error(typeof validation === 'string' ? validation : '[Validation Error]')\n return\n }\n }\n\n if (engine.batchDepth > 0) {\n if (!hasBatchValue) {\n hasBatchValue = true\n batchInitialValue = value\n }\n value = newValue\n engine.batchedSignals.add(signalInstance)\n return\n }\n\n const oldValue = value\n value = newValue\n\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal',\n details: { from: oldValue, to: newValue },\n isInternalCoreSignal\n })\n\n notifySubscribers()\n if (engine.batchDepth === 0) engine.flushEffects()\n },\n\n get version() { return version },\n type: 'signal',\n\n subscribe(cb: (val: T) => void) {\n subscribers.add(cb)\n cb(value)\n return () => { subscribers.delete(cb) }\n },\n\n _flushBatch: () => {\n if (!hasBatchValue) return\n\n const wasChanged = !Object.is(batchInitialValue, value) || (value !== null && typeof value === 'object')\n\n if (wasChanged) {\n version++\n engine.epoch++\n\n engine.log({\n type: 'signal',\n label: name || 'signal_batched',\n details: { from: batchInitialValue, to: value },\n isInternalCoreSignal\n })\n\n for (const sub of subscribers) {\n const rawSub = sub._node || sub\n if (rawSub.type === 'effect') {\n rawSub.isDirty = true\n engine.scheduleEffect(sub)\n } else if (rawSub.markDirty) {\n rawSub.markDirty(2)\n } else if (typeof sub === 'function') {\n try { sub(value) } catch (err) { console.error(err) }\n }\n }\n }\n\n hasBatchValue = false\n batchInitialValue = value\n },\n\n get hasBatchValue() { return hasBatchValue },\n\n destroy: () => {\n if (subscribers) {\n subscribers.clear()\n }\n if (engine.batchedSignals) {\n engine.batchedSignals.delete(signalInstance)\n }\n hasBatchValue = false\n value = undefined as any\n batchInitialValue = undefined as any\n }\n } as any\n\n ;(signalInstance as any)._node = signalNode\n ;(signalInstance as any).subscribers = subscribers\n return signalInstance\n}\n","/**\n * Изолированный менеджер контекста untrack реактивного графа.\n * Временно замораживает автоматический сбор зависимостей, подменяя activeConsumer на null.\n */\nexport function executeUntrack<T>(engine: any, fn: () => T): T {\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = null\n try {\n return fn()\n } finally {\n engine.activeConsumer = prevConsumer\n }\n}\n","/**\n * * Изолированная фабрика глубоких реактивных Proxy-объектов графа.\n */\nexport function createReactive<T extends object>(\n engine: any,\n target: T,\n name?: string\n): T {\n if (engine.proxyTargets.has(target)) return target as any\n if (engine.proxyCache.has(target)) return engine.proxyCache.get(target) as any\n if (!engine.reactiveSignals.has(target)) engine.reactiveSignals.set(target, new Map())\n const signalsMap = engine.reactiveSignals.get(target)!\n\n const handler: ProxyHandler<T> = {\n get(t: T, prop: string | symbol, receiver: any) {\n if (prop === '__subscribe' && Array.isArray(t)) {\n return (cb: () => void) => {\n let lengthSig = signalsMap.get('length')\n if (!lengthSig) {\n lengthSig = engine.signal(t.length)\n signalsMap.set('length', lengthSig)\n }\n return lengthSig.subscribe(cb)\n }\n }\n\n if (Array.isArray(t) && typeof prop === 'string' && ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].includes(prop)) {\n return (...args: any[]) => {\n let result: any\n engine.batch(() => {\n result = (Reflect.get(t, prop) as Function).apply(receiver, args)\n\n let lengthSig = signalsMap.get('length')\n if (lengthSig) lengthSig.value = t.length\n\n signalsMap.forEach((sig: any, key: string) => {\n if (key !== 'length') sig.value = Reflect.get(t, key)\n })\n })\n return result\n }\n }\n\n if (typeof prop === 'symbol' || prop === 'constructor' || prop === 'toJSON') return Reflect.get(t, prop, receiver)\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n const rawValue = Reflect.get(t, prop)\n sig = engine.signal(rawValue)\n signalsMap.set(prop, sig)\n\n // ⚡ ЛЕНИВОЕ КЭШИРОВАНИЕ НА ЧТЕНИИ (O(1) Hot Path):\n // Создаем прокси-обертку строго один раз при первом РЕАЛЬНОМ обращении к свойству,\n // а не принудительно при записи.\n if (rawValue !== null && typeof rawValue === 'object') {\n (sig as any)._proxyCache = engine.reactive(rawValue, name ? `${name}.${String(prop)}` : String(prop))\n }\n }\n\n if ((sig as any)._proxyCache !== undefined) {\n sig.value // Честная регистрация ребра для сохранения топологии глубины веток\n return (sig as any)._proxyCache\n }\n\n return sig.value\n },\n\n set(t: T, prop: string | symbol, value: any, receiver: any) {\n const rawValue = engine.proxyTargets.has(value) ? value : value\n const oldValue = Reflect.get(t, prop)\n\n if (oldValue === rawValue && prop !== 'length') return true\n Reflect.set(t, prop, rawValue)\n\n let sig = signalsMap.get(prop)\n if (!sig) {\n sig = engine.signal(oldValue)\n signalsMap.set(prop, sig)\n }\n\n // ⚡ МЕГА-УСКOРЕНИЕ ДЛЯ СЕТТЕРOВ:\n // При записи мы просто СБРАСЫВАЕМ кэш прокси на узле в undefined.\n // Если бенчмарк захочет прочитать это свойство на следующей итерации,\n // ловушка геттера лениво создаст прокси. Если нет — мы сэкономили 100% ресурсов!\n (sig as any)._proxyCache = undefined\n sig.value = rawValue\n\n if (Array.isArray(t) && prop !== 'length') {\n let lengthSig = signalsMap.get('length')\n if (lengthSig) lengthSig.value = t.length\n }\n return true\n }\n }\n\n const proxy = new Proxy(target, handler)\n engine.proxyCache.set(target, proxy)\n engine.proxyTargets.add(proxy)\n return proxy\n}\n","import { IEffect, EffectFn, CleanupFn } from './types'\n\ninterface ICoreEffectNode extends IEffect {\n dependencies: Set<any>;\n depVersions: Map<any, number>;\n ownedEffects: Set<ICoreEffectNode>;\n type: string;\n depth: number;\n state: number;\n _node: any;\n dispose: () => void;\n}\n\nexport function createEffect(engine: any, fn: EffectFn, effectName?: string): () => void {\n let isDisposed = false\n let isRunning = false\n let state = 2 // 0 = STABLE, 1 = CHECK, 2 = DIRTY\n\n const dependencies = new Set<any>()\n const depVersions = new Map<any, number>()\n const ownedEffects = new Set<ICoreEffectNode>()\n\n const runCleanupPhase = () => {\n // Каскадное уничтожение вложенных детей через быстрый for...of\n if (ownedEffects.size > 0) {\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n engine.activeConsumer = null\n engine.activeOwner = null\n\n for (const child of ownedEffects) {\n if (child.dispose) child.dispose()\n }\n ownedEffects.clear()\n\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n }\n\n // Изоляция ошибок в деструкторах пользователя через быстрый for...of\n if (effectNode.cleanups.size > 0) {\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = null\n\n for (const cleanup of effectNode.cleanups) {\n try {\n cleanup()\n } catch (err) {\n console.error(err)\n }\n }\n\n effectNode.cleanups.clear()\n engine.activeConsumer = prevConsumer\n }\n }\n\n const effectNode: ICoreEffectNode = {\n id: engine.subscriberId++,\n dependencies,\n ownedEffects,\n cleanups: new Set<CleanupFn>(),\n type: 'effect',\n depth: 0,\n label: effectName,\n\n get isDirty(): boolean { return state > 0 },\n set isDirty(val: boolean) { if (val) state = 2 },\n\n get isDisposed(): boolean { return isDisposed },\n set isDisposed(val: boolean) { isDisposed = val },\n\n get state(): number { return state },\n set state(val: number) { state = val },\n get depVersions(): Map<any, number> { return depVersions },\n get _node(): any { return effectNode },\n\n markDirty: () => {\n if (state >= 1) return\n state = 1\n engine.scheduleEffect(effectNode)\n },\n\n run: () => {\n if (isDisposed || isRunning) return\n isRunning = true\n\n runCleanupPhase()\n\n const prevConsumer = engine.activeConsumer\n const prevOwner = engine.activeOwner\n\n engine.activeConsumer = effectNode\n engine.activeOwner = effectNode\n\n const oldDeps = dependencies.size > 0 ? Array.from(dependencies) : null\n dependencies.clear()\n\n try {\n state = 0 // Сбрасываем флаг грязи перед чтением графа\n\n const result = fn()\n if (typeof result === 'function') {\n effectNode.cleanups.add(result)\n }\n\n if (oldDeps !== null) {\n for (const unknownDep of oldDeps) {\n const dep = unknownDep as any\n if (!dependencies.has(dep)) {\n const rawDepNode = dep._node || dep\n if (rawDepNode.subscribers) rawDepNode.subscribers.delete(effectNode)\n depVersions.delete(dep)\n }\n }\n }\n\n let maxDepDepth = 0\n for (const unknownDep of dependencies) {\n const dep = unknownDep as any\n const rawNode = dep._node || dep\n depVersions.set(dep, rawNode.version)\n if (rawNode.subscribers) rawNode.subscribers.add(effectNode)\n if (rawNode.depth !== undefined && rawNode.depth > maxDepDepth) {\n maxDepDepth = rawNode.depth\n }\n }\n effectNode.depth = maxDepDepth + 1\n\n } finally {\n isRunning = false\n engine.activeConsumer = prevConsumer\n engine.activeOwner = prevOwner\n }\n },\n\n dispose: () => {\n if (isDisposed) return\n isDisposed = true\n effectNode.isDisposed = true\n\n runCleanupPhase()\n\n // ⚡ ОПТИМИЗАЦИЯ: Замена .forEach на быстрый for...of при полном уничтожении эффекта\n for (const dep of dependencies) {\n const rawNode = dep._node || dep\n if (rawNode.subscribers) rawNode.subscribers.delete(effectNode)\n }\n dependencies.clear()\n depVersions.clear()\n }\n }\n\n const actualOwnerNode = engine.activeOwner ? (engine.activeOwner._node || engine.activeOwner) : null\n\n if (actualOwnerNode && actualOwnerNode.ownedEffects) {\n actualOwnerNode.ownedEffects.add(effectNode)\n }\n\n effectNode.run()\n\n return () => {\n effectNode.dispose()\n }\n}\n","// core.logger.ts\nimport { LogEventType } from \"./types\"\n\ninterface LogDetails {\n from?: unknown;\n to?: unknown;\n payload?: unknown;\n}\n\nexport class ReactiveDebounceLogger {\n private static churnTracker = new Map<string, number[]>()\n\n private static readonly TIME_WINDOW_MS = 1000\n private static readonly CHURN_WARNING_THRESHOLD = 3\n private static readonly CHURN_CRITICAL_THRESHOLD = 6\n\n private static isDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n return JSON.stringify(a) === JSON.stringify(b)\n }\n\n private static analyzeSignalChurn(label: string): { marker: string; info: string } {\n const now = Date.now()\n if (!this.churnTracker.has(label)) {\n this.churnTracker.set(label, [])\n }\n\n const history = this.churnTracker.get(label)!\n const cutoff = now - this.TIME_WINDOW_MS\n // Фильтруем историю\n const activeHistory = history.filter(ts => ts > cutoff)\n activeHistory.push(now)\n\n const updateCount = activeHistory.length\n const intervalSec = (this.TIME_WINDOW_MS / 1000).toFixed(1)\n\n // ⚛️ ФИКС УТЕЧКИ ПАМЯТИ: Если узел стабилен и старых логов нет,\n // удаляем ключ из Map целиком, чтобы не копить мусор\n if (activeHistory.length <= 1) {\n this.churnTracker.delete(label)\n return { marker: '🟢', info: `[STABLE] (1 изм./${intervalSec}s)` }\n } else {\n this.churnTracker.set(label, activeHistory)\n }\n\n if (updateCount >= this.CHURN_CRITICAL_THRESHOLD) {\n return {\n marker: '🔴',\n info: `[CRITICAL CHURN] (${updateCount} изм./${intervalSec}s) — Нужен debounce!`\n }\n }\n\n if (updateCount >= this.CHURN_WARNING_THRESHOLD) {\n return {\n marker: '🟡',\n info: `[WARNING CHURN] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n return {\n marker: '🟢',\n info: `[STABLE] (${updateCount} изм./${intervalSec}s)`\n }\n }\n\n public static processLog(\n engineLogger: any,\n queueLogFn: Function,\n params: { type: LogEventType; label: string; details?: LogDetails; isInternalCoreSignal?: boolean }\n ) {\n const { type, label, details, isInternalCoreSignal = false } = params\n\n if (!engineLogger.isEnabled) return\n if (isInternalCoreSignal && !engineLogger.isCoreOptimizationDebugEnabled) return\n\n if (details && 'from' in details && 'to' in details) {\n if (this.isDeepEqual(details.from, details.to)) {\n if (type === 'computed') {\n queueLogFn(type, `🔵 [IDLE PULL] ${label} (Значение кэша не изменилось)`, details)\n return\n }\n return\n }\n }\n\n let churnInfo = ''\n if (type === 'signal' || type === 'resource' || type === 'computed') {\n const churn = this.analyzeSignalChurn(label)\n churnInfo = churn.marker === '🟢' ? ` ${churn.marker}` : ` ${churn.marker} ${churn.info}`\n }\n\n queueLogFn(type, `${label}${churnInfo}`, details)\n }\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Resource, ResourceOptions, ResourceState, Signal } from './types'\n\n// Контракт ядра движка для безопасных вызовов методов с дженериками\ninterface IReactiveEngine {\n signal<V>(initialValue: V, optionsOrName?: any): Signal<V>;\n effect(fn: () => any, name?: string): () => void;\n untrack<V>(fn: () => V): V;\n log(params: any): void;\n delay(ms: number, signal: AbortSignal): Promise<void>;\n}\n\nexport function createResource<T, S = void>(\n engine: IReactiveEngine,\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n): Resource<T> {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const resourceSignalName = isOptionsObject\n ? ((optionsOrName as ResourceOptions<T, S>).name || 'unnamed_resource')\n : (optionsOrName as string) || 'unnamed_resource'\n\n const options: Partial<ResourceOptions<T, S>> = isOptionsObject\n ? (optionsOrName as ResourceOptions<T, S>)\n : {}\n\n const resetDataOnSourceChange = options.resetDataOnSourceChange ?? true\n const responseValidate = options.responseValidate\n const validateBeforeFetch = options.validateBeforeFetch\n const retryCount = 0\n const baseDelay = 1000\n const useExponential = true\n const maxRetryDelay = 1000 * 60 * 5\n const timeoutMs = 1000\n\n // Вызов скомпилируется успешно, так как метод signal теперь строго описан в интерфейсе\n const state = engine.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 engine.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 if (validateBeforeFetch) {\n const preValidationResult = validateBeforeFetch(sValue)\n if (preValidationResult === false || typeof preValidationResult === 'string') {\n if (effectSignal.aborted) return\n const errorMsg = typeof preValidationResult === 'string'\n ? preValidationResult\n : 'Pre-fetch validation failed for resource'\n\n const currentData = isSourceChange ? null : engine.untrack(() => state.value.data)\n updateResourceState({ data: currentData, loading: false, error: errorMsg, isRetrying: false })\n return\n }\n }\n const shouldClear = isSourceChange && resetDataOnSourceChange\n const currentData = shouldClear ? null : engine.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 engine.delay(currentDelay, effectSignal)\n if (effectSignal.aborted) return\n } catch (delayError) {\n return\n }\n }\n }\n }\n }\n\n let activeEffectController: AbortController | null = null\n\n const disposeInternalEffect = engine.effect(() => {\n const sValue = source ? source.value : undefined as S\n const effectController = new AbortController()\n activeEffectController = effectController\n\n engine.untrack(() => {\n load(sValue as S, effectController.signal, true)\n })\n\n return () => effectController.abort()\n }, '[CORE_INTERNAL_SIGNAL=1]:effect')\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get isRetrying() { return state.value.isRetrying },\n get value() { return state.value },\n refetch: () => {\n activeEffectController?.abort()\n activeEffectController = new AbortController()\n load(source ? source.value : undefined as S, activeEffectController.signal, false)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb),\n destroy: () => {\n activeEffectController?.abort()\n activeEffectController = null\n if (typeof disposeInternalEffect === 'function') {\n disposeInternalEffect()\n }\n if ((state as any).destroy) {\n (state as any).destroy()\n }\n }\n } as any\n}\n","import { getExtractedValues } from '../utils/getExtractedValues'\nimport { Signal, Computed, IEffect, EngineLoggerOptions, LogEventType, CleanupFn, TransactionContext, LogRecord, SignalOptions, ResourceOptions, ResourceState, Resource } from './types'\nimport { createComputed } from './core.method.computed'\nimport { createSignal } from './core.method.signal'\n// import { executeBatch } from './core.method.batch'\nimport { executeUntrack } from './core.method.untrack'\nimport { createReactive } from './core.method.reactive'\nimport { createEffect } from './core.method.effect'\nimport { ReactiveDebounceLogger } from './core.logger'\nimport { createResource } from './core.method.resource'\n\n// Тип для конструктора класса\ntype Constructor<T> = new (...args: any[]) => T\n// Тип для фабричной функции зависимостей\ntype Factory<T> = (engine: any) => T\n// Универсальный тип токена DI\ntype InjectionToken<T> = Constructor<T> | Factory<T> | symbol | string\n\nconst badgeColors: Record<LogEventType, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;'\n}\nlet currentTransaction: TransactionContext | null = null\nfunction safeValueToString(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value)\n } catch (e) {\n return '[Cyclic Object or Layer]'\n }\n }\n return String(value)\n}\nexport function queueLog(type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }): void {\n if (!currentTransaction) {\n currentTransaction = { id: Math.random().toString(36).substring(2, 9), pendingLogQueue: [], isFlushing: false }\n queueMicrotask(() => flushLogs())\n }\n currentTransaction.pendingLogQueue.push({ type, label, from: details?.from, to: details?.to, payload: details?.payload, timestamp: Date.now() })\n}\nexport function flushLogs(): void {\n if (!currentTransaction || currentTransaction.isFlushing) return\n currentTransaction.isFlushing = true\n const queue = currentTransaction.pendingLogQueue\n if (queue.length === 0) {\n currentTransaction = null\n return\n }\n console.groupCollapsed(`%cREACTIVE TRANSACTION%c [id: ${currentTransaction.id}] (${queue.length} operations)`, 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;', 'color: #888; font-weight: normal;')\n for (const record of queue) {\n const colorStyle = badgeColors[record.type]\n const hasTransition = record.from !== undefined || record.to !== undefined\n let logMessage = `%c${record.type.toUpperCase()}%c ${record.label}`\n\n if (hasTransition) {\n if (!!record.from)\n logMessage += ` ${safeValueToString(record.from)} → ${safeValueToString(record.to)}`\n else logMessage += ` (${safeValueToString(record.to)})`\n }\n\n if (record.payload !== undefined) {\n console.groupCollapsed(logMessage, colorStyle, 'color: inherit;')\n console.log('Payload:', record.payload)\n console.groupEnd()\n } else {\n console.log(logMessage, colorStyle, 'color: inherit;')\n }\n }\n console.groupEnd()\n currentTransaction = null\n}\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n private logger: EngineLoggerOptions\n public epoch = 0\n public activeConsumer: any = null\n public batchDepth = 0\n public subscriberId = 0\n public pendingEffects: Array<Set<any> | undefined> = []\n public maxPendingDepth = 0\n public computedCache = new WeakMap<Function, any>()\n private diRegistry = new Map<unknown, unknown>()\n private diCache = new Map<unknown, unknown>()\n private proxyCache = new WeakMap<object, any>()\n private proxyTargets = new WeakSet<object>()\n private reactiveSignals = new WeakMap<object, Map<string | symbol, any>>()\n private cycleDetectionStack = new Set<unknown>()\n public batchedSignals = new Set<any>()\n public activeOwner: any = null\n // Системная очередь для отложенного батчинга деструкторов\n public pendingCleanups = new Set<() => void>()\n\n // Метод для регистрации отложенной очистки\n public queueCleanup(cleanup: () => void): void {\n this.pendingCleanups.add(cleanup)\n }\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n this.logger = options?.logger || { isEnabled: false }\n }\n\n public scheduleEffect(effect: any): void {\n const depth = effect.depth || 0\n if (!this.pendingEffects[depth]) {\n this.pendingEffects[depth] = new Set()\n }\n this.pendingEffects[depth]!.add(effect)\n if (depth > this.maxPendingDepth) {\n this.maxPendingDepth = depth\n }\n }\n\n public queueLog(type: LogEventType, label: string, details?: { from?: unknown; to?: unknown; payload?: unknown }): void {\n queueLog(type, label, details)\n }\n\n public batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) {\n if (this.batchedSignals.size > 0) {\n for (const sig of this.batchedSignals) {\n if (sig._flushBatch) sig._flushBatch()\n }\n this.batchedSignals.clear()\n }\n\n this.flushEffects()\n }\n }\n }\n\n public flushEffects(): void {\n if (this.batchDepth > 0) return\n\n const prevConsumer = this.activeConsumer\n\n try {\n for (let depth = 0; depth <= this.maxPendingDepth; depth++) {\n const bucket = this.pendingEffects[depth]\n\n if (!bucket || bucket.size === 0) continue\n\n const effects = Array.from(bucket)\n bucket.clear()\n\n for (const effect of effects) {\n if (effect.isDisposed) continue\n\n // ⚡ ЗOЛОТOЙ СТАНДАРТ ОПТИМИЗАЦИИ (Early Dirty Check Bypass):\n // Переносим проверку грязи в самое начало цикла. Если эффект не был промаркирован\n // как DIRTY волной push-уведомлений, мы мгновенно пропускаем его, полностью\n // избавляя V8 от холостого обхода родителей и тяжелых хэш-поисков depVersions.get(dep).\n if (!effect.isDirty) continue\n\n if (effect.dependencies && effect.dependencies.size > 0) {\n let parentChanged = false\n\n for (const dep of effect.dependencies) {\n const rawNode = dep._node || dep\n\n if (rawNode.type === 'computed' && rawNode.state > 0) {\n if (rawNode.update) rawNode.update()\n }\n\n if (effect.depVersions && effect.depVersions.get(dep) !== rawNode.version) {\n parentChanged = true\n }\n }\n\n if (!parentChanged && effect.dependencies.size > 0) {\n effect.isDirty = false\n continue\n }\n }\n\n try {\n effect.run()\n } catch (err) {\n // ⚡ ФИКС ТЕСТА #177: Если один из эффектов выбросил исключение,\n // принудительно очищаем и гасим флаги грязи (isDirty) у всех оставшихся\n // в очереди эффектов текущего и последующих уровней глубины.\n for (let d = depth; d <= this.maxPendingDepth; d++) {\n const remainingBucket = this.pendingEffects[d]\n if (remainingBucket) {\n for (const remEffect of remainingBucket) {\n remEffect.isDirty = false\n }\n remainingBucket.clear()\n }\n }\n this.maxPendingDepth = 0\n throw err // Прокидываем ошибку дальше по спецификации\n }\n\n }\n\n if (depth > 0) {\n let hasEarlierEffects = false\n for (let i = 0; i < depth; i++) {\n if (this.pendingEffects[i] && this.pendingEffects[i]!.size > 0) {\n hasEarlierEffects = true\n break\n }\n }\n if (hasEarlierEffects) depth = -1\n }\n }\n this.maxPendingDepth = 0\n } finally {\n this.activeConsumer = prevConsumer\n }\n }\n\n // public batch<T>(fn: () => T): T {\n // return executeBatch<T>(this, fn)\n // }\n\n // ⚛️ ФИКС ДЛЯ РЕЛИЗА 2.5.0: Меняем private на public,\n // чтобы изолированные функции-методы имели легальный доступ к регистратору логов\n public log(params: any) {\n if (!this.logger || !this.logger.isEnabled) return\n ReactiveDebounceLogger.processLog(this.logger, queueLog, params)\n }\n\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n return createSignal<T>(this, initialValue, optionsOrName)\n }\n\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n // Просто делегируем вызов строго изолированной чистой функции\n return createComputed<T>(this, fn, signalName)\n }\n\n public effect(fn: () => void | CleanupFn, effectName?: string): () => void {\n return createEffect(this, fn, effectName)\n }\n\n public untrack<T>(fn: () => T): T {\n return executeUntrack<T>(this, fn)\n }\n\n public reactive<T extends object>(target: T, name?: string): T {\n return createReactive<T>(this, target, name)\n }\n\n public provide<T>(token: InjectionToken<T>, valueOrFactory: T | Factory<T>): void {\n this.diRegistry.set(token, valueOrFactory)\n this.diCache.delete(token)\n }\n\n public inject<T>(token: InjectionToken<T>): T {\n if (token === undefined || token === null) throw new Error('[DI Error] Token is empty')\n if (this.diCache.has(token)) return this.diCache.get(token) as T\n if (this.cycleDetectionStack.has(token)) throw new Error('[DI Error] Cyclic dependency detected')\n this.cycleDetectionStack.add(token)\n try {\n if (this.diRegistry.has(token)) {\n const entry = this.diRegistry.get(token)\n if (typeof entry === 'function') {\n if ((entry as any)._isMockFunction) {\n const mockRes = (entry as Function)(this)\n if (mockRes !== undefined) {\n this.diCache.set(token, mockRes)\n return mockRes as T\n }\n return entry as unknown as T\n }\n const str = entry.toString()\n const isClass = str.startsWith('class ') || str.startsWith('class{') || (entry.prototype && entry.prototype.constructor === entry && !str.startsWith('function') && !str.includes('=>'))\n if (!isClass) {\n const resolved = (entry as Factory<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n return entry as unknown as T\n }\n return entry as T\n }\n if (typeof token === 'function') {\n const resolved = new (token as Constructor<T>)(this)\n this.diCache.set(token, resolved)\n return resolved\n }\n throw new Error('[DI Error] Token not found')\n } finally {\n this.cycleDetectionStack.delete(token)\n }\n }\n\n public delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n const timeoutId = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n\n const onAbort = () => {\n clearTimeout(timeoutId)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n })\n }\n\n /**\n * Создает умную реактивную декларативную обертку над асинхронными операциями\n * с автоматическим подавлением Race Conditions и встроенным методом .destroy().\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>,\n ): Resource<T> {\n // Передаем инстанс движка (this) как IReactiveEngine для соблюдения строгой типизации\n return createResource<T, S>(this, fetcher, source, optionsOrName)\n }\n}\n\nexport { ReactiveEngineCore as ReactiveEngine, ReactiveEngineCore as ReactiveEngineAutomatic }\n","import { ReactiveEngineCore } from './core'\n\nexport class ReactiveEngineAutomatic extends ReactiveEngineCore {}\n","import { ReactiveEngineAutomatic } from './core.automatic'\nimport { Computed } from './types'\n\n/**\n * 📊 REACTIVE ENGINE AUTOLOG (core.autolog)\n * Расширяет автоматический шедулер. Добавляет Enterprise-логирование,\n * замер производительности и Pull Duration каскадов графа.\n */\nexport class ReactiveEngineAutolog extends ReactiveEngineAutomatic {\n public autoLogQueue: Array<any> = []\n public isHardFlushScheduled = false\n\n public queueLog(type: string, name: string, meta?: any): void {\n this.autoLogQueue.push({ type, name, meta, timestamp: Date.now() })\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n queueMicrotask(() => this.flushLogs())\n }\n }\n\n public flushLogs(): void {\n this.isHardFlushScheduled = false\n if (this.autoLogQueue.length === 0) return\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console.group(`📊 [Autolog] Срез транзакций: ${this.autoLogQueue.length} операций`)\n this.autoLogQueue.forEach(log => console.log(`[${log.type.toUpperCase()}] ${log.name}`, log.meta || ''))\n console.groupEnd()\n }\n this.autoLogQueue = []\n }\n\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n let isDestroyed = false\n\n const autologComputedInstance: Computed<T> = {\n get value(): T {\n if (isDestroyed) return originalComputed.value\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n const val = originalComputed.value\n\n if (startTime) {\n engine.queueLog('computed', name, { value: val, duration: `${(performance.now() - startTime).toFixed(3)}ms` })\n }\n return val\n },\n subscribe: (cb) => originalComputed.subscribe(cb),\n destroy() {\n isDestroyed = true\n originalComputed.destroy()\n }\n }\n\n if ('_node' in originalComputed) {\n Object.defineProperty(autologComputedInstance, '_node', {\n value: (originalComputed as any)._node,\n enumerable: false\n })\n }\n\n return autologComputedInstance\n }\n}\n","import { ReactiveEngineCore } from './core'\n\n// Единый глобальный инстанс по умолчанию\nlet globalEngine = new ReactiveEngineCore({ logger: { isEnabled: false } })\n\nexport const signal = <T>(initialValue: T, options?: any) => globalEngine.signal(initialValue, options)\nexport const computed = <T>(fn: () => T, name?: string) => globalEngine.computed(fn, name)\nexport const effect = (fn: () => any, name?: string) => globalEngine.effect(fn, name)\nexport const batch = <T>(fn: () => T): T => globalEngine.batch(fn)\nexport const untrack = <T>(fn: () => T): T => globalEngine.untrack(fn)\n\n/**\n * ⚡ ХУК ДЛЯ БЕНЧМАРКОВ И ТЕСТОВЫХ СРЕД:\n * Позволяет атомарно уничтожить старый граф реактивности и начать с чистого листа,\n * полностью исключая утечки памяти и пересечение эпох между тест-кейсами.\n */\nexport function resetGlobalReactiveEngine(): void {\n // Старый инстанс со всеми WeakMap и StringCache уходит в Garbage Collector\n globalEngine = new ReactiveEngineCore({ logger: { isEnabled: false } })\n}\n","import { ReactiveEngineAutomatic } from './core.automatic'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngineAutomatic) {\n // Вызываем метод инициализации, который можно переопределить в наследниках\n this.onInit()\n }\n\n // NOTE: Полезные хелперы для сокращения кода\n protected createNumericSignal(val: number, name: string) {\n return this.engine.signal(val, {\n name,\n validate: (v) => typeof v === 'number' && !isNaN(v)\n })\n }\n\n protected createComputed<T>(fn: () => T) {\n return this.engine.computed(fn)\n }\n\n protected createSignal<T>(val: T, name?: string) {\n return this.engine.signal(val, name)\n }\n\n // NOTE: Жизненный цикл: вызывается сразу после создания сервиса.\n // Удобно для инициализации сигналов, которые зависят от engine.\n protected onInit(): void { }\n}\n\nexport const BaseREService = AbstractService\n","import { ReactiveEngineCore } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngineCore) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- let e=require("vue");function t(t){if(typeof t!=`object`||!t)return(0,e.shallowRef)(t);let n=`subscribe`in t&&typeof t.subscribe==`function`,r=(0,e.shallowRef)(n?t.value:t),i=null;if(n)i=t.subscribe(e=>{r.value=e});else if(`__subscribe`in t&&typeof t.__subscribe==`function`){let e=t;i=e.__subscribe(()=>{r.value=Array.isArray(e)?[...e]:{...e}})}return i&&(0,e.onScopeDispose)(()=>{i()}),r}exports.useReactiveValue=t;
1
+ let e=require("vue");function t(t){if(typeof t!=`object`||!t)return(0,e.shallowRef)(t);let n=`subscribe`in t&&typeof t.subscribe==`function`,r=(0,e.shallowRef)(n?t.value:t),i=null;if(n)i=t.subscribe(e=>{r.value=e});else if(`__subscribe`in t){let e=t;typeof e.__subscribe==`function`&&(i=e.__subscribe(()=>{r.value=Array.isArray(t)?[...t]:{...t}}))}return i&&(0,e.onScopeDispose)(()=>{i&&i()}),r}exports.useReactiveValue=t;
2
2
  //# sourceMappingURL=core.vue-adapter.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.vue-adapter.cjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose } from 'vue'\nimport { ISignalLike } from '../core/types'\n\ntype CleanupFn = () => void\n\n/**\n * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v1.9.0)\n *\n * Нативно интегрирует синхронные и асингулярные графы ядра с реактивной системой Vue 3.\n * Исключает десинхронизацию за счет shallowRef-трансляции и триггеров onScopeDispose.\n */\nexport function useReactiveValue<T>(item: T): any {\n // Быстрый выход для примитивов или невалидных объектов, переданных по ошибке\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Инициализируем реактивный контейнер Vue 3 стартовым снимком из ядра\n const stateRef = shallowRef(isSignal ? (item as any).value : item)\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue: any) => {\n stateRef.value = newValue // Vue 3 автоматически триггерит обновление DOM\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const reactiveItem = item as any\n unsubscribe = reactiveItem.__subscribe(() => {\n // Для Proxy-коллекций принудительно создаем shallow-копию ссылки,\n // заставляя ленивый движок Vue 3 безупречно перерисовывать шаблоны .push/.splice мутаций!\n stateRef.value = Array.isArray(reactiveItem) ? [...reactiveItem] : { ...reactiveItem }\n })\n }\n\n // Автоматически освобождаем оперативную память и гасим эффекты ядра\n // при размонтировании Vue-компонента или закрытии EffectScope\n if (unsubscribe) {\n onScopeDispose(() => {\n unsubscribe!()\n })\n }\n\n return stateRef\n}\n"],"mappings":"qBAWA,SAAgB,EAAoB,EAAc,CAEhD,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,WAAA,CAAkB,CAAI,EAGxB,IAAM,EAAW,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAGzF,GAAA,EAAA,EAAA,WAAA,CAAsB,EAAY,EAAa,MAAQ,CAAI,EAC7D,EAAgC,KAKpC,GAAI,EAEF,EAAc,EAAW,UAAW,GAAkB,CACpD,EAAS,MAAQ,CACnB,CAAC,OAKE,GAAI,gBAAiB,GAAQ,OAAQ,EAAiC,aAAgB,WAAY,CACrG,IAAM,EAAe,EACrB,EAAc,EAAa,gBAAkB,CAG3C,EAAS,MAAQ,MAAM,QAAQ,CAAY,EAAI,CAAC,GAAG,CAAY,EAAI,CAAE,GAAG,CAAa,CACvF,CAAC,CACH,CAUA,OANI,IACF,EAAA,EAAA,eAAA,KAAqB,CACnB,EAAa,CACf,CAAC,EAGI,CACT"}
1
+ {"version":3,"file":"core.vue-adapter.cjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose, ShallowRef } from 'vue'\nimport { ISignalLike, CleanupFn } from '../core/types'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних методов подписки Proxy-объектов ядра\n */\ninterface IReactiveProxyExtension {\n __subscribe?: (cb: () => void) => CleanupFn;\n}\n\n/**\n * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v2.6.1)\n *\n * Нативно интегрирует синхронные и асинхронные графы ядра с реактивной системой Vue 3.\n * Автоматически выводит тип внутренней структуры данных и возвращает строго типизированный ShallowRef.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): ShallowRef<V>;\nexport function useReactiveValue<T extends object>(proxy: T): ShallowRef<T>;\nexport function useReactiveValue<T>(primitive: T): ShallowRef<T>;\nexport function useReactiveValue(item: unknown): ShallowRef<unknown> {\n // Быстрый выход для примитивов или невалидных объектов, переданных по ошибке\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Вычисляем стартовое значение без использования unsafe any\n const getInitialValue = (): unknown => {\n if (isSignal) {\n return (item as ISignalLike<unknown>).value\n }\n return item\n }\n\n // Инициализируем реактивный контейнер Vue 3 стартовым снимком из ядра\n const stateRef = shallowRef(getInitialValue())\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = item as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue) => {\n stateRef.value = newValue // Vue 3 автоматически триггерит обновление DOM\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item) {\n const potentialProxy = item as IReactiveProxyExtension\n if (typeof potentialProxy.__subscribe === 'function') {\n unsubscribe = potentialProxy.__subscribe(() => {\n // Для Proxy-коллекций принудительно создаем shallow-копию ссылки,\n // заставляя ленивый движок Vue 3 безупречно перерисовывать шаблоны .push/.splice мутаций!\n stateRef.value = Array.isArray(item) ? [...item] : { ...item }\n })\n }\n }\n\n // Автоматически освобождаем оперативную память и гасим эффекты ядра\n // при размонтировании Vue-компонента или закрытии EffectScope\n if (unsubscribe) {\n onScopeDispose(() => {\n if (unsubscribe) unsubscribe()\n })\n }\n\n return stateRef\n}\n"],"mappings":"qBAmBA,SAAgB,EAAiB,EAAoC,CAEnE,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,WAAA,CAAkB,CAAI,EAGxB,IAAM,EAAW,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAWzF,GAAA,EAAA,EAAA,WAAA,CAPA,EACM,EAA8B,MAEjC,CAIoC,EACzC,EAAgC,KAKpC,GAAI,EAEF,EAAc,EAAW,UAAW,GAAa,CAC/C,EAAS,MAAQ,CACnB,CAAC,OAKE,GAAI,gBAAiB,EAAM,CAC9B,IAAM,EAAiB,EACnB,OAAO,EAAe,aAAgB,aACxC,EAAc,EAAe,gBAAkB,CAG7C,EAAS,MAAQ,MAAM,QAAQ,CAAI,EAAI,CAAC,GAAG,CAAI,EAAI,CAAE,GAAG,CAAK,CAC/D,CAAC,EAEL,CAUA,OANI,IACF,EAAA,EAAA,eAAA,KAAqB,CACf,GAAa,EAAY,CAC/B,CAAC,EAGI,CACT"}
@@ -1,8 +1,12 @@
1
+ import { ShallowRef } from 'vue';
2
+ import { ISignalLike } from '../core/types';
1
3
  /**
2
- * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v1.9.0)
4
+ * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v2.6.1)
3
5
  *
4
- * Нативно интегрирует синхронные и асингулярные графы ядра с реактивной системой Vue 3.
5
- * Исключает десинхронизацию за счет shallowRef-трансляции и триггеров onScopeDispose.
6
+ * Нативно интегрирует синхронные и асинхронные графы ядра с реактивной системой Vue 3.
7
+ * Автоматически выводит тип внутренней структуры данных и возвращает строго типизированный ShallowRef.
6
8
  */
7
- export declare function useReactiveValue<T>(item: T): any;
9
+ export declare function useReactiveValue<V>(signal: ISignalLike<V>): ShallowRef<V>;
10
+ export declare function useReactiveValue<T extends object>(proxy: T): ShallowRef<T>;
11
+ export declare function useReactiveValue<T>(primitive: T): ShallowRef<T>;
8
12
  //# sourceMappingURL=core.vue-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.vue-adapter.d.ts","sourceRoot":"","sources":["../../src/vue/core.vue-adapter.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,CA0ChD"}
1
+ {"version":3,"file":"core.vue-adapter.d.ts","sourceRoot":"","sources":["../../src/vue/core.vue-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,UAAU,EAAE,MAAM,KAAK,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAa,MAAM,eAAe,CAAA;AAStD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3E,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC"}
@@ -6,14 +6,14 @@ function n(n) {
6
6
  if (r) a = n.subscribe((e) => {
7
7
  i.value = e;
8
8
  });
9
- else if ("__subscribe" in n && typeof n.__subscribe == "function") {
9
+ else if ("__subscribe" in n) {
10
10
  let e = n;
11
- a = e.__subscribe(() => {
12
- i.value = Array.isArray(e) ? [...e] : { ...e };
13
- });
11
+ typeof e.__subscribe == "function" && (a = e.__subscribe(() => {
12
+ i.value = Array.isArray(n) ? [...n] : { ...n };
13
+ }));
14
14
  }
15
15
  return a && e(() => {
16
- a();
16
+ a && a();
17
17
  }), i;
18
18
  }
19
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"core.vue-adapter.mjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose } from 'vue'\nimport { ISignalLike } from '../core/types'\n\ntype CleanupFn = () => void\n\n/**\n * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v1.9.0)\n *\n * Нативно интегрирует синхронные и асингулярные графы ядра с реактивной системой Vue 3.\n * Исключает десинхронизацию за счет shallowRef-трансляции и триггеров onScopeDispose.\n */\nexport function useReactiveValue<T>(item: T): any {\n // Быстрый выход для примитивов или невалидных объектов, переданных по ошибке\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Инициализируем реактивный контейнер Vue 3 стартовым снимком из ядра\n const stateRef = shallowRef(isSignal ? (item as any).value : item)\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue: any) => {\n stateRef.value = newValue // Vue 3 автоматически триггерит обновление DOM\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const reactiveItem = item as any\n unsubscribe = reactiveItem.__subscribe(() => {\n // Для Proxy-коллекций принудительно создаем shallow-копию ссылки,\n // заставляя ленивый движок Vue 3 безупречно перерисовывать шаблоны .push/.splice мутаций!\n stateRef.value = Array.isArray(reactiveItem) ? [...reactiveItem] : { ...reactiveItem }\n })\n }\n\n // Автоматически освобождаем оперативную память и гасим эффекты ядра\n // при размонтировании Vue-компонента или закрытии EffectScope\n if (unsubscribe) {\n onScopeDispose(() => {\n unsubscribe!()\n })\n }\n\n return stateRef\n}\n"],"mappings":";;AAWA,SAAgB,EAAoB,GAAc;CAEhD,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAW,CAAI;CAGxB,IAAM,IAAW,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAGzF,IAAW,EAAW,IAAY,EAAa,QAAQ,CAAI,GAC7D,IAAgC;CAKpC,IAAI,GAEF,IAAc,EAAW,WAAW,MAAkB;EACpD,EAAS,QAAQ;CACnB,CAAC;MAKE,IAAI,iBAAiB,KAAQ,OAAQ,EAAiC,eAAgB,YAAY;EACrG,IAAM,IAAe;EACrB,IAAc,EAAa,kBAAkB;GAG3C,EAAS,QAAQ,MAAM,QAAQ,CAAY,IAAI,CAAC,GAAG,CAAY,IAAI,EAAE,GAAG,EAAa;EACvF,CAAC;CACH;CAUA,OANI,KACF,QAAqB;EACnB,EAAa;CACf,CAAC,GAGI;AACT"}
1
+ {"version":3,"file":"core.vue-adapter.mjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose, ShallowRef } from 'vue'\nimport { ISignalLike, CleanupFn } from '../core/types'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних методов подписки Proxy-объектов ядра\n */\ninterface IReactiveProxyExtension {\n __subscribe?: (cb: () => void) => CleanupFn;\n}\n\n/**\n * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v2.6.1)\n *\n * Нативно интегрирует синхронные и асинхронные графы ядра с реактивной системой Vue 3.\n * Автоматически выводит тип внутренней структуры данных и возвращает строго типизированный ShallowRef.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): ShallowRef<V>;\nexport function useReactiveValue<T extends object>(proxy: T): ShallowRef<T>;\nexport function useReactiveValue<T>(primitive: T): ShallowRef<T>;\nexport function useReactiveValue(item: unknown): ShallowRef<unknown> {\n // Быстрый выход для примитивов или невалидных объектов, переданных по ошибке\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Вычисляем стартовое значение без использования unsafe any\n const getInitialValue = (): unknown => {\n if (isSignal) {\n return (item as ISignalLike<unknown>).value\n }\n return item\n }\n\n // Инициализируем реактивный контейнер Vue 3 стартовым снимком из ядра\n const stateRef = shallowRef(getInitialValue())\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = item as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue) => {\n stateRef.value = newValue // Vue 3 автоматически триггерит обновление DOM\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item) {\n const potentialProxy = item as IReactiveProxyExtension\n if (typeof potentialProxy.__subscribe === 'function') {\n unsubscribe = potentialProxy.__subscribe(() => {\n // Для Proxy-коллекций принудительно создаем shallow-копию ссылки,\n // заставляя ленивый движок Vue 3 безупречно перерисовывать шаблоны .push/.splice мутаций!\n stateRef.value = Array.isArray(item) ? [...item] : { ...item }\n })\n }\n }\n\n // Автоматически освобождаем оперативную память и гасим эффекты ядра\n // при размонтировании Vue-компонента или закрытии EffectScope\n if (unsubscribe) {\n onScopeDispose(() => {\n if (unsubscribe) unsubscribe()\n })\n }\n\n return stateRef\n}\n"],"mappings":";;AAmBA,SAAgB,EAAiB,GAAoC;CAEnE,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAW,CAAI;CAGxB,IAAM,IAAW,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAWzF,IAAW,EAPX,IACM,EAA8B,QAEjC,CAIoC,GACzC,IAAgC;CAKpC,IAAI,GAEF,IAAc,EAAW,WAAW,MAAa;EAC/C,EAAS,QAAQ;CACnB,CAAC;MAKE,IAAI,iBAAiB,GAAM;EAC9B,IAAM,IAAiB;EACvB,AAAI,OAAO,EAAe,eAAgB,eACxC,IAAc,EAAe,kBAAkB;GAG7C,EAAS,QAAQ,MAAM,QAAQ,CAAI,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,GAAG,EAAK;EAC/D,CAAC;CAEL;CAUA,OANI,KACF,QAAqB;EACnB,AAAI,KAAa,EAAY;CAC/B,CAAC,GAGI;AACT"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./core.vue-adapter.cjs");let n=require("vue");var r=class extends e.ReactiveEngine{frameworkPrefix=`vue-auto`;reactive(e,t){let n=e=>{if(!(!e||typeof e!=`object`||Symbol.iterator in e)){Reflect.has(e,`__subscribe`)||Object.defineProperty(e,"__subscribe",{get:()=>e=>this.effect(()=>{try{JSON.stringify(r)}catch{Object.values(r)}e()},`vue-proxy-internal-subscription`),configurable:!0,enumerable:!1}),Reflect.has(e,`__v_skip`)||Object.defineProperty(e,"__v_skip",{get:()=>!0,configurable:!0,enumerable:!1});for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&typeof e[t]==`object`&&n(e[t])}};n(e);let r=super.reactive(e,t);return r}use(e){if(typeof e!=`object`||!e)return(0,n.shallowRef)(e);if(`subscribe`in e&&typeof e.subscribe==`function`){let t=e,r=(0,n.shallowRef)(this.untrack(()=>t.value)),i=`__subscribe`in t&&typeof t.__subscribe==`function`?t.__subscribe(()=>{r.value=t.value,(0,n.triggerRef)(r)}):t.subscribe(e=>{r.value=e,(0,n.triggerRef)(r)});return(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>i()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>i()),r}let t=(0,n.shallowRef)(e);if(`__subscribe`in e&&typeof e.__subscribe==`function`){let r=e.__subscribe(()=>{(0,n.triggerRef)(t)});(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>r()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>r())}return t}};exports.ReactiveEngine=r,exports.useReactiveValue=t.useReactiveValue;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./core.vue-adapter.cjs");let n=require("vue");var r=class extends e.ReactiveEngine{frameworkPrefix=`vue-auto`;reactive(e,t){let n,r=e=>{if(!e||typeof e!=`object`||Symbol.iterator in e)return;let t=e;Reflect.has(t,`__subscribe`)||Object.defineProperty(t,"__subscribe",{get:()=>e=>this.effect(()=>{try{JSON.stringify(n)}catch{Object.values(n)}e()},`vue-proxy-internal-subscription`),configurable:!0,enumerable:!1}),Reflect.has(t,`__v_skip`)||Object.defineProperty(t,"__v_skip",{get:()=>!0,configurable:!0,enumerable:!1});for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let n=t[e];typeof n==`object`&&n&&r(n)}};return r(e),n=super.reactive(e,t),n}use(e){if(typeof e!=`object`||!e)return(0,n.shallowRef)(e);if(`subscribe`in e&&typeof e.subscribe==`function`){let t=e,r=(0,n.shallowRef)(this.untrack(()=>t.value)),i=`__subscribe`in t&&typeof t.__subscribe==`function`&&t.__subscribe?t.__subscribe(()=>{r.value=t.value,(0,n.triggerRef)(r)}):t.subscribe(e=>{r.value=e,(0,n.triggerRef)(r)});return(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>i()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>i()),r}let t=(0,n.shallowRef)(e),r=e;if(`__subscribe`in r&&typeof r.__subscribe==`function`){let e=r.__subscribe(()=>{(0,n.triggerRef)(t)});(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>e()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>e())}return t}};exports.ReactiveEngine=r,exports.useReactiveValue=t.useReactiveValue;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n const injectVueMarkers = (obj: any) => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in obj) return\n\n if (!Reflect.has(obj, '__subscribe')) {\n Object.defineProperty(obj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(obj, '__v_skip')) {\n Object.defineProperty(obj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === 'object') {\n injectVueMarkers(obj[key])\n }\n }\n }\n\n injectVueMarkers(target)\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n \n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof (signalItem as any).__subscribe === 'function'\n \n const unsubscribe = hasHook \n ? (signalItem as any).__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as any\n }\n\n const state = shallowRef(item)\n\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as any\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":"2JAMA,IAAM,EAAN,cAAqC,EAAA,cAAwB,CAC3D,gBAAqC,WAErC,SAA2C,EAAW,EAAkB,CACtE,IAAM,EAAoB,GAAa,CACjC,MAAC,GAAO,OAAO,GAAQ,UAAY,OAAO,YAAY,GAqB1D,CAnBK,QAAQ,IAAI,EAAK,aAAa,GACjC,OAAO,eAAe,EAAK,cAAe,CACxC,QACU,GACC,KAAK,WAAa,CACvB,GAAI,CACF,KAAK,UAAU,CAAa,CAC9B,MAAY,CACV,OAAO,OAAO,CAAwC,CACxD,CACA,EAAG,CACL,EAAG,iCAAiC,EAGxC,aAAc,GACd,WAAY,EACd,CAAC,EAGE,QAAQ,IAAI,EAAK,UAAU,GAC9B,OAAO,eAAe,EAAK,WAAY,CACrC,QAAW,GACX,aAAc,GACd,WAAY,EACd,CAAC,EAGH,IAAK,IAAM,KAAO,EACZ,OAAO,UAAU,eAAe,KAAK,EAAK,CAAG,GAAK,OAAO,EAAI,IAAS,UACxE,EAAiB,EAAI,EAAI,CAL1B,CAQL,EAEA,EAAiB,CAAM,EACvB,IAAM,EAAgB,MAAM,SAAS,EAAQ,CAAI,EACjD,OAAO,CACT,CAMA,IAAc,EAAyE,CACrF,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,WAAA,CAAkB,CAAI,EAKxB,GAFiB,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAEjF,CACZ,IAAM,EAAc,EAKd,GAAA,EAAA,EAAA,WAAA,CADe,KAAK,YAAc,EAAW,KAC1B,CAAY,EAM/B,EAFU,gBAAiB,GAAc,OAAQ,EAAmB,aAAgB,WAGrF,EAAmB,gBAAkB,CACpC,EAAM,MAAQ,EAAW,OACzB,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EACD,EAAW,UAAW,GAAa,CACjC,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAQL,OANA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,EAG7B,CACT,CAEA,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,CAAI,EAE7B,GAAI,gBAAiB,GAAQ,OAAQ,EAAiC,aAAgB,WAAY,CAChG,IAAM,EAAgB,EAAiC,gBAAoD,EACzG,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,GAED,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,CAEtC,CAEA,OAAO,CACT,CACF"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних маркеров Vue и Ядра на прокси-объектах\n */\ninterface IVueProxyExtensions {\n __subscribe?: (cb: () => void) => CleanupFn;\n __v_skip?: boolean;\n}\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n // Внутренний кэш оригинального прокси, который будет доступен в замыкании макрозадачи подписки\n let originalProxy: T\n\n const injectVueMarkers = (obj: unknown): void => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in (obj as object)) return\n\n const targetObj = obj as Record<string, unknown> & IVueProxyExtensions\n\n if (!Reflect.has(targetObj, '__subscribe')) {\n Object.defineProperty(targetObj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(targetObj, '__v_skip')) {\n Object.defineProperty(targetObj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in targetObj) {\n if (Object.prototype.hasOwnProperty.call(targetObj, key)) {\n const value = targetObj[key]\n if (value !== null && typeof value === 'object') {\n injectVueMarkers(value)\n }\n }\n }\n }\n\n injectVueMarkers(target)\n originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n type ReturnType = T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>\n\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as ReturnType\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = item as unknown as ISignalLike<unknown>\n\n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный системный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof signalItem.__subscribe === 'function'\n\n const unsubscribe = hasHook && signalItem.__subscribe\n ? signalItem.__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as ReturnType\n }\n\n const state = shallowRef(item)\n const potentialProxy = item as Record<string, unknown> & IVueProxyExtensions\n\n if ('__subscribe' in potentialProxy && typeof potentialProxy.__subscribe === 'function') {\n const unsubscribe = potentialProxy.__subscribe(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as ReturnType\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":"2JAcA,IAAM,EAAN,cAAqC,EAAA,cAAwB,CAC3D,gBAAqC,WAErC,SAA2C,EAAW,EAAkB,CAEtE,IAAI,EAEE,EAAoB,GAAuB,CAC/C,GAAI,CAAC,GAAO,OAAO,GAAQ,UAAY,OAAO,YAAa,EAAgB,OAE3E,IAAM,EAAY,EAEb,QAAQ,IAAI,EAAW,aAAa,GACvC,OAAO,eAAe,EAAW,cAAe,CAC9C,QACU,GACC,KAAK,WAAa,CACvB,GAAI,CACF,KAAK,UAAU,CAAa,CAC9B,MAAY,CACV,OAAO,OAAO,CAAwC,CACxD,CACA,EAAG,CACL,EAAG,iCAAiC,EAGxC,aAAc,GACd,WAAY,EACd,CAAC,EAGE,QAAQ,IAAI,EAAW,UAAU,GACpC,OAAO,eAAe,EAAW,WAAY,CAC3C,QAAW,GACX,aAAc,GACd,WAAY,EACd,CAAC,EAGH,IAAK,IAAM,KAAO,EAChB,GAAI,OAAO,UAAU,eAAe,KAAK,EAAW,CAAG,EAAG,CACxD,IAAM,EAAQ,EAAU,GACF,OAAO,GAAU,UAAnC,GACF,EAAiB,CAAK,CAE1B,CAEJ,EAIA,OAFA,EAAiB,CAAM,EACvB,EAAgB,MAAM,SAAS,EAAQ,CAAI,EACpC,CACT,CAMA,IAAc,EAAyE,CAGrF,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,WAAA,CAAkB,CAAI,EAKxB,GAFiB,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAEjF,CACZ,IAAM,EAAa,EAKb,GAAA,EAAA,EAAA,WAAA,CADe,KAAK,YAAc,EAAW,KAC1B,CAAY,EAM/B,EAFU,gBAAiB,GAAc,OAAO,EAAW,aAAgB,YAElD,EAAW,YACtC,EAAW,gBAAkB,CAC7B,EAAM,MAAQ,EAAW,OACzB,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EACC,EAAW,UAAW,GAAa,CACnC,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAQH,OANA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,EAG7B,CACT,CAEA,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,CAAI,EACvB,EAAiB,EAEvB,GAAI,gBAAiB,GAAkB,OAAO,EAAe,aAAgB,WAAY,CACvF,IAAM,EAAc,EAAe,gBAAkB,EACnD,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,GAED,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,CAEtC,CAEA,OAAO,CACT,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAgF,UAAU,EAAc,MAAM,KAAK,CAAA;AAE1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,cAAM,sBAAuB,SAAQ,uBAAuB;IAC1D,UAAmB,eAAe,SAAa;IAE/B,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IA2CvE;;;OAGG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CAsDvF;AAED,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAgF,UAAU,EAAc,MAAM,KAAK,CAAA;AAE1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAUrD,cAAM,sBAAuB,SAAQ,uBAAuB;IAC1D,UAAmB,eAAe,SAAa;IAE/B,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IAmDvE;;;OAGG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CAyDvF;AAED,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,CAAA"}
@@ -5,47 +5,48 @@ import { getCurrentInstance as n, getCurrentScope as r, onScopeDispose as i, onU
5
5
  var c = class extends e {
6
6
  frameworkPrefix = "vue-auto";
7
7
  reactive(e, t) {
8
- let n = (e) => {
9
- if (!(!e || typeof e != "object" || Symbol.iterator in e)) {
10
- Reflect.has(e, "__subscribe") || Object.defineProperty(e, "__subscribe", {
11
- get: () => (e) => this.effect(() => {
12
- try {
13
- JSON.stringify(r);
14
- } catch {
15
- Object.values(r);
16
- }
17
- e();
18
- }, "vue-proxy-internal-subscription"),
19
- configurable: !0,
20
- enumerable: !1
21
- }), Reflect.has(e, "__v_skip") || Object.defineProperty(e, "__v_skip", {
22
- get: () => !0,
23
- configurable: !0,
24
- enumerable: !1
25
- });
26
- for (let t in e) Object.prototype.hasOwnProperty.call(e, t) && typeof e[t] == "object" && n(e[t]);
8
+ let n, r = (e) => {
9
+ if (!e || typeof e != "object" || Symbol.iterator in e) return;
10
+ let t = e;
11
+ Reflect.has(t, "__subscribe") || Object.defineProperty(t, "__subscribe", {
12
+ get: () => (e) => this.effect(() => {
13
+ try {
14
+ JSON.stringify(n);
15
+ } catch {
16
+ Object.values(n);
17
+ }
18
+ e();
19
+ }, "vue-proxy-internal-subscription"),
20
+ configurable: !0,
21
+ enumerable: !1
22
+ }), Reflect.has(t, "__v_skip") || Object.defineProperty(t, "__v_skip", {
23
+ get: () => !0,
24
+ configurable: !0,
25
+ enumerable: !1
26
+ });
27
+ for (let e in t) if (Object.prototype.hasOwnProperty.call(t, e)) {
28
+ let n = t[e];
29
+ typeof n == "object" && n && r(n);
27
30
  }
28
31
  };
29
- n(e);
30
- let r = super.reactive(e, t);
31
- return r;
32
+ return r(e), n = super.reactive(e, t), n;
32
33
  }
33
34
  use(e) {
34
35
  if (typeof e != "object" || !e) return o(e);
35
36
  if ("subscribe" in e && typeof e.subscribe == "function") {
36
- let t = e, c = o(this.untrack(() => t.value)), l = "__subscribe" in t && typeof t.__subscribe == "function" ? t.__subscribe(() => {
37
+ let t = e, c = o(this.untrack(() => t.value)), l = "__subscribe" in t && typeof t.__subscribe == "function" && t.__subscribe ? t.__subscribe(() => {
37
38
  c.value = t.value, s(c);
38
39
  }) : t.subscribe((e) => {
39
40
  c.value = e, s(c);
40
41
  });
41
42
  return n() ? a(() => l()) : r() && i(() => l()), c;
42
43
  }
43
- let t = o(e);
44
- if ("__subscribe" in e && typeof e.__subscribe == "function") {
45
- let o = e.__subscribe(() => {
44
+ let t = o(e), c = e;
45
+ if ("__subscribe" in c && typeof c.__subscribe == "function") {
46
+ let e = c.__subscribe(() => {
46
47
  s(t);
47
48
  });
48
- n() ? a(() => o()) : r() && i(() => o());
49
+ n() ? a(() => e()) : r() && i(() => e());
49
50
  }
50
51
  return t;
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n const injectVueMarkers = (obj: any) => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in obj) return\n\n if (!Reflect.has(obj, '__subscribe')) {\n Object.defineProperty(obj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(obj, '__v_skip')) {\n Object.defineProperty(obj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === 'object') {\n injectVueMarkers(obj[key])\n }\n }\n }\n\n injectVueMarkers(target)\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n \n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof (signalItem as any).__subscribe === 'function'\n \n const unsubscribe = hasHook \n ? (signalItem as any).__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as any\n }\n\n const state = shallowRef(item)\n\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as any\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":";;;;AAMA,IAAM,IAAN,cAAqC,EAAwB;CAC3D,kBAAqC;CAErC,SAA2C,GAAW,GAAkB;EACtE,IAAM,KAAoB,MAAa;GACjC,OAAC,KAAO,OAAO,KAAQ,YAAY,OAAO,YAAY,IAqB1D;IAnBK,QAAQ,IAAI,GAAK,aAAa,KACjC,OAAO,eAAe,GAAK,eAAe;KACxC,YACU,MACC,KAAK,aAAa;MACvB,IAAI;OACF,KAAK,UAAU,CAAa;MAC9B,QAAY;OACV,OAAO,OAAO,CAAwC;MACxD;MACA,EAAG;KACL,GAAG,iCAAiC;KAGxC,cAAc;KACd,YAAY;IACd,CAAC,GAGE,QAAQ,IAAI,GAAK,UAAU,KAC9B,OAAO,eAAe,GAAK,YAAY;KACrC,WAAW;KACX,cAAc;KACd,YAAY;IACd,CAAC;IAGH,KAAK,IAAM,KAAO,GAChB,AAAI,OAAO,UAAU,eAAe,KAAK,GAAK,CAAG,KAAK,OAAO,EAAI,MAAS,YACxE,EAAiB,EAAI,EAAI;GAL1B;EAQL;EAEA,EAAiB,CAAM;EACvB,IAAM,IAAgB,MAAM,SAAS,GAAQ,CAAI;EACjD,OAAO;CACT;CAMA,IAAc,GAAyE;EACrF,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAW,CAAI;EAKxB,IAFiB,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAEjF;GACZ,IAAM,IAAc,GAKd,IAAQ,EADO,KAAK,cAAc,EAAW,KAC1B,CAAY,GAM/B,IAFU,iBAAiB,KAAc,OAAQ,EAAmB,eAAgB,aAGrF,EAAmB,kBAAkB;IAEpC,AADA,EAAM,QAAQ,EAAW,OACzB,EAAW,CAAK;GAClB,CAAC,IACD,EAAW,WAAW,MAAa;IAEjC,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;GAClB,CAAC;GAQL,OANI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC,GAG7B;EACT;EAEA,IAAM,IAAQ,EAAW,CAAI;EAE7B,IAAI,iBAAiB,KAAQ,OAAQ,EAAiC,eAAgB,YAAY;GAChG,IAAM,IAAgB,EAAiC,kBAAoD;IACzG,EAAW,CAAK;GAClB,CAAC;GAED,AAAI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC;EAEtC;EAEA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних маркеров Vue и Ядра на прокси-объектах\n */\ninterface IVueProxyExtensions {\n __subscribe?: (cb: () => void) => CleanupFn;\n __v_skip?: boolean;\n}\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n // Внутренний кэш оригинального прокси, который будет доступен в замыкании макрозадачи подписки\n let originalProxy: T\n\n const injectVueMarkers = (obj: unknown): void => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in (obj as object)) return\n\n const targetObj = obj as Record<string, unknown> & IVueProxyExtensions\n\n if (!Reflect.has(targetObj, '__subscribe')) {\n Object.defineProperty(targetObj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(targetObj, '__v_skip')) {\n Object.defineProperty(targetObj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in targetObj) {\n if (Object.prototype.hasOwnProperty.call(targetObj, key)) {\n const value = targetObj[key]\n if (value !== null && typeof value === 'object') {\n injectVueMarkers(value)\n }\n }\n }\n }\n\n injectVueMarkers(target)\n originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n type ReturnType = T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>\n\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as ReturnType\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = item as unknown as ISignalLike<unknown>\n\n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный системный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof signalItem.__subscribe === 'function'\n\n const unsubscribe = hasHook && signalItem.__subscribe\n ? signalItem.__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as ReturnType\n }\n\n const state = shallowRef(item)\n const potentialProxy = item as Record<string, unknown> & IVueProxyExtensions\n\n if ('__subscribe' in potentialProxy && typeof potentialProxy.__subscribe === 'function') {\n const unsubscribe = potentialProxy.__subscribe(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as ReturnType\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":";;;;AAcA,IAAM,IAAN,cAAqC,EAAwB;CAC3D,kBAAqC;CAErC,SAA2C,GAAW,GAAkB;EAEtE,IAAI,GAEE,KAAoB,MAAuB;GAC/C,IAAI,CAAC,KAAO,OAAO,KAAQ,YAAY,OAAO,YAAa,GAAgB;GAE3E,IAAM,IAAY;GAqBlB,AAnBK,QAAQ,IAAI,GAAW,aAAa,KACvC,OAAO,eAAe,GAAW,eAAe;IAC9C,YACU,MACC,KAAK,aAAa;KACvB,IAAI;MACF,KAAK,UAAU,CAAa;KAC9B,QAAY;MACV,OAAO,OAAO,CAAwC;KACxD;KACA,EAAG;IACL,GAAG,iCAAiC;IAGxC,cAAc;IACd,YAAY;GACd,CAAC,GAGE,QAAQ,IAAI,GAAW,UAAU,KACpC,OAAO,eAAe,GAAW,YAAY;IAC3C,WAAW;IACX,cAAc;IACd,YAAY;GACd,CAAC;GAGH,KAAK,IAAM,KAAO,GAChB,IAAI,OAAO,UAAU,eAAe,KAAK,GAAW,CAAG,GAAG;IACxD,IAAM,IAAQ,EAAU;IACxB,AAAsB,OAAO,KAAU,YAAnC,KACF,EAAiB,CAAK;GAE1B;EAEJ;EAIA,OAFA,EAAiB,CAAM,GACvB,IAAgB,MAAM,SAAS,GAAQ,CAAI,GACpC;CACT;CAMA,IAAc,GAAyE;EAGrF,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAW,CAAI;EAKxB,IAFiB,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAEjF;GACZ,IAAM,IAAa,GAKb,IAAQ,EADO,KAAK,cAAc,EAAW,KAC1B,CAAY,GAM/B,IAFU,iBAAiB,KAAc,OAAO,EAAW,eAAgB,cAElD,EAAW,cACtC,EAAW,kBAAkB;IAE7B,AADA,EAAM,QAAQ,EAAW,OACzB,EAAW,CAAK;GAClB,CAAC,IACC,EAAW,WAAW,MAAa;IAEnC,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;GAClB,CAAC;GAQH,OANI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC,GAG7B;EACT;EAEA,IAAM,IAAQ,EAAW,CAAI,GACvB,IAAiB;EAEvB,IAAI,iBAAiB,KAAkB,OAAO,EAAe,eAAgB,YAAY;GACvF,IAAM,IAAc,EAAe,kBAAkB;IACnD,EAAW,CAAK;GAClB,CAAC;GAED,AAAI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC;EAEtC;EAEA,OAAO;CACT;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "2.6.0",
3
+ "version": "2.6.2-beta.0",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },