@pravosleva/reactive-engine 1.6.1 → 1.7.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 (52) hide show
  1. package/dist/angular/ReactiveEngine4Angular.cjs +1 -1
  2. package/dist/angular/ReactiveEngine4Angular.cjs.map +1 -1
  3. package/dist/angular/ReactiveEngine4Angular.d.ts +16 -10
  4. package/dist/angular/ReactiveEngine4Angular.d.ts.map +1 -1
  5. package/dist/angular/ReactiveEngine4Angular.mjs +29 -5
  6. package/dist/angular/ReactiveEngine4Angular.mjs.map +1 -1
  7. package/dist/core/core.d.ts.map +1 -1
  8. package/dist/core.cjs +1 -1
  9. package/dist/core.cjs.map +1 -1
  10. package/dist/core.mjs +42 -25
  11. package/dist/core.mjs.map +1 -1
  12. package/dist/decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.cjs +1 -1
  13. package/dist/decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.cjs.map +1 -1
  14. package/dist/decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.d.ts +7 -25
  15. package/dist/decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.d.ts.map +1 -1
  16. package/dist/decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.mjs +23 -8
  17. package/dist/decorators/withStaleWhileRevalidate/withStaleWhileRevalidate.mjs.map +1 -1
  18. package/dist/react/ReactiveEngine4React.cjs +1 -4
  19. package/dist/react/ReactiveEngine4React.cjs.map +1 -1
  20. package/dist/react/ReactiveEngine4React.d.ts +7 -5
  21. package/dist/react/ReactiveEngine4React.d.ts.map +1 -1
  22. package/dist/react/ReactiveEngine4React.mjs +25 -17
  23. package/dist/react/ReactiveEngine4React.mjs.map +1 -1
  24. package/dist/react/hooks/types.d.ts +4 -0
  25. package/dist/react/hooks/types.d.ts.map +1 -1
  26. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs +1 -1
  27. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs.map +1 -1
  28. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts +4 -10
  29. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts.map +1 -1
  30. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs +20 -11
  31. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs.map +1 -1
  32. package/dist/react/hooks/useReactiveValue/useReactiveValue.cjs +1 -1
  33. package/dist/react/hooks/useReactiveValue/useReactiveValue.cjs.map +1 -1
  34. package/dist/react/hooks/useReactiveValue/useReactiveValue.d.ts +10 -41
  35. package/dist/react/hooks/useReactiveValue/useReactiveValue.d.ts.map +1 -1
  36. package/dist/react/hooks/useReactiveValue/useReactiveValue.mjs +19 -10
  37. package/dist/react/hooks/useReactiveValue/useReactiveValue.mjs.map +1 -1
  38. package/dist/reactive-engine.umd.js +2 -2
  39. package/dist/reactive-engine.umd.js.map +1 -1
  40. package/dist/vue/ReactiveEngine4Vue.cjs +1 -1
  41. package/dist/vue/ReactiveEngine4Vue.cjs.map +1 -1
  42. package/dist/vue/ReactiveEngine4Vue.d.ts +21 -6
  43. package/dist/vue/ReactiveEngine4Vue.d.ts.map +1 -1
  44. package/dist/vue/ReactiveEngine4Vue.mjs +31 -8
  45. package/dist/vue/ReactiveEngine4Vue.mjs.map +1 -1
  46. package/dist/vue/composables/useReactiveValue.cjs +1 -1
  47. package/dist/vue/composables/useReactiveValue.cjs.map +1 -1
  48. package/dist/vue/composables/useReactiveValue.d.ts +4 -45
  49. package/dist/vue/composables/useReactiveValue.d.ts.map +1 -1
  50. package/dist/vue/composables/useReactiveValue.mjs +10 -5
  51. package/dist/vue/composables/useReactiveValue.mjs.map +1 -1
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/vue/composables/useReactiveValue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, type ShallowRef } from 'vue'\n\ntype CleanupFn = () => void\ninterface ReactiveItem<T> {\n value: T\n subscribe: (cb: (v: T) => void) => CleanupFn\n}\n\n/**\n * Хук-композибл для бесшовной интеграции примитивов реактивного ядра с системой рендеринга Vue 3.\n * Нативно поддерживает как атомарные сигналы (`signal`), так и ленивые вычисляемые свойства (`computed`).\n *\n * @template T Тип данных, содержащихся внутри реактивного элемента.\n *\n * @param {Object} item Реактивный примитив ядра, на который необходимо подписаться.\n * @param {T} item.value Текущее значение элемента.\n * @param {(cb: (v: T) => void) => () => void} item.subscribe Метод ядра для оформления подписки на изменения.\n *\n * @returns {ShallowRef<T>} Возвращает стандартную для Vue 3 переменную типа `ShallowRef`.\n * При мутации данных в ядре автоматически вызывается `triggerRef`, инициируя точечный перерасчет шаблона.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useEngine } from '~/composables/useEngine';\n * import { useReactiveValue } from '@pravosleva/reactive-engine/vue';\n *\n * const engine = useEngine();\n * const counterSignal = engine.signal(0, 'ui:counter');\n *\n * // countState теперь обычный Vue Ref, но связанный с ядром данных\n * const countState = useReactiveValue(counterSignal);\n * </script>\n *\n * <template>\n * <button @click=\"counterSignal.value++\">Кликнули: {{ countState }}</button>\n * </template>\n * ```\n *\n * @abstract\n * ### 🚨 Поведение в SSR и Универсальном рендеринге (Nuxt 3 / Nitro)\n * Композибл полностью безопасен для работы на стороне сервера (Node.js). Благодаря внутренним\n * проверкам окружения, на этапе серверного пре-рендеринга он переходит в **пассивный режим**:\n * - Выполняется только однократное чтение `.value` для сборки начального HTML-кода страницы.\n * - Активные подписки и замыкания **не регистрируются**, что полностью предотвращает утечки памяти на сервере.\n * - Исключает появление ошибок несовпадения разметки (`Hydration Mismatch`) при гидратации в браузере.\n *\n * ### 🧹 Управление памятью на клиенте\n * В браузере композибл самостоятельно управляет своим жизненным циклом:\n * - Если вызван внутри компонента, подписка автоматически аннулируется на хуке `onUnmounted`.\n * - Если вызван внутри независимого контекста эффектов, отписка произойдет через `onScopeDispose`.\n */\nexport function useReactiveValue<T>(item: ReactiveItem<T>): ShallowRef<T> {\n const state = shallowRef(item.value)\n\n // SSR: Если мы на сервере Node.js (нет window) или вне контекста Vue —\n // просто возвращаем пассивный ref, не создавая подписку!\n const isServer = typeof window === 'undefined' || (typeof process !== 'undefined' && process.server)\n const hasInstance = getCurrentInstance() || getCurrentScope()\n\n if (isServer || !hasInstance) {\n return state // Пассивный режим однократного чтения для HTML-рендеринга\n }\n\n const unsubscribe = item.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\n}\n"],"mappings":"qBAoDA,SAAgB,EAAoB,EAAsC,CACxE,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,EAAK,KAAK,EAI7B,EAAW,OAAO,OAAW,KAAgB,OAAO,QAAY,KAAe,QAAQ,OACvF,GAAA,EAAA,EAAA,mBAAA,CAAiC,IAAA,EAAA,EAAA,gBAAA,CAAqB,EAE5D,GAAI,GAAY,CAAC,EACf,OAAO,EAGT,IAAM,EAAc,EAAK,UAAW,GAAa,CAC/C,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAQD,OANA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,CAAY,CAAW,GAClB,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,CAAe,CAAW,EAGrB,CACT"}
1
+ {"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/vue/composables/useReactiveValue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, getCurrentScope as getCurrentVueScope, effect as vueEffect, type ShallowRef } from 'vue'\n\ntype CleanupFn = () => void\n\nexport interface ISignalLike<V> {\n value: V\n subscribe: (cb: (v: V) => void) => CleanupFn\n}\n\n/**\n * Хук-композибл для бесшовной интеграции примитивов реактивного ядра с системой рендеринга Vue 3.\n */\nexport function useReactiveValue<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n const isSignal = item &&\n typeof item === 'object' &&\n 'subscribe' in item &&\n typeof (item as Record<string, unknown>).subscribe === 'function'\n\n const initialValue = isSignal\n ? ((item as unknown) as ISignalLike<unknown>).value\n : item\n\n const state = shallowRef(initialValue)\n\n const isServer = typeof window === 'undefined' || (typeof process !== 'undefined' && (process as any).server)\n const hasInstance = getCurrentInstance() || getCurrentScope()\n\n if (isServer || !hasInstance) {\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n let unsubscribe: CleanupFn = () => {}\n\n // ------------------------------------------------====\n // СЦЕНАРИЙ А: Подписка на примитивный Сигнал / Computed\n // ------------------------------------------------====\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n }\n // ------------------------------------------------====\n // СЦЕНАРИЙ Б: Подписка на глубокий Proxy-объект / Массив\n // ------------------------------------------------====\n else if (item && typeof item === 'object') {\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state)\n })\n } else {\n // НАДЕЖНЫЙ ФОЛЛБЭК: Если объект создан не через ReactiveEngine4Vue,\n // заставляем реф мутировать принудительно (но в тестах переводим на честный ReactiveEngine4Vue)\n unsubscribe = () => {}\n }\n }\n else {\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n if (getCurrentInstance()) {\n onUnmounted(unsubscribe)\n } else if (getCurrentVueScope()) {\n onScopeDispose(unsubscribe)\n }\n\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n}\n"],"mappings":"qBAYA,SAAgB,EAAoB,EAAyE,CAC3G,IAAM,EAAW,GACA,OAAO,GAAS,UAChB,cAAe,GACf,OAAQ,EAAiC,WAAc,WAMlE,GAAA,EAAA,EAAA,WAAA,CAJe,EACf,EAA0C,MAC5C,CAEiC,EAE/B,EAAW,OAAO,OAAW,KAAgB,OAAO,QAAY,KAAgB,QAAgB,OAChG,GAAA,EAAA,EAAA,mBAAA,CAAiC,IAAA,EAAA,EAAA,gBAAA,CAAqB,EAE5D,GAAI,GAAY,CAAC,EACf,OAAO,EAGT,IAAI,MAA+B,CAAC,EAKpC,GAAI,EAEF,EAAc,EAAW,UAAW,GAAa,CAC/C,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,OAKE,GAAI,GAAQ,OAAO,GAAS,SAC/B,AAOE,EAPE,gBAAiB,GAAQ,OAAQ,EAAiC,aAAgB,WACpE,EAAiC,gBAAoD,EACnG,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,MAImB,CAAC,OAIvB,OAAO,EAST,OANA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,CAAY,CAAW,GAClB,EAAA,EAAA,gBAAA,CAAuB,IAC5B,EAAA,EAAA,eAAA,CAAe,CAAW,EAGrB,CACT"}
@@ -1,53 +1,12 @@
1
1
  import { ShallowRef } from 'vue';
2
2
  type CleanupFn = () => void;
3
- interface ReactiveItem<T> {
4
- value: T;
5
- subscribe: (cb: (v: T) => void) => CleanupFn;
3
+ export interface ISignalLike<V> {
4
+ value: V;
5
+ subscribe: (cb: (v: V) => void) => CleanupFn;
6
6
  }
7
7
  /**
8
8
  * Хук-композибл для бесшовной интеграции примитивов реактивного ядра с системой рендеринга Vue 3.
9
- * Нативно поддерживает как атомарные сигналы (`signal`), так и ленивые вычисляемые свойства (`computed`).
10
- *
11
- * @template T Тип данных, содержащихся внутри реактивного элемента.
12
- *
13
- * @param {Object} item Реактивный примитив ядра, на который необходимо подписаться.
14
- * @param {T} item.value Текущее значение элемента.
15
- * @param {(cb: (v: T) => void) => () => void} item.subscribe Метод ядра для оформления подписки на изменения.
16
- *
17
- * @returns {ShallowRef<T>} Возвращает стандартную для Vue 3 переменную типа `ShallowRef`.
18
- * При мутации данных в ядре автоматически вызывается `triggerRef`, инициируя точечный перерасчет шаблона.
19
- *
20
- * @example
21
- * ```vue
22
- * <script setup>
23
- * import { useEngine } from '~/composables/useEngine';
24
- * import { useReactiveValue } from '@pravosleva/reactive-engine/vue';
25
- *
26
- * const engine = useEngine();
27
- * const counterSignal = engine.signal(0, 'ui:counter');
28
- *
29
- * // countState теперь обычный Vue Ref, но связанный с ядром данных
30
- * const countState = useReactiveValue(counterSignal);
31
- * </script>
32
- *
33
- * <template>
34
- * <button @click="counterSignal.value++">Кликнули: {{ countState }}</button>
35
- * </template>
36
- * ```
37
- *
38
- * @abstract
39
- * ### 🚨 Поведение в SSR и Универсальном рендеринге (Nuxt 3 / Nitro)
40
- * Композибл полностью безопасен для работы на стороне сервера (Node.js). Благодаря внутренним
41
- * проверкам окружения, на этапе серверного пре-рендеринга он переходит в **пассивный режим**:
42
- * - Выполняется только однократное чтение `.value` для сборки начального HTML-кода страницы.
43
- * - Активные подписки и замыкания **не регистрируются**, что полностью предотвращает утечки памяти на сервере.
44
- * - Исключает появление ошибок несовпадения разметки (`Hydration Mismatch`) при гидратации в браузере.
45
- *
46
- * ### 🧹 Управление памятью на клиенте
47
- * В браузере композибл самостоятельно управляет своим жизненным циклом:
48
- * - Если вызван внутри компонента, подписка автоматически аннулируется на хуке `onUnmounted`.
49
- * - Если вызван внутри независимого контекста эффектов, отписка произойдет через `onScopeDispose`.
50
9
  */
51
- export declare function useReactiveValue<T>(item: ReactiveItem<T>): ShallowRef<T>;
10
+ export declare function useReactiveValue<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>;
52
11
  export {};
53
12
  //# sourceMappingURL=useReactiveValue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useReactiveValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4F,KAAK,UAAU,EAAE,MAAM,KAAK,CAAA;AAE/H,KAAK,SAAS,GAAG,MAAM,IAAI,CAAA;AAC3B,UAAU,YAAY,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAA;IACR,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAA;CAC7C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAwBxE"}
1
+ {"version":3,"file":"useReactiveValue.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useReactiveValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwJ,KAAK,UAAU,EAAE,MAAM,KAAK,CAAA;AAE3L,KAAK,SAAS,GAAG,MAAM,IAAI,CAAA;AAE3B,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAA;IACR,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAA;CAC7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAwD3G"}
@@ -1,12 +1,17 @@
1
1
  import { getCurrentInstance as e, getCurrentScope as t, onScopeDispose as n, onUnmounted as r, shallowRef as i, triggerRef as a } from "vue";
2
2
  //#region src/vue/composables/useReactiveValue.ts
3
3
  function o(o) {
4
- let s = i(o.value), c = typeof window > "u" || typeof process < "u" && process.server, l = e() || t();
5
- if (c || !l) return s;
6
- let u = o.subscribe((e) => {
7
- s.value = e, a(s);
4
+ let s = o && typeof o == "object" && "subscribe" in o && typeof o.subscribe == "function", c = i(s ? o.value : o), l = typeof window > "u" || typeof process < "u" && process.server, u = e() || t();
5
+ if (l || !u) return c;
6
+ let d = () => {};
7
+ if (s) d = o.subscribe((e) => {
8
+ c.value = e, a(c);
8
9
  });
9
- return e() ? r(u) : t() && n(u), s;
10
+ else if (o && typeof o == "object") d = "__subscribe" in o && typeof o.__subscribe == "function" ? o.__subscribe(() => {
11
+ a(c);
12
+ }) : () => {};
13
+ else return c;
14
+ return e() ? r(d) : t() && n(d), c;
10
15
  }
11
16
  //#endregion
12
17
  export { o as useReactiveValue };
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/vue/composables/useReactiveValue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, type ShallowRef } from 'vue'\n\ntype CleanupFn = () => void\ninterface ReactiveItem<T> {\n value: T\n subscribe: (cb: (v: T) => void) => CleanupFn\n}\n\n/**\n * Хук-композибл для бесшовной интеграции примитивов реактивного ядра с системой рендеринга Vue 3.\n * Нативно поддерживает как атомарные сигналы (`signal`), так и ленивые вычисляемые свойства (`computed`).\n *\n * @template T Тип данных, содержащихся внутри реактивного элемента.\n *\n * @param {Object} item Реактивный примитив ядра, на который необходимо подписаться.\n * @param {T} item.value Текущее значение элемента.\n * @param {(cb: (v: T) => void) => () => void} item.subscribe Метод ядра для оформления подписки на изменения.\n *\n * @returns {ShallowRef<T>} Возвращает стандартную для Vue 3 переменную типа `ShallowRef`.\n * При мутации данных в ядре автоматически вызывается `triggerRef`, инициируя точечный перерасчет шаблона.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useEngine } from '~/composables/useEngine';\n * import { useReactiveValue } from '@pravosleva/reactive-engine/vue';\n *\n * const engine = useEngine();\n * const counterSignal = engine.signal(0, 'ui:counter');\n *\n * // countState теперь обычный Vue Ref, но связанный с ядром данных\n * const countState = useReactiveValue(counterSignal);\n * </script>\n *\n * <template>\n * <button @click=\"counterSignal.value++\">Кликнули: {{ countState }}</button>\n * </template>\n * ```\n *\n * @abstract\n * ### 🚨 Поведение в SSR и Универсальном рендеринге (Nuxt 3 / Nitro)\n * Композибл полностью безопасен для работы на стороне сервера (Node.js). Благодаря внутренним\n * проверкам окружения, на этапе серверного пре-рендеринга он переходит в **пассивный режим**:\n * - Выполняется только однократное чтение `.value` для сборки начального HTML-кода страницы.\n * - Активные подписки и замыкания **не регистрируются**, что полностью предотвращает утечки памяти на сервере.\n * - Исключает появление ошибок несовпадения разметки (`Hydration Mismatch`) при гидратации в браузере.\n *\n * ### 🧹 Управление памятью на клиенте\n * В браузере композибл самостоятельно управляет своим жизненным циклом:\n * - Если вызван внутри компонента, подписка автоматически аннулируется на хуке `onUnmounted`.\n * - Если вызван внутри независимого контекста эффектов, отписка произойдет через `onScopeDispose`.\n */\nexport function useReactiveValue<T>(item: ReactiveItem<T>): ShallowRef<T> {\n const state = shallowRef(item.value)\n\n // SSR: Если мы на сервере Node.js (нет window) или вне контекста Vue —\n // просто возвращаем пассивный ref, не создавая подписку!\n const isServer = typeof window === 'undefined' || (typeof process !== 'undefined' && process.server)\n const hasInstance = getCurrentInstance() || getCurrentScope()\n\n if (isServer || !hasInstance) {\n return state // Пассивный режим однократного чтения для HTML-рендеринга\n }\n\n const unsubscribe = item.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\n}\n"],"mappings":";;AAoDA,SAAgB,EAAoB,GAAsC;CACxE,IAAM,IAAQ,EAAW,EAAK,KAAK,GAI7B,IAAW,OAAO,SAAW,OAAgB,OAAO,UAAY,OAAe,QAAQ,QACvF,IAAc,EAAmB,KAAK,EAAgB;CAE5D,IAAI,KAAY,CAAC,GACf,OAAO;CAGT,IAAM,IAAc,EAAK,WAAW,MAAa;EAE/C,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;CAClB,CAAC;CAQD,OANI,EAAmB,IACrB,EAAY,CAAW,IACd,EAAgB,KACzB,EAAe,CAAW,GAGrB;AACT"}
1
+ {"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/vue/composables/useReactiveValue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, getCurrentScope as getCurrentVueScope, effect as vueEffect, type ShallowRef } from 'vue'\n\ntype CleanupFn = () => void\n\nexport interface ISignalLike<V> {\n value: V\n subscribe: (cb: (v: V) => void) => CleanupFn\n}\n\n/**\n * Хук-композибл для бесшовной интеграции примитивов реактивного ядра с системой рендеринга Vue 3.\n */\nexport function useReactiveValue<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n const isSignal = item &&\n typeof item === 'object' &&\n 'subscribe' in item &&\n typeof (item as Record<string, unknown>).subscribe === 'function'\n\n const initialValue = isSignal\n ? ((item as unknown) as ISignalLike<unknown>).value\n : item\n\n const state = shallowRef(initialValue)\n\n const isServer = typeof window === 'undefined' || (typeof process !== 'undefined' && (process as any).server)\n const hasInstance = getCurrentInstance() || getCurrentScope()\n\n if (isServer || !hasInstance) {\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n let unsubscribe: CleanupFn = () => {}\n\n // ------------------------------------------------====\n // СЦЕНАРИЙ А: Подписка на примитивный Сигнал / Computed\n // ------------------------------------------------====\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n }\n // ------------------------------------------------====\n // СЦЕНАРИЙ Б: Подписка на глубокий Proxy-объект / Массив\n // ------------------------------------------------====\n else if (item && typeof item === 'object') {\n if ('__subscribe' in item && typeof (item as Record<string, unknown>).__subscribe === 'function') {\n unsubscribe = ((item as Record<string, unknown>).__subscribe as (cb: () => void) => CleanupFn)(() => {\n triggerRef(state)\n })\n } else {\n // НАДЕЖНЫЙ ФОЛЛБЭК: Если объект создан не через ReactiveEngine4Vue,\n // заставляем реф мутировать принудительно (но в тестах переводим на честный ReactiveEngine4Vue)\n unsubscribe = () => {}\n }\n }\n else {\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n }\n\n if (getCurrentInstance()) {\n onUnmounted(unsubscribe)\n } else if (getCurrentVueScope()) {\n onScopeDispose(unsubscribe)\n }\n\n return state as (T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>)\n}\n"],"mappings":";;AAYA,SAAgB,EAAoB,GAAyE;CAC3G,IAAM,IAAW,KACA,OAAO,KAAS,YAChB,eAAe,KACf,OAAQ,EAAiC,aAAc,YAMlE,IAAQ,EAJO,IACf,EAA0C,QAC5C,CAEiC,GAE/B,IAAW,OAAO,SAAW,OAAgB,OAAO,UAAY,OAAgB,QAAgB,QAChG,IAAc,EAAmB,KAAK,EAAgB;CAE5D,IAAI,KAAY,CAAC,GACf,OAAO;CAGT,IAAI,UAA+B,CAAC;CAKpC,IAAI,GAEF,IAAc,EAAW,WAAW,MAAa;EAE/C,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;CAClB,CAAC;MAKE,IAAI,KAAQ,OAAO,KAAS,UAC/B,AAOE,IAPE,iBAAiB,KAAQ,OAAQ,EAAiC,eAAgB,aACpE,EAAiC,kBAAoD;EACnG,EAAW,CAAK;CAClB,CAAC,UAImB,CAAC;MAIvB,OAAO;CAST,OANI,EAAmB,IACrB,EAAY,CAAW,IACd,EAAmB,KAC5B,EAAe,CAAW,GAGrB;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "1.6.1",
3
+ "version": "1.7.0-beta",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },