@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
package/dist/core/core.d.ts
CHANGED
|
@@ -1,426 +1,165 @@
|
|
|
1
|
-
import { ResourceOptions,
|
|
1
|
+
import { ResourceOptions, SignalOptions, Signal, Computed, IEffect, Token, Factory, EngineLoggerOptions, LogDetailMap } from './types';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* ⚡ 1. LIGHTWEIGHT CORE ENGINE (МЕНЬШЕ 1 КБ)
|
|
4
|
+
* Чистый синхронный Push/Pull граф реактивности. Без логов, Proxy и DI.
|
|
5
|
+
* Идеален для матрицы тестов johnsoncodehk на 100% Passed.
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export type CleanupFn = () => void;
|
|
22
|
-
export type EffectFn = () => CleanupFn | void;
|
|
23
|
-
export type Token<T> = string | symbol | {
|
|
24
|
-
new (engine: ReactiveEngine, ...args: any[]): T;
|
|
25
|
-
};
|
|
26
|
-
export type Factory<T> = (engine: ReactiveEngine) => T;
|
|
27
|
-
/**
|
|
28
|
-
* Интерфейс для вычисляемого значения.
|
|
29
|
-
* @template T
|
|
30
|
-
* @interface Computed<T>
|
|
31
|
-
*/
|
|
32
|
-
export interface Computed<T> {
|
|
33
|
-
/**
|
|
34
|
-
* Только читаемое значение вычисляемого значения.
|
|
35
|
-
* @type {T}
|
|
7
|
+
export declare class ReactiveEngineCore {
|
|
8
|
+
protected frameworkPrefix: string;
|
|
9
|
+
protected activeConsumer: {
|
|
10
|
+
id: number;
|
|
11
|
+
cleanups: Set<() => void>;
|
|
12
|
+
markDirty: () => void;
|
|
13
|
+
} | null;
|
|
14
|
+
protected subscriberId: number;
|
|
15
|
+
protected batchDepth: number;
|
|
16
|
+
protected pendingEffects: Set<IEffect>;
|
|
17
|
+
protected allEffects: Set<IEffect>;
|
|
18
|
+
computedCache: Map<Function, WeakRef<Computed<unknown>>>;
|
|
19
|
+
/**
|
|
20
|
+
* СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (ЧЕСТНЫЙ ГИБРИДНЫЙ PUSH/PULL)
|
|
36
21
|
*/
|
|
37
|
-
|
|
22
|
+
computed<T>(fn: () => T, signalName?: string): Computed<T>;
|
|
38
23
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* @param {
|
|
42
|
-
* @
|
|
24
|
+
* СИНХРОННЫЙ ПЛАНИРОВЩИК ЭФФЕКТОВ (EFFECT)
|
|
25
|
+
*
|
|
26
|
+
* @param {() => void | (() => void)} fn - Функция эффекта. Может возвращать деструктор (cleanup).
|
|
27
|
+
* @param {string} [label] - Необязательная метка для отладки и трассировки.
|
|
28
|
+
* @returns {() => void} - Функция принудительной отписки (dispose), уничтожающая связи эффекта.
|
|
43
29
|
*/
|
|
44
|
-
|
|
30
|
+
effect(fn: () => void | (() => void), label?: string): () => void;
|
|
45
31
|
/**
|
|
46
|
-
*
|
|
32
|
+
* СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (БЕЗРЕКУРСИОННЫЙ)
|
|
47
33
|
*/
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Интерфейс для эффекта.
|
|
52
|
-
* @interface IEffect
|
|
53
|
-
*/
|
|
54
|
-
export interface IEffect {
|
|
55
|
-
run: () => void;
|
|
56
|
-
label?: string;
|
|
57
|
-
cleanups: Set<CleanupFn>;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Интерфейс для ресурса.
|
|
61
|
-
* @template T
|
|
62
|
-
* @interface Resource<T>
|
|
63
|
-
*/
|
|
64
|
-
export interface Resource<T> extends ResourceState<T> {
|
|
34
|
+
signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T>;
|
|
65
35
|
/**
|
|
66
|
-
*
|
|
67
|
-
* @function refetch
|
|
68
|
-
* @returns {void}
|
|
36
|
+
* МЕНЕДЖЕР СИНХРОННЫХ ТРАНЗАКЦИЙ (BATCH)
|
|
69
37
|
*/
|
|
70
|
-
|
|
38
|
+
batch(fn: () => void): void;
|
|
71
39
|
/**
|
|
72
|
-
*
|
|
73
|
-
* @function subscribe
|
|
74
|
-
* @param {Function} cb - Коллбек функция для обработки изменения.
|
|
75
|
-
* @returns {CleanupFn} - Функция для очистки подписки.
|
|
40
|
+
* ВНУТРЕННИЙ СИНХРОННЫЙ ПРОГОН ОЧЕРЕДИ ЭФФЕКТОВ
|
|
76
41
|
*/
|
|
77
|
-
|
|
42
|
+
protected flushEffects(): void;
|
|
78
43
|
/**
|
|
79
|
-
*
|
|
80
|
-
* @type {ResourceState<T>}
|
|
44
|
+
* ВЫПОЛНЕНИЕ ФУНКЦИИ БЕЗ ТРЕКИНГА ЗАВИСИМОСТЕЙ
|
|
81
45
|
*/
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
export interface EngineLoggerOptions {
|
|
85
|
-
/** Наименование инстанса движка */
|
|
86
|
-
instanceName?: string;
|
|
87
|
-
/** Включить детальное логгирование в консоль */
|
|
88
|
-
isEnabled: boolean;
|
|
89
|
-
/** Выводить время выполнения с точностью до микросекунд (performance.now) */
|
|
90
|
-
traceTime?: boolean;
|
|
91
|
-
/** Фильтровать логи по имени сигнала (поддерживает RegExp или строку) */
|
|
92
|
-
filter?: RegExp | string;
|
|
93
|
-
/** Показывать внутренние системные логи ядра (сигналы кэша, эффекты computed) */
|
|
94
|
-
isCoreOptimizationDebugEnabled?: boolean;
|
|
95
|
-
}
|
|
96
|
-
export interface ReactiveEngineOptions {
|
|
97
|
-
logger?: EngineLoggerOptions;
|
|
98
|
-
}
|
|
99
|
-
export interface SignalLogDetail {
|
|
100
|
-
from: unknown;
|
|
101
|
-
to: unknown;
|
|
102
|
-
subscribersCount: number;
|
|
103
|
-
subscribers: string[];
|
|
104
|
-
}
|
|
105
|
-
export interface ComputedLogDetail {
|
|
106
|
-
value: unknown;
|
|
107
|
-
duration: string;
|
|
108
|
-
}
|
|
109
|
-
export interface EffectLogDetail {
|
|
110
|
-
triggeredBy: string;
|
|
111
|
-
executionTime?: string;
|
|
112
|
-
}
|
|
113
|
-
export interface BatchLogDetail {
|
|
114
|
-
transactionSize: number;
|
|
115
|
-
totalEffectsRun: number;
|
|
116
|
-
}
|
|
117
|
-
export interface ResourceLogDetail {
|
|
118
|
-
/** Текущий статус загрузки */
|
|
119
|
-
loading: boolean;
|
|
120
|
-
/** Данные ответа (если есть) */
|
|
121
|
-
data: unknown;
|
|
122
|
-
/** Объект ошибки (если запрос упал) */
|
|
123
|
-
error: Error | null;
|
|
124
|
-
/** Была ли это повторная попытка (Retry) */
|
|
125
|
-
isRetrying?: boolean;
|
|
126
|
-
}
|
|
127
|
-
export interface ReactiveDetail {
|
|
128
|
-
}
|
|
129
|
-
export interface LogDetailMap {
|
|
130
|
-
signal: SignalLogDetail;
|
|
131
|
-
computed: ComputedLogDetail;
|
|
132
|
-
effect: EffectLogDetail;
|
|
133
|
-
batch: BatchLogDetail;
|
|
134
|
-
resource: ResourceLogDetail;
|
|
135
|
-
reactive: ReactiveDetail;
|
|
46
|
+
untrack<T>(fn: () => T): T;
|
|
136
47
|
}
|
|
137
48
|
/**
|
|
138
|
-
*
|
|
139
|
-
* сигналами, эффектами, асинхронными ресурсами и другими реактивными примитивами. Реактивные механизмы облегчают разработку
|
|
140
|
-
* сложных пользовательских интерфейсов и приложений, автоматически отслеживая зависимости между данными и реактивно обновляя UI.
|
|
141
|
-
*
|
|
142
|
-
* Основные возможности `ReactiveEngine` включают:
|
|
143
|
-
* - **Сигналы (Signals)**: Реактивные переменные с поддержкой подписки на изменения.
|
|
144
|
-
* - **Эффекты (Effects)**: Автоматические функции, которые выполняются при изменении зависимых сигналов.
|
|
145
|
-
* - **Ресурсы (Resources)**: Асинхронные ресурсы с поддержкой повторных попыток и валидации.
|
|
146
|
-
* - **Прокси-объекты (Proxy Objects)**: Реактивное обертывание объектов для отслеживания изменений свойств.
|
|
147
|
-
* - **Интеграция с React**: Удобные методы для интеграции реактивного ядра с компонентами React.
|
|
148
|
-
*
|
|
149
|
-
* Пример использования:
|
|
150
|
-
*
|
|
151
|
-
* ```javascript
|
|
152
|
-
* const engine = new ReactiveEngine();
|
|
153
|
-
* const count = engine.signal(0);
|
|
49
|
+
* 🏢 ENTERPRISE REACTIVE ENGINE (ПОЛНАЯ ВЕРСИЯ)
|
|
154
50
|
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
* });
|
|
158
|
-
*
|
|
159
|
-
* count.value++; // Выведет: Count is 1
|
|
160
|
-
* ```
|
|
161
|
-
*
|
|
162
|
-
* @class
|
|
51
|
+
* Наследует и расширяет легкое ядро ReactiveEngineCore.
|
|
52
|
+
* Включает: Глубокий reactive(), асинхронные ресурсы (resource), DI-контейнер и систему логирования.
|
|
163
53
|
*/
|
|
164
|
-
export declare class ReactiveEngine {
|
|
165
|
-
protected frameworkPrefix: string;
|
|
166
|
-
private activeEffect;
|
|
167
|
-
private isBatching;
|
|
168
|
-
private pendingEffects;
|
|
54
|
+
export declare class ReactiveEngine extends ReactiveEngineCore {
|
|
169
55
|
private services;
|
|
170
56
|
private factories;
|
|
171
57
|
private proxyCache;
|
|
172
|
-
private allEffects;
|
|
173
58
|
private loggerOptions?;
|
|
174
59
|
private pendingLogQueue;
|
|
175
|
-
private lastTransactionDuration;
|
|
176
60
|
private signalMutationCounts;
|
|
177
61
|
private lastComputedDurations;
|
|
178
62
|
private effectExecutionCounts;
|
|
179
63
|
private batchTickCounts;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
*
|
|
185
|
-
* Дополнительно агрегирует рантйам-статистику по всей стейт-машине приложения:
|
|
186
|
-
* - **`signal`:** Отслеживает счетчик частоты изменений (шума) для детекции паразитных циклов мутаций.
|
|
187
|
-
* - **`computed`:** Сравнивает текущую длительность ленивого вычисления с прошлым, подсвечивая тренд производительности.
|
|
188
|
-
* - **`effect`:** Подсчитывает общее количество ререндеров/вызовов побочных эффектов.
|
|
189
|
-
* - **`batch`:** Фиксирует порядковый номер выполненного шедулером пакета микрозадач.
|
|
190
|
-
*
|
|
191
|
-
* @template K - Литеральный тип лога из карты `LogDetailMap`
|
|
192
|
-
* @param {K} type - Категория логгируемого события ('signal' | 'computed' | 'effect' | 'batch')
|
|
193
|
-
* @param {string} name - Уникальное имя реактивного элемента (или label эффекта)
|
|
194
|
-
* @param {LogDetailMap[K]} detail - Строго типизированный объект с контекстными данными события
|
|
195
|
-
* @returns {void}
|
|
196
|
-
*/
|
|
197
|
-
log<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void;
|
|
64
|
+
private lastTransactionDuration;
|
|
65
|
+
constructor(options?: {
|
|
66
|
+
logger?: EngineLoggerOptions;
|
|
67
|
+
});
|
|
198
68
|
/**
|
|
199
|
-
*
|
|
200
|
-
* Использование unknown вместо any гарантирует безопасную работу с типами prev/next.
|
|
69
|
+
* ГЛУБОКИЙ РЕАКТИВНЫЙ PROXY-ОБЪЕКТ (СИНХРОННЫЙ PUSH/PULL С МИКРОБАЧИНГОМ ДЛЯ ФРЕЙМВОРКОВ)
|
|
201
70
|
*/
|
|
202
|
-
|
|
71
|
+
reactive<T extends object>(target: T, name?: string): T;
|
|
203
72
|
/**
|
|
204
|
-
* DI
|
|
205
|
-
* @template T
|
|
206
|
-
* @function provide
|
|
207
|
-
* @param {Token<T>} token - Токен для зависимости.
|
|
208
|
-
* @param {T | Factory<T>} valueOrFactory - Значение или фабрика для создания сервиса.
|
|
209
|
-
* @returns {void}
|
|
210
|
-
* @source
|
|
73
|
+
* DI-КОНТЕЙНЕР: РЕГИСТРАЦИЯ ЗАВИСИМОСТИ
|
|
211
74
|
*/
|
|
212
75
|
provide<T>(token: Token<T>, valueOrFactory: T | Factory<T>): void;
|
|
213
76
|
/**
|
|
214
|
-
* DI
|
|
215
|
-
* @template T
|
|
216
|
-
* @function inject
|
|
217
|
-
* @param {Token<T>} token - Токен для зависимости.
|
|
218
|
-
* @returns {T} - Сервис.
|
|
219
|
-
* @source
|
|
77
|
+
* DI-КОНТЕЙНЕР: ИНЪЕКЦИЯ (ПОЛУЧЕНИЕ СЕРВИСА ПО ТОКЕНУ)
|
|
220
78
|
*/
|
|
221
79
|
inject<T>(token: Token<T>): T;
|
|
80
|
+
queueLog(type: string, name: string, detail: any): void;
|
|
81
|
+
flushLogs(): void;
|
|
222
82
|
/**
|
|
223
|
-
*
|
|
83
|
+
* АСИНХРОННЫЙ РЕСУРС (ПУЛЕНЕПРОБИВАЕМЫЙ СИНХРОННЫЙ PUSH/PULL)
|
|
224
84
|
*/
|
|
225
|
-
|
|
85
|
+
resource<T, S = void>(fetcher: (source: S, signal: AbortSignal) => Promise<T>, source?: {
|
|
86
|
+
value: S;
|
|
87
|
+
}, optionsOrName?: string | ResourceOptions<T, S>): any;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 🤖 AUTOMATIC BATCHING REACTIVE ENGINE
|
|
91
|
+
*
|
|
92
|
+
* Расширение Enterprise-ядра, реализующее аппаратный автобатчинг микрозадач.
|
|
93
|
+
* Автоматически склеивает множественные каскадные мутации стейта (включая асинхронные цепочки после await)
|
|
94
|
+
* и выполняет побочные эффекты ровно 1 раз на выходе в Event Loop без ручного вызова engine.batch().
|
|
95
|
+
*/
|
|
96
|
+
export declare class ReactiveEngineAutomatic extends ReactiveEngine {
|
|
97
|
+
private isFlushScheduled;
|
|
98
|
+
constructor(options?: {
|
|
99
|
+
logger?: EngineLoggerOptions;
|
|
100
|
+
});
|
|
226
101
|
/**
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
* Метод автоматически вызывается планировщиком ядра (`queueMicrotask`) непосредственно
|
|
231
|
-
* перед запуском каскада отложенных эффектов фреймворков и ререндеров интерфейса.
|
|
232
|
-
*
|
|
233
|
-
* ### Особенности рантайм-логики:
|
|
234
|
-
* 1. **Атомарный батчинг:** Предотвращает лавинообразный спам в консоли разработчика при
|
|
235
|
-
* множественных синхронных мутациях сигналов. Все тики склеиваются в единую мастер-группу.
|
|
236
|
-
* 2. **Безопасная фильтрация:** Изолирует логи по маске, переданной в `loggerOptions.filter`.
|
|
237
|
-
* Если после фильтрации очередь оказывается пустой, метод бережно зачищает буфер и
|
|
238
|
-
* возвращает управление шедулеру ядра, не блокируя выполнение `pendingEffects`.
|
|
239
|
-
* 3. **Профайлинг производительности (Pull Duration):** При включенном `traceTime` рассчитывает
|
|
240
|
-
* чистую длительность калькуляции и фильтрации транзакции графа в миллисекундах
|
|
241
|
-
* с точностью до микросекунд (`performance.now`), помогая находить узкие места.
|
|
242
|
-
*
|
|
243
|
-
* @function flushLogs
|
|
244
|
-
* @returns {void} Метод не возвращает значения, а только очищает внутренний буфер `pendingLogQueue`.
|
|
102
|
+
* ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ АВТОМАТИЧЕСКОГО ДВИЖКА
|
|
103
|
+
* Внедряет аппаратный микробатчинг (queueMicrotask) прямо в мост __subscribe фреймворков,
|
|
104
|
+
* защищая Vue 3 triggerRef() от каскадного дребезга кадров рендеринга.
|
|
245
105
|
*/
|
|
246
|
-
|
|
106
|
+
reactive<T extends object>(target: T, name?: string): T;
|
|
247
107
|
/**
|
|
248
|
-
*
|
|
249
|
-
* @template T
|
|
250
|
-
* @function signal
|
|
251
|
-
* @param {T} initialValue - Начальное значение сигнала.
|
|
252
|
-
* @param {string | SignalOptions<T>} [optionsOrName] - Имя или опции сигнала.
|
|
253
|
-
* @returns {Signal<T>} - Сигнал.
|
|
254
|
-
* @source
|
|
108
|
+
* ВНУТРЕННИЙ СБРОС ОЧЕРЕДИ С ПОДДЕРЖКОЙ МИКРОБАЧИНГА МАССИВОВ
|
|
255
109
|
*/
|
|
256
|
-
|
|
110
|
+
protected flushEffects(): void;
|
|
257
111
|
/**
|
|
258
|
-
*
|
|
259
|
-
* @function effect
|
|
260
|
-
* @param {EffectFn} fn - Функция эффекта.
|
|
261
|
-
* @param {string} [label] - Необязательная метка для логирования и отладки.
|
|
262
|
-
* @returns {CleanupFn} - Функция для очистки эффекта.
|
|
263
|
-
* @source
|
|
112
|
+
* ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (АСИНХРОННЫЙ АВТОБАТЧИНГ ПРИМИТИВОВ)
|
|
264
113
|
*/
|
|
265
|
-
effect(fn:
|
|
266
|
-
|
|
267
|
-
|
|
114
|
+
effect(fn: () => void | (() => void), label?: string): () => void;
|
|
115
|
+
}
|
|
116
|
+
interface ReactiveEngineOptions {
|
|
117
|
+
logger?: EngineLoggerOptions;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 📊 AUTOMATIC BATCHING HARD-LOGGING REACTIVE ENGINE
|
|
121
|
+
*
|
|
122
|
+
* Премиальное Enterprise-расширение автоматического ядра, сочетающее аппаратный асинхронный
|
|
123
|
+
* автобатчинг микрозадач (queueMicrotask) и тотальный рантайм-мониторинг всей стейт-машины.
|
|
124
|
+
*/
|
|
125
|
+
export declare class ReactiveEngineAutomaticHard extends ReactiveEngineAutomatic {
|
|
126
|
+
private autoLogQueue;
|
|
127
|
+
private isHardFlushScheduled;
|
|
128
|
+
constructor(options?: ReactiveEngineOptions);
|
|
268
129
|
/**
|
|
269
|
-
*
|
|
270
|
-
* @template T
|
|
271
|
-
* @function computed
|
|
272
|
-
* @param {Function} fn - Функция для вычисления значения.
|
|
273
|
-
* @param {string} [signalName] - Имя сигнала.
|
|
274
|
-
* @returns {Computed<T>} - Вычисляемое значение с методом destroy.
|
|
275
|
-
* @source
|
|
130
|
+
* ПЕРЕХВАТ И ПЕРЕНАПРАВЛЕНИЕ ЛОГОВ В ЛОКАЛЬНЫЙ АСИНХРОННЫЙ БУФЕР
|
|
276
131
|
*/
|
|
277
|
-
|
|
132
|
+
queueLog<K extends keyof LogDetailMap>(type: K, name: string, detail: LogDetailMap[K]): void;
|
|
278
133
|
/**
|
|
279
|
-
*
|
|
280
|
-
*
|
|
281
|
-
* В отличие от атомарных сигналов (`signal`), требующих ручного обращения через `.value`,
|
|
282
|
-
* метод `reactive` позволяет работать со сложными разветвленными структурами данных нативно,
|
|
283
|
-
* используя стандартный синтаксис JavaScript для чтения и прямой мутации свойств.
|
|
284
|
-
*
|
|
285
|
-
* ### Архитектурные особенности рантайма:
|
|
286
|
-
* 1. **Гранулярность подписок (Property-level Subscriptions):** Зависимости графа ядра трекаются
|
|
287
|
-
* не для всего объекта целиком, а строго для конкретных ключей (`prop`). Если эффект или
|
|
288
|
-
* компонент читает свойство `user.name`, он подписывается исключительно на этот ключ.
|
|
289
|
-
* Изменение свойства `user.age` не вызовет его повторного выполнения.
|
|
290
|
-
* 2. **Глубокое проксирование (Deep Reactivity):** При обращении к вложенным объектам или массивам,
|
|
291
|
-
* метод динамически и лениво оборачивает их в Proxy-структуры, автоматически формируя
|
|
292
|
-
* понятные строковые пути для подсистемы логирования (например, `user.meta.role`).
|
|
293
|
-
* 3. **Иммунизация кэша (Proxy Mirroring Cache):** Все созданные Proxy зеркалируются во внутреннем
|
|
294
|
-
* реестре `proxyCache`. Повторный вызов метода для одного и того же объекта вернет
|
|
295
|
-
* уже существующий Proxy, предотвращая утечки памяти и дублирование подписок.
|
|
296
|
-
*
|
|
297
|
-
* ### Применение в оптимизации больших форм:
|
|
298
|
-
* Идеально подходит для тяжелых интерфейсов (динамические таблицы, анкеты из сотен полей),
|
|
299
|
-
* так как прямая мутация конкретного инпута изолирует поток изменений и избавляет от необходимости
|
|
300
|
-
* иммутабельного копирования всего стейта формы через оператор расширения (`...spread`).
|
|
301
|
-
*
|
|
302
|
-
* @template T - Тип целевого объекта, расширяющий базовый интерфейс `object`.
|
|
303
|
-
* @function reactive
|
|
304
|
-
* @param {T} target - Исходный объект или массив JavaScript для проксирования.
|
|
305
|
-
* @param {string} [name='reactive'] - Уникальное базовое имя объекта для трассировки и фильтрации в логгере.
|
|
306
|
-
* @returns {T} Глубоко проксированный реактивный объект типа `T`.
|
|
307
|
-
*
|
|
308
|
-
* @example
|
|
309
|
-
* ```typescript
|
|
310
|
-
* // 1. Инициализация в сервисе бизнес-логики:
|
|
311
|
-
* public form = this.engine.reactive({
|
|
312
|
-
* user: { name: 'Иван', age: 25 }
|
|
313
|
-
* }, 'profile-form');
|
|
314
|
-
*
|
|
315
|
-
* // 2. Прямая мутация в экшене (Proxy перехватит тик и запустит атомарный батчинг):
|
|
316
|
-
* public updateAge() {
|
|
317
|
-
* this.form.user.age += 1; // Автоматический лог: SIGNAL [profile-form.user.age]
|
|
318
|
-
* }
|
|
319
|
-
*
|
|
320
|
-
* // 3. Мост подписки для UI-компонентов:
|
|
321
|
-
* public uiBridge = this.engine.computed(() => ({
|
|
322
|
-
* name: this.form.user.name,
|
|
323
|
-
* age: this.form.user.age
|
|
324
|
-
* }));
|
|
325
|
-
* ```
|
|
134
|
+
* АВТОНОМНЫЙ МЕТОД ФОРМАТИРОВАНИЯ И ВЫВОДА ENTERPRISE-ЛОГОВ В КОНСОЛЬ
|
|
326
135
|
*/
|
|
327
|
-
|
|
136
|
+
flushLogs(): void;
|
|
328
137
|
/**
|
|
329
|
-
*
|
|
330
|
-
* @function batch
|
|
331
|
-
* @param {Function} fn - Функция для выполнения в группе.
|
|
332
|
-
* @returns {void}
|
|
333
|
-
* @source
|
|
138
|
+
* АТОМАРНЫЙ АСИНХРОННЫЙ СБРОС ЛОГОВ СОВМЕСТНО С ЭФФЕКТАМИ
|
|
334
139
|
*/
|
|
335
|
-
|
|
140
|
+
protected flushEffects(): void;
|
|
336
141
|
/**
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
* Вызов new DOMException('Aborted', 'AbortError') гарантирует,
|
|
340
|
-
* что ваша кастомная пауза между ретраями this.delay притворяется для движка JavaScript
|
|
341
|
-
* точно таким же нативным процессом отмены, как и fetch().
|
|
342
|
-
* Это делает реактивное ядро бесшовным и избавляет от необходимости
|
|
343
|
-
* писать кучу разных проверок под каждый тип ошибки.
|
|
142
|
+
* ПЕРЕОПРЕДЕЛЕНИЕ ПЛАНИРОВЩИКА ЭФФЕКТОВ (С ПОЛНЫМ ЛОГИРОВАНИЕМ ДЛИТЕЛЬНОСТИ И ВЫЗОВОВ)
|
|
344
143
|
*/
|
|
345
|
-
|
|
144
|
+
effect(fn: () => void | (() => void), label?: string): () => void;
|
|
346
145
|
/**
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
* Explained 👉 {@link https://github.com/garage-13/reactive-engine/blob/main/README_EN.md#1-async-resources-dependent-on-multiple-signals}
|
|
350
|
-
*
|
|
351
|
-
* @template T, S
|
|
352
|
-
* @see {@link https://github.com/garage-13/reactive-engine/blob/main/examples/200-resource/Example200.tsx Реализация базового компонента Example200}
|
|
353
|
-
* @see {@link https://github.com/garage-13/reactive-engine/blob/main/examples/201-multi-resource/service.secondary.ts Сложный пример зависимости ресурсов через computed}
|
|
354
|
-
* @function resource
|
|
355
|
-
* @param {Function} fetcher - Асинхронная функция для загрузки данных.
|
|
356
|
-
* @param {{ value: S }} [source] - Источник данных.
|
|
357
|
-
* @param {string | ResourceOptions<T>} [optionsOrName] - Имя сигнала или объект конфигурации `{ name: string; validate: (res) => boolean | string; resetDataOnSourceChange?: boolean }`.
|
|
358
|
-
* @returns {Resource<T>} - Асинхронный ресурс.
|
|
359
|
-
*
|
|
360
|
-
* @example
|
|
361
|
-
* // Базовый вызов со строкой (обратная совместимость):
|
|
362
|
-
* const res = engine.resource(fetcher, source, 'my-resource-name');
|
|
363
|
-
*
|
|
364
|
-
* @example
|
|
365
|
-
* // Современный вызов с валидацией ответа:
|
|
366
|
-
* const res = engine.resource(fetcher, source, {
|
|
367
|
-
* name: 'my-resource-name',
|
|
368
|
-
* resetDataOnSourceChange: true, // true by default
|
|
369
|
-
* responseValidate: (data) => !!data || 'Данные пусты', // Проверяйте формат в соотв. с дженериком
|
|
370
|
-
* });
|
|
371
|
-
*
|
|
372
|
-
* @example
|
|
373
|
-
* // (Экспериментальная фича)
|
|
374
|
-
* // В теле fetcher можно выкинуть ошибку в виде
|
|
375
|
-
* // `throw new Error('[THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY=1][MESSAGE=Your msg]')`
|
|
376
|
-
* // Причина: Особенности внутренней реализации определения харакрера ошибки и необходимость делать retry (если такая опция передана)
|
|
377
|
-
* // Рекомендуем вместо этого использовать `validateBeforeFetch` в опциях при создании ресурса.
|
|
378
|
-
* const res = engine.resource(
|
|
379
|
-
* async (counterValue, abortSignal) => {
|
|
380
|
-
* if (counterValue === 0)
|
|
381
|
-
* throw new Error([
|
|
382
|
-
* '[THROW_CUSTOM_VALIDATION_ERROR_NO_RETRY=1]', // Иначе запустится механизм retry (напр. по причине отсутствия сети, далее в этом же примере)
|
|
383
|
-
* `[MESSAGE=Stop for count value ${counterValue} - excepted from fetcher fn body]`,
|
|
384
|
-
* ].join(' '))
|
|
385
|
-
* const res = await fetch(
|
|
386
|
-
* [
|
|
387
|
-
* `${BASE_API_URL}/profile/search`,
|
|
388
|
-
* '?',
|
|
389
|
-
* [
|
|
390
|
-
* `counter=${counterValue}`,
|
|
391
|
-
* '_responseDelay=2000',
|
|
392
|
-
* ].join('&')
|
|
393
|
-
* ].join(''),
|
|
394
|
-
* { signal: abortSignal }
|
|
395
|
-
* )
|
|
396
|
-
* if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)
|
|
397
|
-
* return res.json()
|
|
398
|
-
* },
|
|
399
|
-
* this.counter,
|
|
400
|
-
* )
|
|
401
|
-
* @source
|
|
146
|
+
* АСИНХРОННЫЙ РЕСУРС (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)
|
|
402
147
|
*/
|
|
403
148
|
resource<T, S = void>(fetcher: (source: S, signal: AbortSignal) => Promise<T>, source?: {
|
|
404
149
|
value: S;
|
|
405
|
-
}, optionsOrName?: string | ResourceOptions<T, S>):
|
|
150
|
+
}, optionsOrName?: string | ResourceOptions<T, S>): any;
|
|
406
151
|
/**
|
|
407
|
-
*
|
|
408
|
-
* @template T
|
|
409
|
-
* @function untrack
|
|
410
|
-
* @param {Function} fn - Функция для выполнения.
|
|
411
|
-
* @returns {T} - Результат выполнения функции.
|
|
412
|
-
* @source
|
|
152
|
+
* ПЕРЕОПРЕДЕЛЕНИЕ РЕАКТИВНОГО PROXY ДЛЯ ХАРД-ЛОГГЕРА
|
|
413
153
|
*/
|
|
414
|
-
|
|
154
|
+
reactive<T extends object>(target: T, name?: string): T;
|
|
415
155
|
/**
|
|
416
|
-
*
|
|
417
|
-
* @private
|
|
418
|
-
* @function safeRun
|
|
419
|
-
* @param {IEffect} effect - Эффект.
|
|
420
|
-
* @param {Function} fn - Функция для выполнения.
|
|
421
|
-
* @returns {void}
|
|
422
|
-
* @source
|
|
156
|
+
* СИНХРОННЫЙ АТОМАРНЫЙ СИГНАЛ (ИНТЕГРИРОВАННЫЙ В HARD-ЛОГГЕР)
|
|
423
157
|
*/
|
|
424
|
-
|
|
158
|
+
signal<T>(initialValue: T, optionsOrName?: string | SignalOptions<T>): Signal<T>;
|
|
159
|
+
/**
|
|
160
|
+
* СИНХРОННО-ЛЕНИВОЕ ВЫЧИСЛЯЕМОЕ СВОЙСТВО (С ЗАМЕРОМ ТАЙМИНГОВ PULL И БЕЗ ANY)
|
|
161
|
+
*/
|
|
162
|
+
computed<T>(fn: () => T, signalName?: string): Computed<T>;
|
|
425
163
|
}
|
|
164
|
+
export {};
|
|
426
165
|
//# sourceMappingURL=core.d.ts.map
|
package/dist/core/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"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"}
|