@pravosleva/reactive-engine 2.0.0 → 2.1.0-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.
Files changed (48) hide show
  1. package/dist/BaseREServiceEnhanced.cjs.map +1 -1
  2. package/dist/BaseREServiceEnhanced.mjs.map +1 -1
  3. package/dist/core/BaseREServiceEnhanced.d.ts +3 -3
  4. package/dist/core/BaseREServiceEnhanced.d.ts.map +1 -1
  5. package/dist/core/core.automatic.d.ts +0 -19
  6. package/dist/core/core.automatic.d.ts.map +1 -1
  7. package/dist/core/core.d.ts.map +1 -1
  8. package/dist/core/core.logger.d.ts +22 -0
  9. package/dist/core/core.logger.d.ts.map +1 -0
  10. package/dist/core/core.method.computed.d.ts +0 -4
  11. package/dist/core/core.method.computed.d.ts.map +1 -1
  12. package/dist/core/core.method.signal.d.ts +0 -4
  13. package/dist/core/core.method.signal.d.ts.map +1 -1
  14. package/dist/core.automatic.cjs +1 -1
  15. package/dist/core.automatic.cjs.map +1 -1
  16. package/dist/core.automatic.mjs +1 -20
  17. package/dist/core.automatic.mjs.map +1 -1
  18. package/dist/core.cjs +1 -1
  19. package/dist/core.cjs.map +1 -1
  20. package/dist/core.logger.cjs +2 -0
  21. package/dist/core.logger.cjs.map +1 -0
  22. package/dist/core.logger.mjs +48 -0
  23. package/dist/core.logger.mjs.map +1 -0
  24. package/dist/core.method.computed.cjs +1 -1
  25. package/dist/core.method.computed.cjs.map +1 -1
  26. package/dist/core.method.computed.mjs +110 -46
  27. package/dist/core.method.computed.mjs.map +1 -1
  28. package/dist/core.method.signal.cjs +1 -1
  29. package/dist/core.method.signal.cjs.map +1 -1
  30. package/dist/core.method.signal.mjs +6 -10
  31. package/dist/core.method.signal.mjs.map +1 -1
  32. package/dist/core.mjs +31 -43
  33. package/dist/core.mjs.map +1 -1
  34. package/dist/react/index.cjs +1 -1
  35. package/dist/react/index.cjs.map +1 -1
  36. package/dist/react/index.d.ts +2 -2
  37. package/dist/react/index.d.ts.map +1 -1
  38. package/dist/react/index.mjs +1 -1
  39. package/dist/react/index.mjs.map +1 -1
  40. package/dist/reactive-engine.umd.js +2 -2
  41. package/dist/reactive-engine.umd.js.map +1 -1
  42. package/dist/vue/index.cjs +1 -1
  43. package/dist/vue/index.cjs.map +1 -1
  44. package/dist/vue/index.d.ts +3 -3
  45. package/dist/vue/index.d.ts.map +1 -1
  46. package/dist/vue/index.mjs +3 -1
  47. package/dist/vue/index.mjs.map +1 -1
  48. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./core.vue-adapter.cjs");let n=require("vue");var r=class extends e.ReactiveEngine{frameworkPrefix=`vue-auto`;reactive(e,t){let n=e=>{if(!(!e||typeof e!=`object`||Symbol.iterator in e)){Reflect.has(e,`__subscribe`)||Object.defineProperty(e,"__subscribe",{get:()=>e=>this.effect(()=>{try{JSON.stringify(r)}catch{Object.values(r)}e()},`vue-proxy-internal-subscription`),configurable:!0,enumerable:!1}),Reflect.has(e,`__v_skip`)||Object.defineProperty(e,"__v_skip",{get:()=>!0,configurable:!0,enumerable:!1});for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&typeof e[t]==`object`&&n(e[t])}};n(e);let r=super.reactive(e,t);return r}use(e){if(typeof e!=`object`||!e)return(0,n.shallowRef)(e);if(`subscribe`in e&&typeof e.subscribe==`function`){let t=e,r=(0,n.shallowRef)(t.value),i=t.subscribe(e=>{r.value=e,(0,n.triggerRef)(r)});return(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>i()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>i()),r}let t=(0,n.shallowRef)(e);if(`__subscribe`in e&&typeof e.__subscribe==`function`){let r=e.__subscribe(()=>{(0,n.triggerRef)(t)});(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>r()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>r())}return t}};exports.ReactiveEngine=r,exports.useReactiveValue=t.useReactiveValue;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./core.vue-adapter.cjs");let n=require("vue");var r=class extends e.ReactiveEngine{frameworkPrefix=`vue-auto`;reactive(e,t){let n=e=>{if(!(!e||typeof e!=`object`||Symbol.iterator in e)){Reflect.has(e,`__subscribe`)||Object.defineProperty(e,"__subscribe",{get:()=>e=>this.effect(()=>{try{JSON.stringify(r)}catch{Object.values(r)}e()},`vue-proxy-internal-subscription`),configurable:!0,enumerable:!1}),Reflect.has(e,`__v_skip`)||Object.defineProperty(e,"__v_skip",{get:()=>!0,configurable:!0,enumerable:!1});for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&typeof e[t]==`object`&&n(e[t])}};n(e);let r=super.reactive(e,t);return r}use(e){if(typeof e!=`object`||!e)return(0,n.shallowRef)(e);if(`subscribe`in e&&typeof e.subscribe==`function`){let t=e,r=(0,n.shallowRef)(this.untrack(()=>t.value)),i=`__subscribe`in t&&typeof t.__subscribe==`function`?t.__subscribe(()=>{r.value=t.value,(0,n.triggerRef)(r)}):t.subscribe(e=>{r.value=e,(0,n.triggerRef)(r)});return(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>i()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>i()),r}let t=(0,n.shallowRef)(e);if(`__subscribe`in e&&typeof e.__subscribe==`function`){let r=e.__subscribe(()=>{(0,n.triggerRef)(t)});(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>r()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>r())}return t}};exports.ReactiveEngine=r,exports.useReactiveValue=t.useReactiveValue;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n /**\n * Переопределяем метод создания реактивных объектов для Vue-версии движка.\n * Рекурсивно внедряет свойства __subscribe и __v_skip в target, защищая глубокие структуры от Vue 3.\n */\n public override reactive<T extends object>(target: T, name?: string): T {\n // Вспомогательная функция для глубокого рекурсивного внедрения маркеров фреймворка\n const injectVueMarkers = (obj: any) => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in obj) return\n\n // 1. Внедряем мост подписки __subscribe\n if (!Reflect.has(obj, '__subscribe')) {\n Object.defineProperty(obj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n // 2. Внедряем маркер __v_skip непосредственно в target\n // Благодаря Reflect.get в ядре, этот маркер будет возвращаться для ВСЕХ уровней вложенности графа!\n if (!Reflect.has(obj, '__v_skip')) {\n Object.defineProperty(obj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n // Рекурсивно обходим все дочерние свойства, чтобы застраховать вложенные массивы и объекты\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === 'object') {\n injectVueMarkers(obj[key])\n }\n }\n }\n\n // Запускаем глубокую инжекцию маркеров во все узлы дерева target\n injectVueMarkers(target)\n\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n const state = shallowRef(item)\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n const state = shallowRef(signalItem.value)\n\n const unsubscribe = signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n const state = shallowRef(item)\n\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state) // triggerRef теперь будет вызван строго 1 раз на выходе в Event Loop\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":"2JAMA,IAAM,EAAN,cAAqC,EAAA,cAAwB,CAC3D,gBAAqC,WAMrC,SAA2C,EAAW,EAAkB,CAEtE,IAAM,EAAoB,GAAa,CACjC,MAAC,GAAO,OAAO,GAAQ,UAAY,OAAO,YAAY,GAwB1D,CArBK,QAAQ,IAAI,EAAK,aAAa,GACjC,OAAO,eAAe,EAAK,cAAe,CACxC,QACU,GACC,KAAK,WAAa,CACvB,GAAI,CACF,KAAK,UAAU,CAAa,CAC9B,MAAY,CACV,OAAO,OAAO,CAAwC,CACxD,CACA,EAAG,CACL,EAAG,iCAAiC,EAGxC,aAAc,GACd,WAAY,EACd,CAAC,EAKE,QAAQ,IAAI,EAAK,UAAU,GAC9B,OAAO,eAAe,EAAK,WAAY,CACrC,QAAW,GACX,aAAc,GACd,WAAY,EACd,CAAC,EAIH,IAAK,IAAM,KAAO,EACZ,OAAO,UAAU,eAAe,KAAK,EAAK,CAAG,GAAK,OAAO,EAAI,IAAS,UACxE,EAAiB,EAAI,EAAI,CAN1B,CASL,EAGA,EAAiB,CAAM,EAEvB,IAAM,EAAgB,MAAM,SAAS,EAAQ,CAAI,EACjD,OAAO,CACT,CAEA,IAAc,EAAyE,CACrF,GAA2C,OAAO,GAAS,WAAvD,EAEF,OAAA,EAAA,EAAA,WAAA,CADyB,CAClB,EAKT,GAFiB,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAEjF,CACZ,IAAM,EAAc,EACd,GAAA,EAAA,EAAA,WAAA,CAAmB,EAAW,KAAK,EAEnC,EAAc,EAAW,UAAW,GAAa,CACrD,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAQD,OANA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,EAG7B,CACT,CAEA,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,CAAI,EAE7B,GAAI,gBAAiB,GAAQ,OAAQ,EAAiC,aAAgB,WAAY,CAChG,IAAM,EAAgB,EAAiC,gBAAoD,EACzG,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,GAED,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,CAEtC,CAEA,OAAO,CACT,CACF"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n const injectVueMarkers = (obj: any) => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in obj) return\n\n if (!Reflect.has(obj, '__subscribe')) {\n Object.defineProperty(obj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(obj, '__v_skip')) {\n Object.defineProperty(obj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === 'object') {\n injectVueMarkers(obj[key])\n }\n }\n }\n\n injectVueMarkers(target)\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n \n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof (signalItem as any).__subscribe === 'function'\n \n const unsubscribe = hasHook \n ? (signalItem as any).__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as any\n }\n\n const state = shallowRef(item)\n\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as any\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":"2JAMA,IAAM,EAAN,cAAqC,EAAA,cAAwB,CAC3D,gBAAqC,WAErC,SAA2C,EAAW,EAAkB,CACtE,IAAM,EAAoB,GAAa,CACjC,MAAC,GAAO,OAAO,GAAQ,UAAY,OAAO,YAAY,GAqB1D,CAnBK,QAAQ,IAAI,EAAK,aAAa,GACjC,OAAO,eAAe,EAAK,cAAe,CACxC,QACU,GACC,KAAK,WAAa,CACvB,GAAI,CACF,KAAK,UAAU,CAAa,CAC9B,MAAY,CACV,OAAO,OAAO,CAAwC,CACxD,CACA,EAAG,CACL,EAAG,iCAAiC,EAGxC,aAAc,GACd,WAAY,EACd,CAAC,EAGE,QAAQ,IAAI,EAAK,UAAU,GAC9B,OAAO,eAAe,EAAK,WAAY,CACrC,QAAW,GACX,aAAc,GACd,WAAY,EACd,CAAC,EAGH,IAAK,IAAM,KAAO,EACZ,OAAO,UAAU,eAAe,KAAK,EAAK,CAAG,GAAK,OAAO,EAAI,IAAS,UACxE,EAAiB,EAAI,EAAI,CAL1B,CAQL,EAEA,EAAiB,CAAM,EACvB,IAAM,EAAgB,MAAM,SAAS,EAAQ,CAAI,EACjD,OAAO,CACT,CAMA,IAAc,EAAyE,CACrF,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,WAAA,CAAkB,CAAI,EAKxB,GAFiB,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAEjF,CACZ,IAAM,EAAc,EAKd,GAAA,EAAA,EAAA,WAAA,CADe,KAAK,YAAc,EAAW,KAC1B,CAAY,EAM/B,EAFU,gBAAiB,GAAc,OAAQ,EAAmB,aAAgB,WAGrF,EAAmB,gBAAkB,CACpC,EAAM,MAAQ,EAAW,OACzB,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EACD,EAAW,UAAW,GAAa,CACjC,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAQL,OANA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,EAG7B,CACT,CAEA,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,CAAI,EAE7B,GAAI,gBAAiB,GAAQ,OAAQ,EAAiC,aAAgB,WAAY,CAChG,IAAM,EAAgB,EAAiC,gBAAoD,EACzG,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,GAED,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,CAEtC,CAEA,OAAO,CACT,CACF"}
@@ -4,11 +4,11 @@ import { ShallowRef } from 'vue';
4
4
  export { useReactiveValue } from './core.vue-adapter';
5
5
  declare class ExtendedReactiveEngine extends ReactiveEngineAutomatic {
6
6
  protected frameworkPrefix: string;
7
+ reactive<T extends object>(target: T, name?: string): T;
7
8
  /**
8
- * Переопределяем метод создания реактивных объектов для Vue-версии движка.
9
- * Рекурсивно внедряет свойства __subscribe и __v_skip в target, защищая глубокие структуры от Vue 3.
9
+ * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.
10
+ * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).
10
11
  */
11
- reactive<T extends object>(target: T, name?: string): T;
12
12
  use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>;
13
13
  }
14
14
  export { ExtendedReactiveEngine as ReactiveEngine };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAgF,UAAU,EAAc,MAAM,KAAK,CAAA;AAE1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,cAAM,sBAAuB,SAAQ,uBAAuB;IAC1D,UAAmB,eAAe,SAAa;IAE/C;;;OAGG;IACa,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IAkDhE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CA0CvF;AAED,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAgF,UAAU,EAAc,MAAM,KAAK,CAAA;AAE1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,cAAM,sBAAuB,SAAQ,uBAAuB;IAC1D,UAAmB,eAAe,SAAa;IAE/B,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IA2CvE;;;OAGG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CAsDvF;AAED,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,CAAA"}
@@ -33,7 +33,9 @@ var c = class extends e {
33
33
  use(e) {
34
34
  if (typeof e != "object" || !e) return o(e);
35
35
  if ("subscribe" in e && typeof e.subscribe == "function") {
36
- let t = e, c = o(t.value), l = t.subscribe((e) => {
36
+ let t = e, c = o(this.untrack(() => t.value)), l = "__subscribe" in t && typeof t.__subscribe == "function" ? t.__subscribe(() => {
37
+ c.value = t.value, s(c);
38
+ }) : t.subscribe((e) => {
37
39
  c.value = e, s(c);
38
40
  });
39
41
  return n() ? a(() => l()) : r() && i(() => l()), c;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n /**\n * Переопределяем метод создания реактивных объектов для Vue-версии движка.\n * Рекурсивно внедряет свойства __subscribe и __v_skip в target, защищая глубокие структуры от Vue 3.\n */\n public override reactive<T extends object>(target: T, name?: string): T {\n // Вспомогательная функция для глубокого рекурсивного внедрения маркеров фреймворка\n const injectVueMarkers = (obj: any) => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in obj) return\n\n // 1. Внедряем мост подписки __subscribe\n if (!Reflect.has(obj, '__subscribe')) {\n Object.defineProperty(obj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n // 2. Внедряем маркер __v_skip непосредственно в target\n // Благодаря Reflect.get в ядре, этот маркер будет возвращаться для ВСЕХ уровней вложенности графа!\n if (!Reflect.has(obj, '__v_skip')) {\n Object.defineProperty(obj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n // Рекурсивно обходим все дочерние свойства, чтобы застраховать вложенные массивы и объекты\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === 'object') {\n injectVueMarkers(obj[key])\n }\n }\n }\n\n // Запускаем глубокую инжекцию маркеров во все узлы дерева target\n injectVueMarkers(target)\n\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n const state = shallowRef(item)\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n const state = shallowRef(signalItem.value)\n\n const unsubscribe = signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n const state = shallowRef(item)\n\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state) // triggerRef теперь будет вызван строго 1 раз на выходе в Event Loop\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":";;;;AAMA,IAAM,IAAN,cAAqC,EAAwB;CAC3D,kBAAqC;CAMrC,SAA2C,GAAW,GAAkB;EAEtE,IAAM,KAAoB,MAAa;GACjC,OAAC,KAAO,OAAO,KAAQ,YAAY,OAAO,YAAY,IAwB1D;IArBK,QAAQ,IAAI,GAAK,aAAa,KACjC,OAAO,eAAe,GAAK,eAAe;KACxC,YACU,MACC,KAAK,aAAa;MACvB,IAAI;OACF,KAAK,UAAU,CAAa;MAC9B,QAAY;OACV,OAAO,OAAO,CAAwC;MACxD;MACA,EAAG;KACL,GAAG,iCAAiC;KAGxC,cAAc;KACd,YAAY;IACd,CAAC,GAKE,QAAQ,IAAI,GAAK,UAAU,KAC9B,OAAO,eAAe,GAAK,YAAY;KACrC,WAAW;KACX,cAAc;KACd,YAAY;IACd,CAAC;IAIH,KAAK,IAAM,KAAO,GAChB,AAAI,OAAO,UAAU,eAAe,KAAK,GAAK,CAAG,KAAK,OAAO,EAAI,MAAS,YACxE,EAAiB,EAAI,EAAI;GAN1B;EASL;EAGA,EAAiB,CAAM;EAEvB,IAAM,IAAgB,MAAM,SAAS,GAAQ,CAAI;EACjD,OAAO;CACT;CAEA,IAAc,GAAyE;EACrF,IAA2C,OAAO,KAAS,aAAvD,GAEF,OADc,EAAW,CAClB;EAKT,IAFiB,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAEjF;GACZ,IAAM,IAAc,GACd,IAAQ,EAAW,EAAW,KAAK,GAEnC,IAAc,EAAW,WAAW,MAAa;IAErD,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;GAClB,CAAC;GAQD,OANI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC,GAG7B;EACT;EAEA,IAAM,IAAQ,EAAW,CAAI;EAE7B,IAAI,iBAAiB,KAAQ,OAAQ,EAAiC,eAAgB,YAAY;GAChG,IAAM,IAAgB,EAAiC,kBAAoD;IACzG,EAAW,CAAK;GAClB,CAAC;GAED,AAAI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC;EAEtC;EAEA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n const injectVueMarkers = (obj: any) => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in obj) return\n\n if (!Reflect.has(obj, '__subscribe')) {\n Object.defineProperty(obj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(obj, '__v_skip')) {\n Object.defineProperty(obj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === 'object') {\n injectVueMarkers(obj[key])\n }\n }\n }\n\n injectVueMarkers(target)\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n \n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof (signalItem as any).__subscribe === 'function'\n \n const unsubscribe = hasHook \n ? (signalItem as any).__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as any\n }\n\n const state = shallowRef(item)\n\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n const unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as any\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":";;;;AAMA,IAAM,IAAN,cAAqC,EAAwB;CAC3D,kBAAqC;CAErC,SAA2C,GAAW,GAAkB;EACtE,IAAM,KAAoB,MAAa;GACjC,OAAC,KAAO,OAAO,KAAQ,YAAY,OAAO,YAAY,IAqB1D;IAnBK,QAAQ,IAAI,GAAK,aAAa,KACjC,OAAO,eAAe,GAAK,eAAe;KACxC,YACU,MACC,KAAK,aAAa;MACvB,IAAI;OACF,KAAK,UAAU,CAAa;MAC9B,QAAY;OACV,OAAO,OAAO,CAAwC;MACxD;MACA,EAAG;KACL,GAAG,iCAAiC;KAGxC,cAAc;KACd,YAAY;IACd,CAAC,GAGE,QAAQ,IAAI,GAAK,UAAU,KAC9B,OAAO,eAAe,GAAK,YAAY;KACrC,WAAW;KACX,cAAc;KACd,YAAY;IACd,CAAC;IAGH,KAAK,IAAM,KAAO,GAChB,AAAI,OAAO,UAAU,eAAe,KAAK,GAAK,CAAG,KAAK,OAAO,EAAI,MAAS,YACxE,EAAiB,EAAI,EAAI;GAL1B;EAQL;EAEA,EAAiB,CAAM;EACvB,IAAM,IAAgB,MAAM,SAAS,GAAQ,CAAI;EACjD,OAAO;CACT;CAMA,IAAc,GAAyE;EACrF,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAW,CAAI;EAKxB,IAFiB,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAEjF;GACZ,IAAM,IAAc,GAKd,IAAQ,EADO,KAAK,cAAc,EAAW,KAC1B,CAAY,GAM/B,IAFU,iBAAiB,KAAc,OAAQ,EAAmB,eAAgB,aAGrF,EAAmB,kBAAkB;IAEpC,AADA,EAAM,QAAQ,EAAW,OACzB,EAAW,CAAK;GAClB,CAAC,IACD,EAAW,WAAW,MAAa;IAEjC,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;GAClB,CAAC;GAQL,OANI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC,GAG7B;EACT;EAEA,IAAM,IAAQ,EAAW,CAAI;EAE7B,IAAI,iBAAiB,KAAQ,OAAQ,EAAiC,eAAgB,YAAY;GAChG,IAAM,IAAgB,EAAiC,kBAAoD;IACzG,EAAW,CAAK;GAClB,CAAC;GAED,AAAI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC;EAEtC;EAEA,OAAO;CACT;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "2.0.0",
3
+ "version": "2.1.0-beta",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },