@pravosleva/reactive-engine 1.8.0-beta → 1.8.2-beta

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.
@@ -37,7 +37,7 @@ export declare class ReactiveEngineCore {
37
37
  */
38
38
  batch(fn: () => void): void;
39
39
  /**
40
- * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ
40
+ * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ (ОТКАЗОУСТОЙЧИВЫЙ)
41
41
  */
42
42
  protected flushEffects(): void;
43
43
  /**
@@ -87,31 +87,30 @@ export declare class ReactiveEngine extends ReactiveEngineCore {
87
87
  }, optionsOrName?: string | ResourceOptions<T, S>): any;
88
88
  }
89
89
  /**
90
- * 🤖 AUTOMATIC BATCHING REACTIVE ENGINE
90
+ * 🤖 AUTOMATIC BATCHING ENTERPRISE REACTIVE ENGINE (v1.8.2-beta)
91
91
  *
92
- * Расширение Enterprise-ядра, реализующее аппаратный автобатчинг микрозадач.
93
- * Автоматически склеивает множественные каскадные мутации стейта (включая асинхронные цепочки после await)
94
- * и выполняет побочные эффекты ровно 1 раз на выходе в Event Loop без ручного вызова engine.batch().
92
+ * Полностью автономный асингулярный движок с топологической сортировкой графа,
93
+ * каскадным уничтожением вложенных эффектов и циклом схождения inner-записей.
95
94
  */
96
95
  export declare class ReactiveEngineAutomatic extends ReactiveEngine {
97
96
  private isFlushScheduled;
97
+ protected nodeDepths: WeakMap<any, number>;
98
98
  constructor(options?: {
99
99
  logger?: EngineLoggerOptions;
100
100
  });
101
101
  /**
102
- * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ АВТОМАТИЧЕСКОГО ДВИЖКА
103
- * Внедряет аппаратный микробатчинг (queueMicrotask) прямо в мост __subscribe фреймворков,
104
- * защищая Vue 3 triggerRef() от каскадного дребезга кадров рендеринга.
102
+ * ВЫЧИСЛЕНИЕ ГЛУБИНЫ УЗЛА ДЛЯ ТОПОЛОГИЧЕСКОЙ СОРТИРОВКИ
105
103
  */
106
- reactive<T extends object>(target: T, name?: string): T;
104
+ protected getNodeDepth(node: any): number;
107
105
  /**
108
- * ВНУТРЕННИЙ СБРОС ОЧЕРЕДИ С ПОДДЕРЖКОЙ МИКРОБАЧИНГА МАССИВОВ
106
+ * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (ИЕРАРХИЯ + ТОПОЛОГИЯ)
109
107
  */
110
- protected flushEffects(): void;
108
+ effect(fn: () => void | (() => void), label?: string): () => void;
111
109
  /**
112
- * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (АСИНХРОННЫЙ АВТОБАТЧИНГ ПРИМИТИВОВ)
110
+ * АСИНХРОННЫЙ ЦИКЛ СХОЖДЕНИЯ ГРАФА (CONVERGENCE LOOP)
111
+ * Прогоняет эффекты строго по топологической глубине и обрабатывает Inner Writes на месте.
113
112
  */
114
- effect(fn: () => void | (() => void), label?: string): () => void;
113
+ protected flushEffects(): void;
115
114
  }
116
115
  interface ReactiveEngineOptions {
117
116
  logger?: EngineLoggerOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"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"}
package/dist/core.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=class{frameworkPrefix=`core`;activeConsumer=null;subscriberId=0;batchDepth=0;pendingEffects=new Set;allEffects=new Set;computedCache=new Map;computed(e,t){let n=this;if(n.computedCache.has(e)){let t=n.computedCache.get(e)?.deref();if(t)return t}let r=t||`unnamed_computed`,i,a=new Set,o={id:++n.subscriberId,isDirty:!0,cleanups:new Set,markDirty(){this.isDirty||(this.isDirty=!0,Array.from(a).forEach(e=>{e!==n.activeConsumer&&e.markDirty()}))}},s={get value(){if(n.activeConsumer){let e=n.activeConsumer;a.has(e)||(a.add(e),e.cleanups.add(()=>a.delete(e)))}if(o.isDirty){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e());let r=n.activeConsumer;n.activeConsumer=o;try{i=e(),o.isDirty=!1}finally{n.activeConsumer=r}}return i},subscribe:e=>n.effect(()=>e(s.value),`computed:use:${r}`),destroy(){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e()),a.clear(),n.computedCache.delete(e);for(let[e,t]of n.computedCache.entries())t.deref()===s&&n.computedCache.delete(e)}};return n.cleanupRegistry&&n.cleanupRegistry.register(s,()=>s.destroy()),n.computedCache.set(e,new WeakRef(s)),s}effect(e,t){let n=this,r={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(r),n.batchDepth===0&&n.flushEffects()},run(){let t=Array.from(r.cleanups);r.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let i=n.activeConsumer;n.activeConsumer=r;try{let t=e();typeof t==`function`&&r.cleanups.add(t)}catch(e){console.error(`[Reactive Error] Ошибка при выполнении тела эффекта:`,e)}finally{n.activeConsumer=i}}};return n.allEffects.add(r),r.run(),()=>{Array.from(r.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),r.cleanups.clear(),n.pendingEffects.delete(r),n.allEffects.delete(r)}}signal(e,t){let n=this,r=e,i=new Set,a=typeof t==`string`?{name:t}:t||{},o=a.name||`unnamed_signal`;return{get value(){if(n.activeConsumer){let e=n.activeConsumer;i.has(e)||(i.add(e),e.cleanups.add(()=>i.delete(e)))}return r},set value(e){if(a?.validate){let t=a.validate(e);if(t!==!0){console.error(`[Reactive Engine: Validation Error] ${t}`);return}}if((e===null||typeof e!=`object`&&typeof e!=`function`)&&r===e)return;let t=r;r=e,n.onSignalChange?.(o,e,t),Array.from(i).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})},subscribe(e){return n.effect(()=>e(this.value),`use:${o}`)}}}batch(e){this.batchDepth++;try{e()}finally{this.batchDepth--,this.batchDepth===0&&this.flushEffects()}}flushEffects(){let e=Array.from(this.pendingEffects);this.pendingEffects.clear(),e.forEach(e=>{e.run()})}untrack(e){let t=this.activeConsumer;this.activeConsumer=null;try{return e()}finally{this.activeConsumer=t}}},t=class extends e{services=new Map;factories=new Map;proxyCache=new WeakMap;loggerOptions;pendingLogQueue=[];signalMutationCounts=new Map;lastComputedDurations=new Map;effectExecutionCounts=new Map;batchTickCounts=0;lastTransactionDuration=null;constructor(e){super(),this.loggerOptions=e?.logger}reactive(e,t=`reactive`){if(this.proxyCache.has(e))return this.proxyCache.get(e);let n=this,r=new Map,i=!1,a=new Proxy(e,{get(e,o,s){if(o===`__subscribe`)return e=>{let t=!1;return n.effect(()=>{try{JSON.stringify(a)}catch{Object.values(a)}typeof window<`u`&&(window.__VUE__||globalThis.__VUE__||e.toString().includes(`triggerRef`))?t||(t=!0,queueMicrotask(()=>{t=!1,e()})):e()},`framework-proxy-internal-subscription`)};if(n.activeConsumer){let e=n.activeConsumer;r.has(o)||r.set(o,new Map);let t=r.get(o);if(!t.has(e)){let n=()=>{t.delete(e)};t.set(e,n),e.cleanups.add(n)}}if(Array.isArray(e)&&typeof o==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(o)){let t=e[o];return function(...a){n.batchDepth++,i=!0;let s=t.apply(e,a);return i=!1,r.forEach((e,t)=>{t!==o&&Array.from(e.keys()).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})}),n.batchDepth--,n.batchDepth===0&&n.flushEffects(),s}}let c=Reflect.get(e,o,s);return typeof c==`object`&&c?n.reactive(c,`${t}.${String(o)}`):c},set(e,a,o,s){let c=Reflect.get(e,a,s);if(c===o||(Reflect.set(e,a,o,s),n.onSignalChange?.(`${t}.${String(a)}`,o,c),i))return!0;let l=r.get(a),u=l?Array.from(l.keys()):[];if(Array.isArray(e)){let e=r.get(`length`);e&&u.push(...Array.from(e.keys()))}return u.forEach(e=>{e!==n.activeConsumer&&e.markDirty()}),typeof n.queueLog==`function`&&n.queueLog(`reactive`,`${t}.${String(a)}`,{action:`set`,property:String(a),oldValue:c,newValue:o}),!0}});return this.proxyCache.set(e,a),a}provide(e,t){typeof t==`function`&&(!t.prototype||t.name===`mockConstructor`||t._isMockFunction)?this.factories.set(e,t):this.services.set(e,t)}inject(e){if(!e)throw Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`);let t=e;if(this.services.has(t))return this.services.get(t);try{let n=this.factories.get(t);if(n){let e=n(this);return this.services.set(t,e),e}if(typeof e==`function`&&e.prototype){let n=new e(this);return this.services.set(t,n),n}throw Error(`Service not found: ${String(e)}`)}catch{throw Error(`[DI Error]: Не удалось создать сервис ${String(e)}.`)}}queueLog(e,t,n){this.loggerOptions?.isEnabled&&(this.pendingLogQueue.push({type:e,name:t,detail:n}),this.batchDepth===0&&this.flushLogs())}flushLogs(){!this.loggerOptions?.isEnabled||this.pendingLogQueue.length===0||(this.pendingLogQueue=[])}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this.signal({data:null,loading:!0,error:null,isRetrying:!1},`resource:state:${r}`),a=this,o=null,s=async(t,n)=>{if(!n.aborted){a.untrack(()=>{i.value={data:i.value.data,loading:!0,error:null,isRetrying:!1}});try{let r=await e(t,n);n.aborted||a.untrack(()=>{i.value={data:r,loading:!1,error:null,isRetrying:!1}})}catch(e){n.aborted||a.untrack(()=>{i.value={data:null,loading:!1,error:e,isRetrying:!1}})}}};return this.effect(()=>{let e=t?t.value:void 0;return o&&o.abort(),o=new AbortController,s(e,o.signal),()=>{o&&o.abort()}}),{get data(){return i.value.data},get loading(){return i.value.loading},get error(){return i.value.error},get value(){return i.value},refetch:()=>{o&&o.abort(),o=new AbortController,s(t?t.value:void 0,o.signal)},subscribe:e=>i.subscribe(e)}}},n=class extends t{isFlushScheduled=!1;constructor(e){super(e),this.frameworkPrefix=`auto-core`}reactive(e,t=`reactive`){let n=this;Reflect.has(e,`__subscribe`)||Object.defineProperty(e,"__subscribe",{get:()=>e=>{let t=!1;return n.effect(()=>{try{JSON.stringify(r)}catch{Object.values(r)}t||(t=!0,queueMicrotask(()=>{t=!1,e()}))},`auto-framework-proxy-internal-subscription`)},configurable:!0,enumerable:!1});let r=super.reactive(e,t);return r}flushEffects(){this.batchDepth>0||this.isFlushScheduled||(this.isFlushScheduled=!0,queueMicrotask(()=>{this.isFlushScheduled=!1,super.flushEffects()}))}effect(e,t){let n=this,r={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(r),n.flushEffects()},run(){let t=Array.from(r.cleanups);r.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let i=n.activeConsumer;n.activeConsumer=r;try{let t=e();typeof t==`function`&&r.cleanups.add(t)}finally{n.activeConsumer=i}}};return n.allEffects.add(r),r.run(),()=>{Array.from(r.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),r.cleanups.clear(),n.pendingEffects.delete(r),n.allEffects.delete(r)}}},r=class extends n{autoLogQueue=[];isHardFlushScheduled=!1;constructor(e){let t={...e,logger:{isEnabled:!0,traceTime:!0,isCoreOptimizationDebugEnabled:!0,instanceName:e?.logger?.instanceName||`AUTOMATIC_HARD_CORE`,filter:e?.logger?.filter}};super(t),this.frameworkPrefix=`auto-hard-core`}queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,detail:n})}flushLogs(){if(this.autoLogQueue.length===0)return;let e={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;`};console.groupCollapsed(`%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #aaa; font-weight: normal;`),this.autoLogQueue.forEach(t=>{let n=``;if(t.type===`signal`){let e=t.detail;n=` 🔄 Изменение: [${String(e.from)} -> ${String(e.to)}]`}else if(t.type===`computed`)n=` 🧮 Расчет кэша (${t.detail.duration})`;else if(t.type===`effect`){let e=t.detail;n=e?.isTriggered?` ⚡️ Ререндер/Вызов (${e.duration||`0ms`})`:` 🟢 Инициализация подписки`}else if(t.type===`resource`){let e=t.detail;n=e.loading?` ⏳ ЗАГРУЗКА СЕТИ`:e.error?` 🔴 ОШИБКА`:` 🟢 УСПЕШНО ОТВЕТИЛ`}console.groupCollapsed(`%c${t.type.toUpperCase()}%c [${t.name}]%c${n}`,e[t.type]||e.signal,`color: #aaa; font-weight: bold;`,`color: #42b883; font-weight: bold;`),console.log(`Детали операции:`,t.detail),console.groupEnd()}),console.groupEnd(),this.autoLogQueue=[]}flushEffects(){this.batchDepth>0||this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>{this.isHardFlushScheduled=!1,this.flushLogs(),super.flushEffects()}))}effect(e,t){let n=this,r=t||`unnamed_effect`,i=!0;n.queueLog(`effect`,r,{isTriggered:!1,phase:`mount`});let a={id:++n.subscriberId,label:r,cleanups:new Set,markDirty(){n.pendingEffects.add(a),n.flushEffects()},run(){let t=typeof performance<`u`?performance.now():0,o=Array.from(a.cleanups);a.cleanups.clear(),o.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let s=n.activeConsumer;n.activeConsumer=a;try{let t=e();typeof t==`function`&&a.cleanups.add(t)}finally{if(n.activeConsumer=s,!i&&t&&typeof n.queueLog==`function`){let e=performance.now()-t;n.queueLog(`effect`,r,{isTriggered:!0,phase:`update`,duration:`${e.toFixed(3)}ms`})}i=!1}}};return n.allEffects.add(a),a.run(),()=>{Array.from(a.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),a.cleanups.clear(),n.pendingEffects.delete(a),n.allEffects.delete(a),n.queueLog(`effect`,r,{phase:`unmount`})}}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this;return super.resource(async(t,n)=>{i.queueLog(`resource`,r,{loading:!0,error:null,data:null});try{let a=await e(t,n);return i.queueLog(`resource`,r,{loading:!1,error:null,data:a}),a}catch(e){throw i.queueLog(`resource`,r,{loading:!1,error:e,data:null}),e}},t,n)}reactive(e,t=`reactive`){let n=this,r=super.reactive(e,t);return new Proxy(r,{get(e,r,i){let a=Reflect.get(e,r,i);return typeof a==`object`&&a?n.reactive(a,`${t}.${String(r)}`):a},set(e,r,i,a){let o=Reflect.get(e,r,a);return o===i?!0:(n.queueLog(`signal`,`${t}.${String(r)}`,{from:o,to:i,subscribersCount:0,subscribers:[`framework-reactive-proxy-subscriber`]}),Reflect.set(e,r,i,a))}})}signal(e,t){let n=this,r=(typeof t==`string`?{name:t}:t||{}).name||`unnamed_signal`,i=super.signal(e,t);return{get value(){return i.value},set value(e){let t=i.value;if((e===null||typeof e!=`object`&&typeof e!=`function`)&&t===e)return;let a=n.activeConsumer,o=a&&`label`in a&&typeof a.label==`string`?a.label:`unnamed_effect`;n.queueLog(`signal`,r,{from:t,to:e,subscribersCount:0,subscribers:[o]}),i.value=e},subscribe(e){return i.subscribe(e)}}}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t);return{get value(){let e=typeof performance<`u`?performance.now():0,t=i.value;if(e){let i=performance.now()-e;n.queueLog(`computed`,r,{value:t,duration:`${i.toFixed(3)}ms`})}return t},subscribe:e=>i.subscribe(e),destroy(){i.destroy()}}}};exports.ReactiveEngine=t,exports.ReactiveEngineAutomatic=n,exports.ReactiveEngineAutomaticHard=r,exports.ReactiveEngineCore=e;
1
+ var e=class{frameworkPrefix=`core`;activeConsumer=null;subscriberId=0;batchDepth=0;pendingEffects=new Set;allEffects=new Set;computedCache=new Map;computed(e,t){let n=this;if(n.computedCache.has(e)){let t=n.computedCache.get(e)?.deref();if(t)return t}let r=t||`unnamed_computed`,i,a=new Set,o={id:++n.subscriberId,isDirty:!0,cleanups:new Set,markDirty(){this.isDirty||(this.isDirty=!0,Array.from(a).forEach(e=>{e!==n.activeConsumer&&e.markDirty()}))}},s={get value(){if(n.activeConsumer){let e=n.activeConsumer;a.has(e)||(a.add(e),e.cleanups.add(()=>a.delete(e)))}if(o.isDirty){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e());let r=n.activeConsumer;n.activeConsumer=o;try{i=e(),o.isDirty=!1}finally{n.activeConsumer=r}}return i},subscribe:e=>n.effect(()=>e(s.value),`computed:use:${r}`),destroy(){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e()),a.clear(),n.computedCache.delete(e);for(let[e,t]of n.computedCache.entries())t.deref()===s&&n.computedCache.delete(e)}};return n.cleanupRegistry&&n.cleanupRegistry.register(s,()=>s.destroy()),n.computedCache.set(e,new WeakRef(s)),s}effect(e,t){let n=this,r={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(r),n.batchDepth===0&&n.flushEffects()},run(){let t=Array.from(r.cleanups);r.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let i=n.activeConsumer;n.activeConsumer=r;try{let t=e();typeof t==`function`&&r.cleanups.add(t)}catch(e){console.error(`[Reactive Error] Ошибка при выполнении тела эффекта:`,e)}finally{n.activeConsumer=i}}};return n.allEffects.add(r),r.run(),()=>{Array.from(r.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),r.cleanups.clear(),n.pendingEffects.delete(r),n.allEffects.delete(r)}}signal(e,t){let n=this,r=e,i=new Set,a=typeof t==`string`?{name:t}:t||{},o=a.name||`unnamed_signal`;return{get value(){if(n.activeConsumer){let e=n.activeConsumer;i.has(e)||(i.add(e),e.cleanups.add(()=>i.delete(e)))}return r},set value(e){if(a?.validate){let t=a.validate(e);if(t!==!0){console.error(`[Reactive Engine: Validation Error] ${t}`);return}}if((e===null||typeof e!=`object`&&typeof e!=`function`)&&r===e)return;let t=r;r=e,n.onSignalChange?.(o,e,t),Array.from(i).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})},subscribe(e){return n.effect(()=>e(this.value),`use:${o}`)}}}batch(e){this.batchDepth++;try{e()}finally{this.batchDepth--,this.batchDepth===0&&this.flushEffects()}}flushEffects(){let e=Array.from(this.pendingEffects);this.pendingEffects.clear(),e.forEach(e=>{try{e.run()}catch(e){console.error(`[Reactive Engine: Effect Execution Error]`,e)}})}untrack(e){let t=this.activeConsumer;this.activeConsumer=null;try{return e()}finally{this.activeConsumer=t}}},t=class extends e{services=new Map;factories=new Map;proxyCache=new WeakMap;loggerOptions;pendingLogQueue=[];signalMutationCounts=new Map;lastComputedDurations=new Map;effectExecutionCounts=new Map;batchTickCounts=0;lastTransactionDuration=null;constructor(e){super(),this.loggerOptions=e?.logger}reactive(e,t=`reactive`){if(this.proxyCache.has(e))return this.proxyCache.get(e);let n=this,r=new Map,i=!1,a=new Proxy(e,{get(e,o,s){if(o===`__subscribe`)return e=>{let t=!1;return n.effect(()=>{try{JSON.stringify(a)}catch{Object.values(a)}typeof window<`u`&&(window.__VUE__||globalThis.__VUE__||e.toString().includes(`triggerRef`))?t||(t=!0,queueMicrotask(()=>{t=!1,e()})):e()},`framework-proxy-internal-subscription`)};if(n.activeConsumer){let e=n.activeConsumer;r.has(o)||r.set(o,new Map);let t=r.get(o);if(!t.has(e)){let n=()=>{t.delete(e)};t.set(e,n),e.cleanups.add(n)}}if(Array.isArray(e)&&typeof o==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(o)){let t=e[o];return function(...a){n.batchDepth++,i=!0;let s=t.apply(e,a);return i=!1,r.forEach((e,t)=>{t!==o&&Array.from(e.keys()).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})}),n.batchDepth--,n.batchDepth===0&&n.flushEffects(),s}}let c=Reflect.get(e,o,s);return typeof c==`object`&&c?n.reactive(c,`${t}.${String(o)}`):c},set(e,a,o,s){let c=Reflect.get(e,a,s);if(c===o||(Reflect.set(e,a,o,s),n.onSignalChange?.(`${t}.${String(a)}`,o,c),i))return!0;let l=r.get(a),u=l?Array.from(l.keys()):[];if(Array.isArray(e)){let e=r.get(`length`);e&&u.push(...Array.from(e.keys()))}return u.forEach(e=>{e!==n.activeConsumer&&e.markDirty()}),typeof n.queueLog==`function`&&n.queueLog(`reactive`,`${t}.${String(a)}`,{action:`set`,property:String(a),oldValue:c,newValue:o}),!0}});return this.proxyCache.set(e,a),a}provide(e,t){typeof t==`function`&&(!t.prototype||t.name===`mockConstructor`||t._isMockFunction)?this.factories.set(e,t):this.services.set(e,t)}inject(e){if(!e)throw Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`);let t=e;if(this.services.has(t))return this.services.get(t);try{let n=this.factories.get(t);if(n){let e=n(this);return this.services.set(t,e),e}if(typeof e==`function`&&e.prototype){let n=new e(this);return this.services.set(t,n),n}throw Error(`Service not found: ${String(e)}`)}catch{throw Error(`[DI Error]: Не удалось создать сервис ${String(e)}.`)}}queueLog(e,t,n){this.loggerOptions?.isEnabled&&(this.pendingLogQueue.push({type:e,name:t,detail:n}),this.batchDepth===0&&this.flushLogs())}flushLogs(){!this.loggerOptions?.isEnabled||this.pendingLogQueue.length===0||(this.pendingLogQueue=[])}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this.signal({data:null,loading:!0,error:null,isRetrying:!1},`resource:state:${r}`),a=this,o=null,s=async(t,n)=>{if(!n.aborted){a.untrack(()=>{i.value={data:i.value.data,loading:!0,error:null,isRetrying:!1}});try{let r=await e(t,n);n.aborted||a.untrack(()=>{i.value={data:r,loading:!1,error:null,isRetrying:!1}})}catch(e){n.aborted||a.untrack(()=>{i.value={data:null,loading:!1,error:e,isRetrying:!1}})}}};return this.effect(()=>{let e=t?t.value:void 0;return o&&o.abort(),o=new AbortController,s(e,o.signal),()=>{o&&o.abort()}}),{get data(){return i.value.data},get loading(){return i.value.loading},get error(){return i.value.error},get value(){return i.value},refetch:()=>{o&&o.abort(),o=new AbortController,s(t?t.value:void 0,o.signal)},subscribe:e=>i.subscribe(e)}}},n=class extends t{isFlushScheduled=!1;nodeDepths=new WeakMap;constructor(e){super(e),this.frameworkPrefix=`auto-core`}getNodeDepth(e){return e?this.nodeDepths.has(e)?this.nodeDepths.get(e):1:0}effect(e,t){let n=this,r=n.activeConsumer,i={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(i),n.flushEffects()},run(){let t=Array.from(i.cleanups);i.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let r=n.activeConsumer;n.activeConsumer=i;let a=n.getNodeDepth(r)+1;n.nodeDepths.set(i,a);try{let t=e();typeof t==`function`&&i.cleanups.add(t)}finally{n.activeConsumer=r}}};return r&&r.cleanups.add(()=>{Array.from(i.cleanups).forEach(e=>{try{e()}catch{}}),i.cleanups.clear(),n.pendingEffects.delete(i),n.allEffects.delete(i)}),n.allEffects.add(i),i.run(),()=>{Array.from(i.cleanups).forEach(e=>{try{e()}catch{}}),i.cleanups.clear(),n.pendingEffects.delete(i),n.allEffects.delete(i)}}flushEffects(){this.batchDepth>0||this.isFlushScheduled||(this.isFlushScheduled=!0,queueMicrotask(()=>{this.isFlushScheduled=!1;let e=0;for(;this.pendingEffects.size>0&&e<100;){e++;let t=Array.from(this.pendingEffects).sort((e,t)=>this.getNodeDepth(e)-this.getNodeDepth(t)||e.id-t.id);this.pendingEffects.clear(),t.forEach(e=>{try{e.run()}catch(e){console.error(`[Reactive Engine Automatic: Effect Error]`,e)}})}e>=100&&console.warn(`[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.`)}))}},r=class extends n{autoLogQueue=[];isHardFlushScheduled=!1;constructor(e){let t={...e,logger:{isEnabled:!0,traceTime:!0,isCoreOptimizationDebugEnabled:!0,instanceName:e?.logger?.instanceName||`AUTOMATIC_HARD_CORE`,filter:e?.logger?.filter}};super(t),this.frameworkPrefix=`auto-hard-core`}queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,detail:n})}flushLogs(){if(this.autoLogQueue.length===0)return;let e={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;`};console.groupCollapsed(`%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #aaa; font-weight: normal;`),this.autoLogQueue.forEach(t=>{let n=``;if(t.type===`signal`){let e=t.detail;n=` 🔄 Изменение: [${String(e.from)} -> ${String(e.to)}]`}else if(t.type===`computed`)n=` 🧮 Расчет кэша (${t.detail.duration})`;else if(t.type===`effect`){let e=t.detail;n=e?.isTriggered?` ⚡️ Ререндер/Вызов (${e.duration||`0ms`})`:` 🟢 Инициализация подписки`}else if(t.type===`resource`){let e=t.detail;n=e.loading?` ⏳ ЗАГРУЗКА СЕТИ`:e.error?` 🔴 ОШИБКА`:` 🟢 УСПЕШНО ОТВЕТИЛ`}console.groupCollapsed(`%c${t.type.toUpperCase()}%c [${t.name}]%c${n}`,e[t.type]||e.signal,`color: #aaa; font-weight: bold;`,`color: #42b883; font-weight: bold;`),console.log(`Детали операции:`,t.detail),console.groupEnd()}),console.groupEnd(),this.autoLogQueue=[]}flushEffects(){this.batchDepth>0||this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>{this.isHardFlushScheduled=!1,this.flushLogs(),super.flushEffects()}))}effect(e,t){let n=this,r=t||`unnamed_effect`,i=!0;n.queueLog(`effect`,r,{isTriggered:!1,phase:`mount`});let a={id:++n.subscriberId,label:r,cleanups:new Set,markDirty(){n.pendingEffects.add(a),n.flushEffects()},run(){let t=typeof performance<`u`?performance.now():0,o=Array.from(a.cleanups);a.cleanups.clear(),o.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let s=n.activeConsumer;n.activeConsumer=a;try{let t=e();typeof t==`function`&&a.cleanups.add(t)}finally{if(n.activeConsumer=s,!i&&t&&typeof n.queueLog==`function`){let e=performance.now()-t;n.queueLog(`effect`,r,{isTriggered:!0,phase:`update`,duration:`${e.toFixed(3)}ms`})}i=!1}}};return n.allEffects.add(a),a.run(),()=>{Array.from(a.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),a.cleanups.clear(),n.pendingEffects.delete(a),n.allEffects.delete(a),n.queueLog(`effect`,r,{phase:`unmount`})}}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this;return super.resource(async(t,n)=>{i.queueLog(`resource`,r,{loading:!0,error:null,data:null});try{let a=await e(t,n);return i.queueLog(`resource`,r,{loading:!1,error:null,data:a}),a}catch(e){throw i.queueLog(`resource`,r,{loading:!1,error:e,data:null}),e}},t,n)}reactive(e,t=`reactive`){let n=this,r=super.reactive(e,t);return new Proxy(r,{get(e,r,i){let a=Reflect.get(e,r,i);return typeof a==`object`&&a?n.reactive(a,`${t}.${String(r)}`):a},set(e,r,i,a){let o=Reflect.get(e,r,a);return o===i?!0:(n.queueLog(`signal`,`${t}.${String(r)}`,{from:o,to:i,subscribersCount:0,subscribers:[`framework-reactive-proxy-subscriber`]}),Reflect.set(e,r,i,a))}})}signal(e,t){let n=this,r=(typeof t==`string`?{name:t}:t||{}).name||`unnamed_signal`,i=super.signal(e,t);return{get value(){return i.value},set value(e){let t=i.value;if((e===null||typeof e!=`object`&&typeof e!=`function`)&&t===e)return;let a=n.activeConsumer,o=a&&`label`in a&&typeof a.label==`string`?a.label:`unnamed_effect`;n.queueLog(`signal`,r,{from:t,to:e,subscribersCount:0,subscribers:[o]}),i.value=e},subscribe(e){return i.subscribe(e)}}}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t);return{get value(){let e=typeof performance<`u`?performance.now():0,t=i.value;if(e){let i=performance.now()-e;n.queueLog(`computed`,r,{value:t,duration:`${i.toFixed(3)}ms`})}return t},subscribe:e=>i.subscribe(e),destroy(){i.destroy()}}}};exports.ReactiveEngine=t,exports.ReactiveEngineAutomatic=n,exports.ReactiveEngineAutomaticHard=r,exports.ReactiveEngineCore=e;
2
2
  //# sourceMappingURL=core.cjs.map
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n // Множество активных подписчиков (потребителей: эффектов или компьютеров)\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n return {\n get value(): T {\n // ДИНАМИЧЕСКИЙ ТРЕКИНГ: Если сигнал читается внутри активного контекста\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n // Заставляем потребителя отписаться от нас при его следующем перезапуске\n consumer.cleanups.add(() => subscribers.delete(consumer))\n }\n }\n return val\n },\n set value(newValue: T) {\n // Валидатор: если возвращает строку, выводим ошибку, но запись блокируем\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue;\n (engine as any).onSignalChange?.(name, newValue, old)\n\n // ФАЗА PUSH: Рассылаем статус загрязнения вниз по течению (downstream)\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n // БАРЬЕР ОТ САМОВЫЗОВА: защищает от бесконечных циклов\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n effectsToRun.forEach(effectObj => {\n effectObj.run()\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING REACTIVE ENGINE\n *\n * Расширение Enterprise-ядра, реализующее аппаратный автобатчинг микрозадач.\n * Автоматически склеивает множественные каскадные мутации стейта (включая асинхронные цепочки после await)\n * и выполняет побочные эффекты ровно 1 раз на выходе в Event Loop без ручного вызова engine.batch().\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n // Флаг, контролирующий, взведен ли уже таймаут микрозадачи в Event Loop\n private isFlushScheduled = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ АВТОМАТИЧЕСКОГО ДВИЖКА\n * Внедряет аппаратный микробатчинг (queueMicrotask) прямо в мост __subscribe фреймворков,\n * защищая Vue 3 triggerRef() от каскадного дребезга кадров рендеринга.\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n let isFrameworkFlushScheduled = false\n\n // Регистрируем эффект ядра, следящий за изменениями Proxy\n return engine.effect(() => {\n try {\n JSON.stringify(proxyInstance)\n } catch (e) {\n Object.values(proxyInstance as Record<string, unknown>)\n }\n\n // АППАРАТНЫЙ БАРЬЕР: Склеиваем каскад синхронных flushEffects ядра\n // в ровно одно уведомление triggerRef() фреймворка на выходе в Event Loop!\n if (!isFrameworkFlushScheduled) {\n isFrameworkFlushScheduled = true\n\n queueMicrotask(() => {\n isFrameworkFlushScheduled = false\n cb() // Вызываем триггер Vue/React строго 1 раз в конце макротаска\n })\n }\n }, 'auto-framework-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const proxyInstance = super.reactive(target, name)\n return proxyInstance\n }\n\n /**\n * ВНУТРЕННИЙ СБРОС ОЧЕРЕДИ С ПОДДЕРЖКОЙ МИКРОБАЧИНГА МАССИВОВ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (АСИНХРОННЫЙ АВТОБАТЧИНГ ПРИМИТИВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n // Множество активных подписчиков (потребителей: эффектов или компьютеров)\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n return {\n get value(): T {\n // ДИНАМИЧЕСКИЙ ТРЕКИНГ: Если сигнал читается внутри активного контекста\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n // Заставляем потребителя отписаться от нас при его следующем перезапуске\n consumer.cleanups.add(() => subscribers.delete(consumer))\n }\n }\n return val\n },\n set value(newValue: T) {\n // Валидатор: если возвращает строку, выводим ошибку, но запись блокируем\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue;\n (engine as any).onSignalChange?.(name, newValue, old)\n\n // ФАЗА PUSH: Рассылаем статус загрязнения вниз по течению (downstream)\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n // БАРЬЕР ОТ САМОВЫЗОВА: защищает от бесконечных циклов\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ (ОТКАЗОУСТОЙЧИВЫЙ)\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n // Изолируем панику эффекта, позволяя соседним эффектам в очереди успешно выполниться!\n console.error('[Reactive Engine: Effect Execution Error]', error)\n }\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING ENTERPRISE REACTIVE ENGINE (v1.8.2-beta)\n *\n * Полностью автономный асингулярный движок с топологической сортировкой графа,\n * каскадным уничтожением вложенных эффектов и циклом схождения inner-записей.\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n private isFlushScheduled = false\n\n // Карта глубин зависимостей для топологической сортировки\n protected nodeDepths = new WeakMap<any, number>()\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * ВЫЧИСЛЕНИЕ ГЛУБИНЫ УЗЛА ДЛЯ ТОПОЛОГИЧЕСКОЙ СОРТИРОВКИ\n */\n protected getNodeDepth(node: any): number {\n if (!node) return 0\n if (this.nodeDepths.has(node)) return this.nodeDepths.get(node)!\n\n // По умолчанию глубина равна 1, увеличивается при обнаружении родительских контекстов\n return 1\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (ИЕРАРХИЯ + ТОПОЛОГИЯ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const parentConsumer = engine.activeConsumer // Ловим родительский контекст\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n // Вычисляем и фиксируем глубину эффекта относительно его динамических геттеров\n const currentDepth = engine.getNodeDepth(prevConsumer) + 1\n engine.nodeDepths.set(effectObj, currentDepth)\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // ПАТТЕРН CASCADE: Если эффект создан внутри родительского эффекта,\n // регистрируем его автоматическое уничтожение при пересчете родителя!\n if (parentConsumer) {\n const autoDisposeChild = () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n parentConsumer.cleanups.add(autoDisposeChild)\n }\n\n (engine as any).allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n }\n\n /**\n * АСИНХРОННЫЙ ЦИКЛ СХОЖДЕНИЯ ГРАФА (CONVERGENCE LOOP)\n * Прогоняет эффекты строго по топологической глубине и обрабатывает Inner Writes на месте.\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n\n // ЦИКЛ СХОЖДЕНИЯ (Convergence Loop): Крутимся до тех пор,\n // пока внутренние записи (Inner Writes) не перестанут загрязнять граф\n let iterations = 0\n const MAX_ITERATIONS = 100\n\n while (this.pendingEffects.size > 0 && iterations < MAX_ITERATIONS) {\n iterations++\n\n // ТОПОЛОГИЧЕСКАЯ СОРТИРОВКА: Сортируем эффекты по глубине вложенности графа,\n // чтобы апстрим-компьютеды всегда выполнялись раньше даунстрим-эффектов!\n const effectsToRun = Array.from(this.pendingEffects).sort((a: any, b: any) => {\n const depthA = this.getNodeDepth(a)\n const depthB = this.getNodeDepth(b)\n return depthA - depthB || a.id - b.id\n })\n\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n console.error('[Reactive Engine Automatic: Effect Error]', error)\n }\n })\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn('[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.')\n }\n })\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n"],"mappings":"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"}
package/dist/core.mjs CHANGED
@@ -129,7 +129,11 @@ var e = class {
129
129
  flushEffects() {
130
130
  let e = Array.from(this.pendingEffects);
131
131
  this.pendingEffects.clear(), e.forEach((e) => {
132
- e.run();
132
+ try {
133
+ e.run();
134
+ } catch (e) {
135
+ console.error("[Reactive Engine: Effect Execution Error]", e);
136
+ }
133
137
  });
134
138
  }
135
139
  untrack(e) {
@@ -322,73 +326,74 @@ var e = class {
322
326
  }
323
327
  }, n = class extends t {
324
328
  isFlushScheduled = !1;
329
+ nodeDepths = /* @__PURE__ */ new WeakMap();
325
330
  constructor(e) {
326
331
  super(e), this.frameworkPrefix = "auto-core";
327
332
  }
328
- reactive(e, t = "reactive") {
329
- let n = this;
330
- Reflect.has(e, "__subscribe") || Object.defineProperty(e, "__subscribe", {
331
- get: () => (e) => {
332
- let t = !1;
333
- return n.effect(() => {
334
- try {
335
- JSON.stringify(r);
336
- } catch {
337
- Object.values(r);
338
- }
339
- t || (t = !0, queueMicrotask(() => {
340
- t = !1, e();
341
- }));
342
- }, "auto-framework-proxy-internal-subscription");
343
- },
344
- configurable: !0,
345
- enumerable: !1
346
- });
347
- let r = super.reactive(e, t);
348
- return r;
349
- }
350
- flushEffects() {
351
- this.batchDepth > 0 || this.isFlushScheduled || (this.isFlushScheduled = !0, queueMicrotask(() => {
352
- this.isFlushScheduled = !1, super.flushEffects();
353
- }));
333
+ getNodeDepth(e) {
334
+ return e ? this.nodeDepths.has(e) ? this.nodeDepths.get(e) : 1 : 0;
354
335
  }
355
336
  effect(e, t) {
356
- let n = this, r = {
337
+ let n = this, r = n.activeConsumer, i = {
357
338
  id: ++n.subscriberId,
358
339
  label: t,
359
340
  cleanups: /* @__PURE__ */ new Set(),
360
341
  markDirty() {
361
- n.pendingEffects.add(r), n.flushEffects();
342
+ n.pendingEffects.add(i), n.flushEffects();
362
343
  },
363
344
  run() {
364
- let t = Array.from(r.cleanups);
365
- r.cleanups.clear(), t.forEach((e) => {
345
+ let t = Array.from(i.cleanups);
346
+ i.cleanups.clear(), t.forEach((e) => {
366
347
  try {
367
348
  e();
368
349
  } catch (e) {
369
350
  console.error("[Reactive Engine:Cleanup Error]", e);
370
351
  }
371
352
  });
372
- let i = n.activeConsumer;
373
- n.activeConsumer = r;
353
+ let r = n.activeConsumer;
354
+ n.activeConsumer = i;
355
+ let a = n.getNodeDepth(r) + 1;
356
+ n.nodeDepths.set(i, a);
374
357
  try {
375
358
  let t = e();
376
- typeof t == "function" && r.cleanups.add(t);
359
+ typeof t == "function" && i.cleanups.add(t);
377
360
  } finally {
378
- n.activeConsumer = i;
361
+ n.activeConsumer = r;
379
362
  }
380
363
  }
381
364
  };
382
- return n.allEffects.add(r), r.run(), () => {
383
- Array.from(r.cleanups).forEach((e) => {
365
+ return r && r.cleanups.add(() => {
366
+ Array.from(i.cleanups).forEach((e) => {
384
367
  try {
385
368
  e();
386
- } catch (e) {
387
- console.error("[Reactive Engine:Dispose Cleanup Error]", e);
388
- }
389
- }), r.cleanups.clear(), n.pendingEffects.delete(r), n.allEffects.delete(r);
369
+ } catch {}
370
+ }), i.cleanups.clear(), n.pendingEffects.delete(i), n.allEffects.delete(i);
371
+ }), n.allEffects.add(i), i.run(), () => {
372
+ Array.from(i.cleanups).forEach((e) => {
373
+ try {
374
+ e();
375
+ } catch {}
376
+ }), i.cleanups.clear(), n.pendingEffects.delete(i), n.allEffects.delete(i);
390
377
  };
391
378
  }
379
+ flushEffects() {
380
+ this.batchDepth > 0 || this.isFlushScheduled || (this.isFlushScheduled = !0, queueMicrotask(() => {
381
+ this.isFlushScheduled = !1;
382
+ let e = 0;
383
+ for (; this.pendingEffects.size > 0 && e < 100;) {
384
+ e++;
385
+ let t = Array.from(this.pendingEffects).sort((e, t) => this.getNodeDepth(e) - this.getNodeDepth(t) || e.id - t.id);
386
+ this.pendingEffects.clear(), t.forEach((e) => {
387
+ try {
388
+ e.run();
389
+ } catch (e) {
390
+ console.error("[Reactive Engine Automatic: Effect Error]", e);
391
+ }
392
+ });
393
+ }
394
+ e >= 100 && console.warn("[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.");
395
+ }));
396
+ }
392
397
  }, r = class extends n {
393
398
  autoLogQueue = [];
394
399
  isHardFlushScheduled = !1;
package/dist/core.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.mjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n // Множество активных подписчиков (потребителей: эффектов или компьютеров)\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n return {\n get value(): T {\n // ДИНАМИЧЕСКИЙ ТРЕКИНГ: Если сигнал читается внутри активного контекста\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n // Заставляем потребителя отписаться от нас при его следующем перезапуске\n consumer.cleanups.add(() => subscribers.delete(consumer))\n }\n }\n return val\n },\n set value(newValue: T) {\n // Валидатор: если возвращает строку, выводим ошибку, но запись блокируем\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue;\n (engine as any).onSignalChange?.(name, newValue, old)\n\n // ФАЗА PUSH: Рассылаем статус загрязнения вниз по течению (downstream)\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n // БАРЬЕР ОТ САМОВЫЗОВА: защищает от бесконечных циклов\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n effectsToRun.forEach(effectObj => {\n effectObj.run()\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING REACTIVE ENGINE\n *\n * Расширение Enterprise-ядра, реализующее аппаратный автобатчинг микрозадач.\n * Автоматически склеивает множественные каскадные мутации стейта (включая асинхронные цепочки после await)\n * и выполняет побочные эффекты ровно 1 раз на выходе в Event Loop без ручного вызова engine.batch().\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n // Флаг, контролирующий, взведен ли уже таймаут микрозадачи в Event Loop\n private isFlushScheduled = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ АВТОМАТИЧЕСКОГО ДВИЖКА\n * Внедряет аппаратный микробатчинг (queueMicrotask) прямо в мост __subscribe фреймворков,\n * защищая Vue 3 triggerRef() от каскадного дребезга кадров рендеринга.\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n let isFrameworkFlushScheduled = false\n\n // Регистрируем эффект ядра, следящий за изменениями Proxy\n return engine.effect(() => {\n try {\n JSON.stringify(proxyInstance)\n } catch (e) {\n Object.values(proxyInstance as Record<string, unknown>)\n }\n\n // АППАРАТНЫЙ БАРЬЕР: Склеиваем каскад синхронных flushEffects ядра\n // в ровно одно уведомление triggerRef() фреймворка на выходе в Event Loop!\n if (!isFrameworkFlushScheduled) {\n isFrameworkFlushScheduled = true\n\n queueMicrotask(() => {\n isFrameworkFlushScheduled = false\n cb() // Вызываем триггер Vue/React строго 1 раз в конце макротаска\n })\n }\n }, 'auto-framework-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const proxyInstance = super.reactive(target, name)\n return proxyInstance\n }\n\n /**\n * ВНУТРЕННИЙ СБРОС ОЧЕРЕДИ С ПОДДЕРЖКОЙ МИКРОБАЧИНГА МАССИВОВ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (АСИНХРОННЫЙ АВТОБАТЧИНГ ПРИМИТИВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.mjs","names":[],"sources":["../src/core/core.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n // Множество активных подписчиков (потребителей: эффектов или компьютеров)\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n return {\n get value(): T {\n // ДИНАМИЧЕСКИЙ ТРЕКИНГ: Если сигнал читается внутри активного контекста\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n // Заставляем потребителя отписаться от нас при его следующем перезапуске\n consumer.cleanups.add(() => subscribers.delete(consumer))\n }\n }\n return val\n },\n set value(newValue: T) {\n // Валидатор: если возвращает строку, выводим ошибку, но запись блокируем\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue;\n (engine as any).onSignalChange?.(name, newValue, old)\n\n // ФАЗА PUSH: Рассылаем статус загрязнения вниз по течению (downstream)\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n // БАРЬЕР ОТ САМОВЫЗОВА: защищает от бесконечных циклов\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ (ОТКАЗОУСТОЙЧИВЫЙ)\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n // Изолируем панику эффекта, позволяя соседним эффектам в очереди успешно выполниться!\n console.error('[Reactive Engine: Effect Execution Error]', error)\n }\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING ENTERPRISE REACTIVE ENGINE (v1.8.2-beta)\n *\n * Полностью автономный асингулярный движок с топологической сортировкой графа,\n * каскадным уничтожением вложенных эффектов и циклом схождения inner-записей.\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n private isFlushScheduled = false\n\n // Карта глубин зависимостей для топологической сортировки\n protected nodeDepths = new WeakMap<any, number>()\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * ВЫЧИСЛЕНИЕ ГЛУБИНЫ УЗЛА ДЛЯ ТОПОЛОГИЧЕСКОЙ СОРТИРОВКИ\n */\n protected getNodeDepth(node: any): number {\n if (!node) return 0\n if (this.nodeDepths.has(node)) return this.nodeDepths.get(node)!\n\n // По умолчанию глубина равна 1, увеличивается при обнаружении родительских контекстов\n return 1\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (ИЕРАРХИЯ + ТОПОЛОГИЯ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const parentConsumer = engine.activeConsumer // Ловим родительский контекст\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n // Вычисляем и фиксируем глубину эффекта относительно его динамических геттеров\n const currentDepth = engine.getNodeDepth(prevConsumer) + 1\n engine.nodeDepths.set(effectObj, currentDepth)\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // ПАТТЕРН CASCADE: Если эффект создан внутри родительского эффекта,\n // регистрируем его автоматическое уничтожение при пересчете родителя!\n if (parentConsumer) {\n const autoDisposeChild = () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n parentConsumer.cleanups.add(autoDisposeChild)\n }\n\n (engine as any).allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n }\n\n /**\n * АСИНХРОННЫЙ ЦИКЛ СХОЖДЕНИЯ ГРАФА (CONVERGENCE LOOP)\n * Прогоняет эффекты строго по топологической глубине и обрабатывает Inner Writes на месте.\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n\n // ЦИКЛ СХОЖДЕНИЯ (Convergence Loop): Крутимся до тех пор,\n // пока внутренние записи (Inner Writes) не перестанут загрязнять граф\n let iterations = 0\n const MAX_ITERATIONS = 100\n\n while (this.pendingEffects.size > 0 && iterations < MAX_ITERATIONS) {\n iterations++\n\n // ТОПОЛОГИЧЕСКАЯ СОРТИРОВКА: Сортируем эффекты по глубине вложенности графа,\n // чтобы апстрим-компьютеды всегда выполнялись раньше даунстрим-эффектов!\n const effectsToRun = Array.from(this.pendingEffects).sort((a: any, b: any) => {\n const depthA = this.getNodeDepth(a)\n const depthB = this.getNodeDepth(b)\n return depthA - depthB || a.id - b.id\n })\n\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n console.error('[Reactive Engine Automatic: Effect Error]', error)\n }\n })\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn('[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.')\n }\n })\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pravosleva/reactive-engine v1.8.0-beta
2
+ * @pravosleva/reactive-engine v1.8.2-beta
3
3
  * High-performance transactional reactive engine with microtask batching.
4
4
  *
5
5
  * @license MIT
@@ -9,5 +9,5 @@
9
9
  * @contact Telegram Channel: https://t.me/bash_exp_ru/3393
10
10
  * @contact Developer Telegram: https://t.me/pravosleva
11
11
  */
12
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactiveEngineLib={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=class{frameworkPrefix=`core`;activeConsumer=null;subscriberId=0;batchDepth=0;pendingEffects=new Set;allEffects=new Set;computedCache=new Map;computed(e,t){let n=this;if(n.computedCache.has(e)){let t=n.computedCache.get(e)?.deref();if(t)return t}let r=t||`unnamed_computed`,i,a=new Set,o={id:++n.subscriberId,isDirty:!0,cleanups:new Set,markDirty(){this.isDirty||(this.isDirty=!0,Array.from(a).forEach(e=>{e!==n.activeConsumer&&e.markDirty()}))}},s={get value(){if(n.activeConsumer){let e=n.activeConsumer;a.has(e)||(a.add(e),e.cleanups.add(()=>a.delete(e)))}if(o.isDirty){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e());let r=n.activeConsumer;n.activeConsumer=o;try{i=e(),o.isDirty=!1}finally{n.activeConsumer=r}}return i},subscribe:e=>n.effect(()=>e(s.value),`computed:use:${r}`),destroy(){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e()),a.clear(),n.computedCache.delete(e);for(let[e,t]of n.computedCache.entries())t.deref()===s&&n.computedCache.delete(e)}};return n.cleanupRegistry&&n.cleanupRegistry.register(s,()=>s.destroy()),n.computedCache.set(e,new WeakRef(s)),s}effect(e,t){let n=this,r={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(r),n.batchDepth===0&&n.flushEffects()},run(){let t=Array.from(r.cleanups);r.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let i=n.activeConsumer;n.activeConsumer=r;try{let t=e();typeof t==`function`&&r.cleanups.add(t)}catch(e){console.error(`[Reactive Error] Ошибка при выполнении тела эффекта:`,e)}finally{n.activeConsumer=i}}};return n.allEffects.add(r),r.run(),()=>{Array.from(r.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),r.cleanups.clear(),n.pendingEffects.delete(r),n.allEffects.delete(r)}}signal(e,t){let n=this,r=e,i=new Set,a=typeof t==`string`?{name:t}:t||{},o=a.name||`unnamed_signal`;return{get value(){if(n.activeConsumer){let e=n.activeConsumer;i.has(e)||(i.add(e),e.cleanups.add(()=>i.delete(e)))}return r},set value(e){if(a?.validate){let t=a.validate(e);if(t!==!0){console.error(`[Reactive Engine: Validation Error] ${t}`);return}}if((e===null||typeof e!=`object`&&typeof e!=`function`)&&r===e)return;let t=r;r=e,n.onSignalChange?.(o,e,t),Array.from(i).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})},subscribe(e){return n.effect(()=>e(this.value),`use:${o}`)}}}batch(e){this.batchDepth++;try{e()}finally{this.batchDepth--,this.batchDepth===0&&this.flushEffects()}}flushEffects(){let e=Array.from(this.pendingEffects);this.pendingEffects.clear(),e.forEach(e=>{e.run()})}untrack(e){let t=this.activeConsumer;this.activeConsumer=null;try{return e()}finally{this.activeConsumer=t}}},n=class extends t{services=new Map;factories=new Map;proxyCache=new WeakMap;loggerOptions;pendingLogQueue=[];signalMutationCounts=new Map;lastComputedDurations=new Map;effectExecutionCounts=new Map;batchTickCounts=0;lastTransactionDuration=null;constructor(e){super(),this.loggerOptions=e?.logger}reactive(e,t=`reactive`){if(this.proxyCache.has(e))return this.proxyCache.get(e);let n=this,r=new Map,i=!1,a=new Proxy(e,{get(e,o,s){if(o===`__subscribe`)return e=>{let t=!1;return n.effect(()=>{try{JSON.stringify(a)}catch{Object.values(a)}typeof window<`u`&&(window.__VUE__||globalThis.__VUE__||e.toString().includes(`triggerRef`))?t||(t=!0,queueMicrotask(()=>{t=!1,e()})):e()},`framework-proxy-internal-subscription`)};if(n.activeConsumer){let e=n.activeConsumer;r.has(o)||r.set(o,new Map);let t=r.get(o);if(!t.has(e)){let n=()=>{t.delete(e)};t.set(e,n),e.cleanups.add(n)}}if(Array.isArray(e)&&typeof o==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(o)){let t=e[o];return function(...a){n.batchDepth++,i=!0;let s=t.apply(e,a);return i=!1,r.forEach((e,t)=>{t!==o&&Array.from(e.keys()).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})}),n.batchDepth--,n.batchDepth===0&&n.flushEffects(),s}}let c=Reflect.get(e,o,s);return typeof c==`object`&&c?n.reactive(c,`${t}.${String(o)}`):c},set(e,a,o,s){let c=Reflect.get(e,a,s);if(c===o||(Reflect.set(e,a,o,s),n.onSignalChange?.(`${t}.${String(a)}`,o,c),i))return!0;let l=r.get(a),u=l?Array.from(l.keys()):[];if(Array.isArray(e)){let e=r.get(`length`);e&&u.push(...Array.from(e.keys()))}return u.forEach(e=>{e!==n.activeConsumer&&e.markDirty()}),typeof n.queueLog==`function`&&n.queueLog(`reactive`,`${t}.${String(a)}`,{action:`set`,property:String(a),oldValue:c,newValue:o}),!0}});return this.proxyCache.set(e,a),a}provide(e,t){typeof t==`function`&&(!t.prototype||t.name===`mockConstructor`||t._isMockFunction)?this.factories.set(e,t):this.services.set(e,t)}inject(e){if(!e)throw Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`);let t=e;if(this.services.has(t))return this.services.get(t);try{let n=this.factories.get(t);if(n){let e=n(this);return this.services.set(t,e),e}if(typeof e==`function`&&e.prototype){let n=new e(this);return this.services.set(t,n),n}throw Error(`Service not found: ${String(e)}`)}catch{throw Error(`[DI Error]: Не удалось создать сервис ${String(e)}.`)}}queueLog(e,t,n){this.loggerOptions?.isEnabled&&(this.pendingLogQueue.push({type:e,name:t,detail:n}),this.batchDepth===0&&this.flushLogs())}flushLogs(){!this.loggerOptions?.isEnabled||this.pendingLogQueue.length===0||(this.pendingLogQueue=[])}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this.signal({data:null,loading:!0,error:null,isRetrying:!1},`resource:state:${r}`),a=this,o=null,s=async(t,n)=>{if(!n.aborted){a.untrack(()=>{i.value={data:i.value.data,loading:!0,error:null,isRetrying:!1}});try{let r=await e(t,n);n.aborted||a.untrack(()=>{i.value={data:r,loading:!1,error:null,isRetrying:!1}})}catch(e){n.aborted||a.untrack(()=>{i.value={data:null,loading:!1,error:e,isRetrying:!1}})}}};return this.effect(()=>{let e=t?t.value:void 0;return o&&o.abort(),o=new AbortController,s(e,o.signal),()=>{o&&o.abort()}}),{get data(){return i.value.data},get loading(){return i.value.loading},get error(){return i.value.error},get value(){return i.value},refetch:()=>{o&&o.abort(),o=new AbortController,s(t?t.value:void 0,o.signal)},subscribe:e=>i.subscribe(e)}}},r=class extends n{isFlushScheduled=!1;constructor(e){super(e),this.frameworkPrefix=`auto-core`}reactive(e,t=`reactive`){let n=this;Reflect.has(e,`__subscribe`)||Object.defineProperty(e,"__subscribe",{get:()=>e=>{let t=!1;return n.effect(()=>{try{JSON.stringify(r)}catch{Object.values(r)}t||(t=!0,queueMicrotask(()=>{t=!1,e()}))},`auto-framework-proxy-internal-subscription`)},configurable:!0,enumerable:!1});let r=super.reactive(e,t);return r}flushEffects(){this.batchDepth>0||this.isFlushScheduled||(this.isFlushScheduled=!0,queueMicrotask(()=>{this.isFlushScheduled=!1,super.flushEffects()}))}effect(e,t){let n=this,r={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(r),n.flushEffects()},run(){let t=Array.from(r.cleanups);r.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let i=n.activeConsumer;n.activeConsumer=r;try{let t=e();typeof t==`function`&&r.cleanups.add(t)}finally{n.activeConsumer=i}}};return n.allEffects.add(r),r.run(),()=>{Array.from(r.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),r.cleanups.clear(),n.pendingEffects.delete(r),n.allEffects.delete(r)}}},i=class extends r{autoLogQueue=[];isHardFlushScheduled=!1;constructor(e){let t={...e,logger:{isEnabled:!0,traceTime:!0,isCoreOptimizationDebugEnabled:!0,instanceName:e?.logger?.instanceName||`AUTOMATIC_HARD_CORE`,filter:e?.logger?.filter}};super(t),this.frameworkPrefix=`auto-hard-core`}queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,detail:n})}flushLogs(){if(this.autoLogQueue.length===0)return;let e={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;`};console.groupCollapsed(`%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #aaa; font-weight: normal;`),this.autoLogQueue.forEach(t=>{let n=``;if(t.type===`signal`){let e=t.detail;n=` 🔄 Изменение: [${String(e.from)} -> ${String(e.to)}]`}else if(t.type===`computed`)n=` 🧮 Расчет кэша (${t.detail.duration})`;else if(t.type===`effect`){let e=t.detail;n=e?.isTriggered?` ⚡️ Ререндер/Вызов (${e.duration||`0ms`})`:` 🟢 Инициализация подписки`}else if(t.type===`resource`){let e=t.detail;n=e.loading?` ⏳ ЗАГРУЗКА СЕТИ`:e.error?` 🔴 ОШИБКА`:` 🟢 УСПЕШНО ОТВЕТИЛ`}console.groupCollapsed(`%c${t.type.toUpperCase()}%c [${t.name}]%c${n}`,e[t.type]||e.signal,`color: #aaa; font-weight: bold;`,`color: #42b883; font-weight: bold;`),console.log(`Детали операции:`,t.detail),console.groupEnd()}),console.groupEnd(),this.autoLogQueue=[]}flushEffects(){this.batchDepth>0||this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>{this.isHardFlushScheduled=!1,this.flushLogs(),super.flushEffects()}))}effect(e,t){let n=this,r=t||`unnamed_effect`,i=!0;n.queueLog(`effect`,r,{isTriggered:!1,phase:`mount`});let a={id:++n.subscriberId,label:r,cleanups:new Set,markDirty(){n.pendingEffects.add(a),n.flushEffects()},run(){let t=typeof performance<`u`?performance.now():0,o=Array.from(a.cleanups);a.cleanups.clear(),o.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let s=n.activeConsumer;n.activeConsumer=a;try{let t=e();typeof t==`function`&&a.cleanups.add(t)}finally{if(n.activeConsumer=s,!i&&t&&typeof n.queueLog==`function`){let e=performance.now()-t;n.queueLog(`effect`,r,{isTriggered:!0,phase:`update`,duration:`${e.toFixed(3)}ms`})}i=!1}}};return n.allEffects.add(a),a.run(),()=>{Array.from(a.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),a.cleanups.clear(),n.pendingEffects.delete(a),n.allEffects.delete(a),n.queueLog(`effect`,r,{phase:`unmount`})}}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this;return super.resource(async(t,n)=>{i.queueLog(`resource`,r,{loading:!0,error:null,data:null});try{let a=await e(t,n);return i.queueLog(`resource`,r,{loading:!1,error:null,data:a}),a}catch(e){throw i.queueLog(`resource`,r,{loading:!1,error:e,data:null}),e}},t,n)}reactive(e,t=`reactive`){let n=this,r=super.reactive(e,t);return new Proxy(r,{get(e,r,i){let a=Reflect.get(e,r,i);return typeof a==`object`&&a?n.reactive(a,`${t}.${String(r)}`):a},set(e,r,i,a){let o=Reflect.get(e,r,a);return o===i?!0:(n.queueLog(`signal`,`${t}.${String(r)}`,{from:o,to:i,subscribersCount:0,subscribers:[`framework-reactive-proxy-subscriber`]}),Reflect.set(e,r,i,a))}})}signal(e,t){let n=this,r=(typeof t==`string`?{name:t}:t||{}).name||`unnamed_signal`,i=super.signal(e,t);return{get value(){return i.value},set value(e){let t=i.value;if((e===null||typeof e!=`object`&&typeof e!=`function`)&&t===e)return;let a=n.activeConsumer,o=a&&`label`in a&&typeof a.label==`string`?a.label:`unnamed_effect`;n.queueLog(`signal`,r,{from:t,to:e,subscribersCount:0,subscribers:[o]}),i.value=e},subscribe(e){return i.subscribe(e)}}}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t);return{get value(){let e=typeof performance<`u`?performance.now():0,t=i.value;if(e){let i=performance.now()-e;n.queueLog(`computed`,r,{value:t,duration:`${i.toFixed(3)}ms`})}return t},subscribe:e=>i.subscribe(e),destroy(){i.destroy()}}}},a=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(){}},o=a,s=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=a,e.BaseREService=o,e.BaseREServiceEnhanced=s,e.ReactiveEngine=n,e.ReactiveEngineAutomatic=r,e.ReactiveEngineAutomaticHard=i,e.ReactiveEngineCore=t});
12
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactiveEngineLib={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=class{frameworkPrefix=`core`;activeConsumer=null;subscriberId=0;batchDepth=0;pendingEffects=new Set;allEffects=new Set;computedCache=new Map;computed(e,t){let n=this;if(n.computedCache.has(e)){let t=n.computedCache.get(e)?.deref();if(t)return t}let r=t||`unnamed_computed`,i,a=new Set,o={id:++n.subscriberId,isDirty:!0,cleanups:new Set,markDirty(){this.isDirty||(this.isDirty=!0,Array.from(a).forEach(e=>{e!==n.activeConsumer&&e.markDirty()}))}},s={get value(){if(n.activeConsumer){let e=n.activeConsumer;a.has(e)||(a.add(e),e.cleanups.add(()=>a.delete(e)))}if(o.isDirty){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e());let r=n.activeConsumer;n.activeConsumer=o;try{i=e(),o.isDirty=!1}finally{n.activeConsumer=r}}return i},subscribe:e=>n.effect(()=>e(s.value),`computed:use:${r}`),destroy(){let t=Array.from(o.cleanups);o.cleanups.clear(),t.forEach(e=>e()),a.clear(),n.computedCache.delete(e);for(let[e,t]of n.computedCache.entries())t.deref()===s&&n.computedCache.delete(e)}};return n.cleanupRegistry&&n.cleanupRegistry.register(s,()=>s.destroy()),n.computedCache.set(e,new WeakRef(s)),s}effect(e,t){let n=this,r={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(r),n.batchDepth===0&&n.flushEffects()},run(){let t=Array.from(r.cleanups);r.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let i=n.activeConsumer;n.activeConsumer=r;try{let t=e();typeof t==`function`&&r.cleanups.add(t)}catch(e){console.error(`[Reactive Error] Ошибка при выполнении тела эффекта:`,e)}finally{n.activeConsumer=i}}};return n.allEffects.add(r),r.run(),()=>{Array.from(r.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),r.cleanups.clear(),n.pendingEffects.delete(r),n.allEffects.delete(r)}}signal(e,t){let n=this,r=e,i=new Set,a=typeof t==`string`?{name:t}:t||{},o=a.name||`unnamed_signal`;return{get value(){if(n.activeConsumer){let e=n.activeConsumer;i.has(e)||(i.add(e),e.cleanups.add(()=>i.delete(e)))}return r},set value(e){if(a?.validate){let t=a.validate(e);if(t!==!0){console.error(`[Reactive Engine: Validation Error] ${t}`);return}}if((e===null||typeof e!=`object`&&typeof e!=`function`)&&r===e)return;let t=r;r=e,n.onSignalChange?.(o,e,t),Array.from(i).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})},subscribe(e){return n.effect(()=>e(this.value),`use:${o}`)}}}batch(e){this.batchDepth++;try{e()}finally{this.batchDepth--,this.batchDepth===0&&this.flushEffects()}}flushEffects(){let e=Array.from(this.pendingEffects);this.pendingEffects.clear(),e.forEach(e=>{try{e.run()}catch(e){console.error(`[Reactive Engine: Effect Execution Error]`,e)}})}untrack(e){let t=this.activeConsumer;this.activeConsumer=null;try{return e()}finally{this.activeConsumer=t}}},n=class extends t{services=new Map;factories=new Map;proxyCache=new WeakMap;loggerOptions;pendingLogQueue=[];signalMutationCounts=new Map;lastComputedDurations=new Map;effectExecutionCounts=new Map;batchTickCounts=0;lastTransactionDuration=null;constructor(e){super(),this.loggerOptions=e?.logger}reactive(e,t=`reactive`){if(this.proxyCache.has(e))return this.proxyCache.get(e);let n=this,r=new Map,i=!1,a=new Proxy(e,{get(e,o,s){if(o===`__subscribe`)return e=>{let t=!1;return n.effect(()=>{try{JSON.stringify(a)}catch{Object.values(a)}typeof window<`u`&&(window.__VUE__||globalThis.__VUE__||e.toString().includes(`triggerRef`))?t||(t=!0,queueMicrotask(()=>{t=!1,e()})):e()},`framework-proxy-internal-subscription`)};if(n.activeConsumer){let e=n.activeConsumer;r.has(o)||r.set(o,new Map);let t=r.get(o);if(!t.has(e)){let n=()=>{t.delete(e)};t.set(e,n),e.cleanups.add(n)}}if(Array.isArray(e)&&typeof o==`string`&&[`push`,`pop`,`shift`,`unshift`,`splice`,`sort`,`reverse`].includes(o)){let t=e[o];return function(...a){n.batchDepth++,i=!0;let s=t.apply(e,a);return i=!1,r.forEach((e,t)=>{t!==o&&Array.from(e.keys()).forEach(e=>{e!==n.activeConsumer&&e.markDirty()})}),n.batchDepth--,n.batchDepth===0&&n.flushEffects(),s}}let c=Reflect.get(e,o,s);return typeof c==`object`&&c?n.reactive(c,`${t}.${String(o)}`):c},set(e,a,o,s){let c=Reflect.get(e,a,s);if(c===o||(Reflect.set(e,a,o,s),n.onSignalChange?.(`${t}.${String(a)}`,o,c),i))return!0;let l=r.get(a),u=l?Array.from(l.keys()):[];if(Array.isArray(e)){let e=r.get(`length`);e&&u.push(...Array.from(e.keys()))}return u.forEach(e=>{e!==n.activeConsumer&&e.markDirty()}),typeof n.queueLog==`function`&&n.queueLog(`reactive`,`${t}.${String(a)}`,{action:`set`,property:String(a),oldValue:c,newValue:o}),!0}});return this.proxyCache.set(e,a),a}provide(e,t){typeof t==`function`&&(!t.prototype||t.name===`mockConstructor`||t._isMockFunction)?this.factories.set(e,t):this.services.set(e,t)}inject(e){if(!e)throw Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`);let t=e;if(this.services.has(t))return this.services.get(t);try{let n=this.factories.get(t);if(n){let e=n(this);return this.services.set(t,e),e}if(typeof e==`function`&&e.prototype){let n=new e(this);return this.services.set(t,n),n}throw Error(`Service not found: ${String(e)}`)}catch{throw Error(`[DI Error]: Не удалось создать сервис ${String(e)}.`)}}queueLog(e,t,n){this.loggerOptions?.isEnabled&&(this.pendingLogQueue.push({type:e,name:t,detail:n}),this.batchDepth===0&&this.flushLogs())}flushLogs(){!this.loggerOptions?.isEnabled||this.pendingLogQueue.length===0||(this.pendingLogQueue=[])}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this.signal({data:null,loading:!0,error:null,isRetrying:!1},`resource:state:${r}`),a=this,o=null,s=async(t,n)=>{if(!n.aborted){a.untrack(()=>{i.value={data:i.value.data,loading:!0,error:null,isRetrying:!1}});try{let r=await e(t,n);n.aborted||a.untrack(()=>{i.value={data:r,loading:!1,error:null,isRetrying:!1}})}catch(e){n.aborted||a.untrack(()=>{i.value={data:null,loading:!1,error:e,isRetrying:!1}})}}};return this.effect(()=>{let e=t?t.value:void 0;return o&&o.abort(),o=new AbortController,s(e,o.signal),()=>{o&&o.abort()}}),{get data(){return i.value.data},get loading(){return i.value.loading},get error(){return i.value.error},get value(){return i.value},refetch:()=>{o&&o.abort(),o=new AbortController,s(t?t.value:void 0,o.signal)},subscribe:e=>i.subscribe(e)}}},r=class extends n{isFlushScheduled=!1;nodeDepths=new WeakMap;constructor(e){super(e),this.frameworkPrefix=`auto-core`}getNodeDepth(e){return e?this.nodeDepths.has(e)?this.nodeDepths.get(e):1:0}effect(e,t){let n=this,r=n.activeConsumer,i={id:++n.subscriberId,label:t,cleanups:new Set,markDirty(){n.pendingEffects.add(i),n.flushEffects()},run(){let t=Array.from(i.cleanups);i.cleanups.clear(),t.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let r=n.activeConsumer;n.activeConsumer=i;let a=n.getNodeDepth(r)+1;n.nodeDepths.set(i,a);try{let t=e();typeof t==`function`&&i.cleanups.add(t)}finally{n.activeConsumer=r}}};return r&&r.cleanups.add(()=>{Array.from(i.cleanups).forEach(e=>{try{e()}catch{}}),i.cleanups.clear(),n.pendingEffects.delete(i),n.allEffects.delete(i)}),n.allEffects.add(i),i.run(),()=>{Array.from(i.cleanups).forEach(e=>{try{e()}catch{}}),i.cleanups.clear(),n.pendingEffects.delete(i),n.allEffects.delete(i)}}flushEffects(){this.batchDepth>0||this.isFlushScheduled||(this.isFlushScheduled=!0,queueMicrotask(()=>{this.isFlushScheduled=!1;let e=0;for(;this.pendingEffects.size>0&&e<100;){e++;let t=Array.from(this.pendingEffects).sort((e,t)=>this.getNodeDepth(e)-this.getNodeDepth(t)||e.id-t.id);this.pendingEffects.clear(),t.forEach(e=>{try{e.run()}catch(e){console.error(`[Reactive Engine Automatic: Effect Error]`,e)}})}e>=100&&console.warn(`[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.`)}))}},i=class extends r{autoLogQueue=[];isHardFlushScheduled=!1;constructor(e){let t={...e,logger:{isEnabled:!0,traceTime:!0,isCoreOptimizationDebugEnabled:!0,instanceName:e?.logger?.instanceName||`AUTOMATIC_HARD_CORE`,filter:e?.logger?.filter}};super(t),this.frameworkPrefix=`auto-hard-core`}queueLog(e,t,n){this.autoLogQueue.push({type:e,name:t,detail:n})}flushLogs(){if(this.autoLogQueue.length===0)return;let e={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;`};console.groupCollapsed(`%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,`background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;`,`color: #aaa; font-weight: normal;`),this.autoLogQueue.forEach(t=>{let n=``;if(t.type===`signal`){let e=t.detail;n=` 🔄 Изменение: [${String(e.from)} -> ${String(e.to)}]`}else if(t.type===`computed`)n=` 🧮 Расчет кэша (${t.detail.duration})`;else if(t.type===`effect`){let e=t.detail;n=e?.isTriggered?` ⚡️ Ререндер/Вызов (${e.duration||`0ms`})`:` 🟢 Инициализация подписки`}else if(t.type===`resource`){let e=t.detail;n=e.loading?` ⏳ ЗАГРУЗКА СЕТИ`:e.error?` 🔴 ОШИБКА`:` 🟢 УСПЕШНО ОТВЕТИЛ`}console.groupCollapsed(`%c${t.type.toUpperCase()}%c [${t.name}]%c${n}`,e[t.type]||e.signal,`color: #aaa; font-weight: bold;`,`color: #42b883; font-weight: bold;`),console.log(`Детали операции:`,t.detail),console.groupEnd()}),console.groupEnd(),this.autoLogQueue=[]}flushEffects(){this.batchDepth>0||this.isHardFlushScheduled||(this.isHardFlushScheduled=!0,queueMicrotask(()=>{this.isHardFlushScheduled=!1,this.flushLogs(),super.flushEffects()}))}effect(e,t){let n=this,r=t||`unnamed_effect`,i=!0;n.queueLog(`effect`,r,{isTriggered:!1,phase:`mount`});let a={id:++n.subscriberId,label:r,cleanups:new Set,markDirty(){n.pendingEffects.add(a),n.flushEffects()},run(){let t=typeof performance<`u`?performance.now():0,o=Array.from(a.cleanups);a.cleanups.clear(),o.forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Cleanup Error]`,e)}});let s=n.activeConsumer;n.activeConsumer=a;try{let t=e();typeof t==`function`&&a.cleanups.add(t)}finally{if(n.activeConsumer=s,!i&&t&&typeof n.queueLog==`function`){let e=performance.now()-t;n.queueLog(`effect`,r,{isTriggered:!0,phase:`update`,duration:`${e.toFixed(3)}ms`})}i=!1}}};return n.allEffects.add(a),a.run(),()=>{Array.from(a.cleanups).forEach(e=>{try{e()}catch(e){console.error(`[Reactive Engine:Dispose Cleanup Error]`,e)}}),a.cleanups.clear(),n.pendingEffects.delete(a),n.allEffects.delete(a),n.queueLog(`effect`,r,{phase:`unmount`})}}resource(e,t,n){let r=n&&typeof n==`object`?n.name:n||`unnamed_resource`,i=this;return super.resource(async(t,n)=>{i.queueLog(`resource`,r,{loading:!0,error:null,data:null});try{let a=await e(t,n);return i.queueLog(`resource`,r,{loading:!1,error:null,data:a}),a}catch(e){throw i.queueLog(`resource`,r,{loading:!1,error:e,data:null}),e}},t,n)}reactive(e,t=`reactive`){let n=this,r=super.reactive(e,t);return new Proxy(r,{get(e,r,i){let a=Reflect.get(e,r,i);return typeof a==`object`&&a?n.reactive(a,`${t}.${String(r)}`):a},set(e,r,i,a){let o=Reflect.get(e,r,a);return o===i?!0:(n.queueLog(`signal`,`${t}.${String(r)}`,{from:o,to:i,subscribersCount:0,subscribers:[`framework-reactive-proxy-subscriber`]}),Reflect.set(e,r,i,a))}})}signal(e,t){let n=this,r=(typeof t==`string`?{name:t}:t||{}).name||`unnamed_signal`,i=super.signal(e,t);return{get value(){return i.value},set value(e){let t=i.value;if((e===null||typeof e!=`object`&&typeof e!=`function`)&&t===e)return;let a=n.activeConsumer,o=a&&`label`in a&&typeof a.label==`string`?a.label:`unnamed_effect`;n.queueLog(`signal`,r,{from:t,to:e,subscribersCount:0,subscribers:[o]}),i.value=e},subscribe(e){return i.subscribe(e)}}}computed(e,t){let n=this,r=t||`unnamed_computed`,i=super.computed(e,t);return{get value(){let e=typeof performance<`u`?performance.now():0,t=i.value;if(e){let i=performance.now()-e;n.queueLog(`computed`,r,{value:t,duration:`${i.toFixed(3)}ms`})}return t},subscribe:e=>i.subscribe(e),destroy(){i.destroy()}}}},a=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(){}},o=a,s=class{engine;constructor(e){this.engine=e,setTimeout(()=>this.onInit(),0)}onInit(){}};e.AbstractService=a,e.BaseREService=o,e.BaseREServiceEnhanced=s,e.ReactiveEngine=n,e.ReactiveEngineAutomatic=r,e.ReactiveEngineAutomaticHard=i,e.ReactiveEngineCore=t});
13
13
  //# sourceMappingURL=reactive-engine.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n // Множество активных подписчиков (потребителей: эффектов или компьютеров)\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n return {\n get value(): T {\n // ДИНАМИЧЕСКИЙ ТРЕКИНГ: Если сигнал читается внутри активного контекста\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n // Заставляем потребителя отписаться от нас при его следующем перезапуске\n consumer.cleanups.add(() => subscribers.delete(consumer))\n }\n }\n return val\n },\n set value(newValue: T) {\n // Валидатор: если возвращает строку, выводим ошибку, но запись блокируем\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue;\n (engine as any).onSignalChange?.(name, newValue, old)\n\n // ФАЗА PUSH: Рассылаем статус загрязнения вниз по течению (downstream)\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n // БАРЬЕР ОТ САМОВЫЗОВА: защищает от бесконечных циклов\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n effectsToRun.forEach(effectObj => {\n effectObj.run()\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING REACTIVE ENGINE\n *\n * Расширение Enterprise-ядра, реализующее аппаратный автобатчинг микрозадач.\n * Автоматически склеивает множественные каскадные мутации стейта (включая асинхронные цепочки после await)\n * и выполняет побочные эффекты ровно 1 раз на выходе в Event Loop без ручного вызова engine.batch().\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n // Флаг, контролирующий, взведен ли уже таймаут микрозадачи в Event Loop\n private isFlushScheduled = false\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ АВТОМАТИЧЕСКОГО ДВИЖКА\n * Внедряет аппаратный микробатчинг (queueMicrotask) прямо в мост __subscribe фреймворков,\n * защищая Vue 3 triggerRef() от каскадного дребезга кадров рендеринга.\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n let isFrameworkFlushScheduled = false\n\n // Регистрируем эффект ядра, следящий за изменениями Proxy\n return engine.effect(() => {\n try {\n JSON.stringify(proxyInstance)\n } catch (e) {\n Object.values(proxyInstance as Record<string, unknown>)\n }\n\n // АППАРАТНЫЙ БАРЬЕР: Склеиваем каскад синхронных flushEffects ядра\n // в ровно одно уведомление triggerRef() фреймворка на выходе в Event Loop!\n if (!isFrameworkFlushScheduled) {\n isFrameworkFlushScheduled = true\n\n queueMicrotask(() => {\n isFrameworkFlushScheduled = false\n cb() // Вызываем триггер Vue/React строго 1 раз в конце макротаска\n })\n }\n }, 'auto-framework-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const proxyInstance = super.reactive(target, name)\n return proxyInstance\n }\n\n /**\n * ВНУТРЕННИЙ СБРОС ОЧЕРЕДИ С ПОДДЕРЖКОЙ МИКРОБАЧИНГА МАССИВОВ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (АСИНХРОННЫЙ АВТОБАТЧИНГ ПРИМИТИВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n","import { ReactiveEngine } from './core'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngine) {\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 { ReactiveEngine } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngine) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reactive-engine.umd.js","names":[],"sources":["../src/core/core.ts","../src/core/AbstractService.ts","../src/core/BaseREServiceEnhanced.ts"],"sourcesContent":["// import { getExtractedValues } from '../utils'\nimport { ResourceOptions, ResourceState, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap, ResourceLogDetail, ComputedLogDetail, SignalLogDetail } from './types'\n\n/**\n * ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)\n * Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.\n * Идеален для матрицы тестов johnsoncodehk на 100% Passed.\n */\nexport class ReactiveEngineCore {\n protected frameworkPrefix = 'core'\n protected activeConsumer: { id: number; cleanups: Set<() => void>; markDirty: () => void } | null = null\n protected subscriberId = 0\n protected batchDepth = 0\n protected pendingEffects = new Set<IEffect>()\n protected allEffects = new Set<IEffect>()\n public computedCache = new Map<Function, WeakRef<Computed<unknown>>>()\n\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)\n */\n public computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this // Фиксируем стабильный инстанс ядра в замыкании\n\n // 1. ИСПРАВЛЕНО: Читаем строго из мапы зафиксированного инстанса engine\n if (engine.computedCache.has(fn)) {\n const cachedRef = engine.computedCache.get(fn)\n const cachedInstance = cachedRef?.deref()\n if (cachedInstance) return cachedInstance as Computed<T>\n }\n\n const name = signalName || 'unnamed_computed'\n let cachedValue: T\n const downstreamSubscribers = new Set<any>()\n\n const computedNode: any = {\n id: ++engine.subscriberId,\n isDirty: true,\n cleanups: new Set<() => void>(),\n markDirty() {\n if (!this.isDirty) {\n this.isDirty = true\n const targets = Array.from(downstreamSubscribers)\n targets.forEach(sub => {\n if (sub === engine.activeConsumer) return\n sub.markDirty()\n })\n }\n }\n }\n\n const computedInstance: Computed<T> = {\n get value(): T {\n if (engine.activeConsumer) {\n const parentConsumer = engine.activeConsumer\n if (!downstreamSubscribers.has(parentConsumer)) {\n downstreamSubscribers.add(parentConsumer)\n parentConsumer.cleanups.add(() => downstreamSubscribers.delete(parentConsumer))\n }\n }\n\n if (computedNode.isDirty) {\n const oldCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n oldCleanups.forEach(unsub => unsub())\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = computedNode\n\n try {\n cachedValue = fn()\n computedNode.isDirty = false\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n return cachedValue\n },\n\n subscribe: (cb: (val: T) => void) => engine.effect(() => cb(computedInstance.value), `computed:use:${name}`),\n\n destroy() {\n const finalCleanups = Array.from(computedNode.cleanups) as (() => void)[]\n computedNode.cleanups.clear()\n finalCleanups.forEach(unsub => unsub())\n downstreamSubscribers.clear()\n\n // 2. ИСПРАВЛЕНО: Стираем по прямому ключу\n engine.computedCache.delete(fn)\n\n // 3. Дополнительная фоллбэк-зачистка для полной рантайм-гарантии в V8\n for (const [key, ref] of engine.computedCache.entries()) {\n if (ref.deref() === computedInstance) {\n engine.computedCache.delete(key)\n }\n }\n }\n }\n\n // 4. ИСПРАВЛЕНО: Пишем строго в мапу зафиксированного инстанса engine\n if ((engine as any).cleanupRegistry) {\n (engine as any).cleanupRegistry.register(computedInstance, () => computedInstance.destroy())\n }\n engine.computedCache.set(fn, new WeakRef(computedInstance as Computed<unknown>))\n\n return computedInstance\n }\n\n /**\n * СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)\n *\n * @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).\n * @param {string} [label] - Необязательная метка для отладки и трассировки.\n * @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.\n */\n public effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n\n // Структурный объект эффекта, регистрируемый в графе зависимостей ядра\n const effectObj: any = {\n id: ++engine.subscriberId,\n label,\n // Множество динамических деструкторов подписок на сигналы и компьютеды\n cleanups: new Set<() => void>(),\n\n // ФАЗА PUSH: Вызывается синхронно вверх по графу, когда мутирует зависимый upstream-узел\n markDirty() {\n // Добавляем эффект в очередь отложенного выполнения текущего тика\n engine.pendingEffects.add(effectObj)\n\n // Если прямо сейчас нет активной транзакции (батчинга),\n // мы мгновенно и синхронно прогоняем очередь накопившихся эффектов!\n if (engine.batchDepth === 0) {\n engine.flushEffects()\n }\n },\n\n run() {\n // ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ: Указываем компилятору, что это массив функций отписки.\n // Это полностью убирает ошибку \"'c' is of type 'unknown'\"\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try {\n c() // Теперь вызов разрешен, так как c имеет тип () => void\n } catch (e) {\n console.error('[Reactive Engine:Cleanup Error]', e)\n }\n })\n\n // Переключаем рантайм-контекст трекинга на текущий эффект\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n // Если колбэк вернул новую функцию очистки — сохраняем её в Set\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } catch (error) {\n console.error('[Reactive Error] Ошибка при выполнении тела эффекта:', error)\n } finally {\n // Восстанавливаем предыдущий контекст (поддерживает вложенность parent-child)\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // Регистрируем эффект в глобальном реестре активных подписок ядра\n engine.allEffects.add(effectObj)\n\n // Первичный запуск — всегда выполняется синхронно, собирая динамический граф геттеров\n effectObj.run()\n\n // Возвращает честную функцию отписки (деструктор эффекта)\n return () => {\n // Принудительно очищаем все внутренние деструкторы подписок с явным кастом типов\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try {\n c()\n } catch (e) {\n console.error('[Reactive Engine:Dispose Cleanup Error]', e)\n }\n })\n effectObj.cleanups.clear()\n\n // Стираем эффект из всех очередей планировщика ядра, предотвращая утечки памяти\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n }\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)\n */\n public signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n let val = initialValue\n\n // Множество активных подписчиков (потребителей: эффектов или компьютеров)\n const subscribers = new Set<any>()\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n return {\n get value(): T {\n // ДИНАМИЧЕСКИЙ ТРЕКИНГ: Если сигнал читается внутри активного контекста\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!subscribers.has(consumer)) {\n subscribers.add(consumer)\n // Заставляем потребителя отписаться от нас при его следующем перезапуске\n consumer.cleanups.add(() => subscribers.delete(consumer))\n }\n }\n return val\n },\n set value(newValue: T) {\n // Валидатор: если возвращает строку, выводим ошибку, но запись блокируем\n if (options?.validate) {\n const validationResult = options.validate(newValue)\n if (validationResult !== true) {\n console.error(`[Reactive Engine: Validation Error] ${validationResult}`)\n return\n }\n }\n\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n if (isPrimitive && val === newValue) return\n\n const old = val\n val = newValue;\n (engine as any).onSignalChange?.(name, newValue, old)\n\n // ФАЗА PUSH: Рассылаем статус загрязнения вниз по течению (downstream)\n const targets = Array.from(subscribers)\n targets.forEach(consumer => {\n // БАРЬЕР ОТ САМОВЫЗОВА: защищает от бесконечных циклов\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n },\n subscribe(cb: (val: T) => void) {\n return engine.effect(() => cb(this.value), `use:${name}`)\n }\n }\n }\n\n /**\n * МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)\n */\n public batch(fn: () => void): void {\n this.batchDepth++\n try {\n fn()\n } finally {\n this.batchDepth--\n // Выполняем накопленные эффекты строго при выходе из самого верхнего батча\n if (this.batchDepth === 0) {\n this.flushEffects()\n }\n }\n }\n\n /**\n * ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ (ОТКАЗОУСТОЙЧИВЫЙ)\n */\n protected flushEffects(): void {\n const effectsToRun = Array.from(this.pendingEffects)\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n // Изолируем панику эффекта, позволяя соседним эффектам в очереди успешно выполниться!\n console.error('[Reactive Engine: Effect Execution Error]', error)\n }\n })\n }\n\n /**\n * ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ\n */\n public untrack<T>(fn: () => T): T {\n const prev = this.activeConsumer\n this.activeConsumer = null\n try {\n return fn()\n } finally {\n this.activeConsumer = prev\n }\n }\n}\n\n/**\n * 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)\n *\n * Наследует и расширяет легкое ядро ReactiveEngineCore.\n * Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.\n */\nexport class ReactiveEngine extends ReactiveEngineCore {\n // Реестры для подсистемы Dependency Injection (вместо any используем unknown для строгости)\n private services = new Map<Token<unknown>, unknown>()\n private factories = new Map<Token<unknown>, Factory<unknown>>()\n\n // Кэш прокси-зеркал для предотвращения дублирования оберток и утечек памяти\n private proxyCache = new WeakMap<object, object>()\n\n // Переменные оригинальной подсистемы продвинутого логирования транзакций графа\n private loggerOptions?: EngineLoggerOptions\n private pendingLogQueue: Array<any> = []\n private signalMutationCounts = new Map<string, number>()\n private lastComputedDurations = new Map<string, number>()\n private effectExecutionCounts = new Map<string, number>()\n private batchTickCounts = 0\n private lastTransactionDuration: number | null = null\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super()\n this.loggerOptions = options?.logger\n }\n\n /**\n * ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)\n */\n public reactive<T extends object>(target: T, name: string = 'reactive'): T {\n if (this.proxyCache.has(target)) return this.proxyCache.get(target) as T\n\n const engine = this\n const propsSubscribers = new Map<string | symbol, Map<any, () => void>>()\n let isMutatingArray = false\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop === '__subscribe') {\n return (cb: () => void) => {\n let isBatchingScheduled = false\n\n return engine.effect(() => {\n try {\n JSON.stringify(proxy)\n } catch (e) {\n Object.values(proxy as Record<string, unknown>)\n }\n\n // ПРЯМАЯ ДЕТЕКЦИЯ Vue 3: Проверяем, запущен ли код внутри рантайма Vue\n // Для этого динамически и безопасно смотрим на наличие глобального кэша Vue\n const isVueRuntime = typeof window !== 'undefined' &&\n ((window as any).__VUE__ || (globalThis as any).__VUE__ || cb.toString().includes('triggerRef'))\n\n if (!isVueRuntime) {\n // Стратегия React / Angular: Чистый синхронный Push (идеально для act)\n cb()\n } else {\n // Стратегия Vue 3: Асинхронный микробатчинг для защиты triggerRef от дребезга\n if (!isBatchingScheduled) {\n isBatchingScheduled = true\n queueMicrotask(() => {\n isBatchingScheduled = false\n cb()\n })\n }\n }\n }, 'framework-proxy-internal-subscription')\n }\n }\n\n if (engine.activeConsumer) {\n const consumer = engine.activeConsumer\n if (!propsSubscribers.has(prop)) propsSubscribers.set(prop, new Map())\n const subscribers = propsSubscribers.get(prop)!\n if (!subscribers.has(consumer)) {\n const unsubscribeFromKey = () => { subscribers.delete(consumer) }\n subscribers.set(consumer, unsubscribeFromKey)\n consumer.cleanups.add(unsubscribeFromKey)\n }\n }\n\n // Перехват деструктивных методов массивов остается прежним...\n if (Array.isArray(obj) && typeof prop === 'string') {\n const mutatingMethods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']\n if (mutatingMethods.includes(prop)) {\n const originalMethod = (obj as any)[prop]\n return function (...args: any[]) {\n engine.batchDepth++\n isMutatingArray = true\n\n const result = originalMethod.apply(obj, args)\n\n isMutatingArray = false\n\n propsSubscribers.forEach((subscribers, key) => {\n if (key !== prop) {\n Array.from(subscribers.keys()).forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n }\n })\n\n engine.batchDepth--\n if (engine.batchDepth === 0) engine.flushEffects()\n return result\n }\n }\n }\n\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object') ? engine.reactive(value, `${name}.${String(prop)}`) : value\n },\n\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n Reflect.set(obj, prop, value, receiver);\n (engine as any).onSignalChange?.(`${name}.${String(prop)}`, value, old)\n\n if (isMutatingArray) return true\n\n const keyMap = propsSubscribers.get(prop)\n const consumersToNotify = keyMap ? Array.from(keyMap.keys()) : []\n\n if (Array.isArray(obj)) {\n const lengthMap = propsSubscribers.get('length')\n if (lengthMap) consumersToNotify.push(...Array.from(lengthMap.keys()))\n }\n\n consumersToNotify.forEach(consumer => {\n if (consumer === engine.activeConsumer) return\n consumer.markDirty()\n })\n\n if (typeof (engine as any).queueLog === 'function') {\n (engine as any).queueLog('reactive', `${name}.${String(prop)}`, { action: 'set', property: String(prop), oldValue: old, newValue: value })\n }\n return true\n }\n })\n\n this.proxyCache.set(target, proxy)\n return proxy\n }\n\n /**\n * DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ\n */\n public provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void {\n const isFactory = typeof valueOrFactory === 'function' &&\n (!valueOrFactory.prototype || valueOrFactory.name === 'mockConstructor' || (valueOrFactory as any)._isMockFunction)\n\n if (isFactory) {\n this.factories.set(token, valueOrFactory as Factory<T>)\n } else {\n this.services.set(token, valueOrFactory)\n }\n }\n\n /**\n * DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)\n */\n public inject<T>(token: Token<T>): T {\n if (!token) throw new Error(`[DI Error]: Вы пытаетесь внедрить пустой токен.`)\n const targetToken = token as Token<unknown>\n if (this.services.has(targetToken)) return this.services.get(targetToken) as T\n\n try {\n const factory = this.factories.get(targetToken)\n if (factory) {\n const instance = factory(this) as T\n this.services.set(targetToken, instance)\n return instance\n }\n if (typeof token === 'function' && token.prototype) {\n const instance = new (token as any)(this)\n this.services.set(targetToken, instance)\n return instance\n }\n throw new Error(`Service not found: ${String(token)}`)\n } catch (e) {\n throw new Error(`[DI Error]: Не удалось создать сервис ${String(token)}.`)\n }\n }\n\n public queueLog(type: string, name: string, detail: any): void {\n if (!this.loggerOptions?.isEnabled) return\n this.pendingLogQueue.push({ type, name, detail })\n if (this.batchDepth === 0) this.flushLogs()\n }\n\n public flushLogs(): void {\n if (!this.loggerOptions?.isEnabled || this.pendingLogQueue.length === 0) return\n // (Оригинальная логика детального console.groupCollapsed тренда транзакций)\n this.pendingLogQueue = []\n }\n\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)\n */\n public resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const signalName = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n\n const state = this.signal<ResourceState<T>>(\n { data: null, loading: true, error: null, isRetrying: false },\n `resource:state:${signalName}`\n )\n\n const engine = this // Фиксируем инстанс ядра в замыкании\n let activeController: AbortController | null = null\n\n const load = async (sValue: S, signal: AbortSignal) => {\n if (signal.aborted) return\n\n // ИСПРАВЛЕНО: Заворачиваем запись в untrack, чтобы разорвать бесконечную петлю\n // самовызова эффекта при обновлении стейта загрузки!\n engine.untrack(() => {\n state.value = { data: state.value.data, loading: true, error: null, isRetrying: false }\n })\n\n try {\n const data = await fetcher(sValue, signal)\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись успешного ответа в untrack\n engine.untrack(() => {\n state.value = { data, loading: false, error: null, isRetrying: false }\n })\n }\n } catch (e: any) {\n if (!signal.aborted) {\n // ИСПРАВЛЕНО: Заворачиваем запись ошибки в untrack\n engine.untrack(() => {\n state.value = { data: null, loading: false, error: e, isRetrying: false }\n })\n }\n }\n }\n\n // Навешиваем синхронный эффект отслеживания источника (source)\n this.effect(() => {\n const sValue = source ? source.value : (undefined as any)\n\n if (activeController) activeController.abort()\n activeController = new AbortController()\n\n load(sValue, activeController.signal)\n\n return () => {\n if (activeController) activeController.abort()\n }\n })\n\n return {\n get data() { return state.value.data },\n get loading() { return state.value.loading },\n get error() { return state.value.error },\n get value() { return state.value },\n refetch: () => {\n if (activeController) activeController.abort()\n activeController = new AbortController()\n load(source ? source.value : (undefined as any), activeController.signal)\n },\n subscribe: (cb: (val: ResourceState<T>) => void) => state.subscribe(cb)\n }\n }\n\n}\n\n/**\n * 🤖 AUTOMATIC BATCHING ENTERPRISE REACTIVE ENGINE (v1.8.2-beta)\n *\n * Полностью автономный асингулярный движок с топологической сортировкой графа,\n * каскадным уничтожением вложенных эффектов и циклом схождения inner-записей.\n */\nexport class ReactiveEngineAutomatic extends ReactiveEngine {\n private isFlushScheduled = false\n\n // Карта глубин зависимостей для топологической сортировки\n protected nodeDepths = new WeakMap<any, number>()\n\n constructor(options?: { logger?: EngineLoggerOptions }) {\n super(options)\n this.frameworkPrefix = 'auto-core'\n }\n\n /**\n * ВЫЧИСЛЕНИЕ ГЛУБИНЫ УЗЛА ДЛЯ ТОПОЛОГИЧЕСКОЙ СОРТИРОВКИ\n */\n protected getNodeDepth(node: any): number {\n if (!node) return 0\n if (this.nodeDepths.has(node)) return this.nodeDepths.get(node)!\n\n // По умолчанию глубина равна 1, увеличивается при обнаружении родительских контекстов\n return 1\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (ИЕРАРХИЯ + ТОПОЛОГИЯ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const parentConsumer = engine.activeConsumer // Ловим родительский контекст\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n // Вычисляем и фиксируем глубину эффекта относительно его динамических геттеров\n const currentDepth = engine.getNodeDepth(prevConsumer) + 1\n engine.nodeDepths.set(effectObj, currentDepth)\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n }\n }\n }\n\n // ПАТТЕРН CASCADE: Если эффект создан внутри родительского эффекта,\n // регистрируем его автоматическое уничтожение при пересчете родителя!\n if (parentConsumer) {\n const autoDisposeChild = () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n parentConsumer.cleanups.add(autoDisposeChild)\n }\n\n (engine as any).allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => { try { c() } catch (e) {} })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj);\n (engine as any).allEffects.delete(effectObj)\n }\n }\n\n /**\n * АСИНХРОННЫЙ ЦИКЛ СХОЖДЕНИЯ ГРАФА (CONVERGENCE LOOP)\n * Прогоняет эффекты строго по топологической глубине и обрабатывает Inner Writes на месте.\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isFlushScheduled) {\n this.isFlushScheduled = true\n\n queueMicrotask(() => {\n this.isFlushScheduled = false\n\n // ЦИКЛ СХОЖДЕНИЯ (Convergence Loop): Крутимся до тех пор,\n // пока внутренние записи (Inner Writes) не перестанут загрязнять граф\n let iterations = 0\n const MAX_ITERATIONS = 100\n\n while (this.pendingEffects.size > 0 && iterations < MAX_ITERATIONS) {\n iterations++\n\n // ТОПОЛОГИЧЕСКАЯ СОРТИРОВКА: Сортируем эффекты по глубине вложенности графа,\n // чтобы апстрим-компьютеды всегда выполнялись раньше даунстрим-эффектов!\n const effectsToRun = Array.from(this.pendingEffects).sort((a: any, b: any) => {\n const depthA = this.getNodeDepth(a)\n const depthB = this.getNodeDepth(b)\n return depthA - depthB || a.id - b.id\n })\n\n this.pendingEffects.clear()\n\n effectsToRun.forEach(effectObj => {\n try {\n effectObj.run()\n } catch (error) {\n console.error('[Reactive Engine Automatic: Effect Error]', error)\n }\n })\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn('[Reactive Engine Automatic] Превышен лимит схождения графа. Обнаружен бесконечный цикл мутаций.')\n }\n })\n }\n }\n}\n\ninterface ReactiveEngineOptions {\n logger?: EngineLoggerOptions;\n}\n\n/**\n * 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE\n *\n * Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный\n * автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.\n */\nexport class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {\n // Локальный буфер асинхронных логов, строго типизированный по контракту LogDetailMap\n private autoLogQueue: Array<{\n type: keyof LogDetailMap;\n name: string;\n detail: LogDetailMap[keyof LogDetailMap];\n }> = []\n\n private isHardFlushScheduled = false\n\n constructor(options?: ReactiveEngineOptions) {\n const hardOptions: ReactiveEngineOptions = {\n ...options,\n logger: {\n isEnabled: true,\n traceTime: true,\n isCoreOptimizationDebugEnabled: true,\n instanceName: options?.logger?.instanceName || 'AUTOMATIC_HARD_CORE',\n filter: options?.logger?.filter\n }\n }\n super(hardOptions)\n this.frameworkPrefix = 'auto-hard-core'\n }\n\n /**\n * ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР\n */\n public override queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void {\n this.autoLogQueue.push({ type, name, detail })\n }\n\n /**\n * АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ\n */\n public override flushLogs(): void {\n if (this.autoLogQueue.length === 0) return\n\n const badgeColors: Record<keyof LogDetailMap, string> = {\n signal: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n computed: 'background: #42b883; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n effect: 'background: #e01e5a; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n batch: 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n resource: 'background: #d97706; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n reactive: 'background: #007acc; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n }\n\n console.groupCollapsed(\n `%cREACTIVE TRANSACTION [${this.frameworkPrefix.toUpperCase()}]%c Microtask Tick (Size: ${this.autoLogQueue.length})`,\n 'background: #7952b3; color: #fff; padding: 2px 6px; border-radius: 4px; font-weight: bold;',\n 'color: #aaa; font-weight: normal;'\n )\n\n this.autoLogQueue.forEach(item => {\n let subBadgeText = ''\n if (item.type === 'signal') {\n const d = item.detail as SignalLogDetail\n subBadgeText = ` 🔄 Изменение: [${String(d.from)} -> ${String(d.to)}]`\n } else if (item.type === 'computed') {\n const d = item.detail as ComputedLogDetail\n subBadgeText = ` 🧮 Расчет кэша (${d.duration})`\n } else if (item.type === 'effect') {\n const d = item.detail as any\n subBadgeText = d?.isTriggered ? ` ⚡️ Ререндер/Вызов (${d.duration || '0ms'})` : ' 🟢 Инициализация подписки'\n } else if (item.type === 'resource') {\n const d = item.detail as ResourceLogDetail\n subBadgeText = d.loading ? ' ⏳ ЗАГРУЗКА СЕТИ' : d.error ? ` 🔴 ОШИБКА` : ' 🟢 УСПЕШНО ОТВЕТИЛ'\n }\n\n console.groupCollapsed(\n `%c${item.type.toUpperCase()}%c [${item.name}]%c${subBadgeText}`,\n badgeColors[item.type] || badgeColors.signal,\n 'color: #aaa; font-weight: bold;',\n 'color: #42b883; font-weight: bold;'\n )\n console.log('Детали операции:', item.detail)\n console.groupEnd()\n })\n\n console.groupEnd()\n this.autoLogQueue = []\n }\n\n /**\n * АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ\n */\n protected override flushEffects(): void {\n if (this.batchDepth > 0) {\n return\n }\n\n if (!this.isHardFlushScheduled) {\n this.isHardFlushScheduled = true\n\n queueMicrotask(() => {\n this.isHardFlushScheduled = false\n this.flushLogs()\n super.flushEffects()\n })\n }\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)\n */\n public override effect(fn: () => void | (() => void), label?: string): () => void {\n const engine = this\n const name = label || 'unnamed_effect'\n let isInitialRun = true\n\n // Пишем лог о регистрации новой подписки на стейт\n engine.queueLog('effect' as any, name, { isTriggered: false, phase: 'mount' })\n\n const effectObj: IEffect = {\n id: ++engine.subscriberId,\n label: name,\n cleanups: new Set<() => void>(),\n\n markDirty() {\n engine.pendingEffects.add(effectObj)\n engine.flushEffects()\n },\n\n run() {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n const cleanupsToRun = Array.from(effectObj.cleanups) as (() => void)[]\n effectObj.cleanups.clear()\n\n cleanupsToRun.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Cleanup Error]', e) }\n })\n\n const prevConsumer = engine.activeConsumer\n engine.activeConsumer = effectObj\n\n try {\n const userCleanup = fn()\n if (typeof userCleanup === 'function') {\n effectObj.cleanups.add(userCleanup)\n }\n } finally {\n engine.activeConsumer = prevConsumer\n\n if (!isInitialRun && startTime && typeof engine.queueLog === 'function') {\n const duration = performance.now() - startTime\n engine.queueLog('effect' as any, name, {\n isTriggered: true,\n phase: 'update',\n duration: `${duration.toFixed(3)}ms`\n })\n }\n isInitialRun = false\n }\n }\n }\n\n engine.allEffects.add(effectObj)\n effectObj.run()\n\n return () => {\n const finalCleanups = Array.from(effectObj.cleanups) as (() => void)[]\n finalCleanups.forEach(c => {\n try { c() } catch (e) { console.error('[Reactive Engine:Dispose Cleanup Error]', e) }\n })\n effectObj.cleanups.clear()\n engine.pendingEffects.delete(effectObj)\n engine.allEffects.delete(effectObj)\n engine.queueLog('effect' as any, name, { phase: 'unmount' })\n }\n }\n\n /**\n * АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override resource<T, S = void>(\n fetcher: (source: S, signal: AbortSignal) => Promise<T>,\n source?: { value: S },\n optionsOrName?: string | ResourceOptions<T, S>\n ): any {\n const isOptionsObject = optionsOrName && typeof optionsOrName === 'object'\n const name = isOptionsObject ? (optionsOrName as any).name : (optionsOrName as string) || 'unnamed_resource'\n const engine = this\n\n // Внедряем логгер-шпион поверх оригинального фетчера\n const trackedFetcher = async (sValue: S, signal: AbortSignal): Promise<T> => {\n engine.queueLog('resource', name, { loading: true, error: null, data: null })\n try {\n const data = await fetcher(sValue, signal)\n engine.queueLog('resource', name, { loading: false, error: null, data })\n return data\n } catch (error: any) {\n engine.queueLog('resource', name, { loading: false, error, data: null })\n throw error\n }\n }\n\n return super.resource(trackedFetcher, source, optionsOrName)\n }\n\n /**\n * ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА\n */\n public override reactive<T extends object>(target: T, name: string = 'reactive'): T {\n const engine = this\n const baseProxy = super.reactive(target, name)\n\n return new Proxy(baseProxy, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver)\n return (value !== null && typeof value === 'object')\n ? engine.reactive(value, `${name}.${String(prop)}`)\n : value\n },\n set(obj, prop, value, receiver) {\n const old = Reflect.get(obj, prop, receiver)\n if (old === value) return true\n\n engine.queueLog('signal', `${name}.${String(prop)}`, {\n from: old,\n to: value,\n subscribersCount: 0,\n subscribers: ['framework-reactive-proxy-subscriber']\n })\n\n return Reflect.set(obj, prop, value, receiver)\n }\n }) as T\n }\n\n /**\n * СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)\n */\n public override signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T> {\n const engine = this\n const options = typeof optionsOrName === 'string' ? { name: optionsOrName } : optionsOrName || {}\n const name = options.name || 'unnamed_signal'\n\n const originalSignal = super.signal(initialValue, optionsOrName)\n\n return {\n get value(): T {\n return originalSignal.value\n },\n set value(newValue: T) {\n const old = originalSignal.value\n const isPrimitive = newValue === null || (typeof newValue !== 'object' && typeof newValue !== 'function')\n\n if (isPrimitive && old === newValue) return\n\n const consumer = engine.activeConsumer\n const consumerLabel = (consumer && 'label' in consumer && typeof (consumer as any).label === 'string')\n ? (consumer as any).label\n : 'unnamed_effect'\n\n engine.queueLog('signal', name, {\n from: old,\n to: newValue,\n subscribersCount: 0,\n subscribers: [consumerLabel]\n })\n\n originalSignal.value = newValue\n },\n subscribe(cb: (val: T) => void) {\n return originalSignal.subscribe(cb)\n }\n }\n }\n /**\n * СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)\n */\n public override computed<T>(fn: () => T, signalName?: string): Computed<T> {\n const engine = this\n const name = signalName || 'unnamed_computed'\n const originalComputed = super.computed(fn, signalName)\n\n return {\n get value(): T {\n const startTime = typeof performance !== 'undefined' ? performance.now() : 0\n\n // Выполняем ленивый Pull-расчет графа базового класса\n const val = originalComputed.value\n\n if (startTime) {\n const duration = performance.now() - startTime\n engine.queueLog('computed', name, {\n value: val,\n duration: `${duration.toFixed(3)}ms`\n })\n }\n return val\n },\n subscribe: (cb: (val: T) => void) => originalComputed.subscribe(cb),\n destroy() {\n originalComputed.destroy()\n }\n }\n }\n\n}\n","import { ReactiveEngine } from './core'\n\nexport abstract class AbstractService {\n constructor(protected engine: ReactiveEngine) {\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 { ReactiveEngine } from './core'\n\nexport abstract class BaseREServiceEnhanced {\n constructor(protected engine: ReactiveEngine) {\n setTimeout(() => this.onInit(), 0)\n }\n\n protected onInit(): void { }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "1.8.0-beta",
3
+ "version": "1.8.2-beta",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },