@pravosleva/reactive-engine 1.7.0-beta → 1.8.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.
- package/dist/angular/ReactiveEngine4Angular.cjs +1 -1
- package/dist/angular/ReactiveEngine4Angular.cjs.map +1 -1
- package/dist/angular/ReactiveEngine4Angular.d.ts +16 -7
- package/dist/angular/ReactiveEngine4Angular.d.ts.map +1 -1
- package/dist/angular/ReactiveEngine4Angular.mjs +4 -4
- package/dist/angular/ReactiveEngine4Angular.mjs.map +1 -1
- package/dist/angular/core.angular.auto.test.d.ts +2 -0
- package/dist/angular/core.angular.auto.test.d.ts.map +1 -0
- package/dist/angular/core.angular.test.d.ts +2 -0
- package/dist/angular/core.angular.test.d.ts.map +1 -0
- package/dist/angular/index.cjs +1 -1
- package/dist/angular/index.d.ts +2 -2
- package/dist/angular/index.d.ts.map +1 -1
- package/dist/angular/index.mjs +1 -1
- package/dist/angular/rxjs-interop.d.ts +1 -1
- package/dist/angular/rxjs-interop.d.ts.map +1 -1
- package/dist/core/AbstractService.d.ts +3 -3
- package/dist/core/core.auto.test.d.ts +2 -0
- package/dist/core/core.auto.test.d.ts.map +1 -0
- package/dist/core/core.d.ts +105 -366
- package/dist/core/core.d.ts.map +1 -1
- package/dist/core/types.d.ts +102 -72
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.mjs +497 -414
- package/dist/core.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +11 -11
- package/dist/react/ReactiveEngine4React.cjs +1 -1
- package/dist/react/ReactiveEngine4React.cjs.map +1 -1
- package/dist/react/ReactiveEngine4React.d.ts +16 -8
- package/dist/react/ReactiveEngine4React.d.ts.map +1 -1
- package/dist/react/ReactiveEngine4React.mjs +5 -5
- package/dist/react/ReactiveEngine4React.mjs.map +1 -1
- package/dist/react/core.react.auto.test.d.ts +2 -0
- package/dist/react/core.react.auto.test.d.ts.map +1 -0
- package/dist/react/hooks/FilteredCatalog.auto.test.d.ts +2 -0
- package/dist/react/hooks/FilteredCatalog.auto.test.d.ts.map +1 -0
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.auto.test.d.ts +2 -0
- package/dist/react/hooks/useReactiveSubscription/useReactiveSubscription.auto.test.d.ts.map +1 -0
- package/dist/react/hooks/useReactiveValue/useReactiveValue.auto.test.d.ts +2 -0
- package/dist/react/hooks/useReactiveValue/useReactiveValue.auto.test.d.ts.map +1 -0
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.mjs +1 -1
- package/dist/reactive-engine.umd.js +2 -2
- package/dist/reactive-engine.umd.js.map +1 -1
- package/dist/vue/ReactiveEngine4Vue.cjs +1 -1
- package/dist/vue/ReactiveEngine4Vue.cjs.map +1 -1
- package/dist/vue/ReactiveEngine4Vue.d.ts +21 -13
- package/dist/vue/ReactiveEngine4Vue.d.ts.map +1 -1
- package/dist/vue/ReactiveEngine4Vue.mjs +27 -17
- package/dist/vue/ReactiveEngine4Vue.mjs.map +1 -1
- package/dist/vue/composables/useReactiveValue.auto.test.d.ts +2 -0
- package/dist/vue/composables/useReactiveValue.auto.test.d.ts.map +1 -0
- package/dist/vue/core.vue.auto.test.d.ts +2 -0
- package/dist/vue/core.vue.auto.test.d.ts.map +1 -0
- package/dist/vue/core.vue.test.d.ts +2 -0
- package/dist/vue/core.vue.test.d.ts.map +1 -0
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.d.ts +1 -1
- package/dist/vue/index.d.ts.map +1 -1
- package/dist/vue/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/angular/ReactiveEngine4Angular.test.d.ts +0 -2
- package/dist/angular/ReactiveEngine4Angular.test.d.ts.map +0 -1
- package/dist/decorators/withThrottleComputed/_withThrottleComputed.d.ts +0 -22
- package/dist/decorators/withThrottleComputed/_withThrottleComputed.d.ts.map +0 -1
- package/dist/utils/getExtractedValues.cjs +0 -2
- package/dist/utils/getExtractedValues.cjs.map +0 -1
- package/dist/utils/getExtractedValues.mjs +0 -24
- package/dist/utils/getExtractedValues.mjs.map +0 -1
- package/dist/vue/ReactiveEngine4Vue.test.d.ts +0 -2
- package/dist/vue/ReactiveEngine4Vue.test.d.ts.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../core.cjs");let t=require("@angular/core");var n=class extends e.
|
|
1
|
+
const e=require("../core.cjs");let t=require("@angular/core");var n=class extends e.ReactiveEngineAutomatic{frameworkPrefix=`angular-auto`;reactive(e,t){Reflect.has(e,`__subscribe`)||Object.defineProperty(e,"__subscribe",{get:()=>e=>this.effect(()=>{try{JSON.stringify(n)}catch{Object.values(n)}e()},`angular-auto-proxy-internal-subscription`),configurable:!0,enumerable:!1});let n=super.reactive(e,t);return n}use(e,n){if(typeof e!=`object`||!e)return(0,t.signal)(e).asReadonly();let r=`subscribe`in e&&typeof e.subscribe==`function`,i=()=>{},a;if(r){let n=e;a=(0,t.signal)(n.value),i=n.subscribe(()=>{let e=n.value;a.set(e)})}else a=(0,t.signal)(e),`__subscribe`in e&&typeof e.__subscribe==`function`&&(i=e.__subscribe(()=>{a.set({...e})}));let o=()=>{(0,t.inject)(t.DestroyRef).onDestroy(()=>{i()})};return n?.injector?(0,t.runInInjectionContext)(n.injector,o):o(),a.asReadonly()}};exports.ReactiveEngine4AngularAutomatic=n;
|
|
2
2
|
//# sourceMappingURL=ReactiveEngine4Angular.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactiveEngine4Angular.cjs","names":[],"sources":["../../src/angular/ReactiveEngine4Angular.ts"],"sourcesContent":["import { signal, inject, DestroyRef, Injector, runInInjectionContext, type Signal } from '@angular/core'\nimport { ReactiveEngine
|
|
1
|
+
{"version":3,"file":"ReactiveEngine4Angular.cjs","names":[],"sources":["../../src/angular/ReactiveEngine4Angular.ts"],"sourcesContent":["import { signal, inject, DestroyRef, Injector, runInInjectionContext, type Signal } from '@angular/core'\nimport { ReactiveEngine, ReactiveEngineAutomatic } from '../core/core'\nimport { CleanupFn } from '../core/types'\n\nexport interface AngularUseOptions {\n injector?: Injector;\n}\n\n// Описываем строгий контракт для примитивов реактивного ядра (Signals / Computed)\nexport interface ISignalLike<V> {\n readonly value: V;\n subscribe: (cb: (v: V) => void) => CleanupFn;\n}\n\n/**\n * 🔴 1. СИНХРОННЫЙ РЕАКТИВНЫЙ АДАПТЕР ДЛЯ ANGULAR 16+\n * Базируется на плоском синхронном Push/Pull графе ядра.\n */\nexport class ReactiveEngine4Angular extends ReactiveEngine {\n protected override frameworkPrefix = 'angular'\n\n /**\n * Переопределяем метод создания реактивных объектов для Angular-версии движка.\n * Безопасно внедряет скрытое свойство __subscribe в оригинальный граф без double-proxying.\n */\n public override reactive<T extends object>(target: T, name?: string): T {\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__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() // Оповещаем Angular Signal о мутации внутренностей Proxy\n }, 'angular-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Использование реактивного значения в Angular компоненте или сервисе.\n * Полиморфно поддерживает как атомарные Сигналы/Computed, так и глубокие реактивные Proxy-объекты.\n */\n public use<T>(\n item: T,\n options?: AngularUseOptions\n ): T extends ISignalLike<infer V> ? Signal<V> : Signal<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n const angularSignal = signal(item)\n return angularSignal.asReadonly() as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n let unsubscribe: CleanupFn = () => {}\n let angularSignal: any\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n angularSignal = signal(signalItem.value)\n\n unsubscribe = signalItem.subscribe(() => {\n const freshValue = signalItem.value\n angularSignal.set(freshValue)\n })\n }\n else {\n angularSignal = signal(item)\n\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 // При мутации свойств или массивов Proxy делаем принудительный .set()\n angularSignal.set({ ...item })\n })\n }\n }\n\n const registerCleanup = () => {\n const destroyRef = inject(DestroyRef)\n destroyRef.onDestroy(() => {\n unsubscribe()\n })\n }\n\n if (options?.injector) {\n runInInjectionContext(options.injector, registerCleanup)\n } else {\n registerCleanup()\n }\n\n return angularSignal.asReadonly()\n }\n}\n\n/**\n * 🤖 2. АВТОМАТИЧЕСКИЙ РЕАКТИВНЫЙ АДАПТЕР ДЛЯ ANGULAR 16+ (АСИНХРОННЫЙ ШЕДУЛЕР)\n * Наследует ReactiveEngineAutomatic и аппаратно склеивает цепочки мутаций в микрозадачи.\n */\nexport class ReactiveEngine4AngularAutomatic extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'angular-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__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 }, 'angular-auto-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n public use<T>(\n item: T,\n options?: AngularUseOptions\n ): T extends ISignalLike<infer V> ? Signal<V> : Signal<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n const angularSignal = signal(item)\n return angularSignal.asReadonly() as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n let unsubscribe: CleanupFn = () => {}\n let angularSignal: any\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n angularSignal = signal(signalItem.value)\n\n unsubscribe = signalItem.subscribe(() => {\n const freshValue = signalItem.value\n angularSignal.set(freshValue)\n })\n }\n else {\n angularSignal = signal(item)\n\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 angularSignal.set({ ...item })\n })\n }\n }\n\n const registerCleanup = () => {\n const destroyRef = inject(DestroyRef)\n destroyRef.onDestroy(() => {\n unsubscribe()\n })\n }\n\n if (options?.injector) {\n runInInjectionContext(options.injector, registerCleanup)\n } else {\n registerCleanup()\n }\n\n return angularSignal.asReadonly()\n }\n}\n"],"mappings":"8DA4GA,IAAa,EAAb,cAAqD,EAAA,uBAAwB,CAC3E,gBAAqC,eAErC,SAA2C,EAAW,EAAkB,CACjE,QAAQ,IAAI,EAAQ,aAAa,GACpC,OAAO,eAAe,EAAQ,cAAe,CAC3C,QACU,GACC,KAAK,WAAa,CACvB,GAAI,CACF,KAAK,UAAU,CAAa,CAC9B,MAAY,CACV,OAAO,OAAO,CAAwC,CACxD,CACA,EAAG,CACL,EAAG,0CAA0C,EAGjD,aAAc,GACd,WAAY,EACd,CAAC,EAGH,IAAM,EAAgB,MAAM,SAAS,EAAQ,CAAI,EACjD,OAAO,CACT,CAEA,IACE,EACA,EACwD,CACxD,GAA2C,OAAO,GAAS,WAAvD,EAEF,OAAA,EAAA,EAAA,OAAA,CAD6B,CACtB,CAAA,CAAc,WAAW,EAGlC,IAAM,EAAW,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAE3F,MAA+B,CAAC,EAChC,EAEJ,GAAI,EAAU,CACZ,IAAM,EAAc,EACpB,GAAA,EAAA,EAAA,OAAA,CAAuB,EAAW,KAAK,EAEvC,EAAc,EAAW,cAAgB,CACvC,IAAM,EAAa,EAAW,MAC9B,EAAc,IAAI,CAAU,CAC9B,CAAC,CACH,KAEE,IAAA,EAAA,EAAA,OAAA,CAAuB,CAAI,EAEvB,gBAAiB,GAAQ,OAAQ,EAAiC,aAAgB,aACpF,EAAgB,EAAiC,gBAAoD,CACnG,EAAc,IAAI,CAAE,GAAG,CAAK,CAAC,CAC/B,CAAC,GAIL,IAAM,MAAwB,EAE5B,EAAA,EAAA,OAAA,CAD0B,EAAA,UAC1B,CAAA,CAAW,cAAgB,CACzB,EAAY,CACd,CAAC,CACH,EAQA,OANI,GAAS,UACX,EAAA,EAAA,sBAAA,CAAsB,EAAQ,SAAU,CAAe,EAEvD,EAAgB,EAGX,EAAc,WAAW,CAClC,CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Injector, Signal } from '@angular/core';
|
|
2
|
-
import { ReactiveEngine
|
|
2
|
+
import { ReactiveEngine, ReactiveEngineAutomatic } from '../core/core';
|
|
3
|
+
import { CleanupFn } from '../core/types';
|
|
3
4
|
export interface AngularUseOptions {
|
|
4
5
|
injector?: Injector;
|
|
5
6
|
}
|
|
@@ -7,7 +8,11 @@ export interface ISignalLike<V> {
|
|
|
7
8
|
readonly value: V;
|
|
8
9
|
subscribe: (cb: (v: V) => void) => CleanupFn;
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
+
/**
|
|
12
|
+
* 🔴 1. СИНХРОННЫЙ РЕАКТИВНЫЙ АДАПТЕР ДЛЯ ANGULAR 16+
|
|
13
|
+
* Базируется на плоском синхронном Push/Pull графе ядра.
|
|
14
|
+
*/
|
|
15
|
+
export declare class ReactiveEngine4Angular extends ReactiveEngine {
|
|
11
16
|
protected frameworkPrefix: string;
|
|
12
17
|
/**
|
|
13
18
|
* Переопределяем метод создания реактивных объектов для Angular-версии движка.
|
|
@@ -17,12 +22,16 @@ export declare class ReactiveEngine4Angular extends OriginalReactiveEngine {
|
|
|
17
22
|
/**
|
|
18
23
|
* Использование реактивного значения в Angular компоненте или сервисе.
|
|
19
24
|
* Полиморфно поддерживает как атомарные Сигналы/Computed, так и глубокие реактивные Proxy-объекты.
|
|
20
|
-
*
|
|
21
|
-
* @template T
|
|
22
|
-
* @param {T} item - Реактивный объект ядра (сигнал или прокси)
|
|
23
|
-
* @param {AngularUseOptions} [options] - Опции инжектора Angular
|
|
24
|
-
* @returns {T extends ISignalLike<infer V> ? Signal<V> : Signal<T>} - Стандартный Angular Signal (Readonly)
|
|
25
25
|
*/
|
|
26
26
|
use<T>(item: T, options?: AngularUseOptions): T extends ISignalLike<infer V> ? Signal<V> : Signal<T>;
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* 🤖 2. АВТОМАТИЧЕСКИЙ РЕАКТИВНЫЙ АДАПТЕР ДЛЯ ANGULAR 16+ (АСИНХРОННЫЙ ШЕДУЛЕР)
|
|
30
|
+
* Наследует ReactiveEngineAutomatic и аппаратно склеивает цепочки мутаций в микрозадачи.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ReactiveEngine4AngularAutomatic extends ReactiveEngineAutomatic {
|
|
33
|
+
protected frameworkPrefix: string;
|
|
34
|
+
reactive<T extends object>(target: T, name?: string): T;
|
|
35
|
+
use<T>(item: T, options?: AngularUseOptions): T extends ISignalLike<infer V> ? Signal<V> : Signal<T>;
|
|
36
|
+
}
|
|
28
37
|
//# sourceMappingURL=ReactiveEngine4Angular.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactiveEngine4Angular.d.ts","sourceRoot":"","sources":["../../src/angular/ReactiveEngine4Angular.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,QAAQ,EAAyB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AACxG,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"ReactiveEngine4Angular.d.ts","sourceRoot":"","sources":["../../src/angular/ReactiveEngine4Angular.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,QAAQ,EAAyB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AACxG,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,CAAC;CAC9C;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,cAAc;IACxD,UAAmB,eAAe,SAAY;IAE9C;;;OAGG;IACa,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IAwBvE;;;OAGG;IACI,GAAG,CAAC,CAAC,EACV,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,iBAAiB,GAC1B,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CA8C1D;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,uBAAuB;IAC1E,UAAmB,eAAe,SAAiB;IAEnC,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IAwBhE,GAAG,CAAC,CAAC,EACV,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,iBAAiB,GAC1B,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CA6C1D"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactiveEngineAutomatic as e } from "../core.mjs";
|
|
2
2
|
import { DestroyRef as t, inject as n, runInInjectionContext as r, signal as i } from "@angular/core";
|
|
3
3
|
//#region src/angular/ReactiveEngine4Angular.ts
|
|
4
4
|
var a = class extends e {
|
|
5
|
-
frameworkPrefix = "angular";
|
|
5
|
+
frameworkPrefix = "angular-auto";
|
|
6
6
|
reactive(e, t) {
|
|
7
7
|
Reflect.has(e, "__subscribe") || Object.defineProperty(e, "__subscribe", {
|
|
8
8
|
get: () => (e) => this.effect(() => {
|
|
@@ -12,7 +12,7 @@ var a = class extends e {
|
|
|
12
12
|
Object.values(n);
|
|
13
13
|
}
|
|
14
14
|
e();
|
|
15
|
-
}, "angular-proxy-internal-subscription"),
|
|
15
|
+
}, "angular-auto-proxy-internal-subscription"),
|
|
16
16
|
configurable: !0,
|
|
17
17
|
enumerable: !1
|
|
18
18
|
});
|
|
@@ -40,6 +40,6 @@ var a = class extends e {
|
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
42
|
//#endregion
|
|
43
|
-
export { a as
|
|
43
|
+
export { a as ReactiveEngine4AngularAutomatic };
|
|
44
44
|
|
|
45
45
|
//# sourceMappingURL=ReactiveEngine4Angular.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactiveEngine4Angular.mjs","names":[],"sources":["../../src/angular/ReactiveEngine4Angular.ts"],"sourcesContent":["import { signal, inject, DestroyRef, Injector, runInInjectionContext, type Signal } from '@angular/core'\nimport { ReactiveEngine
|
|
1
|
+
{"version":3,"file":"ReactiveEngine4Angular.mjs","names":[],"sources":["../../src/angular/ReactiveEngine4Angular.ts"],"sourcesContent":["import { signal, inject, DestroyRef, Injector, runInInjectionContext, type Signal } from '@angular/core'\nimport { ReactiveEngine, ReactiveEngineAutomatic } from '../core/core'\nimport { CleanupFn } from '../core/types'\n\nexport interface AngularUseOptions {\n injector?: Injector;\n}\n\n// Описываем строгий контракт для примитивов реактивного ядра (Signals / Computed)\nexport interface ISignalLike<V> {\n readonly value: V;\n subscribe: (cb: (v: V) => void) => CleanupFn;\n}\n\n/**\n * 🔴 1. СИНХРОННЫЙ РЕАКТИВНЫЙ АДАПТЕР ДЛЯ ANGULAR 16+\n * Базируется на плоском синхронном Push/Pull графе ядра.\n */\nexport class ReactiveEngine4Angular extends ReactiveEngine {\n protected override frameworkPrefix = 'angular'\n\n /**\n * Переопределяем метод создания реактивных объектов для Angular-версии движка.\n * Безопасно внедряет скрытое свойство __subscribe в оригинальный граф без double-proxying.\n */\n public override reactive<T extends object>(target: T, name?: string): T {\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__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() // Оповещаем Angular Signal о мутации внутренностей Proxy\n }, 'angular-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Использование реактивного значения в Angular компоненте или сервисе.\n * Полиморфно поддерживает как атомарные Сигналы/Computed, так и глубокие реактивные Proxy-объекты.\n */\n public use<T>(\n item: T,\n options?: AngularUseOptions\n ): T extends ISignalLike<infer V> ? Signal<V> : Signal<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n const angularSignal = signal(item)\n return angularSignal.asReadonly() as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n let unsubscribe: CleanupFn = () => {}\n let angularSignal: any\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n angularSignal = signal(signalItem.value)\n\n unsubscribe = signalItem.subscribe(() => {\n const freshValue = signalItem.value\n angularSignal.set(freshValue)\n })\n }\n else {\n angularSignal = signal(item)\n\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 // При мутации свойств или массивов Proxy делаем принудительный .set()\n angularSignal.set({ ...item })\n })\n }\n }\n\n const registerCleanup = () => {\n const destroyRef = inject(DestroyRef)\n destroyRef.onDestroy(() => {\n unsubscribe()\n })\n }\n\n if (options?.injector) {\n runInInjectionContext(options.injector, registerCleanup)\n } else {\n registerCleanup()\n }\n\n return angularSignal.asReadonly()\n }\n}\n\n/**\n * 🤖 2. АВТОМАТИЧЕСКИЙ РЕАКТИВНЫЙ АДАПТЕР ДЛЯ ANGULAR 16+ (АСИНХРОННЫЙ ШЕДУЛЕР)\n * Наследует ReactiveEngineAutomatic и аппаратно склеивает цепочки мутаций в микрозадачи.\n */\nexport class ReactiveEngine4AngularAutomatic extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'angular-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n if (!Reflect.has(target, '__subscribe')) {\n Object.defineProperty(target, '__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 }, 'angular-auto-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n const originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n public use<T>(\n item: T,\n options?: AngularUseOptions\n ): T extends ISignalLike<infer V> ? Signal<V> : Signal<T> {\n if (item === null || item === undefined || typeof item !== 'object') {\n const angularSignal = signal(item)\n return angularSignal.asReadonly() as any\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n let unsubscribe: CleanupFn = () => {}\n let angularSignal: any\n\n if (isSignal) {\n const signalItem = (item as unknown) as ISignalLike<unknown>\n angularSignal = signal(signalItem.value)\n\n unsubscribe = signalItem.subscribe(() => {\n const freshValue = signalItem.value\n angularSignal.set(freshValue)\n })\n }\n else {\n angularSignal = signal(item)\n\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 angularSignal.set({ ...item })\n })\n }\n }\n\n const registerCleanup = () => {\n const destroyRef = inject(DestroyRef)\n destroyRef.onDestroy(() => {\n unsubscribe()\n })\n }\n\n if (options?.injector) {\n runInInjectionContext(options.injector, registerCleanup)\n } else {\n registerCleanup()\n }\n\n return angularSignal.asReadonly()\n }\n}\n"],"mappings":";;;AA4GA,IAAa,IAAb,cAAqD,EAAwB;CAC3E,kBAAqC;CAErC,SAA2C,GAAW,GAAkB;EACtE,AAAK,QAAQ,IAAI,GAAQ,aAAa,KACpC,OAAO,eAAe,GAAQ,eAAe;GAC3C,YACU,MACC,KAAK,aAAa;IACvB,IAAI;KACF,KAAK,UAAU,CAAa;IAC9B,QAAY;KACV,OAAO,OAAO,CAAwC;IACxD;IACA,EAAG;GACL,GAAG,0CAA0C;GAGjD,cAAc;GACd,YAAY;EACd,CAAC;EAGH,IAAM,IAAgB,MAAM,SAAS,GAAQ,CAAI;EACjD,OAAO;CACT;CAEA,IACE,GACA,GACwD;EACxD,IAA2C,OAAO,KAAS,aAAvD,GAEF,OADsB,EAAO,CACtB,CAAA,CAAc,WAAW;EAGlC,IAAM,IAAW,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAE3F,UAA+B,CAAC,GAChC;EAEJ,IAAI,GAAU;GACZ,IAAM,IAAc;GAGpB,AAFA,IAAgB,EAAO,EAAW,KAAK,GAEvC,IAAc,EAAW,gBAAgB;IACvC,IAAM,IAAa,EAAW;IAC9B,EAAc,IAAI,CAAU;GAC9B,CAAC;EACH,OAIE,AAFA,IAAgB,EAAO,CAAI,GAEvB,iBAAiB,KAAQ,OAAQ,EAAiC,eAAgB,eACpF,IAAgB,EAAiC,kBAAoD;GACnG,EAAc,IAAI,EAAE,GAAG,EAAK,CAAC;EAC/B,CAAC;EAIL,IAAM,UAAwB;GAE5B,EAD0B,CAC1B,CAAA,CAAW,gBAAgB;IACzB,EAAY;GACd,CAAC;EACH;EAQA,OANI,GAAS,WACX,EAAsB,EAAQ,UAAU,CAAe,IAEvD,EAAgB,GAGX,EAAc,WAAW;CAClC;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.angular.auto.test.d.ts","sourceRoot":"","sources":["../../src/angular/core.angular.auto.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.angular.test.d.ts","sourceRoot":"","sources":["../../src/angular/core.angular.test.ts"],"names":[],"mappings":""}
|
package/dist/angular/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./ReactiveEngine4Angular.cjs");exports.ReactiveEngine=e.
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./ReactiveEngine4Angular.cjs");exports.ReactiveEngine=e.ReactiveEngine4AngularAutomatic;
|
package/dist/angular/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { ReactiveEngine4AngularAutomatic } from './ReactiveEngine4Angular';
|
|
2
|
+
export { ReactiveEngine4AngularAutomatic as ReactiveEngine };
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/angular/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/angular/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA;AAE1E,OAAO,EAAE,+BAA+B,IAAI,cAAc,EAAE,CAAA"}
|
package/dist/angular/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactiveEngine4AngularAutomatic as e } from "./ReactiveEngine4Angular.mjs";
|
|
2
2
|
export { e as ReactiveEngine };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rxjs-interop.d.ts","sourceRoot":"","sources":["../../src/angular/rxjs-interop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgC,MAAM,MAAM,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"rxjs-interop.d.ts","sourceRoot":"","sources":["../../src/angular/rxjs-interop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgC,MAAM,MAAM,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,UAAU,gBAAgB,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,GAAG,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,MAAM,gBAAgB,CAAC,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,CAmB3E,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,SAAS,UAAU,CAAC,CAAC,CAAC,EACtB,cAAc,CAAC,KACd,gBAAgB,CAAC,CAAC,CAkBpB,CAAA"}
|
|
@@ -2,9 +2,9 @@ import { ReactiveEngine } from './core';
|
|
|
2
2
|
export declare abstract class AbstractService {
|
|
3
3
|
protected engine: ReactiveEngine;
|
|
4
4
|
constructor(engine: ReactiveEngine);
|
|
5
|
-
protected createNumericSignal(val: number, name: string): import('./
|
|
6
|
-
protected createComputed<T>(fn: () => T): import('./
|
|
7
|
-
protected createSignal<T>(val: T, name?: string): import('./
|
|
5
|
+
protected createNumericSignal(val: number, name: string): import('./types').Signal<number>;
|
|
6
|
+
protected createComputed<T>(fn: () => T): import('./types').Computed<T>;
|
|
7
|
+
protected createSignal<T>(val: T, name?: string): import('./types').Signal<T>;
|
|
8
8
|
protected onInit(): void;
|
|
9
9
|
}
|
|
10
10
|
export declare const BaseREService: typeof AbstractService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.auto.test.d.ts","sourceRoot":"","sources":["../../src/core/core.auto.test.ts"],"names":[],"mappings":""}
|