@pravosleva/reactive-engine 1.6.0 → 1.6.1
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.
- package/dist/react/ReactiveEngine4React.cjs +4 -5
- package/dist/react/ReactiveEngine4React.cjs.map +1 -1
- package/dist/react/ReactiveEngine4React.d.ts +10 -18
- package/dist/react/ReactiveEngine4React.d.ts.map +1 -1
- package/dist/react/ReactiveEngine4React.mjs +19 -5
- package/dist/react/ReactiveEngine4React.mjs.map +1 -1
- package/dist/reactive-engine.umd.js +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,5 @@
|
|
|
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(
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
`;throw console.error(t,{item:e}),Error(t)}let[t,n]=this.reactAdapters.useState(e.value);return this.reactAdapters.useEffect(()=>e.subscribe(n),[e]),t}};exports.ReactiveEngine4React=n;
|
|
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==`object`&&`subscribe`in e&&typeof e.subscribe==`function`){let t=e,[n,r]=this.reactAdapters.useState(t.value);return this.reactAdapters.useEffect(()=>t.subscribe(r),[t]),n}if(e&&typeof e==`object`){let[,t]=this.reactAdapters.useState([]);return this.reactAdapters.useEffect(()=>{let n=this.effect(()=>{try{JSON.stringify(e)}catch{Object.values(e)}t([])},`react-use-reactive-proxy`);return()=>n()},[e]),e}let t=`
|
|
2
|
+
[Reactive Error]: engine.use() получил некорректный объект!
|
|
3
|
+
Проверьте, что передаваемый инстанс является Сигналом или создан через engine.reactive().
|
|
4
|
+
`;throw console.error(t,{item:e}),Error(t)}};exports.ReactiveEngine4React=n;
|
|
6
5
|
//# sourceMappingURL=ReactiveEngine4React.cjs.map
|
|
@@ -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
|
|
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// 1. Описываем строгий контракт для примитивных Сигналов/Computed\nexport interface ISignalLike<V> {\n value: V;\n subscribe: (cb: (v: V) => void) => CleanupFn;\n}\n\n/**\n * Класс адаптера для интеграции реактивного движка с React.\n */\nexport class ReactiveEngine4React extends OriginalReactiveEngine {\n protected override frameworkPrefix = 'react'\n\n private reactAdapters: {\n useState: typeof useStateFromReact;\n useEffect: typeof useEffectFromReact;\n } = {\n useState: useStateFromReact,\n useEffect: useEffectFromReact,\n }\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 * Поддерживает как атомарные Сигналы/Computed, так и глубокие реактивные Proxy-объекты.\n *\n * @template T\n * @param {T} item - Реактивный объект (сигнал или прокси)\n * @returns {T extends ISignalLike<infer V> ? V : T} - Развернутое значение или сам прокси-объект\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? V : T {\n if (!this.reactAdapters) {\n throw new Error(\"[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).\")\n }\n\n const isSignal = item &&\n typeof item === 'object' &&\n 'subscribe' in item &&\n typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // 1. Сценарий А: Передан примитивный Сигнал или Computed\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n const [val, setVal] = this.reactAdapters.useState<unknown>(signalItem.value)\n\n this.reactAdapters.useEffect(\n () => {\n return signalItem.subscribe(setVal)\n },\n [signalItem]\n )\n\n return val as (T extends ISignalLike<infer V> ? V : T)\n }\n\n // 2. Сценарий Б: Передан Proxy-объект из метода reactive()\n if (item && typeof item === 'object') {\n const [, forceUpdate] = this.reactAdapters.useState<unknown[]>([])\n\n // Используем useEffect для безопасного создания подписки вне фазы рендера React,\n // но внутри эффекта мы ПРИНУДИТЕЛЬНО запускаем глубокое считывание\n // свойств объекта (прогрев графа), чтобы ядро зацепило зависимости!\n this.reactAdapters.useEffect(() => {\n const unsubscribe = this.effect(() => {\n // Ленивый глубокий проход по свойствам объекта первого уровня,\n // чтобы Proxy-геттеры (строка 618 в core.ts) гарантированно перехватили\n // этот эффект и добавили его в propsSubscribers!\n try {\n // Рекурсивно или плоско считываем ключи\n JSON.stringify(item)\n } catch (e) {\n // Защита от круговых ссылок, просто считываем ключи первого уровня\n Object.values(item as Record<string, unknown>)\n }\n\n // При изменении любого из этих ключей триггерим ререндер React\n forceUpdate([])\n }, 'react-use-reactive-proxy')\n\n return () => unsubscribe()\n }, [item])\n\n // Возвращаем сам прокси-объект. При чтении в JSX он будет работать нативно.\n return item as (T extends ISignalLike<infer V> ? V : T)\n }\n\n const errorMsg = `\n [Reactive Error]: engine.use() получил некорректный объект!\n Проверьте, что передаваемый инстанс является Сигналом или создан через engine.reactive().\n `\n console.error(errorMsg, { item })\n throw new Error(errorMsg)\n }\n\n}\n"],"mappings":"sDAYA,IAAa,EAAb,cAA0C,EAAA,cAAuB,CAC/D,gBAAqC,QAErC,cAGI,CACA,SAAU,EAAA,SACV,UAAW,EAAA,SACb,EAEF,iBACE,EACA,EACM,CACN,KAAK,cAAgB,CAAE,WAAU,WAAU,CAC7C,CAUA,IAAc,EAAiD,CAC7D,GAAI,CAAC,KAAK,cACR,MAAU,MAAM,sGAAsG,EASxH,GANiB,GACA,OAAO,GAAS,UAChB,cAAe,GACf,OAAQ,EAAiC,WAAc,WAG1D,CACZ,IAAM,EAAc,EACd,CAAC,EAAK,GAAU,KAAK,cAAc,SAAkB,EAAW,KAAK,EAS3E,OAPA,KAAK,cAAc,cAER,EAAW,UAAU,CAAM,EAEpC,CAAC,CAAU,CACb,EAEO,CACT,CAGA,GAAI,GAAQ,OAAO,GAAS,SAAU,CACpC,GAAM,EAAG,GAAe,KAAK,cAAc,SAAoB,CAAC,CAAC,EA0BjE,OArBA,KAAK,cAAc,cAAgB,CACjC,IAAM,EAAc,KAAK,WAAa,CAIpC,GAAI,CAEF,KAAK,UAAU,CAAI,CACrB,MAAY,CAEV,OAAO,OAAO,CAA+B,CAC/C,CAGA,EAAY,CAAC,CAAC,CAChB,EAAG,0BAA0B,EAE7B,UAAa,EAAY,CAC3B,EAAG,CAAC,CAAI,CAAC,EAGF,CACT,CAEA,IAAM,EAAW;;;MAKjB,MADA,QAAQ,MAAM,EAAU,CAAE,MAAK,CAAC,EACtB,MAAM,CAAQ,CAC1B,CAEF"}
|
|
@@ -1,32 +1,24 @@
|
|
|
1
1
|
import { useState as useStateFromReact, useEffect as useEffectFromReact } from 'react';
|
|
2
2
|
import { ReactiveEngine as OriginalReactiveEngine, CleanupFn } from '../core/core';
|
|
3
|
+
export interface ISignalLike<V> {
|
|
4
|
+
value: V;
|
|
5
|
+
subscribe: (cb: (v: V) => void) => CleanupFn;
|
|
6
|
+
}
|
|
3
7
|
/**
|
|
4
8
|
* Класс адаптера для интеграции реактивного движка с React.
|
|
5
|
-
* Наследует функциональность оригинального реактивного движка и предоставляет специализированные методы для работы с React.
|
|
6
9
|
*/
|
|
7
10
|
export declare class ReactiveEngine4React extends OriginalReactiveEngine {
|
|
8
11
|
protected frameworkPrefix: string;
|
|
9
12
|
private reactAdapters;
|
|
10
|
-
/**
|
|
11
|
-
* Установка адаптеров React.
|
|
12
|
-
* @function setReactAdapters
|
|
13
|
-
* @param {Function} useState - Функция useState из React.
|
|
14
|
-
* @param {Function} useEffect - Функция useEffect из React.
|
|
15
|
-
* @returns {void}
|
|
16
|
-
* @source
|
|
17
|
-
*/
|
|
18
13
|
setReactAdapters(useState: typeof useStateFromReact, useEffect: typeof useEffectFromReact): void;
|
|
19
14
|
/**
|
|
20
|
-
* Использование реактивного значения в React
|
|
15
|
+
* Использование реактивного значения в React-компоненте.
|
|
16
|
+
* Поддерживает как атомарные Сигналы/Computed, так и глубокие реактивные Proxy-объекты.
|
|
17
|
+
*
|
|
21
18
|
* @template T
|
|
22
|
-
* @
|
|
23
|
-
* @
|
|
24
|
-
* @returns {T} - Значение реактивного объекта.
|
|
25
|
-
* @source
|
|
19
|
+
* @param {T} item - Реактивный объект (сигнал или прокси)
|
|
20
|
+
* @returns {T extends ISignalLike<infer V> ? V : T} - Развернутое значение или сам прокси-объект
|
|
26
21
|
*/
|
|
27
|
-
use<T>(item:
|
|
28
|
-
value: T;
|
|
29
|
-
subscribe: (cb: (v: T) => void) => CleanupFn;
|
|
30
|
-
}): T;
|
|
22
|
+
use<T>(item: T): T extends ISignalLike<infer V> ? V : T;
|
|
31
23
|
}
|
|
32
24
|
//# sourceMappingURL=ReactiveEngine4React.d.ts.map
|
|
@@ -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;
|
|
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;AAGlF,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAC;CAC9C;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,UAAmB,eAAe,SAAU;IAE5C,OAAO,CAAC,aAAa,CAMlB;IAEI,gBAAgB,CACrB,QAAQ,EAAE,OAAO,iBAAiB,EAClC,SAAS,EAAE,OAAO,kBAAkB,GACnC,IAAI;IAIP;;;;;;;OAOG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CAgE/D"}
|
|
@@ -15,12 +15,26 @@ var r = class extends e {
|
|
|
15
15
|
}
|
|
16
16
|
use(e) {
|
|
17
17
|
if (!this.reactAdapters) throw Error("[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).");
|
|
18
|
-
if (
|
|
19
|
-
let t =
|
|
20
|
-
|
|
18
|
+
if (e && typeof e == "object" && "subscribe" in e && typeof e.subscribe == "function") {
|
|
19
|
+
let t = e, [n, r] = this.reactAdapters.useState(t.value);
|
|
20
|
+
return this.reactAdapters.useEffect(() => t.subscribe(r), [t]), n;
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
if (e && typeof e == "object") {
|
|
23
|
+
let [, t] = this.reactAdapters.useState([]);
|
|
24
|
+
return this.reactAdapters.useEffect(() => {
|
|
25
|
+
let n = this.effect(() => {
|
|
26
|
+
try {
|
|
27
|
+
JSON.stringify(e);
|
|
28
|
+
} catch {
|
|
29
|
+
Object.values(e);
|
|
30
|
+
}
|
|
31
|
+
t([]);
|
|
32
|
+
}, "react-use-reactive-proxy");
|
|
33
|
+
return () => n();
|
|
34
|
+
}, [e]), e;
|
|
35
|
+
}
|
|
36
|
+
let t = "\n [Reactive Error]: engine.use() получил некорректный объект!\n Проверьте, что передаваемый инстанс является Сигналом или создан через engine.reactive().\n ";
|
|
37
|
+
throw console.error(t, { item: e }), Error(t);
|
|
24
38
|
}
|
|
25
39
|
};
|
|
26
40
|
//#endregion
|
|
@@ -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
|
|
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// 1. Описываем строгий контракт для примитивных Сигналов/Computed\nexport interface ISignalLike<V> {\n value: V;\n subscribe: (cb: (v: V) => void) => CleanupFn;\n}\n\n/**\n * Класс адаптера для интеграции реактивного движка с React.\n */\nexport class ReactiveEngine4React extends OriginalReactiveEngine {\n protected override frameworkPrefix = 'react'\n\n private reactAdapters: {\n useState: typeof useStateFromReact;\n useEffect: typeof useEffectFromReact;\n } = {\n useState: useStateFromReact,\n useEffect: useEffectFromReact,\n }\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 * Поддерживает как атомарные Сигналы/Computed, так и глубокие реактивные Proxy-объекты.\n *\n * @template T\n * @param {T} item - Реактивный объект (сигнал или прокси)\n * @returns {T extends ISignalLike<infer V> ? V : T} - Развернутое значение или сам прокси-объект\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? V : T {\n if (!this.reactAdapters) {\n throw new Error(\"[React Error]: Адаптеры React не установлены. Вызовите engine.setReactAdapters(useState, useEffect).\")\n }\n\n const isSignal = item &&\n typeof item === 'object' &&\n 'subscribe' in item &&\n typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // 1. Сценарий А: Передан примитивный Сигнал или Computed\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n const [val, setVal] = this.reactAdapters.useState<unknown>(signalItem.value)\n\n this.reactAdapters.useEffect(\n () => {\n return signalItem.subscribe(setVal)\n },\n [signalItem]\n )\n\n return val as (T extends ISignalLike<infer V> ? V : T)\n }\n\n // 2. Сценарий Б: Передан Proxy-объект из метода reactive()\n if (item && typeof item === 'object') {\n const [, forceUpdate] = this.reactAdapters.useState<unknown[]>([])\n\n // Используем useEffect для безопасного создания подписки вне фазы рендера React,\n // но внутри эффекта мы ПРИНУДИТЕЛЬНО запускаем глубокое считывание\n // свойств объекта (прогрев графа), чтобы ядро зацепило зависимости!\n this.reactAdapters.useEffect(() => {\n const unsubscribe = this.effect(() => {\n // Ленивый глубокий проход по свойствам объекта первого уровня,\n // чтобы Proxy-геттеры (строка 618 в core.ts) гарантированно перехватили\n // этот эффект и добавили его в propsSubscribers!\n try {\n // Рекурсивно или плоско считываем ключи\n JSON.stringify(item)\n } catch (e) {\n // Защита от круговых ссылок, просто считываем ключи первого уровня\n Object.values(item as Record<string, unknown>)\n }\n\n // При изменении любого из этих ключей триггерим ререндер React\n forceUpdate([])\n }, 'react-use-reactive-proxy')\n\n return () => unsubscribe()\n }, [item])\n\n // Возвращаем сам прокси-объект. При чтении в JSX он будет работать нативно.\n return item as (T extends ISignalLike<infer V> ? V : T)\n }\n\n const errorMsg = `\n [Reactive Error]: engine.use() получил некорректный объект!\n Проверьте, что передаваемый инстанс является Сигналом или создан через engine.reactive().\n `\n console.error(errorMsg, { item })\n throw new Error(errorMsg)\n }\n\n}\n"],"mappings":";;;AAYA,IAAa,IAAb,cAA0C,EAAuB;CAC/D,kBAAqC;CAErC,gBAGI;EACU;EACC;CACb;CAEF,iBACE,GACA,GACM;EACN,KAAK,gBAAgB;GAAE;GAAU;EAAU;CAC7C;CAUA,IAAc,GAAiD;EAC7D,IAAI,CAAC,KAAK,eACR,MAAU,MAAM,sGAAsG;EASxH,IANiB,KACA,OAAO,KAAS,YAChB,eAAe,KACf,OAAQ,EAAiC,aAAc,YAG1D;GACZ,IAAM,IAAc,GACd,CAAC,GAAK,KAAU,KAAK,cAAc,SAAkB,EAAW,KAAK;GAS3E,OAPA,KAAK,cAAc,gBAER,EAAW,UAAU,CAAM,GAEpC,CAAC,CAAU,CACb,GAEO;EACT;EAGA,IAAI,KAAQ,OAAO,KAAS,UAAU;GACpC,IAAM,GAAG,KAAe,KAAK,cAAc,SAAoB,CAAC,CAAC;GA0BjE,OArBA,KAAK,cAAc,gBAAgB;IACjC,IAAM,IAAc,KAAK,aAAa;KAIpC,IAAI;MAEF,KAAK,UAAU,CAAI;KACrB,QAAY;MAEV,OAAO,OAAO,CAA+B;KAC/C;KAGA,EAAY,CAAC,CAAC;IAChB,GAAG,0BAA0B;IAE7B,aAAa,EAAY;GAC3B,GAAG,CAAC,CAAI,CAAC,GAGF;EACT;EAEA,IAAM,IAAW;EAKjB,MADA,QAAQ,MAAM,GAAU,EAAE,QAAK,CAAC,GACtB,MAAM,CAAQ;CAC1B;AAEF"}
|