@pravosleva/reactive-engine 1.3.2-beta → 1.4.1-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 (47) hide show
  1. package/README.md +1 -1
  2. package/dist/angular/ReactiveEngine4Angular.cjs +1 -1
  3. package/dist/angular/ReactiveEngine4Angular.cjs.map +1 -1
  4. package/dist/angular/ReactiveEngine4Angular.d.ts +1 -0
  5. package/dist/angular/ReactiveEngine4Angular.d.ts.map +1 -1
  6. package/dist/angular/ReactiveEngine4Angular.mjs +4 -2
  7. package/dist/angular/ReactiveEngine4Angular.mjs.map +1 -1
  8. package/dist/angular/rxjs-interop.d.ts +21 -0
  9. package/dist/angular/rxjs-interop.d.ts.map +1 -0
  10. package/dist/core/core.d.ts +110 -0
  11. package/dist/core/core.d.ts.map +1 -1
  12. package/dist/core.cjs +1 -1
  13. package/dist/core.cjs.map +1 -1
  14. package/dist/core.mjs +178 -33
  15. package/dist/core.mjs.map +1 -1
  16. package/dist/decorators/index.d.ts +1 -0
  17. package/dist/decorators/index.d.ts.map +1 -1
  18. package/dist/decorators/withThrottleComputed/_withThrottleComputed.d.ts +22 -0
  19. package/dist/decorators/withThrottleComputed/_withThrottleComputed.d.ts.map +1 -0
  20. package/dist/decorators/withThrottleComputed/index.d.ts +2 -0
  21. package/dist/decorators/withThrottleComputed/index.d.ts.map +1 -0
  22. package/dist/decorators/withThrottleComputed/withThrottleComputed.d.ts +11 -0
  23. package/dist/decorators/withThrottleComputed/withThrottleComputed.d.ts.map +1 -0
  24. package/dist/decorators/withThrottleComputed/withThrottleComputed.test.d.ts +2 -0
  25. package/dist/decorators/withThrottleComputed/withThrottleComputed.test.d.ts.map +1 -0
  26. package/dist/react/ReactiveEngine4React.cjs +1 -1
  27. package/dist/react/ReactiveEngine4React.cjs.map +1 -1
  28. package/dist/react/ReactiveEngine4React.d.ts +1 -0
  29. package/dist/react/ReactiveEngine4React.d.ts.map +1 -1
  30. package/dist/react/ReactiveEngine4React.mjs +1 -0
  31. package/dist/react/ReactiveEngine4React.mjs.map +1 -1
  32. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs +1 -1
  33. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.cjs.map +1 -1
  34. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts +5 -2
  35. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.d.ts.map +1 -1
  36. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs +10 -6
  37. package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.mjs.map +1 -1
  38. package/dist/utils/getExtractedValues.cjs +1 -1
  39. package/dist/utils/getExtractedValues.cjs.map +1 -1
  40. package/dist/utils/getExtractedValues.d.ts.map +1 -1
  41. package/dist/utils/getExtractedValues.mjs +4 -1
  42. package/dist/utils/getExtractedValues.mjs.map +1 -1
  43. package/dist/vue/ReactiveEngine4Vue.cjs.map +1 -1
  44. package/dist/vue/ReactiveEngine4Vue.d.ts +1 -0
  45. package/dist/vue/ReactiveEngine4Vue.d.ts.map +1 -1
  46. package/dist/vue/ReactiveEngine4Vue.mjs.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_withThrottleComputed.d.ts","sourceRoot":"","sources":["../../../src/decorators/withThrottleComputed/_withThrottleComputed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,UAAU,uBAAuB;IAC/B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,QAAQ,cAAc,EACtB,QAAQ,MAAM,CAAC,EACf,SAAS,uBAAuB,EAChC,aAAa,MAAM;oBA8DJ,CAAC;oBAGE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI;;CAGnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './withThrottleComputed';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/decorators/withThrottleComputed/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { ReactiveEngine } from '../../core/core';
2
+ interface ThrottleComputedOptions {
3
+ limit: number;
4
+ }
5
+ export declare const withThrottleComputed: <T>(engine: ReactiveEngine, getter: () => T, options: ThrottleComputedOptions, signalName?: string) => {
6
+ readonly value: T;
7
+ subscribe: (cb: (val: T) => void) => import('../..').CleanupFn;
8
+ destroy: () => void;
9
+ };
10
+ export {};
11
+ //# sourceMappingURL=withThrottleComputed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withThrottleComputed.d.ts","sourceRoot":"","sources":["../../../src/decorators/withThrottleComputed/withThrottleComputed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,QAAQ,cAAc,EACtB,QAAQ,MAAM,CAAC,EACf,SAAS,uBAAuB,EAChC,aAAa,MAAM;oBA+DJ,CAAC;oBAGE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI;;CAGnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=withThrottleComputed.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withThrottleComputed.test.d.ts","sourceRoot":"","sources":["../../../src/decorators/withThrottleComputed/withThrottleComputed.test.ts"],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- const e=require("../core.cjs");let t=require("react");var n=class extends e.ReactiveEngine{reactAdapters={useState:t.useState,useEffect:t.useEffect};setReactAdapters(e,t){this.reactAdapters={useState:e,useEffect:t}}use(e){if(!this.reactAdapters)throw Error(`[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).`);if(!e||typeof e.subscribe!=`function`){let t=`
1
+ const e=require("../core.cjs");let t=require("react");var n=class extends e.ReactiveEngine{frameworkPrefix=`react`;reactAdapters={useState:t.useState,useEffect:t.useEffect};setReactAdapters(e,t){this.reactAdapters={useState:e,useEffect:t}}use(e){if(!this.reactAdapters)throw Error(`[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).`);if(!e||typeof e.subscribe!=`function`){let t=`
2
2
  [Reactive Error]: engine.use() получил некорректный объект!
3
3
  Скорее всего, вы пытаетесь подписаться на свойство сервиса, которое не было инициализировано.
4
4
  Проверьте, что в классе написано: public mySignal = this.engine.signal(...)
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveEngine4React.cjs","names":[],"sources":["../../src/react/ReactiveEngine4React.ts"],"sourcesContent":["import { useState as useStateFromReact, useEffect as useEffectFromReact } from 'react'\nimport { ReactiveEngine as OriginalReactiveEngine, CleanupFn } from '../core/core'\n\n/**\n * Класс адаптера для интеграции реактивного движка с React.\n * Наследует функциональность оригинального реактивного движка и предоставляет специализированные методы для работы с React.\n */\nexport class ReactiveEngine4React extends OriginalReactiveEngine {\n // Описываем строгие типы для адаптеров React, чтобы не ломать встроенные типы React.\n private reactAdapters: {\n useState: typeof useStateFromReact;\n useEffect: typeof useEffectFromReact;\n } = {\n useState: useStateFromReact,\n useEffect: useEffectFromReact,\n };\n\n /**\n * Установка адаптеров React.\n * @function setReactAdapters\n * @param {Function} useState - Функция useState из React.\n * @param {Function} useEffect - Функция useEffect из React.\n * @returns {void}\n * @source\n */\n public setReactAdapters(\n useState: typeof useStateFromReact,\n useEffect: typeof useEffectFromReact\n ): void {\n this.reactAdapters = { useState, useEffect };\n }\n\n /**\n * Использование реактивного значения в React компоненте.\n * @template T\n * @function use\n * @param {{ value: T; subscribe: (cb: (v: T) => void) => CleanupFn }} item - Реактивный объект.\n * @returns {T} - Значение реактивного объекта.\n * @source\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): T {\n if (!this.reactAdapters) {\n throw new Error(\"[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).\");\n }\n\n // NOTE: (защита) проверяем, что нам передали объект сигнала\n if (!item || typeof item.subscribe !== 'function') {\n const errorMsg = `\n [Reactive Error]: engine.use() получил некорректный объект!\n Скорее всего, вы пытаетесь подписаться на свойство сервиса, которое не было инициализировано.\n Проверьте, что в классе написано: public mySignal = this.engine.signal(...)\n `;\n console.error(errorMsg, { item });\n throw new Error(errorMsg);\n }\n const [val, setVal] = this.reactAdapters.useState(item.value);\n\n this.reactAdapters.useEffect(\n () => {\n return item.subscribe(setVal);\n },\n [item]\n );\n\n return val;\n }\n}\n"],"mappings":"sDAOA,IAAa,EAAb,cAA0C,EAAA,cAAuB,CAE/D,cAGI,CACA,SAAU,EAAA,SACV,UAAW,EAAA,SACb,EAUF,iBACE,EACA,EACM,CACN,KAAK,cAAgB,CAAE,WAAU,WAAU,CAC7C,CAUA,IAAc,EAAqE,CACjF,GAAI,CAAC,KAAK,cACR,MAAU,MAAM,sGAAsG,EAIxH,GAAI,CAAC,GAAQ,OAAO,EAAK,WAAc,WAAY,CACjD,IAAM,EAAW;;;;QAMjB,MADA,QAAQ,MAAM,EAAU,CAAE,MAAK,CAAC,EACtB,MAAM,CAAQ,CAC1B,CACA,GAAM,CAAC,EAAK,GAAU,KAAK,cAAc,SAAS,EAAK,KAAK,EAS5D,OAPA,KAAK,cAAc,cAER,EAAK,UAAU,CAAM,EAE9B,CAAC,CAAI,CACP,EAEO,CACT,CACF"}
1
+ {"version":3,"file":"ReactiveEngine4React.cjs","names":[],"sources":["../../src/react/ReactiveEngine4React.ts"],"sourcesContent":["import { useState as useStateFromReact, useEffect as useEffectFromReact } from 'react'\nimport { ReactiveEngine as OriginalReactiveEngine, CleanupFn } from '../core/core'\n\n/**\n * Класс адаптера для интеграции реактивного движка с React.\n * Наследует функциональность оригинального реактивного движка и предоставляет специализированные методы для работы с React.\n */\nexport class ReactiveEngine4React extends OriginalReactiveEngine {\n protected override frameworkPrefix = 'react';\n\n // Описываем строгие типы для адаптеров React, чтобы не ломать встроенные типы React.\n private reactAdapters: {\n useState: typeof useStateFromReact;\n useEffect: typeof useEffectFromReact;\n } = {\n useState: useStateFromReact,\n useEffect: useEffectFromReact,\n };\n\n /**\n * Установка адаптеров React.\n * @function setReactAdapters\n * @param {Function} useState - Функция useState из React.\n * @param {Function} useEffect - Функция useEffect из React.\n * @returns {void}\n * @source\n */\n public setReactAdapters(\n useState: typeof useStateFromReact,\n useEffect: typeof useEffectFromReact\n ): void {\n this.reactAdapters = { useState, useEffect };\n }\n\n /**\n * Использование реактивного значения в React компоненте.\n * @template T\n * @function use\n * @param {{ value: T; subscribe: (cb: (v: T) => void) => CleanupFn }} item - Реактивный объект.\n * @returns {T} - Значение реактивного объекта.\n * @source\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): T {\n if (!this.reactAdapters) {\n throw new Error(\"[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).\");\n }\n\n // NOTE: (защита) проверяем, что нам передали объект сигнала\n if (!item || typeof item.subscribe !== 'function') {\n const errorMsg = `\n [Reactive Error]: engine.use() получил некорректный объект!\n Скорее всего, вы пытаетесь подписаться на свойство сервиса, которое не было инициализировано.\n Проверьте, что в классе написано: public mySignal = this.engine.signal(...)\n `;\n console.error(errorMsg, { item });\n throw new Error(errorMsg);\n }\n const [val, setVal] = this.reactAdapters.useState(item.value);\n\n this.reactAdapters.useEffect(\n () => {\n return item.subscribe(setVal);\n },\n [item]\n );\n\n return val;\n }\n}\n"],"mappings":"sDAOA,IAAa,EAAb,cAA0C,EAAA,cAAuB,CAC/D,gBAAqC,QAGrC,cAGI,CACA,SAAU,EAAA,SACV,UAAW,EAAA,SACb,EAUF,iBACE,EACA,EACM,CACN,KAAK,cAAgB,CAAE,WAAU,WAAU,CAC7C,CAUA,IAAc,EAAqE,CACjF,GAAI,CAAC,KAAK,cACR,MAAU,MAAM,sGAAsG,EAIxH,GAAI,CAAC,GAAQ,OAAO,EAAK,WAAc,WAAY,CACjD,IAAM,EAAW;;;;QAMjB,MADA,QAAQ,MAAM,EAAU,CAAE,MAAK,CAAC,EACtB,MAAM,CAAQ,CAC1B,CACA,GAAM,CAAC,EAAK,GAAU,KAAK,cAAc,SAAS,EAAK,KAAK,EAS5D,OAPA,KAAK,cAAc,cAER,EAAK,UAAU,CAAM,EAE9B,CAAC,CAAI,CACP,EAEO,CACT,CACF"}
@@ -5,6 +5,7 @@ import { ReactiveEngine as OriginalReactiveEngine, CleanupFn } from '../core/cor
5
5
  * Наследует функциональность оригинального реактивного движка и предоставляет специализированные методы для работы с React.
6
6
  */
7
7
  export declare class ReactiveEngine4React extends OriginalReactiveEngine {
8
+ protected frameworkPrefix: string;
8
9
  private reactAdapters;
9
10
  /**
10
11
  * Установка адаптеров React.
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveEngine4React.d.ts","sourceRoot":"","sources":["../../src/react/ReactiveEngine4React.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,OAAO,CAAA;AACtF,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAElF;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAE9D,OAAO,CAAC,aAAa,CAMjB;IAEJ;;;;;;;OAOG;IACI,gBAAgB,CACrB,QAAQ,EAAE,OAAO,iBAAiB,EAClC,SAAS,EAAE,OAAO,kBAAkB,GACnC,IAAI;IAIP;;;;;;;OAOG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAA;KAAE,GAAG,CAAC;CA0BnF"}
1
+ {"version":3,"file":"ReactiveEngine4React.d.ts","sourceRoot":"","sources":["../../src/react/ReactiveEngine4React.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,OAAO,CAAA;AACtF,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAElF;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,UAAmB,eAAe,SAAW;IAG7C,OAAO,CAAC,aAAa,CAMjB;IAEJ;;;;;;;OAOG;IACI,gBAAgB,CACrB,QAAQ,EAAE,OAAO,iBAAiB,EAClC,SAAS,EAAE,OAAO,kBAAkB,GACnC,IAAI;IAIP;;;;;;;OAOG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAA;KAAE,GAAG,CAAC;CA0BnF"}
@@ -2,6 +2,7 @@ import { ReactiveEngine as e } from "../core.mjs";
2
2
  import { useEffect as t, useState as n } from "react";
3
3
  //#region src/react/ReactiveEngine4React.ts
4
4
  var r = class extends e {
5
+ frameworkPrefix = "react";
5
6
  reactAdapters = {
6
7
  useState: n,
7
8
  useEffect: t
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveEngine4React.mjs","names":[],"sources":["../../src/react/ReactiveEngine4React.ts"],"sourcesContent":["import { useState as useStateFromReact, useEffect as useEffectFromReact } from 'react'\nimport { ReactiveEngine as OriginalReactiveEngine, CleanupFn } from '../core/core'\n\n/**\n * Класс адаптера для интеграции реактивного движка с React.\n * Наследует функциональность оригинального реактивного движка и предоставляет специализированные методы для работы с React.\n */\nexport class ReactiveEngine4React extends OriginalReactiveEngine {\n // Описываем строгие типы для адаптеров React, чтобы не ломать встроенные типы React.\n private reactAdapters: {\n useState: typeof useStateFromReact;\n useEffect: typeof useEffectFromReact;\n } = {\n useState: useStateFromReact,\n useEffect: useEffectFromReact,\n };\n\n /**\n * Установка адаптеров React.\n * @function setReactAdapters\n * @param {Function} useState - Функция useState из React.\n * @param {Function} useEffect - Функция useEffect из React.\n * @returns {void}\n * @source\n */\n public setReactAdapters(\n useState: typeof useStateFromReact,\n useEffect: typeof useEffectFromReact\n ): void {\n this.reactAdapters = { useState, useEffect };\n }\n\n /**\n * Использование реактивного значения в React компоненте.\n * @template T\n * @function use\n * @param {{ value: T; subscribe: (cb: (v: T) => void) => CleanupFn }} item - Реактивный объект.\n * @returns {T} - Значение реактивного объекта.\n * @source\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): T {\n if (!this.reactAdapters) {\n throw new Error(\"[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).\");\n }\n\n // NOTE: (защита) проверяем, что нам передали объект сигнала\n if (!item || typeof item.subscribe !== 'function') {\n const errorMsg = `\n [Reactive Error]: engine.use() получил некорректный объект!\n Скорее всего, вы пытаетесь подписаться на свойство сервиса, которое не было инициализировано.\n Проверьте, что в классе написано: public mySignal = this.engine.signal(...)\n `;\n console.error(errorMsg, { item });\n throw new Error(errorMsg);\n }\n const [val, setVal] = this.reactAdapters.useState(item.value);\n\n this.reactAdapters.useEffect(\n () => {\n return item.subscribe(setVal);\n },\n [item]\n );\n\n return val;\n }\n}\n"],"mappings":";;;AAOA,IAAa,IAAb,cAA0C,EAAuB;CAE/D,gBAGI;EACU;EACC;CACb;CAUF,iBACE,GACA,GACM;EACN,KAAK,gBAAgB;GAAE;GAAU;EAAU;CAC7C;CAUA,IAAc,GAAqE;EACjF,IAAI,CAAC,KAAK,eACR,MAAU,MAAM,sGAAsG;EAIxH,IAAI,CAAC,KAAQ,OAAO,EAAK,aAAc,YAAY;GACjD,IAAM,IAAW;GAMjB,MADA,QAAQ,MAAM,GAAU,EAAE,QAAK,CAAC,GACtB,MAAM,CAAQ;EAC1B;EACA,IAAM,CAAC,GAAK,KAAU,KAAK,cAAc,SAAS,EAAK,KAAK;EAS5D,OAPA,KAAK,cAAc,gBAER,EAAK,UAAU,CAAM,GAE9B,CAAC,CAAI,CACP,GAEO;CACT;AACF"}
1
+ {"version":3,"file":"ReactiveEngine4React.mjs","names":[],"sources":["../../src/react/ReactiveEngine4React.ts"],"sourcesContent":["import { useState as useStateFromReact, useEffect as useEffectFromReact } from 'react'\nimport { ReactiveEngine as OriginalReactiveEngine, CleanupFn } from '../core/core'\n\n/**\n * Класс адаптера для интеграции реактивного движка с React.\n * Наследует функциональность оригинального реактивного движка и предоставляет специализированные методы для работы с React.\n */\nexport class ReactiveEngine4React extends OriginalReactiveEngine {\n protected override frameworkPrefix = 'react';\n\n // Описываем строгие типы для адаптеров React, чтобы не ломать встроенные типы React.\n private reactAdapters: {\n useState: typeof useStateFromReact;\n useEffect: typeof useEffectFromReact;\n } = {\n useState: useStateFromReact,\n useEffect: useEffectFromReact,\n };\n\n /**\n * Установка адаптеров React.\n * @function setReactAdapters\n * @param {Function} useState - Функция useState из React.\n * @param {Function} useEffect - Функция useEffect из React.\n * @returns {void}\n * @source\n */\n public setReactAdapters(\n useState: typeof useStateFromReact,\n useEffect: typeof useEffectFromReact\n ): void {\n this.reactAdapters = { useState, useEffect };\n }\n\n /**\n * Использование реактивного значения в React компоненте.\n * @template T\n * @function use\n * @param {{ value: T; subscribe: (cb: (v: T) => void) => CleanupFn }} item - Реактивный объект.\n * @returns {T} - Значение реактивного объекта.\n * @source\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): T {\n if (!this.reactAdapters) {\n throw new Error(\"[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).\");\n }\n\n // NOTE: (защита) проверяем, что нам передали объект сигнала\n if (!item || typeof item.subscribe !== 'function') {\n const errorMsg = `\n [Reactive Error]: engine.use() получил некорректный объект!\n Скорее всего, вы пытаетесь подписаться на свойство сервиса, которое не было инициализировано.\n Проверьте, что в классе написано: public mySignal = this.engine.signal(...)\n `;\n console.error(errorMsg, { item });\n throw new Error(errorMsg);\n }\n const [val, setVal] = this.reactAdapters.useState(item.value);\n\n this.reactAdapters.useEffect(\n () => {\n return item.subscribe(setVal);\n },\n [item]\n );\n\n return val;\n }\n}\n"],"mappings":";;;AAOA,IAAa,IAAb,cAA0C,EAAuB;CAC/D,kBAAqC;CAGrC,gBAGI;EACU;EACC;CACb;CAUF,iBACE,GACA,GACM;EACN,KAAK,gBAAgB;GAAE;GAAU;EAAU;CAC7C;CAUA,IAAc,GAAqE;EACjF,IAAI,CAAC,KAAK,eACR,MAAU,MAAM,sGAAsG;EAIxH,IAAI,CAAC,KAAQ,OAAO,EAAK,aAAc,YAAY;GACjD,IAAM,IAAW;GAMjB,MADA,QAAQ,MAAM,GAAU,EAAE,QAAK,CAAC,GACtB,MAAM,CAAQ;EAC1B;EACA,IAAM,CAAC,GAAK,KAAU,KAAK,cAAc,SAAS,EAAK,KAAK;EAS5D,OAPA,KAAK,cAAc,gBAER,EAAK,UAAU,CAAM,GAE9B,CAAC,CAAI,CACP,GAEO;CACT;AACF"}
@@ -1,2 +1,2 @@
1
- let e=require("react");var t=(t,n)=>{let r=(0,e.useRef)(n);(0,e.useEffect)(()=>{r.current=n},[n]),(0,e.useEffect)(()=>t.subscribe(e=>{r.current(e)}),[t])};exports.useReactiveSubscription=t;
1
+ let e=require("react");var t=(t,n)=>{let r=(0,e.useRef)(n);r.current=n,(0,e.useLayoutEffect)(()=>{if(!t||typeof t.subscribe!=`function`)return;let e=t.subscribe(e=>{r.current(e)});return()=>{typeof e==`function`&&e()}},[t])};exports.useReactiveSubscription=t;
2
2
  //# sourceMappingURL=useReactiveSubscription.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveSubscription.cjs","names":[],"sources":["../../../../src/react/hooks/useReactiveSubscription/useReactiveSubscription.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { Signal, CleanupFn } from '../../../core'\n\n/**\n * Универсальный хук для подписки на изменения Signal, Computed или Resource.\n * @template T Тип данных внутри реактивного контейнера\n * @param {Signal<T> | { subscribe: (cb: (val: T) => void) => CleanupFn }} signal Объект подписки\n * @param {(val: T) => void} callback Функция обратного вызова, принимающая новое значение\n * @source\n */\nexport const useReactiveSubscription = <T>(\n signal: Pick<Signal<T>, 'subscribe'>,\n callback: (val: T) => void\n): void => {\n // Сохраняем актуальный callback в ref, чтобы не перезапускать эффект при его изменении\n const callbackRef = useRef(callback)\n\n useEffect(() => {\n callbackRef.current = callback\n }, [callback])\n\n useEffect(() => {\n // Подписываемся один раз при изменении самого signal\n const unsubscribe: CleanupFn = signal.subscribe((val) => {\n callbackRef.current(val)\n })\n\n // Возвращаем функцию очистки для автоматической отписки при размонтировании\n return unsubscribe\n }, [signal])\n}\n"],"mappings":"uBAUA,IAAa,GACX,EACA,IACS,CAET,IAAM,GAAA,EAAA,EAAA,OAAA,CAAqB,CAAQ,GAEnC,EAAA,EAAA,UAAA,KAAgB,CACd,EAAY,QAAU,CACxB,EAAG,CAAC,CAAQ,CAAC,GAEb,EAAA,EAAA,UAAA,KAEiC,EAAO,UAAW,GAAQ,CACvD,EAAY,QAAQ,CAAG,CACzB,CAGO,EACN,CAAC,CAAM,CAAC,CACb"}
1
+ {"version":3,"file":"useReactiveSubscription.cjs","names":[],"sources":["../../../../src/react/hooks/useReactiveSubscription/useReactiveSubscription.ts"],"sourcesContent":["import { useLayoutEffect, useRef } from 'react'\nimport { Signal, CleanupFn } from '../../../core'\n\n/**\n * Универсальный хук для безопасной синхронной подписки на изменения Signal, Computed или Resource.\n * Гарантирует отсутствие упущенных тиков (Race Conditions) и мгновенную очистку в React StrictMode.\n *\n * @template T Тип данных внутри реактивного контейнера\n * @param {Pick<Signal<T>, 'subscribe'>} signal Объект подписки (Signal/Computed/Resource)\n * @param {(val: T) => void} callback Функция обратного вызова, принимающая новое значение\n * @returns {void}\n * @source\n */\nexport const useReactiveSubscription = <T>(\n signal: Pick<Signal<T>, 'subscribe'>,\n callback: (val: T) => void\n): void => {\n // 1. Сохраняем актуальный callback в ref.\n // Мы обновляем его синхронно прямо во время рендера, уходя от лишнего useEffect\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n // 2. Используем useLayoutEffect вместо useEffect.\n // Подписка оформляется синхронно ДО того, как браузер отрисует пиксели на экране.\n // Это полностью исключает Tearing (пропуск первого асинхронного тика данных из сети/WebSocket).\n useLayoutEffect(() => {\n if (!signal || typeof signal.subscribe !== 'function') return\n\n // Подписываемся на изменения в ядре.\n // Наш метод frameworkPrefix автоматически подставит бэдж \"react:use:...\" в логи!\n const unsubscribe: CleanupFn = signal.subscribe((val) => {\n callbackRef.current(val)\n })\n\n // Возвращаем функцию очистки. В useLayoutEffect она срабатывает мгновенно\n // при unmount, на корню уничтожая \"зомби-эффекты\" в StrictMode.\n return () => {\n if (typeof unsubscribe === 'function') {\n unsubscribe()\n }\n }\n }, [signal])\n}\n"],"mappings":"uBAaA,IAAa,GACX,EACA,IACS,CAGT,IAAM,GAAA,EAAA,EAAA,OAAA,CAAqB,CAAQ,EACnC,EAAY,QAAU,GAKtB,EAAA,EAAA,gBAAA,KAAsB,CACpB,GAAI,CAAC,GAAU,OAAO,EAAO,WAAc,WAAY,OAIvD,IAAM,EAAyB,EAAO,UAAW,GAAQ,CACvD,EAAY,QAAQ,CAAG,CACzB,CAAC,EAID,UAAa,CACP,OAAO,GAAgB,YACzB,EAAY,CAEhB,CACF,EAAG,CAAC,CAAM,CAAC,CACb"}
@@ -1,9 +1,12 @@
1
1
  import { Signal } from '../../../core';
2
2
  /**
3
- * Универсальный хук для подписки на изменения Signal, Computed или Resource.
3
+ * Универсальный хук для безопасной синхронной подписки на изменения Signal, Computed или Resource.
4
+ * Гарантирует отсутствие упущенных тиков (Race Conditions) и мгновенную очистку в React StrictMode.
5
+ *
4
6
  * @template T Тип данных внутри реактивного контейнера
5
- * @param {Signal<T> | { subscribe: (cb: (val: T) => void) => CleanupFn }} signal Объект подписки
7
+ * @param {Pick<Signal<T>, 'subscribe'>} signal Объект подписки (Signal/Computed/Resource)
6
8
  * @param {(val: T) => void} callback Функция обратного вызова, принимающая новое значение
9
+ * @returns {void}
7
10
  * @source
8
11
  */
9
12
  export declare const useReactiveSubscription: <T>(signal: Pick<Signal<T>, "subscribe">, callback: (val: T) => void) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveSubscription.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useReactiveSubscription/useReactiveSubscription.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAa,MAAM,eAAe,CAAA;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAI,CAAC,EACvC,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EACpC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,KACzB,IAiBF,CAAA"}
1
+ {"version":3,"file":"useReactiveSubscription.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useReactiveSubscription/useReactiveSubscription.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAa,MAAM,eAAe,CAAA;AAEjD;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,GAAI,CAAC,EACvC,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EACpC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,KACzB,IA0BF,CAAA"}
@@ -1,12 +1,16 @@
1
- import { useEffect as e, useRef as t } from "react";
1
+ import { useLayoutEffect as e, useRef as t } from "react";
2
2
  //#region src/react/hooks/useReactiveSubscription/useReactiveSubscription.ts
3
3
  var n = (n, r) => {
4
4
  let i = t(r);
5
- e(() => {
6
- i.current = r;
7
- }, [r]), e(() => n.subscribe((e) => {
8
- i.current(e);
9
- }), [n]);
5
+ i.current = r, e(() => {
6
+ if (!n || typeof n.subscribe != "function") return;
7
+ let e = n.subscribe((e) => {
8
+ i.current(e);
9
+ });
10
+ return () => {
11
+ typeof e == "function" && e();
12
+ };
13
+ }, [n]);
10
14
  };
11
15
  //#endregion
12
16
  export { n as useReactiveSubscription };
@@ -1 +1 @@
1
- {"version":3,"file":"useReactiveSubscription.mjs","names":[],"sources":["../../../../src/react/hooks/useReactiveSubscription/useReactiveSubscription.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { Signal, CleanupFn } from '../../../core'\n\n/**\n * Универсальный хук для подписки на изменения Signal, Computed или Resource.\n * @template T Тип данных внутри реактивного контейнера\n * @param {Signal<T> | { subscribe: (cb: (val: T) => void) => CleanupFn }} signal Объект подписки\n * @param {(val: T) => void} callback Функция обратного вызова, принимающая новое значение\n * @source\n */\nexport const useReactiveSubscription = <T>(\n signal: Pick<Signal<T>, 'subscribe'>,\n callback: (val: T) => void\n): void => {\n // Сохраняем актуальный callback в ref, чтобы не перезапускать эффект при его изменении\n const callbackRef = useRef(callback)\n\n useEffect(() => {\n callbackRef.current = callback\n }, [callback])\n\n useEffect(() => {\n // Подписываемся один раз при изменении самого signal\n const unsubscribe: CleanupFn = signal.subscribe((val) => {\n callbackRef.current(val)\n })\n\n // Возвращаем функцию очистки для автоматической отписки при размонтировании\n return unsubscribe\n }, [signal])\n}\n"],"mappings":";;AAUA,IAAa,KACX,GACA,MACS;CAET,IAAM,IAAc,EAAO,CAAQ;CAMnC,AAJA,QAAgB;EACd,EAAY,UAAU;CACxB,GAAG,CAAC,CAAQ,CAAC,GAEb,QAEiC,EAAO,WAAW,MAAQ;EACvD,EAAY,QAAQ,CAAG;CACzB,CAGO,GACN,CAAC,CAAM,CAAC;AACb"}
1
+ {"version":3,"file":"useReactiveSubscription.mjs","names":[],"sources":["../../../../src/react/hooks/useReactiveSubscription/useReactiveSubscription.ts"],"sourcesContent":["import { useLayoutEffect, useRef } from 'react'\nimport { Signal, CleanupFn } from '../../../core'\n\n/**\n * Универсальный хук для безопасной синхронной подписки на изменения Signal, Computed или Resource.\n * Гарантирует отсутствие упущенных тиков (Race Conditions) и мгновенную очистку в React StrictMode.\n *\n * @template T Тип данных внутри реактивного контейнера\n * @param {Pick<Signal<T>, 'subscribe'>} signal Объект подписки (Signal/Computed/Resource)\n * @param {(val: T) => void} callback Функция обратного вызова, принимающая новое значение\n * @returns {void}\n * @source\n */\nexport const useReactiveSubscription = <T>(\n signal: Pick<Signal<T>, 'subscribe'>,\n callback: (val: T) => void\n): void => {\n // 1. Сохраняем актуальный callback в ref.\n // Мы обновляем его синхронно прямо во время рендера, уходя от лишнего useEffect\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n // 2. Используем useLayoutEffect вместо useEffect.\n // Подписка оформляется синхронно ДО того, как браузер отрисует пиксели на экране.\n // Это полностью исключает Tearing (пропуск первого асинхронного тика данных из сети/WebSocket).\n useLayoutEffect(() => {\n if (!signal || typeof signal.subscribe !== 'function') return\n\n // Подписываемся на изменения в ядре.\n // Наш метод frameworkPrefix автоматически подставит бэдж \"react:use:...\" в логи!\n const unsubscribe: CleanupFn = signal.subscribe((val) => {\n callbackRef.current(val)\n })\n\n // Возвращаем функцию очистки. В useLayoutEffect она срабатывает мгновенно\n // при unmount, на корню уничтожая \"зомби-эффекты\" в StrictMode.\n return () => {\n if (typeof unsubscribe === 'function') {\n unsubscribe()\n }\n }\n }, [signal])\n}\n"],"mappings":";;AAaA,IAAa,KACX,GACA,MACS;CAGT,IAAM,IAAc,EAAO,CAAQ;CAMnC,AALA,EAAY,UAAU,GAKtB,QAAsB;EACpB,IAAI,CAAC,KAAU,OAAO,EAAO,aAAc,YAAY;EAIvD,IAAM,IAAyB,EAAO,WAAW,MAAQ;GACvD,EAAY,QAAQ,CAAG;EACzB,CAAC;EAID,aAAa;GACX,AAAI,OAAO,KAAgB,cACzB,EAAY;EAEhB;CACF,GAAG,CAAC,CAAM,CAAC;AACb"}
@@ -1,2 +1,2 @@
1
- var e=({tested:e,expectedKey:t,valueType:n})=>{let r=[];for(let i=0,a=e.length;i<a;i++){let a=e[i],o;switch(n){case`number`:o=RegExp(`\\[${t}=(?<value>\\d+)\\]`,`g`);break;default:o=RegExp(`\\[${t}=(?<value>.*?)\\]`,`g`);break}for(let e of a.matchAll(o))e?.groups&&r.push(e.groups.value)}return r};exports.getExtractedValues=e;
1
+ var e=({tested:e,expectedKey:t,valueType:n})=>{let r=[];if(!e||!Array.isArray(e))return r;for(let i=0,a=e.length;i<a;i++){let a=e[i];if(typeof a!=`string`)continue;let o;switch(n){case`number`:o=RegExp(`\\[${t}=(?<value>\\d+)\\]`,`g`);break;default:o=RegExp(`\\[${t}=(?<value>.*?)\\]`,`g`);break}for(let e of a.matchAll(o))e?.groups&&r.push(e.groups.value)}return r};exports.getExtractedValues=e;
2
2
  //# sourceMappingURL=getExtractedValues.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"getExtractedValues.cjs","names":[],"sources":["../../src/utils/getExtractedValues.ts"],"sourcesContent":["export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = [];\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i];\n let regex;\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g');\n break;\n case 'string':\n default:\n // NOTE: \"Ленивый\" квантификатор -> \".*?\" будет искать минимальное количество символов до следующего экранированного \"]\"\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g');\n break;\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value); }\n }\n }\n return results;\n};\n"],"mappings":"AAAA,IAAa,GAAsB,CACjC,SAAQ,cAAa,eAKP,CACd,IAAM,EAAoB,CAAC,EAC3B,IAAK,IAAI,EAAI,EAAG,EAAM,EAAO,OAAQ,EAAI,EAAK,IAAK,CACjD,IAAM,EAAI,EAAO,GACb,EACJ,OAAQ,EAAR,CACE,IAAK,SACH,EAAY,OAAO,MAAM,EAAY,oBAAqB,GAAG,EAC7D,MAEF,QAEE,EAAY,OAAO,MAAM,EAAY,mBAAoB,GAAG,EAC5D,KACJ,CAGA,IAAK,IAAM,KAAK,EAAE,SAAS,CAAK,EAC1B,GAAG,QAAU,EAAQ,KAAK,EAAE,OAAO,KAAK,CAEhD,CACA,OAAO,CACT"}
1
+ {"version":3,"file":"getExtractedValues.cjs","names":[],"sources":["../../src/utils/getExtractedValues.ts"],"sourcesContent":["export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = [];\n if (!tested || !Array.isArray(tested)) return results; // Предохранитель от пустых массивов\n\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i];\n if (typeof t !== 'string') continue; // ЗАЩИТА: Пропускаем всё, что не является валидной строкой\n\n let regex;\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g');\n break;\n case 'string':\n default:\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g');\n break;\n }\n\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value); }\n }\n }\n return results;\n};\n"],"mappings":"AAAA,IAAa,GAAsB,CACjC,SAAQ,cAAa,eAKP,CACd,IAAM,EAAoB,CAAC,EAC3B,GAAI,CAAC,GAAU,CAAC,MAAM,QAAQ,CAAM,EAAG,OAAO,EAE9C,IAAK,IAAI,EAAI,EAAG,EAAM,EAAO,OAAQ,EAAI,EAAK,IAAK,CACjD,IAAM,EAAI,EAAO,GACjB,GAAI,OAAO,GAAM,SAAU,SAE3B,IAAI,EACJ,OAAQ,EAAR,CACE,IAAK,SACH,EAAY,OAAO,MAAM,EAAY,oBAAqB,GAAG,EAC7D,MAEF,QACE,EAAY,OAAO,MAAM,EAAY,mBAAoB,GAAG,EAC5D,KACJ,CAEA,IAAK,IAAM,KAAK,EAAE,SAAS,CAAK,EAC1B,GAAG,QAAU,EAAQ,KAAK,EAAE,OAAO,KAAK,CAEhD,CACA,OAAO,CACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"getExtractedValues.d.ts","sourceRoot":"","sources":["../../src/utils/getExtractedValues.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAAI,oCAEhC;IACD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChC,KAAG,MAAM,EAsBT,CAAC"}
1
+ {"version":3,"file":"getExtractedValues.d.ts","sourceRoot":"","sources":["../../src/utils/getExtractedValues.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAAI,oCAEhC;IACD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChC,KAAG,MAAM,EAwBT,CAAC"}
@@ -1,8 +1,11 @@
1
1
  //#region src/utils/getExtractedValues.ts
2
2
  var e = ({ tested: e, expectedKey: t, valueType: n }) => {
3
3
  let r = [];
4
+ if (!e || !Array.isArray(e)) return r;
4
5
  for (let i = 0, a = e.length; i < a; i++) {
5
- let a = e[i], o;
6
+ let a = e[i];
7
+ if (typeof a != "string") continue;
8
+ let o;
6
9
  switch (n) {
7
10
  case "number":
8
11
  o = RegExp(`\\[${t}=(?<value>\\d+)\\]`, "g");
@@ -1 +1 @@
1
- {"version":3,"file":"getExtractedValues.mjs","names":[],"sources":["../../src/utils/getExtractedValues.ts"],"sourcesContent":["export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = [];\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i];\n let regex;\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g');\n break;\n case 'string':\n default:\n // NOTE: \"Ленивый\" квантификатор -> \".*?\" будет искать минимальное количество символов до следующего экранированного \"]\"\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g');\n break;\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value); }\n }\n }\n return results;\n};\n"],"mappings":";AAAA,IAAa,KAAsB,EACjC,WAAQ,gBAAa,mBAKP;CACd,IAAM,IAAoB,CAAC;CAC3B,KAAK,IAAI,IAAI,GAAG,IAAM,EAAO,QAAQ,IAAI,GAAK,KAAK;EACjD,IAAM,IAAI,EAAO,IACb;EACJ,QAAQ,GAAR;GACE,KAAK;IACH,IAAY,OAAO,MAAM,EAAY,qBAAqB,GAAG;IAC7D;GAEF;IAEE,IAAY,OAAO,MAAM,EAAY,oBAAoB,GAAG;IAC5D;EACJ;EAGA,KAAK,IAAM,KAAK,EAAE,SAAS,CAAK,GAC9B,AAAI,GAAG,UAAU,EAAQ,KAAK,EAAE,OAAO,KAAK;CAEhD;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"getExtractedValues.mjs","names":[],"sources":["../../src/utils/getExtractedValues.ts"],"sourcesContent":["export const getExtractedValues = ({\n tested, expectedKey, valueType\n}: {\n tested: string[];\n expectedKey: string;\n valueType: 'number' | 'string';\n}): string[] => {\n const results: string[] = [];\n if (!tested || !Array.isArray(tested)) return results; // Предохранитель от пустых массивов\n\n for (let i = 0, max = tested.length; i < max; i++) {\n const t = tested[i];\n if (typeof t !== 'string') continue; // ЗАЩИТА: Пропускаем всё, что не является валидной строкой\n\n let regex;\n switch (valueType) {\n case 'number':\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>\\\\d+)\\\\]`, 'g');\n break;\n case 'string':\n default:\n regex = new RegExp(`\\\\[${expectedKey}=(?<value>.*?)\\\\]`, 'g');\n break;\n }\n\n for (const n of t.matchAll(regex)) {\n if (n?.groups) { results.push(n.groups.value); }\n }\n }\n return results;\n};\n"],"mappings":";AAAA,IAAa,KAAsB,EACjC,WAAQ,gBAAa,mBAKP;CACd,IAAM,IAAoB,CAAC;CAC3B,IAAI,CAAC,KAAU,CAAC,MAAM,QAAQ,CAAM,GAAG,OAAO;CAE9C,KAAK,IAAI,IAAI,GAAG,IAAM,EAAO,QAAQ,IAAI,GAAK,KAAK;EACjD,IAAM,IAAI,EAAO;EACjB,IAAI,OAAO,KAAM,UAAU;EAE3B,IAAI;EACJ,QAAQ,GAAR;GACE,KAAK;IACH,IAAY,OAAO,MAAM,EAAY,qBAAqB,GAAG;IAC7D;GAEF;IACE,IAAY,OAAO,MAAM,EAAY,oBAAoB,GAAG;IAC5D;EACJ;EAEA,KAAK,IAAM,KAAK,EAAE,SAAS,CAAK,GAC9B,AAAI,GAAG,UAAU,EAAQ,KAAK,EAAE,OAAO,KAAK;CAEhD;CACA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveEngine4Vue.cjs","names":[],"sources":["../../src/vue/ReactiveEngine4Vue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, type ShallowRef } from 'vue'\nimport { ReactiveEngine as OriginalReactiveEngine, type CleanupFn } from '../core/core'\n\nexport class ReactiveEngine4Vue extends OriginalReactiveEngine {\n /**\n * Использование реактивного значения в Vue компоненте или EffectScope.\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): ShallowRef<T> {\n // Создаем локальную Vue-реактивную обертку со стартовым значением сигнала\n const state = shallowRef(item.value)\n\n // Подписываемся на изменения сигнала ядра\n const unsubscribe = item.subscribe((newValue) => {\n state.value = newValue // Обновляем Vue-реактивную переменную\n triggerRef(state) // 👈 ПРИНУДИТЕЛЬНО заставляем Vue перерисовать шаблон\n })\n\n // Проверяем наличие активного компонента ИЛИ active области видимости эффектов\n\n // 1. Если мы находимся внутри жизненного цикла компонента Vue (setup)\n if (getCurrentInstance()) {\n // Автоматически отписываемся при размонтировании Vue-компонента\n onUnmounted(() => {\n unsubscribe()\n })\n }\n // 2. Иначе, если мы находимся внутри изолированного EffectScope (например, в Pinia или в тестах)\n else if (getCurrentScope()) {\n onScopeDispose(() => {\n unsubscribe()\n })\n }\n\n return state\n }\n}\n"],"mappings":"oDAGA,IAAa,EAAb,cAAwC,EAAA,cAAuB,CAI7D,IAAc,EAAiF,CAE7F,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,EAAK,KAAK,EAG7B,EAAc,EAAK,UAAW,GAAa,CAC/C,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAkBD,OAbA,EAAA,EAAA,mBAAA,CAAuB,GAErB,EAAA,EAAA,YAAA,KAAkB,CAChB,EAAY,CACd,CAAC,GAGE,EAAA,EAAA,gBAAA,CAAoB,IACvB,EAAA,EAAA,eAAA,KAAqB,CACnB,EAAY,CACd,CAAC,EAGI,CACT,CACF"}
1
+ {"version":3,"file":"ReactiveEngine4Vue.cjs","names":[],"sources":["../../src/vue/ReactiveEngine4Vue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, type ShallowRef } from 'vue'\nimport { ReactiveEngine as OriginalReactiveEngine, type CleanupFn } from '../core/core'\n\nexport class ReactiveEngine4Vue extends OriginalReactiveEngine {\n /**\n * Использование реактивного значения в Vue компоненте или EffectScope.\n * Нативно поддерживает сигналы (Push) и ленивые вычисляемые свойства (Pull).\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): ShallowRef<T> {\n // Создаем локальную Vue-реактивную обертку со стартовым значением сигнала/computed\n const state = shallowRef(item.value)\n\n // Подписываемся на изменения реактивного элемента ядра\n const unsubscribe = item.subscribe((newValue) => {\n state.value = newValue // Обновляем Vue-реактивную переменную\n triggerRef(state) // 👈 ПРИНУДИТЕЛЬНО заставляем Vue перерисовать шаблон\n })\n\n // Автоматическое управление жизненным циклом подписок во Vue\n if (getCurrentInstance()) {\n onUnmounted(() => {\n unsubscribe()\n })\n } else if (getCurrentScope()) {\n onScopeDispose(() => {\n unsubscribe()\n })\n }\n\n return state\n }\n}\n"],"mappings":"oDAGA,IAAa,EAAb,cAAwC,EAAA,cAAuB,CAK7D,IAAc,EAAiF,CAE7F,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,EAAK,KAAK,EAG7B,EAAc,EAAK,UAAW,GAAa,CAC/C,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAaD,OAVA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,CAChB,EAAY,CACd,CAAC,GACI,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,CACnB,EAAY,CACd,CAAC,EAGI,CACT,CACF"}
@@ -3,6 +3,7 @@ import { ReactiveEngine as OriginalReactiveEngine, CleanupFn } from '../core/cor
3
3
  export declare class ReactiveEngine4Vue extends OriginalReactiveEngine {
4
4
  /**
5
5
  * Использование реактивного значения в Vue компоненте или EffectScope.
6
+ * Нативно поддерживает сигналы (Push) и ленивые вычисляемые свойства (Pull).
6
7
  */
7
8
  use<T>(item: {
8
9
  value: T;
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveEngine4Vue.d.ts","sourceRoot":"","sources":["../../src/vue/ReactiveEngine4Vue.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4F,KAAK,UAAU,EAAE,MAAM,KAAK,CAAA;AAC/H,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAEvF,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D;;OAEG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAA;KAAE,GAAG,UAAU,CAAC,CAAC,CAAC;CA4B/F"}
1
+ {"version":3,"file":"ReactiveEngine4Vue.d.ts","sourceRoot":"","sources":["../../src/vue/ReactiveEngine4Vue.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4F,KAAK,UAAU,EAAE,MAAM,KAAK,CAAA;AAC/H,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAEvF,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D;;;OAGG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAA;KAAE,GAAG,UAAU,CAAC,CAAC,CAAC;CAuB/F"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveEngine4Vue.mjs","names":[],"sources":["../../src/vue/ReactiveEngine4Vue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, type ShallowRef } from 'vue'\nimport { ReactiveEngine as OriginalReactiveEngine, type CleanupFn } from '../core/core'\n\nexport class ReactiveEngine4Vue extends OriginalReactiveEngine {\n /**\n * Использование реактивного значения в Vue компоненте или EffectScope.\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): ShallowRef<T> {\n // Создаем локальную Vue-реактивную обертку со стартовым значением сигнала\n const state = shallowRef(item.value)\n\n // Подписываемся на изменения сигнала ядра\n const unsubscribe = item.subscribe((newValue) => {\n state.value = newValue // Обновляем Vue-реактивную переменную\n triggerRef(state) // 👈 ПРИНУДИТЕЛЬНО заставляем Vue перерисовать шаблон\n })\n\n // Проверяем наличие активного компонента ИЛИ active области видимости эффектов\n\n // 1. Если мы находимся внутри жизненного цикла компонента Vue (setup)\n if (getCurrentInstance()) {\n // Автоматически отписываемся при размонтировании Vue-компонента\n onUnmounted(() => {\n unsubscribe()\n })\n }\n // 2. Иначе, если мы находимся внутри изолированного EffectScope (например, в Pinia или в тестах)\n else if (getCurrentScope()) {\n onScopeDispose(() => {\n unsubscribe()\n })\n }\n\n return state\n }\n}\n"],"mappings":";;;AAGA,IAAa,IAAb,cAAwC,EAAuB;CAI7D,IAAc,GAAiF;EAE7F,IAAM,IAAQ,EAAW,EAAK,KAAK,GAG7B,IAAc,EAAK,WAAW,MAAa;GAE/C,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;EAClB,CAAC;EAkBD,OAbI,EAAmB,IAErB,QAAkB;GAChB,EAAY;EACd,CAAC,IAGM,EAAgB,KACvB,QAAqB;GACnB,EAAY;EACd,CAAC,GAGI;CACT;AACF"}
1
+ {"version":3,"file":"ReactiveEngine4Vue.mjs","names":[],"sources":["../../src/vue/ReactiveEngine4Vue.ts"],"sourcesContent":["import { shallowRef, onUnmounted, getCurrentInstance, getCurrentScope, onScopeDispose, triggerRef, type ShallowRef } from 'vue'\nimport { ReactiveEngine as OriginalReactiveEngine, type CleanupFn } from '../core/core'\n\nexport class ReactiveEngine4Vue extends OriginalReactiveEngine {\n /**\n * Использование реактивного значения в Vue компоненте или EffectScope.\n * Нативно поддерживает сигналы (Push) и ленивые вычисляемые свойства (Pull).\n */\n public use<T>(item: { value: T; subscribe: (cb: (v: T) => void) => CleanupFn }): ShallowRef<T> {\n // Создаем локальную Vue-реактивную обертку со стартовым значением сигнала/computed\n const state = shallowRef(item.value)\n\n // Подписываемся на изменения реактивного элемента ядра\n const unsubscribe = item.subscribe((newValue) => {\n state.value = newValue // Обновляем Vue-реактивную переменную\n triggerRef(state) // 👈 ПРИНУДИТЕЛЬНО заставляем Vue перерисовать шаблон\n })\n\n // Автоматическое управление жизненным циклом подписок во Vue\n if (getCurrentInstance()) {\n onUnmounted(() => {\n unsubscribe()\n })\n } else if (getCurrentScope()) {\n onScopeDispose(() => {\n unsubscribe()\n })\n }\n\n return state\n }\n}\n"],"mappings":";;;AAGA,IAAa,IAAb,cAAwC,EAAuB;CAK7D,IAAc,GAAiF;EAE7F,IAAM,IAAQ,EAAW,EAAK,KAAK,GAG7B,IAAc,EAAK,WAAW,MAAa;GAE/C,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;EAClB,CAAC;EAaD,OAVI,EAAmB,IACrB,QAAkB;GAChB,EAAY;EACd,CAAC,IACQ,EAAgB,KACzB,QAAqB;GACnB,EAAY;EACd,CAAC,GAGI;CACT;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pravosleva/reactive-engine",
3
- "version": "1.3.2-beta",
3
+ "version": "1.4.1-beta",
4
4
  "engines": {
5
5
  "node": ">=22.20.0"
6
6
  },