@pravosleva/reactive-engine 2.6.0 → 2.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/core/types.d.ts +25 -50
- package/dist/core/types.d.ts.map +1 -1
- package/dist/react/hooks/useReactiveValue.cjs.map +1 -1
- package/dist/react/hooks/useReactiveValue.d.ts +7 -1
- package/dist/react/hooks/useReactiveValue.d.ts.map +1 -1
- package/dist/react/hooks/useReactiveValue.mjs.map +1 -1
- package/dist/reactive-engine.umd.js +1 -1
- package/dist/vue/core.vue-adapter.cjs +1 -1
- package/dist/vue/core.vue-adapter.cjs.map +1 -1
- package/dist/vue/core.vue-adapter.d.ts +8 -4
- package/dist/vue/core.vue-adapter.d.ts.map +1 -1
- package/dist/vue/core.vue-adapter.mjs +5 -5
- package/dist/vue/core.vue-adapter.mjs.map +1 -1
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.ts.map +1 -1
- package/dist/vue/index.mjs +28 -27
- package/dist/vue/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/core/types.d.ts
CHANGED
|
@@ -19,29 +19,47 @@ export type Token<T> = string | symbol | {
|
|
|
19
19
|
new (engine: ReactiveEngineCore, ...args: any[]): T;
|
|
20
20
|
};
|
|
21
21
|
export type Factory<T> = (engine: ReactiveEngineCore) => T;
|
|
22
|
+
/**
|
|
23
|
+
* ⚛️ БАЗОВЫЙ ИНТЕРФЕЙС-КОНТРАКТ ДЛЯ ЛЮБЫХ СИГНАЛОПОДОБНЫХ УЗЛОВ
|
|
24
|
+
*/
|
|
25
|
+
export interface ISignalLike<V> {
|
|
26
|
+
/**
|
|
27
|
+
* Публичный геттер с автоматическим динамическим трекингом зависимостей графа
|
|
28
|
+
*/
|
|
29
|
+
readonly value: V;
|
|
30
|
+
/**
|
|
31
|
+
* Безопасное чтение значения из кэша БЕЗ трекинга зависимостей.
|
|
32
|
+
*/
|
|
33
|
+
valueWithoutTracking?: V;
|
|
34
|
+
/**
|
|
35
|
+
* Активная Push-подписка на каждое изменение значения узла
|
|
36
|
+
*/
|
|
37
|
+
subscribe: (cb: (v: V) => void) => CleanupFn;
|
|
38
|
+
/**
|
|
39
|
+
* Пассивный системный хук подписки на завершение реактивной транзакции.
|
|
40
|
+
*/
|
|
41
|
+
__subscribe?: (cb: () => void) => CleanupFn;
|
|
42
|
+
}
|
|
22
43
|
/**
|
|
23
44
|
* Интерфейс атомарного Сигнала графа.
|
|
45
|
+
* ⚛️ ТЕПЕРЬ ЯВНО НАСЛЕДУЕТ ISignalLike<T> ДЛЯ ГАРАНТИРОВАННОГО ВЫВОДА ТИПОВ
|
|
24
46
|
*/
|
|
25
|
-
export interface Signal<T> {
|
|
47
|
+
export interface Signal<T> extends ISignalLike<T> {
|
|
26
48
|
value: T;
|
|
27
|
-
subscribe: (cb: (val: T) => void) => CleanupFn;
|
|
28
49
|
destroy: () => void;
|
|
29
50
|
}
|
|
30
51
|
/**
|
|
31
52
|
* Интерфейс синхронно-ленивого Вычисляемого свойства.
|
|
53
|
+
* ⚛️ ТЕПЕРЬ ЯВНО НАСЛЕДУЕТ ISignalLike<T> ДЛЯ КЭШИРОВАНИЯ И ВЫВОДА ТИПОВ
|
|
32
54
|
*/
|
|
33
|
-
export interface Computed<T> {
|
|
55
|
+
export interface Computed<T> extends ISignalLike<T> {
|
|
34
56
|
readonly value: T;
|
|
35
|
-
subscribe: (cb: (val: T) => void) => CleanupFn;
|
|
36
57
|
destroy: () => void;
|
|
37
58
|
_isDirty?: () => boolean;
|
|
38
59
|
dependencies?: Set<any>;
|
|
39
60
|
run?: () => void;
|
|
40
61
|
type?: any;
|
|
41
62
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Интерфейс побочного Эффекта планировщика.
|
|
44
|
-
*/
|
|
45
63
|
export interface IEffect {
|
|
46
64
|
id: number;
|
|
47
65
|
run: () => void;
|
|
@@ -54,48 +72,28 @@ export interface IEffect {
|
|
|
54
72
|
fn?: () => void;
|
|
55
73
|
_node?: any;
|
|
56
74
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Опции конфигурации Сигналов.
|
|
59
|
-
*/
|
|
60
75
|
export interface SignalOptions<T> {
|
|
61
76
|
name?: string;
|
|
62
77
|
validate?: (value: T) => boolean | string;
|
|
63
78
|
}
|
|
64
|
-
/**
|
|
65
|
-
* Состояние асинхронного ресурса.
|
|
66
|
-
*/
|
|
67
79
|
export interface ResourceState<T> {
|
|
68
80
|
data: T | null;
|
|
69
81
|
loading: boolean;
|
|
70
82
|
error: string | null;
|
|
71
83
|
isRetrying?: boolean;
|
|
72
84
|
}
|
|
73
|
-
/**
|
|
74
|
-
* Контракт асинхронного Ресурса ядра.
|
|
75
|
-
*/
|
|
76
85
|
export interface Resource<T> extends ResourceState<T> {
|
|
77
86
|
refetch: () => void;
|
|
78
87
|
subscribe: (cb: (val: ResourceState<T>) => void) => CleanupFn;
|
|
79
88
|
readonly value: ResourceState<T>;
|
|
80
89
|
destroy: () => void;
|
|
81
90
|
}
|
|
82
|
-
/**
|
|
83
|
-
* Настройки конфигурации асинхронного Ресурса.
|
|
84
|
-
* Полностью очищены от legacy-параметров ретраев и таймаутов.
|
|
85
|
-
*/
|
|
86
91
|
export interface ResourceOptions<T, S = void> {
|
|
87
|
-
/** Уникальное имя ресурса для трассировки и логирования */
|
|
88
92
|
name?: string;
|
|
89
|
-
/** Принудительный сброс данных в null при изменении источника (true по умолчанию) */
|
|
90
93
|
resetDataOnSourceChange?: boolean;
|
|
91
|
-
/** Декларативная пре-валидация параметров ДО отправки запроса в сеть */
|
|
92
94
|
validateBeforeFetch?: (source: S) => boolean | string;
|
|
93
|
-
/** Валидация структуры ответа сервера после успешного разрешения промиса */
|
|
94
95
|
responseValidate?: (data: T) => boolean | string;
|
|
95
96
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Параметры продвинутой системы логирования транзакций.
|
|
98
|
-
*/
|
|
99
97
|
export interface EngineLoggerOptions {
|
|
100
98
|
instanceName?: string;
|
|
101
99
|
isEnabled: boolean;
|
|
@@ -133,9 +131,6 @@ export interface ReactiveDetail {
|
|
|
133
131
|
oldValue: unknown;
|
|
134
132
|
newValue: unknown;
|
|
135
133
|
}
|
|
136
|
-
/**
|
|
137
|
-
* Карта маппинга категорий логов для безопасной работы метода queueLog.
|
|
138
|
-
*/
|
|
139
134
|
export interface LogDetailMap {
|
|
140
135
|
signal: SignalLogDetail;
|
|
141
136
|
computed: ComputedLogDetail;
|
|
@@ -144,24 +139,4 @@ export interface LogDetailMap {
|
|
|
144
139
|
resource: ResourceLogDetail;
|
|
145
140
|
reactive: ReactiveDetail;
|
|
146
141
|
}
|
|
147
|
-
export interface ISignalLike<V> {
|
|
148
|
-
/**
|
|
149
|
-
* Публичный геттер с автоматическим динамическим трекингом зависимостей графа
|
|
150
|
-
*/
|
|
151
|
-
value: V;
|
|
152
|
-
/**
|
|
153
|
-
* Безопасное чтение значения из кэша БЕЗ трекинга зависимостей.
|
|
154
|
-
* Предотвращает гонку планировщиков и лишние транзакции во время рендера React/Vue.
|
|
155
|
-
*/
|
|
156
|
-
valueWithoutTracking: V;
|
|
157
|
-
/**
|
|
158
|
-
* Активная Push-подписка на каждое изменение значения узла
|
|
159
|
-
*/
|
|
160
|
-
subscribe: (cb: (v: V) => void) => CleanupFn;
|
|
161
|
-
/**
|
|
162
|
-
* Пассивный системный хук подписки на завершение реактивной транзакции.
|
|
163
|
-
* Позволяет UI-мостам просыпаться строго один раз за тик, ликвидируя IDLE PULL дубли.
|
|
164
|
-
*/
|
|
165
|
-
__subscribe?: (cb: () => void) => CleanupFn;
|
|
166
|
-
}
|
|
167
142
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo,
|
|
1
|
+
{"version":3,"file":"useReactiveValue.cjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo, useState } from 'react'\nimport { ISignalLike } from '../../core/types'\n\n/**\n * ⚛️ УЛЬТИМАТИВНЫЙ ХУК ДЛЯ СТЯГИВАНИЯ ДАННЫХ ИЗ ГРАФА В СРЕДУ REACT\n * Автоматически выводит тип внутренней структуры данных (V) из любого сигнала или вычисляемого свойства.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): V;\nexport function useReactiveValue<T extends object>(proxy: T): T;\nexport function useReactiveValue<T>(primitive: T): T;\nexport function useReactiveValue(signal: any): any {\n const isProxy = signal && typeof signal === 'object' && '__subscribe' in signal\n const isSignal = signal && typeof signal === 'object' && 'subscribe' in signal\n\n if (!isSignal && !isProxy) {\n return signal\n }\n\n const rawNode = signal._node || signal\n const engine = rawNode.engine || signal.engine\n\n // Локальный тикет рендеринга для useSyncExternalStore.\n const [ticket, setTicket] = useState(0)\n\n // 🟢 КАНОНИЧЕСКИЙ ВЕРСИОННЫЙ СНАПШOТ useSyncExternalStore С СИНХРOННЫМ ПOДТЯГИВАНИЕМ КЭША\n useSyncExternalStore(\n useMemo(() => (onStoreChange: () => void) => {\n const triggerStoreRerender = () => {\n setTicket((t) => t + 1)\n onStoreChange()\n }\n\n if (rawNode.type === 'computed' && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n if (rawNode.type !== 'computed' && '__subscribe' in signal && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n return signal.subscribe(triggerStoreRerender)\n }, [signal, rawNode]),\n\n () => ticket,\n () => 0\n )\n\n useDebugValue(ticket)\n\n // ⚛️ ТОПОЛОГИЧЕСКИЙ Pull: Стягиваем свежее значение в теле рендера под untrack\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n\n return signal.value !== undefined ? signal.value : signal\n}\n"],"mappings":"uBAUA,SAAgB,EAAiB,EAAkB,CACjD,IAAM,EAAU,GAAU,OAAO,GAAW,UAAY,gBAAiB,EAGzE,GAAI,EAFa,GAAU,OAAO,GAAW,UAAY,cAAe,IAEvD,CAAC,EAChB,OAAO,EAGT,IAAM,EAAU,EAAO,OAAS,EAC1B,EAAS,EAAQ,QAAU,EAAO,OAGlC,CAAC,EAAQ,IAAA,EAAA,EAAA,SAAA,CAAsB,CAAC,EAgCtC,OA7BA,EAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,QAAA,KACiB,GAA8B,CAC3C,IAAM,MAA6B,CACjC,EAAW,GAAM,EAAI,CAAC,EACtB,EAAc,CAChB,EAUA,OARI,EAAQ,OAAS,YAAc,OAAO,EAAO,aAAgB,YAI7D,EAAQ,OAAS,YAAc,gBAAiB,GAAU,OAAO,EAAO,aAAgB,WACnF,EAAO,YAAY,CAAoB,EAGzC,EAAO,UAAU,CAAoB,CAC9C,EAAG,CAAC,EAAQ,CAAO,CAAC,MAEd,MACA,CACR,GAEA,EAAA,EAAA,cAAA,CAAc,CAAM,EAGhB,GAAU,YAAa,EAClB,EAAO,YAAe,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAAe,EAG3E,EAAO,QAAU,IAAA,GAA2B,EAAf,EAAO,KAC7C"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import { ISignalLike } from '../../core/types';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* ⚛️ УЛЬТИМАТИВНЫЙ ХУК ДЛЯ СТЯГИВАНИЯ ДАННЫХ ИЗ ГРАФА В СРЕДУ REACT
|
|
4
|
+
* Автоматически выводит тип внутренней структуры данных (V) из любого сигнала или вычисляемого свойства.
|
|
5
|
+
*/
|
|
6
|
+
export declare function useReactiveValue<V>(signal: ISignalLike<V>): V;
|
|
7
|
+
export declare function useReactiveValue<T extends object>(proxy: T): T;
|
|
8
|
+
export declare function useReactiveValue<T>(primitive: T): T;
|
|
3
9
|
//# sourceMappingURL=useReactiveValue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReactiveValue.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useReactiveValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"useReactiveValue.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useReactiveValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/D,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAChE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo,
|
|
1
|
+
{"version":3,"file":"useReactiveValue.mjs","names":[],"sources":["../../../src/react/hooks/useReactiveValue.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue, useMemo, useState } from 'react'\nimport { ISignalLike } from '../../core/types'\n\n/**\n * ⚛️ УЛЬТИМАТИВНЫЙ ХУК ДЛЯ СТЯГИВАНИЯ ДАННЫХ ИЗ ГРАФА В СРЕДУ REACT\n * Автоматически выводит тип внутренней структуры данных (V) из любого сигнала или вычисляемого свойства.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): V;\nexport function useReactiveValue<T extends object>(proxy: T): T;\nexport function useReactiveValue<T>(primitive: T): T;\nexport function useReactiveValue(signal: any): any {\n const isProxy = signal && typeof signal === 'object' && '__subscribe' in signal\n const isSignal = signal && typeof signal === 'object' && 'subscribe' in signal\n\n if (!isSignal && !isProxy) {\n return signal\n }\n\n const rawNode = signal._node || signal\n const engine = rawNode.engine || signal.engine\n\n // Локальный тикет рендеринга для useSyncExternalStore.\n const [ticket, setTicket] = useState(0)\n\n // 🟢 КАНОНИЧЕСКИЙ ВЕРСИОННЫЙ СНАПШOТ useSyncExternalStore С СИНХРOННЫМ ПOДТЯГИВАНИЕМ КЭША\n useSyncExternalStore(\n useMemo(() => (onStoreChange: () => void) => {\n const triggerStoreRerender = () => {\n setTicket((t) => t + 1)\n onStoreChange()\n }\n\n if (rawNode.type === 'computed' && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n if (rawNode.type !== 'computed' && '__subscribe' in signal && typeof signal.__subscribe === 'function') {\n return signal.__subscribe(triggerStoreRerender)\n }\n\n return signal.subscribe(triggerStoreRerender)\n }, [signal, rawNode]),\n\n () => ticket,\n () => 0\n )\n\n useDebugValue(ticket)\n\n // ⚛️ ТОПОЛОГИЧЕСКИЙ Pull: Стягиваем свежее значение в теле рендера под untrack\n if (engine && 'untrack' in engine) {\n return engine.untrack(() => (signal.value !== undefined ? signal.value : signal))\n }\n\n return signal.value !== undefined ? signal.value : signal\n}\n"],"mappings":";;AAUA,SAAgB,EAAiB,GAAkB;CACjD,IAAM,IAAU,KAAU,OAAO,KAAW,YAAY,iBAAiB;CAGzE,IAAI,EAFa,KAAU,OAAO,KAAW,YAAY,eAAe,MAEvD,CAAC,GAChB,OAAO;CAGT,IAAM,IAAU,EAAO,SAAS,GAC1B,IAAS,EAAQ,UAAU,EAAO,QAGlC,CAAC,GAAQ,KAAa,EAAS,CAAC;CAgCtC,OA7BA,EACE,SAAe,MAA8B;EAC3C,IAAM,UAA6B;GAEjC,AADA,GAAW,MAAM,IAAI,CAAC,GACtB,EAAc;EAChB;EAUA,OARI,EAAQ,SAAS,cAAc,OAAO,EAAO,eAAgB,cAI7D,EAAQ,SAAS,cAAc,iBAAiB,KAAU,OAAO,EAAO,eAAgB,aACnF,EAAO,YAAY,CAAoB,IAGzC,EAAO,UAAU,CAAoB;CAC9C,GAAG,CAAC,GAAQ,CAAO,CAAC,SAEd,SACA,CACR,GAEA,EAAc,CAAM,GAGhB,KAAU,aAAa,IAClB,EAAO,cAAe,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO,KAAe,IAG3E,EAAO,UAAU,KAAA,IAA2B,IAAf,EAAO;AAC7C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=require("vue");function t(t){if(typeof t!=`object`||!t)return(0,e.shallowRef)(t);let n=`subscribe`in t&&typeof t.subscribe==`function`,r=(0,e.shallowRef)(n?t.value:t),i=null;if(n)i=t.subscribe(e=>{r.value=e});else if(`__subscribe`in t
|
|
1
|
+
let e=require("vue");function t(t){if(typeof t!=`object`||!t)return(0,e.shallowRef)(t);let n=`subscribe`in t&&typeof t.subscribe==`function`,r=(0,e.shallowRef)(n?t.value:t),i=null;if(n)i=t.subscribe(e=>{r.value=e});else if(`__subscribe`in t){let e=t;typeof e.__subscribe==`function`&&(i=e.__subscribe(()=>{r.value=Array.isArray(t)?[...t]:{...t}}))}return i&&(0,e.onScopeDispose)(()=>{i&&i()}),r}exports.useReactiveValue=t;
|
|
2
2
|
//# sourceMappingURL=core.vue-adapter.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.vue-adapter.cjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose } from 'vue'\nimport { ISignalLike } from '../core/types'\n\
|
|
1
|
+
{"version":3,"file":"core.vue-adapter.cjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose, ShallowRef } from 'vue'\nimport { ISignalLike, CleanupFn } from '../core/types'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних методов подписки Proxy-объектов ядра\n */\ninterface IReactiveProxyExtension {\n __subscribe?: (cb: () => void) => CleanupFn;\n}\n\n/**\n * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v2.6.1)\n *\n * Нативно интегрирует синхронные и асинхронные графы ядра с реактивной системой Vue 3.\n * Автоматически выводит тип внутренней структуры данных и возвращает строго типизированный ShallowRef.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): ShallowRef<V>;\nexport function useReactiveValue<T extends object>(proxy: T): ShallowRef<T>;\nexport function useReactiveValue<T>(primitive: T): ShallowRef<T>;\nexport function useReactiveValue(item: unknown): ShallowRef<unknown> {\n // Быстрый выход для примитивов или невалидных объектов, переданных по ошибке\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Вычисляем стартовое значение без использования unsafe any\n const getInitialValue = (): unknown => {\n if (isSignal) {\n return (item as ISignalLike<unknown>).value\n }\n return item\n }\n\n // Инициализируем реактивный контейнер Vue 3 стартовым снимком из ядра\n const stateRef = shallowRef(getInitialValue())\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = item as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue) => {\n stateRef.value = newValue // Vue 3 автоматически триггерит обновление DOM\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item) {\n const potentialProxy = item as IReactiveProxyExtension\n if (typeof potentialProxy.__subscribe === 'function') {\n unsubscribe = potentialProxy.__subscribe(() => {\n // Для Proxy-коллекций принудительно создаем shallow-копию ссылки,\n // заставляя ленивый движок Vue 3 безупречно перерисовывать шаблоны .push/.splice мутаций!\n stateRef.value = Array.isArray(item) ? [...item] : { ...item }\n })\n }\n }\n\n // Автоматически освобождаем оперативную память и гасим эффекты ядра\n // при размонтировании Vue-компонента или закрытии EffectScope\n if (unsubscribe) {\n onScopeDispose(() => {\n if (unsubscribe) unsubscribe()\n })\n }\n\n return stateRef\n}\n"],"mappings":"qBAmBA,SAAgB,EAAiB,EAAoC,CAEnE,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,WAAA,CAAkB,CAAI,EAGxB,IAAM,EAAW,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAWzF,GAAA,EAAA,EAAA,WAAA,CAPA,EACM,EAA8B,MAEjC,CAIoC,EACzC,EAAgC,KAKpC,GAAI,EAEF,EAAc,EAAW,UAAW,GAAa,CAC/C,EAAS,MAAQ,CACnB,CAAC,OAKE,GAAI,gBAAiB,EAAM,CAC9B,IAAM,EAAiB,EACnB,OAAO,EAAe,aAAgB,aACxC,EAAc,EAAe,gBAAkB,CAG7C,EAAS,MAAQ,MAAM,QAAQ,CAAI,EAAI,CAAC,GAAG,CAAI,EAAI,CAAE,GAAG,CAAK,CAC/D,CAAC,EAEL,CAUA,OANI,IACF,EAAA,EAAA,eAAA,KAAqB,CACf,GAAa,EAAY,CAC/B,CAAC,EAGI,CACT"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { ShallowRef } from 'vue';
|
|
2
|
+
import { ISignalLike } from '../core/types';
|
|
1
3
|
/**
|
|
2
|
-
* 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (
|
|
4
|
+
* 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v2.6.1)
|
|
3
5
|
*
|
|
4
|
-
* Нативно интегрирует синхронные и
|
|
5
|
-
*
|
|
6
|
+
* Нативно интегрирует синхронные и асинхронные графы ядра с реактивной системой Vue 3.
|
|
7
|
+
* Автоматически выводит тип внутренней структуры данных и возвращает строго типизированный ShallowRef.
|
|
6
8
|
*/
|
|
7
|
-
export declare function useReactiveValue<
|
|
9
|
+
export declare function useReactiveValue<V>(signal: ISignalLike<V>): ShallowRef<V>;
|
|
10
|
+
export declare function useReactiveValue<T extends object>(proxy: T): ShallowRef<T>;
|
|
11
|
+
export declare function useReactiveValue<T>(primitive: T): ShallowRef<T>;
|
|
8
12
|
//# sourceMappingURL=core.vue-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.vue-adapter.d.ts","sourceRoot":"","sources":["../../src/vue/core.vue-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"core.vue-adapter.d.ts","sourceRoot":"","sources":["../../src/vue/core.vue-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,UAAU,EAAE,MAAM,KAAK,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAa,MAAM,eAAe,CAAA;AAStD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3E,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -6,14 +6,14 @@ function n(n) {
|
|
|
6
6
|
if (r) a = n.subscribe((e) => {
|
|
7
7
|
i.value = e;
|
|
8
8
|
});
|
|
9
|
-
else if ("__subscribe" in n
|
|
9
|
+
else if ("__subscribe" in n) {
|
|
10
10
|
let e = n;
|
|
11
|
-
a = e.__subscribe(() => {
|
|
12
|
-
i.value = Array.isArray(
|
|
13
|
-
});
|
|
11
|
+
typeof e.__subscribe == "function" && (a = e.__subscribe(() => {
|
|
12
|
+
i.value = Array.isArray(n) ? [...n] : { ...n };
|
|
13
|
+
}));
|
|
14
14
|
}
|
|
15
15
|
return a && e(() => {
|
|
16
|
-
a();
|
|
16
|
+
a && a();
|
|
17
17
|
}), i;
|
|
18
18
|
}
|
|
19
19
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.vue-adapter.mjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose } from 'vue'\nimport { ISignalLike } from '../core/types'\n\
|
|
1
|
+
{"version":3,"file":"core.vue-adapter.mjs","names":[],"sources":["../../src/vue/core.vue-adapter.ts"],"sourcesContent":["import { shallowRef, onScopeDispose, ShallowRef } from 'vue'\nimport { ISignalLike, CleanupFn } from '../core/types'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних методов подписки Proxy-объектов ядра\n */\ninterface IReactiveProxyExtension {\n __subscribe?: (cb: () => void) => CleanupFn;\n}\n\n/**\n * 🟢 REACTIVE ENGINE ADAPTER FOR VUE 3 (v2.6.1)\n *\n * Нативно интегрирует синхронные и асинхронные графы ядра с реактивной системой Vue 3.\n * Автоматически выводит тип внутренней структуры данных и возвращает строго типизированный ShallowRef.\n */\nexport function useReactiveValue<V>(signal: ISignalLike<V>): ShallowRef<V>;\nexport function useReactiveValue<T extends object>(proxy: T): ShallowRef<T>;\nexport function useReactiveValue<T>(primitive: T): ShallowRef<T>;\nexport function useReactiveValue(item: unknown): ShallowRef<unknown> {\n // Быстрый выход для примитивов или невалидных объектов, переданных по ошибке\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item)\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n // Вычисляем стартовое значение без использования unsafe any\n const getInitialValue = (): unknown => {\n if (isSignal) {\n return (item as ISignalLike<unknown>).value\n }\n return item\n }\n\n // Инициализируем реактивный контейнер Vue 3 стартовым снимком из ядра\n const stateRef = shallowRef(getInitialValue())\n let unsubscribe: CleanupFn | null = null\n\n // =========================================================================\n // СЦЕНАРИЙ 1: Подписка на Сигналы и Вычисляемые свойства (Computed)\n // =========================================================================\n if (isSignal) {\n const signalItem = item as ISignalLike<unknown>\n unsubscribe = signalItem.subscribe((newValue) => {\n stateRef.value = newValue // Vue 3 автоматически триггерит обновление DOM\n })\n }\n // =========================================================================\n // СЦЕНАРИЙ 2: Подписка на глубокие Proxy-объекты и массивы (reactive)\n // =========================================================================\n else if ('__subscribe' in item) {\n const potentialProxy = item as IReactiveProxyExtension\n if (typeof potentialProxy.__subscribe === 'function') {\n unsubscribe = potentialProxy.__subscribe(() => {\n // Для Proxy-коллекций принудительно создаем shallow-копию ссылки,\n // заставляя ленивый движок Vue 3 безупречно перерисовывать шаблоны .push/.splice мутаций!\n stateRef.value = Array.isArray(item) ? [...item] : { ...item }\n })\n }\n }\n\n // Автоматически освобождаем оперативную память и гасим эффекты ядра\n // при размонтировании Vue-компонента или закрытии EffectScope\n if (unsubscribe) {\n onScopeDispose(() => {\n if (unsubscribe) unsubscribe()\n })\n }\n\n return stateRef\n}\n"],"mappings":";;AAmBA,SAAgB,EAAiB,GAAoC;CAEnE,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAW,CAAI;CAGxB,IAAM,IAAW,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAWzF,IAAW,EAPX,IACM,EAA8B,QAEjC,CAIoC,GACzC,IAAgC;CAKpC,IAAI,GAEF,IAAc,EAAW,WAAW,MAAa;EAC/C,EAAS,QAAQ;CACnB,CAAC;MAKE,IAAI,iBAAiB,GAAM;EAC9B,IAAM,IAAiB;EACvB,AAAI,OAAO,EAAe,eAAgB,eACxC,IAAc,EAAe,kBAAkB;GAG7C,EAAS,QAAQ,MAAM,QAAQ,CAAI,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,GAAG,EAAK;EAC/D,CAAC;CAEL;CAUA,OANI,KACF,QAAqB;EACnB,AAAI,KAAa,EAAY;CAC/B,CAAC,GAGI;AACT"}
|
package/dist/vue/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./core.vue-adapter.cjs");let n=require("vue");var r=class extends e.ReactiveEngine{frameworkPrefix=`vue-auto`;reactive(e,t){let n=e=>{if(!
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core.cjs"),t=require("./core.vue-adapter.cjs");let n=require("vue");var r=class extends e.ReactiveEngine{frameworkPrefix=`vue-auto`;reactive(e,t){let n,r=e=>{if(!e||typeof e!=`object`||Symbol.iterator in e)return;let t=e;Reflect.has(t,`__subscribe`)||Object.defineProperty(t,"__subscribe",{get:()=>e=>this.effect(()=>{try{JSON.stringify(n)}catch{Object.values(n)}e()},`vue-proxy-internal-subscription`),configurable:!0,enumerable:!1}),Reflect.has(t,`__v_skip`)||Object.defineProperty(t,"__v_skip",{get:()=>!0,configurable:!0,enumerable:!1});for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let n=t[e];typeof n==`object`&&n&&r(n)}};return r(e),n=super.reactive(e,t),n}use(e){if(typeof e!=`object`||!e)return(0,n.shallowRef)(e);if(`subscribe`in e&&typeof e.subscribe==`function`){let t=e,r=(0,n.shallowRef)(this.untrack(()=>t.value)),i=`__subscribe`in t&&typeof t.__subscribe==`function`&&t.__subscribe?t.__subscribe(()=>{r.value=t.value,(0,n.triggerRef)(r)}):t.subscribe(e=>{r.value=e,(0,n.triggerRef)(r)});return(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>i()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>i()),r}let t=(0,n.shallowRef)(e),r=e;if(`__subscribe`in r&&typeof r.__subscribe==`function`){let e=r.__subscribe(()=>{(0,n.triggerRef)(t)});(0,n.getCurrentInstance)()?(0,n.onUnmounted)(()=>e()):(0,n.getCurrentScope)()&&(0,n.onScopeDispose)(()=>e())}return t}};exports.ReactiveEngine=r,exports.useReactiveValue=t.useReactiveValue;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/vue/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n const injectVueMarkers = (obj:
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних маркеров Vue и Ядра на прокси-объектах\n */\ninterface IVueProxyExtensions {\n __subscribe?: (cb: () => void) => CleanupFn;\n __v_skip?: boolean;\n}\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n // Внутренний кэш оригинального прокси, который будет доступен в замыкании макрозадачи подписки\n let originalProxy: T\n\n const injectVueMarkers = (obj: unknown): void => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in (obj as object)) return\n\n const targetObj = obj as Record<string, unknown> & IVueProxyExtensions\n\n if (!Reflect.has(targetObj, '__subscribe')) {\n Object.defineProperty(targetObj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(targetObj, '__v_skip')) {\n Object.defineProperty(targetObj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in targetObj) {\n if (Object.prototype.hasOwnProperty.call(targetObj, key)) {\n const value = targetObj[key]\n if (value !== null && typeof value === 'object') {\n injectVueMarkers(value)\n }\n }\n }\n }\n\n injectVueMarkers(target)\n originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n type ReturnType = T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>\n\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as ReturnType\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = item as unknown as ISignalLike<unknown>\n\n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный системный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof signalItem.__subscribe === 'function'\n\n const unsubscribe = hasHook && signalItem.__subscribe\n ? signalItem.__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as ReturnType\n }\n\n const state = shallowRef(item)\n const potentialProxy = item as Record<string, unknown> & IVueProxyExtensions\n\n if ('__subscribe' in potentialProxy && typeof potentialProxy.__subscribe === 'function') {\n const unsubscribe = potentialProxy.__subscribe(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as ReturnType\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":"2JAcA,IAAM,EAAN,cAAqC,EAAA,cAAwB,CAC3D,gBAAqC,WAErC,SAA2C,EAAW,EAAkB,CAEtE,IAAI,EAEE,EAAoB,GAAuB,CAC/C,GAAI,CAAC,GAAO,OAAO,GAAQ,UAAY,OAAO,YAAa,EAAgB,OAE3E,IAAM,EAAY,EAEb,QAAQ,IAAI,EAAW,aAAa,GACvC,OAAO,eAAe,EAAW,cAAe,CAC9C,QACU,GACC,KAAK,WAAa,CACvB,GAAI,CACF,KAAK,UAAU,CAAa,CAC9B,MAAY,CACV,OAAO,OAAO,CAAwC,CACxD,CACA,EAAG,CACL,EAAG,iCAAiC,EAGxC,aAAc,GACd,WAAY,EACd,CAAC,EAGE,QAAQ,IAAI,EAAW,UAAU,GACpC,OAAO,eAAe,EAAW,WAAY,CAC3C,QAAW,GACX,aAAc,GACd,WAAY,EACd,CAAC,EAGH,IAAK,IAAM,KAAO,EAChB,GAAI,OAAO,UAAU,eAAe,KAAK,EAAW,CAAG,EAAG,CACxD,IAAM,EAAQ,EAAU,GACF,OAAO,GAAU,UAAnC,GACF,EAAiB,CAAK,CAE1B,CAEJ,EAIA,OAFA,EAAiB,CAAM,EACvB,EAAgB,MAAM,SAAS,EAAQ,CAAI,EACpC,CACT,CAMA,IAAc,EAAyE,CAGrF,GAA2C,OAAO,GAAS,WAAvD,EACF,OAAA,EAAA,EAAA,WAAA,CAAkB,CAAI,EAKxB,GAFiB,cAAe,GAAQ,OAAQ,EAAiC,WAAc,WAEjF,CACZ,IAAM,EAAa,EAKb,GAAA,EAAA,EAAA,WAAA,CADe,KAAK,YAAc,EAAW,KAC1B,CAAY,EAM/B,EAFU,gBAAiB,GAAc,OAAO,EAAW,aAAgB,YAElD,EAAW,YACtC,EAAW,gBAAkB,CAC7B,EAAM,MAAQ,EAAW,OACzB,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EACC,EAAW,UAAW,GAAa,CACnC,EAAM,MAAQ,GACd,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,EAQH,OANA,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,EAG7B,CACT,CAEA,IAAM,GAAA,EAAA,EAAA,WAAA,CAAmB,CAAI,EACvB,EAAiB,EAEvB,GAAI,gBAAiB,GAAkB,OAAO,EAAe,aAAgB,WAAY,CACvF,IAAM,EAAc,EAAe,gBAAkB,EACnD,EAAA,EAAA,WAAA,CAAW,CAAK,CAClB,CAAC,GAED,EAAA,EAAA,mBAAA,CAAuB,GACrB,EAAA,EAAA,YAAA,KAAkB,EAAY,CAAC,GAC1B,EAAA,EAAA,gBAAA,CAAoB,IACzB,EAAA,EAAA,eAAA,KAAqB,EAAY,CAAC,CAEtC,CAEA,OAAO,CACT,CACF"}
|
package/dist/vue/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAgF,UAAU,EAAc,MAAM,KAAK,CAAA;AAE1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAgF,UAAU,EAAc,MAAM,KAAK,CAAA;AAE1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAUrD,cAAM,sBAAuB,SAAQ,uBAAuB;IAC1D,UAAmB,eAAe,SAAa;IAE/B,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;IAmDvE;;;OAGG;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CAyDvF;AAED,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,CAAA"}
|
package/dist/vue/index.mjs
CHANGED
|
@@ -5,47 +5,48 @@ import { getCurrentInstance as n, getCurrentScope as r, onScopeDispose as i, onU
|
|
|
5
5
|
var c = class extends e {
|
|
6
6
|
frameworkPrefix = "vue-auto";
|
|
7
7
|
reactive(e, t) {
|
|
8
|
-
let n = (e) => {
|
|
9
|
-
if (!
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
8
|
+
let n, r = (e) => {
|
|
9
|
+
if (!e || typeof e != "object" || Symbol.iterator in e) return;
|
|
10
|
+
let t = e;
|
|
11
|
+
Reflect.has(t, "__subscribe") || Object.defineProperty(t, "__subscribe", {
|
|
12
|
+
get: () => (e) => this.effect(() => {
|
|
13
|
+
try {
|
|
14
|
+
JSON.stringify(n);
|
|
15
|
+
} catch {
|
|
16
|
+
Object.values(n);
|
|
17
|
+
}
|
|
18
|
+
e();
|
|
19
|
+
}, "vue-proxy-internal-subscription"),
|
|
20
|
+
configurable: !0,
|
|
21
|
+
enumerable: !1
|
|
22
|
+
}), Reflect.has(t, "__v_skip") || Object.defineProperty(t, "__v_skip", {
|
|
23
|
+
get: () => !0,
|
|
24
|
+
configurable: !0,
|
|
25
|
+
enumerable: !1
|
|
26
|
+
});
|
|
27
|
+
for (let e in t) if (Object.prototype.hasOwnProperty.call(t, e)) {
|
|
28
|
+
let n = t[e];
|
|
29
|
+
typeof n == "object" && n && r(n);
|
|
27
30
|
}
|
|
28
31
|
};
|
|
29
|
-
n(e);
|
|
30
|
-
let r = super.reactive(e, t);
|
|
31
|
-
return r;
|
|
32
|
+
return r(e), n = super.reactive(e, t), n;
|
|
32
33
|
}
|
|
33
34
|
use(e) {
|
|
34
35
|
if (typeof e != "object" || !e) return o(e);
|
|
35
36
|
if ("subscribe" in e && typeof e.subscribe == "function") {
|
|
36
|
-
let t = e, c = o(this.untrack(() => t.value)), l = "__subscribe" in t && typeof t.__subscribe == "function" ? t.__subscribe(() => {
|
|
37
|
+
let t = e, c = o(this.untrack(() => t.value)), l = "__subscribe" in t && typeof t.__subscribe == "function" && t.__subscribe ? t.__subscribe(() => {
|
|
37
38
|
c.value = t.value, s(c);
|
|
38
39
|
}) : t.subscribe((e) => {
|
|
39
40
|
c.value = e, s(c);
|
|
40
41
|
});
|
|
41
42
|
return n() ? a(() => l()) : r() && i(() => l()), c;
|
|
42
43
|
}
|
|
43
|
-
let t = o(e);
|
|
44
|
-
if ("__subscribe" in
|
|
45
|
-
let
|
|
44
|
+
let t = o(e), c = e;
|
|
45
|
+
if ("__subscribe" in c && typeof c.__subscribe == "function") {
|
|
46
|
+
let e = c.__subscribe(() => {
|
|
46
47
|
s(t);
|
|
47
48
|
});
|
|
48
|
-
n() ? a(() =>
|
|
49
|
+
n() ? a(() => e()) : r() && i(() => e());
|
|
49
50
|
}
|
|
50
51
|
return t;
|
|
51
52
|
}
|
package/dist/vue/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n const injectVueMarkers = (obj:
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/vue/index.ts"],"sourcesContent":["import { CleanupFn, ISignalLike } from '../core/types'\nimport { ReactiveEngineAutomatic } from '../core/core'\nimport { getCurrentInstance, getCurrentScope, onScopeDispose, onUnmounted, shallowRef, ShallowRef, triggerRef } from 'vue'\n\nexport { useReactiveValue } from './core.vue-adapter'\n\n/**\n * ⚛️ Расширенный интерфейс для поддержки внутренних маркеров Vue и Ядра на прокси-объектах\n */\ninterface IVueProxyExtensions {\n __subscribe?: (cb: () => void) => CleanupFn;\n __v_skip?: boolean;\n}\n\nclass ExtendedReactiveEngine extends ReactiveEngineAutomatic {\n protected override frameworkPrefix = 'vue-auto'\n\n public override reactive<T extends object>(target: T, name?: string): T {\n // Внутренний кэш оригинального прокси, который будет доступен в замыкании макрозадачи подписки\n let originalProxy: T\n\n const injectVueMarkers = (obj: unknown): void => {\n if (!obj || typeof obj !== 'object' || Symbol.iterator in (obj as object)) return\n\n const targetObj = obj as Record<string, unknown> & IVueProxyExtensions\n\n if (!Reflect.has(targetObj, '__subscribe')) {\n Object.defineProperty(targetObj, '__subscribe', {\n get: () => {\n return (cb: () => void) => {\n return this.effect(() => {\n try {\n JSON.stringify(originalProxy)\n } catch (e) {\n Object.values(originalProxy as Record<string, unknown>)\n }\n cb()\n }, 'vue-proxy-internal-subscription')\n }\n },\n configurable: true,\n enumerable: false\n })\n }\n\n if (!Reflect.has(targetObj, '__v_skip')) {\n Object.defineProperty(targetObj, '__v_skip', {\n get: () => true,\n configurable: true,\n enumerable: false\n })\n }\n\n for (const key in targetObj) {\n if (Object.prototype.hasOwnProperty.call(targetObj, key)) {\n const value = targetObj[key]\n if (value !== null && typeof value === 'object') {\n injectVueMarkers(value)\n }\n }\n }\n }\n\n injectVueMarkers(target)\n originalProxy = super.reactive(target, name)\n return originalProxy\n }\n\n /**\n * Адаптирует примитивы реактивного ядра во Vue ShallowRef объекты.\n * Полностью изолирует начальное чтение от реактивного контекста ядра (Topological Isolation).\n */\n public use<T>(item: T): T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T> {\n type ReturnType = T extends ISignalLike<infer V> ? ShallowRef<V> : ShallowRef<T>\n\n if (item === null || item === undefined || typeof item !== 'object') {\n return shallowRef(item) as ReturnType\n }\n\n const isSignal = 'subscribe' in item && typeof (item as Record<string, unknown>).subscribe === 'function'\n\n if (isSignal) {\n const signalItem = item as unknown as ISignalLike<unknown>\n\n // ⚛️ КЛЮЧЕВОЙ ФИКС: Чтение стартового значения оборачиваем в untrack(),\n // предотвращая ложные каскадные вызовы Pull-валидатора при инициализации!\n const initialValue = this.untrack(() => signalItem.value)\n const state = shallowRef(initialValue)\n\n // Используем пассивный системный хук __subscribe, если он доступен (для computed-нод),\n // чтобы избежать спама множественных push-уведомлений посреди транзакции\n const hasHook = '__subscribe' in signalItem && typeof signalItem.__subscribe === 'function'\n\n const unsubscribe = hasHook && signalItem.__subscribe\n ? signalItem.__subscribe(() => {\n state.value = signalItem.value\n triggerRef(state)\n })\n : signalItem.subscribe((newValue) => {\n state.value = newValue\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n\n return state as ReturnType\n }\n\n const state = shallowRef(item)\n const potentialProxy = item as Record<string, unknown> & IVueProxyExtensions\n\n if ('__subscribe' in potentialProxy && typeof potentialProxy.__subscribe === 'function') {\n const unsubscribe = potentialProxy.__subscribe(() => {\n triggerRef(state)\n })\n\n if (getCurrentInstance()) {\n onUnmounted(() => unsubscribe())\n } else if (getCurrentScope()) {\n onScopeDispose(() => unsubscribe())\n }\n }\n\n return state as ReturnType\n }\n}\n\nexport { ExtendedReactiveEngine as ReactiveEngine }\n"],"mappings":";;;;AAcA,IAAM,IAAN,cAAqC,EAAwB;CAC3D,kBAAqC;CAErC,SAA2C,GAAW,GAAkB;EAEtE,IAAI,GAEE,KAAoB,MAAuB;GAC/C,IAAI,CAAC,KAAO,OAAO,KAAQ,YAAY,OAAO,YAAa,GAAgB;GAE3E,IAAM,IAAY;GAqBlB,AAnBK,QAAQ,IAAI,GAAW,aAAa,KACvC,OAAO,eAAe,GAAW,eAAe;IAC9C,YACU,MACC,KAAK,aAAa;KACvB,IAAI;MACF,KAAK,UAAU,CAAa;KAC9B,QAAY;MACV,OAAO,OAAO,CAAwC;KACxD;KACA,EAAG;IACL,GAAG,iCAAiC;IAGxC,cAAc;IACd,YAAY;GACd,CAAC,GAGE,QAAQ,IAAI,GAAW,UAAU,KACpC,OAAO,eAAe,GAAW,YAAY;IAC3C,WAAW;IACX,cAAc;IACd,YAAY;GACd,CAAC;GAGH,KAAK,IAAM,KAAO,GAChB,IAAI,OAAO,UAAU,eAAe,KAAK,GAAW,CAAG,GAAG;IACxD,IAAM,IAAQ,EAAU;IACxB,AAAsB,OAAO,KAAU,YAAnC,KACF,EAAiB,CAAK;GAE1B;EAEJ;EAIA,OAFA,EAAiB,CAAM,GACvB,IAAgB,MAAM,SAAS,GAAQ,CAAI,GACpC;CACT;CAMA,IAAc,GAAyE;EAGrF,IAA2C,OAAO,KAAS,aAAvD,GACF,OAAO,EAAW,CAAI;EAKxB,IAFiB,eAAe,KAAQ,OAAQ,EAAiC,aAAc,YAEjF;GACZ,IAAM,IAAa,GAKb,IAAQ,EADO,KAAK,cAAc,EAAW,KAC1B,CAAY,GAM/B,IAFU,iBAAiB,KAAc,OAAO,EAAW,eAAgB,cAElD,EAAW,cACtC,EAAW,kBAAkB;IAE7B,AADA,EAAM,QAAQ,EAAW,OACzB,EAAW,CAAK;GAClB,CAAC,IACC,EAAW,WAAW,MAAa;IAEnC,AADA,EAAM,QAAQ,GACd,EAAW,CAAK;GAClB,CAAC;GAQH,OANI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC,GAG7B;EACT;EAEA,IAAM,IAAQ,EAAW,CAAI,GACvB,IAAiB;EAEvB,IAAI,iBAAiB,KAAkB,OAAO,EAAe,eAAgB,YAAY;GACvF,IAAM,IAAc,EAAe,kBAAkB;IACnD,EAAW,CAAK;GAClB,CAAC;GAED,AAAI,EAAmB,IACrB,QAAkB,EAAY,CAAC,IACtB,EAAgB,KACzB,QAAqB,EAAY,CAAC;EAEtC;EAEA,OAAO;CACT;AACF"}
|