@foxford/den 1.0.0
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/README.mdx +9 -0
- package/adapter.cjs +43 -0
- package/adapter.d.cts +73 -0
- package/adapter.d.ts +73 -0
- package/adapter.mjs +17 -0
- package/define-slot--HM6B232.d.ts +500 -0
- package/define-slot-es1K6_-L.d.cts +500 -0
- package/define.cjs +282 -0
- package/define.d.cts +26 -0
- package/define.d.ts +26 -0
- package/define.mjs +247 -0
- package/index.cjs +1027 -0
- package/index.d.cts +386 -0
- package/index.d.ts +386 -0
- package/index.mjs +975 -0
- package/package.json +67 -0
- package/types-B4Arep3V.d.cts +415 -0
- package/types-B4Arep3V.d.ts +415 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { Token, Container, TokensToTypes } from '@foxford/ioc';
|
|
2
|
+
import { b as Guard, c as GuardResult } from './types-B4Arep3V.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Базовый интерфейс для всех define*-определений.
|
|
6
|
+
* Содержит токен IoC и метод регистрации в контейнере.
|
|
7
|
+
* @template T - Тип регистрируемой зависимости
|
|
8
|
+
*/
|
|
9
|
+
interface Definition<T> {
|
|
10
|
+
/** Токен IoC для регистрации зависимости */
|
|
11
|
+
readonly token: Token<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Регистрирует определение в IoC-контейнере.
|
|
14
|
+
* @param container - Контейнер для регистрации
|
|
15
|
+
*/
|
|
16
|
+
register(container: Container): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* ServiceDefinition — результат вызова defineService.
|
|
20
|
+
* Описывает сервис с lifecycle-хуками activate/deactivate.
|
|
21
|
+
* @template T - Тип сервиса
|
|
22
|
+
* @template Deps - Кортеж токенов зависимостей
|
|
23
|
+
*/
|
|
24
|
+
interface ServiceDefinition<T, Deps extends readonly Token<unknown>[]> extends Definition<T> {
|
|
25
|
+
/** Дискриминатор типа */
|
|
26
|
+
readonly __type: 'service';
|
|
27
|
+
/** Метаданные определения */
|
|
28
|
+
readonly __meta: {
|
|
29
|
+
/** Токены зависимостей, используемых сервисом */
|
|
30
|
+
readonly requires: Deps;
|
|
31
|
+
/**
|
|
32
|
+
* Скоуп жизненного цикла сервиса.
|
|
33
|
+
* - `'app'` — синглтон на время жизни приложения (по умолчанию)
|
|
34
|
+
* - `'request'` — на сервере создаётся per HTTP-request, на клиенте — app-scope
|
|
35
|
+
*/
|
|
36
|
+
readonly scope: 'app' | 'request';
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* ViewModelDefinition — результат вызова defineViewModel.
|
|
41
|
+
* Proxy для прямого импорта VM из view-компонентов.
|
|
42
|
+
* Поддерживает deferred resolution — контейнер не нужен на момент import.
|
|
43
|
+
* @template T - Тип ViewModel
|
|
44
|
+
* @template Deps - Кортеж токенов зависимостей
|
|
45
|
+
*/
|
|
46
|
+
interface ViewModelDefinition<T, Deps extends readonly Token<unknown>[]> extends Definition<T> {
|
|
47
|
+
/** Дискриминатор типа */
|
|
48
|
+
readonly __type: 'view-model';
|
|
49
|
+
/** Метаданные определения */
|
|
50
|
+
readonly __meta: {
|
|
51
|
+
/** Токены зависимостей, используемых VM */
|
|
52
|
+
readonly requires: Deps;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Резолвит VM из глобального IoC-контейнера.
|
|
56
|
+
* Deferred resolution — вызывайте когда контейнер уже инициализирован.
|
|
57
|
+
* Используется в view-компонентах вместо явного вызова container.resolve.
|
|
58
|
+
* @returns Экземпляр VM или Promise с экземпляром
|
|
59
|
+
*/
|
|
60
|
+
resolve(): T | Promise<T>;
|
|
61
|
+
/**
|
|
62
|
+
* Псевдоним для resolve(). Резолвит VM из глобального IoC-контейнера.
|
|
63
|
+
* @returns Экземпляр VM или Promise с экземпляром
|
|
64
|
+
*/
|
|
65
|
+
use(): T | Promise<T>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* GuardDefinition — результат вызова defineGuard.
|
|
69
|
+
* Совместим с Guard interface и guardRunner.runGuards().
|
|
70
|
+
*/
|
|
71
|
+
interface GuardDefinition extends Definition<Guard> {
|
|
72
|
+
/** Дискриминатор типа */
|
|
73
|
+
readonly __type: 'guard';
|
|
74
|
+
/** Метаданные определения */
|
|
75
|
+
readonly __meta: {
|
|
76
|
+
/** Токены зависимостей guard (пустой массив для инлайн-определений) */
|
|
77
|
+
readonly requires: readonly Token<unknown>[];
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Опции для defineService */
|
|
81
|
+
interface DefineServiceOptions<Deps extends readonly Token<unknown>[], T = unknown> {
|
|
82
|
+
/** Список токенов зависимостей (опционально) */
|
|
83
|
+
readonly requires?: Deps;
|
|
84
|
+
/**
|
|
85
|
+
* Скоуп жизненного цикла сервиса.
|
|
86
|
+
* - `'app'` — синглтон на время жизни приложения (по умолчанию)
|
|
87
|
+
* - `'request'` — на сервере создаётся per HTTP-request, на клиенте — app-scope
|
|
88
|
+
*/
|
|
89
|
+
readonly scope?: 'app' | 'request';
|
|
90
|
+
/**
|
|
91
|
+
* Фабрика для создания экземпляра сервиса.
|
|
92
|
+
* Когда передана — регистрирует возвращаемый объект напрямую (без Activatable-обёртки).
|
|
93
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
94
|
+
* @returns Экземпляр сервиса
|
|
95
|
+
*/
|
|
96
|
+
create?: (deps: TokensToTypes<Deps>) => T;
|
|
97
|
+
/**
|
|
98
|
+
* Вызывается при активации страницы.
|
|
99
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
100
|
+
* @param params - Параметры маршрута
|
|
101
|
+
*/
|
|
102
|
+
activate?: (deps: TokensToTypes<Deps>, params: Record<string, string>) => void | Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Вызывается при деактивации страницы (опционально).
|
|
105
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
106
|
+
*/
|
|
107
|
+
deactivate?: (deps: TokensToTypes<Deps>) => void | Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Возвращает сериализуемое состояние сервиса для SSR-передачи на клиент (опционально).
|
|
110
|
+
* Наличие serialize/deserialize включает участие сервиса в StateRegistry контейнера.
|
|
111
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
112
|
+
* @returns Plain-объект/значение, сериализуемое в JSON
|
|
113
|
+
*/
|
|
114
|
+
serialize?: (deps: TokensToTypes<Deps>) => unknown;
|
|
115
|
+
/**
|
|
116
|
+
* Восстанавливает состояние сервиса из данных, сериализованных на сервере (опционально).
|
|
117
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
118
|
+
* @param data - Данные, полученные из serialize при SSR
|
|
119
|
+
*/
|
|
120
|
+
deserialize?: (deps: TokensToTypes<Deps>, data: unknown) => void;
|
|
121
|
+
}
|
|
122
|
+
/** Опции для defineViewModel */
|
|
123
|
+
interface DefineViewModelOptions<Deps extends readonly Token<unknown>[], T> {
|
|
124
|
+
/** Список токенов зависимостей (опционально) */
|
|
125
|
+
readonly requires?: Deps;
|
|
126
|
+
/**
|
|
127
|
+
* Фабрика для создания экземпляра VM.
|
|
128
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
129
|
+
* @param cachedState - Закэшированный стейт из toJSON() при предыдущем визите (undefined при первом)
|
|
130
|
+
* @returns Экземпляр ViewModel
|
|
131
|
+
*/
|
|
132
|
+
create: (deps: TokensToTypes<Deps>, cachedState?: unknown) => T;
|
|
133
|
+
}
|
|
134
|
+
/** Опции для defineGuard */
|
|
135
|
+
interface DefineGuardOptions<Deps extends readonly Token<unknown>[] = readonly []> {
|
|
136
|
+
/** Список токенов зависимостей (опционально) */
|
|
137
|
+
readonly requires?: Deps;
|
|
138
|
+
/**
|
|
139
|
+
* Фабрика для создания экземпляра Guard с инъекцией зависимостей.
|
|
140
|
+
* Когда передана вместе с requires — создаёт Guard через конструктор с инъектированными зависимостями.
|
|
141
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
142
|
+
* @returns Экземпляр Guard
|
|
143
|
+
*/
|
|
144
|
+
create?: (deps: TokensToTypes<Deps>) => Guard;
|
|
145
|
+
/**
|
|
146
|
+
* Инлайн-реализация проверки доступа (используется когда create не передана).
|
|
147
|
+
* @param params - Параметры маршрута
|
|
148
|
+
* @returns Результат проверки или Promise с результатом
|
|
149
|
+
*/
|
|
150
|
+
check?: (params: Record<string, string>) => GuardResult | Promise<GuardResult>;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Конфигурация приложения, регистрируемая в IoC-контейнере.
|
|
154
|
+
*/
|
|
155
|
+
interface AppConfig {
|
|
156
|
+
/** Сервисы, инициализируемые немедленно при старте */
|
|
157
|
+
readonly eager: readonly Token<unknown>[];
|
|
158
|
+
/** Сервисы, инициализируемые лениво (по требованию) */
|
|
159
|
+
readonly lazy: readonly Token<unknown>[];
|
|
160
|
+
/** Глобальные guards, применяемые ко всем страницам */
|
|
161
|
+
readonly guards: readonly Token<Guard>[];
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* AppDefinition — результат вызова defineApp.
|
|
165
|
+
* Декларирует конфигурацию приложения: eager/lazy сервисы, глобальные guards.
|
|
166
|
+
*/
|
|
167
|
+
interface AppDefinition extends Definition<AppConfig> {
|
|
168
|
+
/** Дискриминатор типа */
|
|
169
|
+
readonly __type: 'app';
|
|
170
|
+
/** Метаданные определения */
|
|
171
|
+
readonly __meta: {
|
|
172
|
+
/** Приложение не имеет requires-зависимостей */
|
|
173
|
+
readonly requires: readonly [];
|
|
174
|
+
/** Eager-сервисы */
|
|
175
|
+
readonly eager: readonly Token<unknown>[];
|
|
176
|
+
/** Lazy-сервисы */
|
|
177
|
+
readonly lazy: readonly Token<unknown>[];
|
|
178
|
+
/** Глобальные guards */
|
|
179
|
+
readonly guards: readonly Token<Guard>[];
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* RepositoryDefinition — результат вызова defineRepository.
|
|
184
|
+
* Описывает репозиторий уровня данных с IoC-биндингом.
|
|
185
|
+
* @template T - Тип репозитория
|
|
186
|
+
* @template Deps - Кортеж токенов зависимостей
|
|
187
|
+
*/
|
|
188
|
+
interface RepositoryDefinition<T, Deps extends readonly Token<unknown>[]> extends Definition<T> {
|
|
189
|
+
/** Дискриминатор типа */
|
|
190
|
+
readonly __type: 'repository';
|
|
191
|
+
/** Метаданные определения */
|
|
192
|
+
readonly __meta: {
|
|
193
|
+
/** Токены зависимостей, используемых репозиторием */
|
|
194
|
+
readonly requires: Deps;
|
|
195
|
+
/**
|
|
196
|
+
* Скоуп жизненного цикла репозитория.
|
|
197
|
+
* - `'app'` — синглтон на время жизни приложения (по умолчанию)
|
|
198
|
+
* - `'request'` — на сервере создаётся per HTTP-request, на клиенте — app-scope
|
|
199
|
+
*/
|
|
200
|
+
readonly scope: 'app' | 'request';
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/** Опции для defineApp */
|
|
204
|
+
interface DefineAppOptions {
|
|
205
|
+
/** Сервисы, инициализируемые немедленно при старте приложения */
|
|
206
|
+
readonly eager?: readonly Token<unknown>[];
|
|
207
|
+
/** Сервисы, инициализируемые лениво (по требованию) */
|
|
208
|
+
readonly lazy?: readonly Token<unknown>[];
|
|
209
|
+
/** Глобальные guards, применяемые ко всем страницам */
|
|
210
|
+
readonly guards?: readonly Token<Guard>[];
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Опции для defineRepository
|
|
214
|
+
* @template Deps - Кортеж токенов зависимостей
|
|
215
|
+
* @template T - Тип репозитория
|
|
216
|
+
*/
|
|
217
|
+
interface DefineRepositoryOptions<Deps extends readonly Token<unknown>[], T> {
|
|
218
|
+
/** Список токенов зависимостей (опционально) */
|
|
219
|
+
readonly requires?: Deps;
|
|
220
|
+
/**
|
|
221
|
+
* Скоуп жизненного цикла репозитория.
|
|
222
|
+
* - `'app'` — синглтон на время жизни приложения (по умолчанию)
|
|
223
|
+
* - `'request'` — на сервере создаётся per HTTP-request, на клиенте — app-scope
|
|
224
|
+
*/
|
|
225
|
+
readonly scope?: 'app' | 'request';
|
|
226
|
+
/**
|
|
227
|
+
* Фабрика для создания экземпляра репозитория.
|
|
228
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
229
|
+
* @returns Экземпляр репозитория
|
|
230
|
+
*/
|
|
231
|
+
create: (deps: TokensToTypes<Deps>) => T;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* ActionGuard — перехватчик вызова метода Service.
|
|
235
|
+
* Позволяет вставить проверку (2FA, подтверждение) перед выполнением операции.
|
|
236
|
+
*/
|
|
237
|
+
interface ActionGuard {
|
|
238
|
+
/**
|
|
239
|
+
* Перехватывает вызов операции.
|
|
240
|
+
* @param next - Функция продолжения (оборачиваемая операция)
|
|
241
|
+
* @returns Промис с результатом операции
|
|
242
|
+
*/
|
|
243
|
+
intercept<T>(next: () => Promise<T>): Promise<T>;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* ActionGuardDefinition — результат вызова defineActionGuard.
|
|
247
|
+
* Регистрирует перехватчик вызовов метода Service в IoC.
|
|
248
|
+
* @template Deps - Кортеж токенов зависимостей
|
|
249
|
+
*/
|
|
250
|
+
interface ActionGuardDefinition<Deps extends readonly Token<unknown>[]> extends Definition<ActionGuard> {
|
|
251
|
+
/** Дискриминатор типа */
|
|
252
|
+
readonly __type: 'action-guard';
|
|
253
|
+
/** Метаданные определения */
|
|
254
|
+
readonly __meta: {
|
|
255
|
+
/** Токены зависимостей перехватчика */
|
|
256
|
+
readonly requires: Deps;
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/** Опции для defineActionGuard */
|
|
260
|
+
interface DefineActionGuardOptions<Deps extends readonly Token<unknown>[]> {
|
|
261
|
+
/** Список токенов зависимостей (опционально) */
|
|
262
|
+
readonly requires?: Deps;
|
|
263
|
+
/**
|
|
264
|
+
* Реализация перехвата: получает зависимости и функцию продолжения.
|
|
265
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
266
|
+
* @param next - Оборачиваемая операция
|
|
267
|
+
* @returns Промис с результатом операции
|
|
268
|
+
*/
|
|
269
|
+
intercept: (deps: TokensToTypes<Deps>, next: () => Promise<unknown>) => Promise<unknown>;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Конфигурация расширения (Extension), регистрируемая в IoC-контейнере.
|
|
273
|
+
* Extension — app-scope модуль с lifecycle (модалки, онбординг, очереди).
|
|
274
|
+
*/
|
|
275
|
+
interface ExtensionConfig {
|
|
276
|
+
/** Сигнатура поля для различения от других конфигов */
|
|
277
|
+
readonly __extensionConfig: true;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* ExtensionDefinition — результат вызова defineExtension.
|
|
281
|
+
* Регистрирует app-scope Activatable с lifecycle в IoC.
|
|
282
|
+
* @template Deps - Кортеж токенов зависимостей
|
|
283
|
+
*/
|
|
284
|
+
interface ExtensionDefinition<Deps extends readonly Token<unknown>[]> extends Definition<ExtensionConfig> {
|
|
285
|
+
/** Дискриминатор типа */
|
|
286
|
+
readonly __type: 'extension';
|
|
287
|
+
/** Метаданные определения */
|
|
288
|
+
readonly __meta: {
|
|
289
|
+
/** Токены зависимостей расширения */
|
|
290
|
+
readonly requires: Deps;
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/** Опции для defineExtension */
|
|
294
|
+
interface DefineExtensionOptions<Deps extends readonly Token<unknown>[]> {
|
|
295
|
+
/** Список токенов зависимостей (опционально) */
|
|
296
|
+
readonly requires?: Deps;
|
|
297
|
+
/**
|
|
298
|
+
* Вызывается при активации расширения (загрузка приложения).
|
|
299
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
300
|
+
*/
|
|
301
|
+
activate?: (deps: TokensToTypes<Deps>) => void | Promise<void>;
|
|
302
|
+
/**
|
|
303
|
+
* Вызывается при деактивации расширения (выгрузка приложения).
|
|
304
|
+
* @param deps - Разрешённые зависимости в порядке, соответствующем requires
|
|
305
|
+
*/
|
|
306
|
+
deactivate?: (deps: TokensToTypes<Deps>) => void | Promise<void>;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Конфигурация layout, регистрируемая в IoC-контейнере.
|
|
310
|
+
*/
|
|
311
|
+
interface LayoutConfig {
|
|
312
|
+
/** Токены ViewModel, привязанных к layout */
|
|
313
|
+
readonly viewModels: readonly Token<unknown>[];
|
|
314
|
+
/** Именованные слоты layout: имя → токен */
|
|
315
|
+
readonly slots: Record<string, Token<unknown>>;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* LayoutDefinition — результат вызова defineLayout.
|
|
319
|
+
* Декларирует layout с lifecycle и привязкой ViewModel.
|
|
320
|
+
*/
|
|
321
|
+
interface LayoutDefinition extends Definition<LayoutConfig> {
|
|
322
|
+
/** Дискриминатор типа */
|
|
323
|
+
readonly __type: 'layout';
|
|
324
|
+
/** Метаданные определения */
|
|
325
|
+
readonly __meta: {
|
|
326
|
+
/** Layout не имеет requires-зависимостей */
|
|
327
|
+
readonly requires: readonly [];
|
|
328
|
+
/** Токены ViewModel */
|
|
329
|
+
readonly viewModels: readonly Token<unknown>[];
|
|
330
|
+
/** Слоты layout */
|
|
331
|
+
readonly slots: Record<string, Token<unknown>>;
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/** Опции для defineLayout */
|
|
335
|
+
interface DefineLayoutOptions {
|
|
336
|
+
/** Токены ViewModel, привязанных к layout */
|
|
337
|
+
readonly viewModels?: readonly Token<unknown>[];
|
|
338
|
+
/** Именованные слоты layout: имя → токен */
|
|
339
|
+
readonly slots?: Record<string, Token<unknown>>;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Конфигурация конфигурационного слоя (Layer).
|
|
343
|
+
* Описывает view-адаптер для смены фреймворка рендеринга.
|
|
344
|
+
*/
|
|
345
|
+
interface LayerConfig {
|
|
346
|
+
/** Имя слоя (например, 'view') */
|
|
347
|
+
readonly name: string;
|
|
348
|
+
/** Адаптер view-фреймворка (react, vue и т.д.) */
|
|
349
|
+
readonly adapter: unknown;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* LayerDefinition — результат вызова defineLayer.
|
|
353
|
+
* Описывает конфигурационный слой для view-фреймворка.
|
|
354
|
+
*/
|
|
355
|
+
interface LayerDefinition extends Definition<LayerConfig> {
|
|
356
|
+
/** Дискриминатор типа */
|
|
357
|
+
readonly __type: 'layer';
|
|
358
|
+
/** Метаданные определения */
|
|
359
|
+
readonly __meta: {
|
|
360
|
+
/** Layer не имеет requires-зависимостей */
|
|
361
|
+
readonly requires: readonly [];
|
|
362
|
+
/** Имя слоя */
|
|
363
|
+
readonly name: string;
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/** Опции для defineLayer */
|
|
367
|
+
interface DefineLayerOptions {
|
|
368
|
+
/** Имя слоя (например, 'view') */
|
|
369
|
+
readonly name: string;
|
|
370
|
+
/** Адаптер view-фреймворка */
|
|
371
|
+
readonly adapter: unknown;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Определяет сервис с IoC-биндингом и опциональными lifecycle-хуками activate/deactivate.
|
|
376
|
+
* Если передана опция create — регистрирует экземпляр класса напрямую (как Singleton).
|
|
377
|
+
* Если create не передана — создаёт Activatable-обёртку с хуками activate/deactivate.
|
|
378
|
+
*
|
|
379
|
+
* @template T - Тип регистрируемого сервиса
|
|
380
|
+
* @template Deps - Кортеж токенов зависимостей (по умолчанию пустой кортеж)
|
|
381
|
+
* @param token - Токен для регистрации сервиса в IoC
|
|
382
|
+
* @param options - Опции: requires, create, activate, deactivate
|
|
383
|
+
* @returns ServiceDefinition с методом register(container)
|
|
384
|
+
*
|
|
385
|
+
* @example
|
|
386
|
+
* // С фабрикой create (сервис-класс регистрируется напрямую)
|
|
387
|
+
* const authService = defineService(AuthServiceToken, {
|
|
388
|
+
* create: () => new AuthService(),
|
|
389
|
+
* })
|
|
390
|
+
* authService.register(appContainer)
|
|
391
|
+
*
|
|
392
|
+
* @example
|
|
393
|
+
* // С lifecycle-хуками (без create)
|
|
394
|
+
* const dataService = defineService(DataServiceToken, {
|
|
395
|
+
* requires: [RepoToken] as const,
|
|
396
|
+
* activate: ([repo], params) => repo.loadData(params.id),
|
|
397
|
+
* deactivate: ([repo]) => repo.cleanup(),
|
|
398
|
+
* })
|
|
399
|
+
* dataService.register(appContainer)
|
|
400
|
+
*/
|
|
401
|
+
declare function defineService<T, Deps extends readonly Token<unknown>[] = readonly []>(token: Token<T>, options: DefineServiceOptions<Deps, T>): ServiceDefinition<T, Deps>;
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Определяет ViewModel с IoC-биндингом и proxy для прямого импорта из view.
|
|
405
|
+
* Поддерживает deferred resolution — контейнер не нужен на момент импорта модуля.
|
|
406
|
+
* Метод resolve() делегирует резолв стратегии активного host-адаптера
|
|
407
|
+
* (см. `@foxford/den/adapter` → `installResolver`).
|
|
408
|
+
*
|
|
409
|
+
* @template T - Тип ViewModel
|
|
410
|
+
* @template Deps - Кортеж токенов зависимостей (по умолчанию пустой кортеж)
|
|
411
|
+
* @param token - Токен для регистрации VM в IoC
|
|
412
|
+
* @param options - Опции: requires, create
|
|
413
|
+
* @returns ViewModelDefinition с методами register(container) и resolve()
|
|
414
|
+
*
|
|
415
|
+
* @example
|
|
416
|
+
* // home.vm.ts — создаётся при импорте модуля
|
|
417
|
+
* export const homeVm = defineViewModel(HomeVmToken, {
|
|
418
|
+
* requires: [UserServiceToken] as const,
|
|
419
|
+
* create: ([userService]) => ({
|
|
420
|
+
* title: userService.getTitle(),
|
|
421
|
+
* }),
|
|
422
|
+
* })
|
|
423
|
+
*
|
|
424
|
+
* // home.view.tsx — контейнер уже инициализирован
|
|
425
|
+
* const vm = await homeVm.use()
|
|
426
|
+
*/
|
|
427
|
+
declare function defineViewModel<T, Deps extends readonly Token<unknown>[] = readonly []>(token: Token<T>, options: DefineViewModelOptions<Deps, T>): ViewModelDefinition<T, Deps>;
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Определяет репозиторий уровня данных с IoC-биндингом.
|
|
431
|
+
* Регистрирует Singleton-фабрику в IoC-контейнере.
|
|
432
|
+
* В отличие от defineService, репозиторий не имеет activate/deactivate lifecycle —
|
|
433
|
+
* он предоставляет методы доступа к данным без управления состоянием страницы.
|
|
434
|
+
*
|
|
435
|
+
* @template T - Тип регистрируемого репозитория
|
|
436
|
+
* @template Deps - Кортеж токенов зависимостей (по умолчанию пустой кортеж)
|
|
437
|
+
* @param token - Токен для регистрации репозитория в IoC
|
|
438
|
+
* @param options - Опции: requires, create
|
|
439
|
+
* @returns RepositoryDefinition с методом register(container)
|
|
440
|
+
*
|
|
441
|
+
* @example
|
|
442
|
+
* const userRepo = defineRepository(UserRepoToken, {
|
|
443
|
+
* requires: [HttpServiceToken] as const,
|
|
444
|
+
* create: ([http]) => ({
|
|
445
|
+
* getUser: (id: string) => http.get(`/users/${id}`),
|
|
446
|
+
* saveUser: (data: UserData) => http.post('/users', data),
|
|
447
|
+
* }),
|
|
448
|
+
* })
|
|
449
|
+
* userRepo.register(appContainer)
|
|
450
|
+
*/
|
|
451
|
+
declare function defineRepository<T, Deps extends readonly Token<unknown>[] = readonly []>(token: Token<T>, options: DefineRepositoryOptions<Deps, T>): RepositoryDefinition<T, Deps>;
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Дескриптор слота — host-агностичен: имя + непрозрачный `view` + опциональные `units`.
|
|
455
|
+
*
|
|
456
|
+
* `view` типизирован как `unknown` — ядро не знает про React/Vue: рендерит его view-адаптер
|
|
457
|
+
* (`Slot` из `@foxford/den-react`). Слот — самостоятельная `define*`-единица: любой пакет
|
|
458
|
+
* экспортит его напрямую, а размещением управляет оркестратор (не `definePage`).
|
|
459
|
+
*/
|
|
460
|
+
interface SlotDefinition {
|
|
461
|
+
/** Дискриминатор типа. */
|
|
462
|
+
readonly __type: 'slot';
|
|
463
|
+
/** Имя слота — по нему оркестратор решает, чем и куда его заполнить. */
|
|
464
|
+
readonly name: string;
|
|
465
|
+
/** Непрозрачная ссылка на view слота (компонент view-фреймворка). */
|
|
466
|
+
readonly view: unknown;
|
|
467
|
+
/** Data/Business единицы слота (изолированная секция). */
|
|
468
|
+
readonly units: readonly Definition<unknown>[];
|
|
469
|
+
/**
|
|
470
|
+
* Регистрирует единицы слота и кладёт сам слот в `SlotRegistry` контейнера.
|
|
471
|
+
* @param container - Контейнер (острова/страницы/запроса)
|
|
472
|
+
*/
|
|
473
|
+
register(container: Container): void;
|
|
474
|
+
}
|
|
475
|
+
/** Опции `defineSlot`. */
|
|
476
|
+
interface DefineSlotOptions {
|
|
477
|
+
/** Имя слота. */
|
|
478
|
+
name: string;
|
|
479
|
+
/** Непрозрачная ссылка на view слота. */
|
|
480
|
+
view: unknown;
|
|
481
|
+
/** Data/Business единицы слота (по умолчанию пусто). */
|
|
482
|
+
units?: readonly Definition<unknown>[];
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Объявляет слот — самостоятельную `define*`-единицу расширения.
|
|
486
|
+
*
|
|
487
|
+
* `register(container)` регистрирует `units` и добавляет `{ name, view }` в `SlotRegistry`
|
|
488
|
+
* контейнера (get-or-create). Оркестратор потом резолвит реестр и решает, чем/куда
|
|
489
|
+
* заполнить слот. Рендерит слот view-адаптер (`Slot` из `@foxford/den-react`).
|
|
490
|
+
*
|
|
491
|
+
* @param options - Имя, непрозрачный `view` и опциональные `units`
|
|
492
|
+
* @returns Дескриптор `SlotDefinition`
|
|
493
|
+
*
|
|
494
|
+
* @example
|
|
495
|
+
* // любой пакет — экспортит слот-юнит, не зная, куда он смонтируется
|
|
496
|
+
* export const asideSlot = defineSlot({ name: 'market:aside', view: AsideView })
|
|
497
|
+
*/
|
|
498
|
+
declare function defineSlot({ name, view, units }: DefineSlotOptions): SlotDefinition;
|
|
499
|
+
|
|
500
|
+
export { type AppConfig as A, type DefineGuardOptions as D, type ExtensionConfig as E, type GuardDefinition as G, type LayoutConfig as L, type RepositoryDefinition as R, type ServiceDefinition as S, type ViewModelDefinition as V, type DefineAppOptions as a, type AppDefinition as b, type DefineExtensionOptions as c, type ExtensionDefinition as d, type ActionGuard as e, type DefineActionGuardOptions as f, type ActionGuardDefinition as g, type DefineLayoutOptions as h, type LayoutDefinition as i, type LayerConfig as j, type DefineLayerOptions as k, type LayerDefinition as l, type DefineRepositoryOptions as m, type DefineServiceOptions as n, type DefineSlotOptions as o, type DefineViewModelOptions as p, type Definition as q, type SlotDefinition as r, defineRepository as s, defineService as t, defineSlot as u, defineViewModel as v };
|