@mediacubeco/base 0.0.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/helpers/index.cjs +1 -0
- package/dist/helpers/index.d.ts +513 -0
- package/dist/helpers/index.mjs +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +1243 -0
- package/dist/index.mjs +1 -0
- package/dist/services/index.cjs +1 -0
- package/dist/services/index.d.ts +174 -0
- package/dist/services/index.mjs +1 -0
- package/dist/types/index.cjs +1 -0
- package/dist/types/index.d.ts +195 -0
- package/dist/types/index.mjs +1 -0
- package/dist/utils/index.cjs +1 -0
- package/dist/utils/index.d.ts +587 -0
- package/dist/utils/index.mjs +1 -0
- package/package.json +51 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,1243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* @description
|
|
4
|
+
* Общие утилитарные типы для проектов на TypeScript.
|
|
5
|
+
* Содержит типы для примитивов (Nullable, NotNullable), структур данных
|
|
6
|
+
* (BaseRecord, Entry, List), функций (Callback, AsyncCallback) и вспомогательные
|
|
7
|
+
* утилиты (KeyOf, ValueOf, Decrement, Increment и др.).
|
|
8
|
+
* Модуль не содержит рантайм-кода — только типы.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* type User = { id: number; name?: string | null }
|
|
13
|
+
*
|
|
14
|
+
* type UserId = ValueOf<Pick<User, 'id'>>
|
|
15
|
+
* type SafeName = NotNullable<User['name']>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
type NullablePrimitive = undefined | null;
|
|
19
|
+
/**
|
|
20
|
+
* Ключи объекта `Data`. Удобный псевдоним для `keyof`.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* type UserKeys = KeyOf<{ id: number; name: string }> // 'id' | 'name'
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
type KeyOf<Data> = keyof Data;
|
|
28
|
+
/**
|
|
29
|
+
* Объединение всех возможных значений объекта `Data`.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* type UserValue = ValueOf<{ id: number; name: string }> // number | string
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
type ValueOf<Data> = Data[KeyOf<Data>];
|
|
37
|
+
/** Тип одного элемента массива или кортежа. */
|
|
38
|
+
type IterableOf<Data extends unknown[]> = Data[number];
|
|
39
|
+
/** Служебный псевдоним для `never` или другого "пустого" значения. */
|
|
40
|
+
type Nothing<Data = never> = Data;
|
|
41
|
+
/**
|
|
42
|
+
* Тип, допускающий null или undefined (например для опциональных полей).
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* type MaybeName = Nullable<string> // string | null | undefined
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
type Nullable<Data = undefined> = Data | NullablePrimitive;
|
|
50
|
+
/**
|
|
51
|
+
* Тип, исключающий null и undefined (гарантированно заданное значение).
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* type Name = NotNullable<string | null | undefined> // string
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
type NotNullable<Data = undefined> = Exclude<Data, NullablePrimitive>;
|
|
59
|
+
/** Число или значение, которое можно привести к числу, включая строковый литерал числа. */
|
|
60
|
+
type Numerable<Data = number> = Data | number | `${number}`;
|
|
61
|
+
/** Значение, которое может быть как синхронным, так и обёрнутым в Promise. */
|
|
62
|
+
type MaybeAsync<Data = never> = Data | Promise<Data>;
|
|
63
|
+
/**
|
|
64
|
+
* Допустимые ключи объекта (как в Record).
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* type Key = BaseKey // string | number | symbol
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
type BaseKey = string | number | symbol;
|
|
72
|
+
/**
|
|
73
|
+
* Массив элементов (базовый тип для списков).
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* type IdList = BaseList<number> // number[]
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
type BaseList<Item = unknown> = Item[];
|
|
81
|
+
/**
|
|
82
|
+
* Объект с ключами Key и значениями Value (обобщение Record).
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* type UserMap = BaseRecord<string, 'name' | 'role'>
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
type BaseRecord<Value = unknown, Key extends BaseKey = BaseKey> = Record<Key, Value>;
|
|
90
|
+
/** Объединение `{ key, value }` для каждой пары ключ-значение объекта. */
|
|
91
|
+
type Entry<Data> = {
|
|
92
|
+
[Key in KeyOf<Data>]: {
|
|
93
|
+
key: Key;
|
|
94
|
+
value: Data[Key];
|
|
95
|
+
};
|
|
96
|
+
}[KeyOf<Data>];
|
|
97
|
+
/** Делает указанные ключи обязательными, а остальные оставляет опциональными. */
|
|
98
|
+
type Include<Data, Key extends KeyOf<Data>> = Required<Pick<Data, Key>> & Partial<Omit<Data, Key>>;
|
|
99
|
+
/** Разделяет объект на кортеж из выбранных и оставшихся свойств. */
|
|
100
|
+
type Divide<Data, Key extends KeyOf<Data>> = [Pick<Data, Key>, Omit<Data, Key>];
|
|
101
|
+
/** Заполняет набор ключей значениями из `Data` или `DefaultValue`, если ключ отсутствует. */
|
|
102
|
+
type Filled<Data, Key extends BaseKey, DefaultValue = undefined> = {
|
|
103
|
+
[SomeKey in Key]: SomeKey extends KeyOf<Data> ? Data[SomeKey] : DefaultValue;
|
|
104
|
+
};
|
|
105
|
+
/** Общая часть нескольких объектов: только совпадающие ключи и совместимые типы значений. */
|
|
106
|
+
type Shared<DataList extends BaseList[], FirstData extends IterableOf<DataList> = IterableOf<DataList>, SecondData extends IterableOf<DataList> = IterableOf<DataList>> = {
|
|
107
|
+
[Key in KeyOf<FirstData> & KeyOf<SecondData>]: FirstData[Key] extends SecondData[Key] ? FirstData[Key] : never;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Кортеж фиксированной длины `Length`, заполненный элементами типа `Item`.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* type Pair = List<2, string> // [string, string]
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
type List<Length extends number, Item = unknown, ResultList extends Item[] = []> = Length extends ResultList['length'] ? ResultList : List<Length, Item, [...ResultList, Item]>;
|
|
118
|
+
/**
|
|
119
|
+
* Уменьшает числовой литерал на единицу.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* type Two = Decrement<3> // 2
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
type Decrement<Value extends number> = List<Value> extends [infer _, ...infer Rest] ? Rest['length'] : never;
|
|
127
|
+
/**
|
|
128
|
+
* Увеличивает числовой литерал на единицу.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* type Four = Increment<3> // 4
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
type Increment<Value extends number> = [...List<Value>, IterableOf<List<Value>>]['length'];
|
|
136
|
+
/**
|
|
137
|
+
* Функция без аргументов и возвращаемого значения.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* const noop: Noop = () => {}
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
type Noop = () => void;
|
|
145
|
+
/**
|
|
146
|
+
* Синхронная функция с заданным списком параметров и результатом.
|
|
147
|
+
* @template ParamList - кортеж типов аргументов
|
|
148
|
+
* @template Result - тип возвращаемого значения
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* type Sum = Callback<[number, number], number>
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
type Callback<ParamList extends BaseList = BaseList, Result = void> = (...paramList: ParamList) => Result;
|
|
156
|
+
/**
|
|
157
|
+
* Асинхронная функция с заданным списком параметров и результатом.
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* type FetchUser = AsyncCallback<[string], { id: string }>
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
type AsyncCallback<ParamList extends BaseList = BaseList, Result = void> = (...paramList: ParamList) => Promise<Result>;
|
|
165
|
+
/** Любая синхронная функция без ограничений на аргументы и результат. */
|
|
166
|
+
type AnyCallback = Callback<any[], any>;
|
|
167
|
+
/** Любая асинхронная функция без ограничений на аргументы и результат. */
|
|
168
|
+
type AnyAsyncCallback = AsyncCallback<any[], any>;
|
|
169
|
+
/** Извлекает кортеж аргументов из типа функции. */
|
|
170
|
+
type CallbackParamList<Callback> = Callback extends (...args: infer ParamList) => any ? ParamList : never;
|
|
171
|
+
/** Извлекает тип возвращаемого значения из типа функции. */
|
|
172
|
+
type CallbackResult<Callback> = Callback extends (...args: any) => infer Result ? Result : any;
|
|
173
|
+
|
|
174
|
+
type ExtraSizeRange<Level extends number, Value extends string, Result extends string = `x${Value}`> = Level extends 1 ? Result : ExtraSizeRange<Decrement<Level>, Value, `${Level}x${Value}` | Result>;
|
|
175
|
+
/**
|
|
176
|
+
* Набор строковых размеров относительно базовых `s`, `m`, `l`.
|
|
177
|
+
* Позволяет расширять диапазон вниз (`xs`, `2xs`, ...) и вверх (`xl`, `2xl`, ...).
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* type ButtonSize = SizeRange<2, 1> // '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl'
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
type SizeRange<ExtraLevelDown extends number = 1, ExtraLevelUp extends number = 1> = ExtraSizeRange<ExtraLevelDown, 's'> | 's' | 'm' | 'l' | ExtraSizeRange<ExtraLevelUp, 'l'>;
|
|
185
|
+
/**
|
|
186
|
+
* Объединение чисел от `1` до `Level`.
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* type Steps = LevelRange<3> // 1 | 2 | 3
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
type LevelRange<Level extends number, Result extends number = Level> = Level extends 1 ? Result : LevelRange<Decrement<Level>, Result | Decrement<Level>>;
|
|
194
|
+
|
|
195
|
+
declare class Event {
|
|
196
|
+
isDefaultPrevented: boolean;
|
|
197
|
+
constructor();
|
|
198
|
+
preventDefault(): void;
|
|
199
|
+
overrideDefault(): void;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
type EventEmitterDefaultAction = Noop;
|
|
203
|
+
type EventEmitterListener<Params> = Callback<[Event & Params]>;
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Имена событий, которые генерирует `ErrorHandler`.
|
|
207
|
+
*/
|
|
208
|
+
declare enum ErrorHandlerEventName {
|
|
209
|
+
/** Ошибка была залогирована и передана подписчикам без выбрасывания. */
|
|
210
|
+
Capture = "capture",
|
|
211
|
+
/** Зарезервированное имя события для проброса ошибки дальше по цепочке. */
|
|
212
|
+
Forward = "forward"
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Сообщение об ошибке для пользователя или лога.
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* ```typescript
|
|
220
|
+
* const message: ErrorHandlerMessage = 'Request failed'
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
type ErrorHandlerMessage = string;
|
|
224
|
+
/**
|
|
225
|
+
* Любое значение, которое может быть перехвачено как ошибка (Error или unknown).
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* const error: ErrorHandlerError = new Error('Timeout')
|
|
230
|
+
* ```
|
|
231
|
+
*/
|
|
232
|
+
type ErrorHandlerError = unknown;
|
|
233
|
+
/**
|
|
234
|
+
* Словарь ошибок валидации (например поле → сообщение или список сообщений).
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* const errors: ErrorHandlerErrors<'email'> = { email: 'Invalid email' }
|
|
239
|
+
* ```
|
|
240
|
+
*/
|
|
241
|
+
type ErrorHandlerErrors<Key extends BaseKey = BaseKey, Value = Nullable<string | string[]>> = BaseRecord<Value, Key>;
|
|
242
|
+
/**
|
|
243
|
+
* Результат разбора ошибки через ErrorHandler.parse.
|
|
244
|
+
* Используется для единообразного представления ошибок API (message, status, errors, isExternal).
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* ```typescript
|
|
248
|
+
* const result: ErrorHandlerParseResult<'email'> = {
|
|
249
|
+
* message: 'Validation failed',
|
|
250
|
+
* status: 422,
|
|
251
|
+
* errors: { email: 'Invalid email' },
|
|
252
|
+
* isExternal: true
|
|
253
|
+
* }
|
|
254
|
+
* ```
|
|
255
|
+
*/
|
|
256
|
+
type ErrorHandlerParseResult<Key extends BaseKey> = {
|
|
257
|
+
message: string;
|
|
258
|
+
status: number;
|
|
259
|
+
errors: ErrorHandlerErrors<Key>;
|
|
260
|
+
isExternal: boolean;
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* Конфиг одного «кейса» для ErrorHandler.parse: проверка типа ошибки и функция разбора.
|
|
264
|
+
* Регистрируется через ErrorHandler.case().
|
|
265
|
+
*
|
|
266
|
+
* @example
|
|
267
|
+
* ```typescript
|
|
268
|
+
* const config: ErrorHandlerCaseConfig<Response> = {
|
|
269
|
+
* check: (error): error is Response => error instanceof Response,
|
|
270
|
+
* parse: (error, defaultResult) => ({ ...defaultResult, status: error.status })
|
|
271
|
+
* }
|
|
272
|
+
* ```
|
|
273
|
+
*/
|
|
274
|
+
type ErrorHandlerCaseConfig<ErrorHandlerCaseError = any> = {
|
|
275
|
+
check: <Key extends BaseKey>(error: ErrorHandlerError, defaultResult: ErrorHandlerParseResult<Key>) => error is ErrorHandlerCaseError;
|
|
276
|
+
parse: <Key extends BaseKey>(error: ErrorHandlerCaseError, defaultResult: ErrorHandlerParseResult<Key>) => ErrorHandlerParseResult<Key>;
|
|
277
|
+
};
|
|
278
|
+
/**
|
|
279
|
+
* Конфигурация при логировании/пробросе ошибки (signal, опциональные message, payload, stack).
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* const config: ErrorHandlerConfig = {
|
|
284
|
+
* signal: 'api',
|
|
285
|
+
* message: 'Cannot load profile'
|
|
286
|
+
* }
|
|
287
|
+
* ```
|
|
288
|
+
*/
|
|
289
|
+
type ErrorHandlerConfig = {
|
|
290
|
+
signal: string;
|
|
291
|
+
message?: ErrorHandlerMessage;
|
|
292
|
+
payload?: BaseRecord<unknown>;
|
|
293
|
+
stack?: string[];
|
|
294
|
+
};
|
|
295
|
+
/**
|
|
296
|
+
* Параметры события capture/forward: ошибка и конфиг.
|
|
297
|
+
*
|
|
298
|
+
* @example
|
|
299
|
+
* ```typescript
|
|
300
|
+
* const params: ErrorHandlerEventParams = {
|
|
301
|
+
* error: new Error('Timeout'),
|
|
302
|
+
* config: { signal: 'api' }
|
|
303
|
+
* }
|
|
304
|
+
* ```
|
|
305
|
+
*/
|
|
306
|
+
type ErrorHandlerEventParams = {
|
|
307
|
+
error: ErrorHandlerError;
|
|
308
|
+
config: ErrorHandlerConfig;
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Централизованная обработка ошибок: логирование, подписка на события, разбор ошибок по кейсам.
|
|
313
|
+
* Статический класс; подписка через on('capture', …), регистрация кейсов через case().
|
|
314
|
+
* capture — залогировать и вызвать событие, не бросать; forward — залогировать, вызвать событие и пробросить.
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```typescript
|
|
318
|
+
* ErrorHandler.on(ErrorHandlerEventName.Capture, ({ error }) => {
|
|
319
|
+
* console.error(error)
|
|
320
|
+
* })
|
|
321
|
+
*
|
|
322
|
+
* ErrorHandler.capture(new Error('Request failed'), { signal: 'api' })
|
|
323
|
+
* ```
|
|
324
|
+
*/
|
|
325
|
+
declare class ErrorHandler {
|
|
326
|
+
private static eventEmitter;
|
|
327
|
+
private static caseList;
|
|
328
|
+
private static log;
|
|
329
|
+
/**
|
|
330
|
+
* Доступ к подписке на события обработчика ошибок.
|
|
331
|
+
* Обычно используется как `ErrorHandler.on(ErrorHandlerEventName.Capture, listener)`.
|
|
332
|
+
*
|
|
333
|
+
* @returns Метод подписки `EventEmitter.on`
|
|
334
|
+
*
|
|
335
|
+
* @example
|
|
336
|
+
* ```typescript
|
|
337
|
+
* ErrorHandler.on(ErrorHandlerEventName.Capture, ({ config }) => {
|
|
338
|
+
* console.log(config.signal)
|
|
339
|
+
* })
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
static get on(): (name: ErrorHandlerEventName, listener: EventEmitterListener<ErrorHandlerEventParams>) => () => void;
|
|
343
|
+
/**
|
|
344
|
+
* Доступ к удалению конкретного подписчика обработчика ошибок.
|
|
345
|
+
*
|
|
346
|
+
* @returns Метод отписки `EventEmitter.off`
|
|
347
|
+
*
|
|
348
|
+
* @example
|
|
349
|
+
* ```typescript
|
|
350
|
+
* ErrorHandler.off(ErrorHandlerEventName.Capture, listener)
|
|
351
|
+
* ```
|
|
352
|
+
*/
|
|
353
|
+
static get off(): (name: ErrorHandlerEventName, listener: EventEmitterListener<ErrorHandlerEventParams>) => void;
|
|
354
|
+
/**
|
|
355
|
+
* Доступ к очистке подписок по имени события.
|
|
356
|
+
*
|
|
357
|
+
* @returns Метод очистки `EventEmitter.clear`
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* ```typescript
|
|
361
|
+
* ErrorHandler.clear(ErrorHandlerEventName.Capture)
|
|
362
|
+
* ```
|
|
363
|
+
*/
|
|
364
|
+
static get clear(): (name: ErrorHandlerEventName) => void;
|
|
365
|
+
/**
|
|
366
|
+
* Создаёт экземпляр Error с сообщением и опциональной причиной (cause).
|
|
367
|
+
*
|
|
368
|
+
* @param message - Текст ошибки
|
|
369
|
+
* @param error - Исходная ошибка или причина
|
|
370
|
+
* @returns Новый объект Error (не бросается)
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* ```typescript
|
|
374
|
+
* const error = ErrorHandler.create('Request failed', new Error('Timeout'))
|
|
375
|
+
* ```
|
|
376
|
+
*/
|
|
377
|
+
static create(message: ErrorHandlerMessage, error?: ErrorHandlerError): Error;
|
|
378
|
+
/**
|
|
379
|
+
* Создаёт ошибку и немедленно бросает её (never).
|
|
380
|
+
* Используется для заглушек (например «Not implemented»).
|
|
381
|
+
*
|
|
382
|
+
* @param message - Текст ошибки
|
|
383
|
+
* @param error - Исходная ошибка или причина
|
|
384
|
+
* @returns Управление не возвращается, так как метод выбрасывает исключение
|
|
385
|
+
*
|
|
386
|
+
* @example
|
|
387
|
+
* ```typescript
|
|
388
|
+
* ErrorHandler.throw('Not implemented')
|
|
389
|
+
* ```
|
|
390
|
+
*/
|
|
391
|
+
static throw(message: ErrorHandlerMessage, error?: ErrorHandlerError): never;
|
|
392
|
+
/**
|
|
393
|
+
* Логирует ошибку и эмитит событие 'capture'. Ошибку не бросает.
|
|
394
|
+
* Подписчики могут отправить данные в мониторинг и т.д.
|
|
395
|
+
*
|
|
396
|
+
* @param error - Ошибка или любое перехваченное значение
|
|
397
|
+
* @param config - Конфигурация логирования и сопровождающих данных
|
|
398
|
+
*
|
|
399
|
+
* @example
|
|
400
|
+
* ```typescript
|
|
401
|
+
* ErrorHandler.capture(new Error('Request failed'), {
|
|
402
|
+
* signal: 'api',
|
|
403
|
+
* message: 'Cannot load profile'
|
|
404
|
+
* })
|
|
405
|
+
* ```
|
|
406
|
+
*/
|
|
407
|
+
static capture(error: ErrorHandlerError, config: ErrorHandlerConfig): void;
|
|
408
|
+
/**
|
|
409
|
+
* Логирует ошибку, эмитит 'capture' и пробрасывает ошибку дальше (never).
|
|
410
|
+
*
|
|
411
|
+
* @param error - Ошибка или любое перехваченное значение
|
|
412
|
+
* @param config - Конфигурация логирования и сопровождающих данных
|
|
413
|
+
* @returns Управление не возвращается, так как метод выбрасывает ошибку дальше
|
|
414
|
+
*
|
|
415
|
+
* @example
|
|
416
|
+
* ```typescript
|
|
417
|
+
* ErrorHandler.forward(new Error('Forbidden'), {
|
|
418
|
+
* signal: 'auth'
|
|
419
|
+
* })
|
|
420
|
+
* ```
|
|
421
|
+
*/
|
|
422
|
+
static forward(error: ErrorHandlerError, config: ErrorHandlerConfig): never;
|
|
423
|
+
/**
|
|
424
|
+
* Регистрирует кейс для parse: при совпадении check() будет вызван parse().
|
|
425
|
+
* Порядок регистрации важен — используется первый подходящий кейс.
|
|
426
|
+
*
|
|
427
|
+
* @param config - Пара функций `check` и `parse` для пользовательского разбора ошибок
|
|
428
|
+
*
|
|
429
|
+
* @example
|
|
430
|
+
* ```typescript
|
|
431
|
+
* ErrorHandler.case({
|
|
432
|
+
* check: (error): error is Response => error instanceof Response,
|
|
433
|
+
* parse: (error, defaultResult) => ({
|
|
434
|
+
* ...defaultResult,
|
|
435
|
+
* status: error.status
|
|
436
|
+
* })
|
|
437
|
+
* })
|
|
438
|
+
* ```
|
|
439
|
+
*/
|
|
440
|
+
static case<ErrorHandlerCaseError>(config: ErrorHandlerCaseConfig<ErrorHandlerCaseError>): void;
|
|
441
|
+
/**
|
|
442
|
+
* Разбирает ошибку в единый формат (message, status, errors, isExternal).
|
|
443
|
+
* Сначала проверяются зарегистрированные кейсы; если ни один не подошёл — базовый разбор (Error.message или default).
|
|
444
|
+
*
|
|
445
|
+
* @param error - Ошибка или любое неизвестное значение
|
|
446
|
+
* @returns Унифицированный результат разбора ошибки
|
|
447
|
+
*
|
|
448
|
+
* @example
|
|
449
|
+
* ```typescript
|
|
450
|
+
* const parsed = ErrorHandler.parse(new Error('Request failed'))
|
|
451
|
+
* console.log(parsed.message)
|
|
452
|
+
* ```
|
|
453
|
+
*/
|
|
454
|
+
static parse<Key extends BaseKey>(error: ErrorHandlerError): ErrorHandlerParseResult<Key>;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Лёгкий EventEmitter с поддержкой подписок, отписок и `defaultAction`.
|
|
459
|
+
* Слушатель получает объект события, объединённый с переданными параметрами emit.
|
|
460
|
+
*
|
|
461
|
+
* @example
|
|
462
|
+
* ```typescript
|
|
463
|
+
* const emitter = new EventEmitter<'save', { id: number }>()
|
|
464
|
+
*
|
|
465
|
+
* emitter.on('save', (event) => {
|
|
466
|
+
* console.log(event.id)
|
|
467
|
+
* })
|
|
468
|
+
*
|
|
469
|
+
* emitter.emit('save', { id: 1 })
|
|
470
|
+
* ```
|
|
471
|
+
*/
|
|
472
|
+
declare class EventEmitter<EventName extends string = string, EventParams extends Nullable<object> = undefined> {
|
|
473
|
+
private subscriptions;
|
|
474
|
+
constructor();
|
|
475
|
+
/**
|
|
476
|
+
* Вызывает событие и передаёт параметры всем подписчикам.
|
|
477
|
+
* Если ни один слушатель не отменил стандартное действие, дополнительно вызывается `defaultAction`.
|
|
478
|
+
*
|
|
479
|
+
* @param name - Имя события
|
|
480
|
+
* @param params - Дополнительные параметры события
|
|
481
|
+
* @param defaultAction - Функция, которая выполнится после слушателей, если действие не отменено
|
|
482
|
+
*
|
|
483
|
+
* @example
|
|
484
|
+
* ```typescript
|
|
485
|
+
* emitter.emit('save', { id: 1 }, () => {
|
|
486
|
+
* console.log('saved')
|
|
487
|
+
* })
|
|
488
|
+
* ```
|
|
489
|
+
*/
|
|
490
|
+
emit(name: EventName, params?: EventParams, defaultAction?: EventEmitterDefaultAction): void;
|
|
491
|
+
/**
|
|
492
|
+
* Подписывает слушатель на событие.
|
|
493
|
+
*
|
|
494
|
+
* @param name - Имя события
|
|
495
|
+
* @param listener - Обработчик события
|
|
496
|
+
* @returns Функция для отписки от события
|
|
497
|
+
*
|
|
498
|
+
* @example
|
|
499
|
+
* ```typescript
|
|
500
|
+
* const unsubscribe = emitter.on('save', (event) => {
|
|
501
|
+
* console.log(event.id)
|
|
502
|
+
* })
|
|
503
|
+
*
|
|
504
|
+
* unsubscribe()
|
|
505
|
+
* ```
|
|
506
|
+
*/
|
|
507
|
+
on(name: EventName, listener: EventEmitterListener<EventParams>): () => void;
|
|
508
|
+
/**
|
|
509
|
+
* Удаляет конкретный слушатель из подписки на событие.
|
|
510
|
+
*
|
|
511
|
+
* @param name - Имя события
|
|
512
|
+
* @param listener - Слушатель, которого нужно удалить
|
|
513
|
+
*
|
|
514
|
+
* @example
|
|
515
|
+
* ```typescript
|
|
516
|
+
* emitter.off('save', listener)
|
|
517
|
+
* ```
|
|
518
|
+
*/
|
|
519
|
+
off(name: EventName, listener: EventEmitterListener<EventParams>): void;
|
|
520
|
+
/**
|
|
521
|
+
* Полностью очищает подписку на указанное событие.
|
|
522
|
+
*
|
|
523
|
+
* @param name - Имя события
|
|
524
|
+
*
|
|
525
|
+
* @example
|
|
526
|
+
* ```typescript
|
|
527
|
+
* emitter.clear('save')
|
|
528
|
+
* ```
|
|
529
|
+
*/
|
|
530
|
+
clear(name: EventName): void;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
type LogSignal = string;
|
|
534
|
+
type LogParamList = any[];
|
|
535
|
+
type LogStyles = string;
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Статический helper для форматированного вывода сообщений в консоль.
|
|
539
|
+
* Поддерживает обычные сообщения, стилизованные группы и набор `formatted`-методов с signal.
|
|
540
|
+
*
|
|
541
|
+
* @example
|
|
542
|
+
* ```typescript
|
|
543
|
+
* Log.info('App started')
|
|
544
|
+
* Log.formatted.success('auth', 'Signed in')
|
|
545
|
+
* ```
|
|
546
|
+
*/
|
|
547
|
+
declare class Log {
|
|
548
|
+
#private;
|
|
549
|
+
/**
|
|
550
|
+
* Набор методов для логирования с предварительным форматированием по signal.
|
|
551
|
+
*
|
|
552
|
+
* @example
|
|
553
|
+
* ```typescript
|
|
554
|
+
* Log.formatted.warning('api', 'Slow response')
|
|
555
|
+
* ```
|
|
556
|
+
*/
|
|
557
|
+
static readonly formatted: {
|
|
558
|
+
info: (paramList_0: string, ...paramList: any[]) => void;
|
|
559
|
+
success: (paramList_0: string, ...paramList: any[]) => void;
|
|
560
|
+
warning: (paramList_0: string, ...paramList: any[]) => void;
|
|
561
|
+
danger: (paramList_0: string, ...paramList: any[]) => void;
|
|
562
|
+
};
|
|
563
|
+
/**
|
|
564
|
+
* Открывает группу логов в консоли и выводит её заголовок.
|
|
565
|
+
*
|
|
566
|
+
* @param signal - Короткий идентификатор группы
|
|
567
|
+
* @param styles - Дополнительные CSS-стили для заголовка
|
|
568
|
+
* @param paramList - Дополнительные данные, которые будут выведены вместе с signal
|
|
569
|
+
*
|
|
570
|
+
* @example
|
|
571
|
+
* ```typescript
|
|
572
|
+
* Log.startGroup('profile', 'color: purple;', { id: 1 })
|
|
573
|
+
* ```
|
|
574
|
+
*/
|
|
575
|
+
static startGroup(signal: LogSignal, styles?: LogStyles, ...paramList: LogParamList): void;
|
|
576
|
+
/**
|
|
577
|
+
* Закрывает текущую группу логов в консоли.
|
|
578
|
+
*
|
|
579
|
+
* @example
|
|
580
|
+
* ```typescript
|
|
581
|
+
* Log.endGroup()
|
|
582
|
+
* ```
|
|
583
|
+
*/
|
|
584
|
+
static endGroup(): void;
|
|
585
|
+
/**
|
|
586
|
+
* Выводит информационное сообщение.
|
|
587
|
+
*
|
|
588
|
+
* @param paramList - Параметры для вывода в консоль
|
|
589
|
+
*
|
|
590
|
+
* @example
|
|
591
|
+
* ```typescript
|
|
592
|
+
* Log.info('Profile loaded', user)
|
|
593
|
+
* ```
|
|
594
|
+
*/
|
|
595
|
+
static info(...paramList: LogParamList): void;
|
|
596
|
+
/**
|
|
597
|
+
* Выводит сообщение об успешном результате.
|
|
598
|
+
*
|
|
599
|
+
* @param paramList - Параметры для вывода в консоль
|
|
600
|
+
*
|
|
601
|
+
* @example
|
|
602
|
+
* ```typescript
|
|
603
|
+
* Log.success('Profile saved')
|
|
604
|
+
* ```
|
|
605
|
+
*/
|
|
606
|
+
static success(...paramList: LogParamList): void;
|
|
607
|
+
/**
|
|
608
|
+
* Выводит предупреждение.
|
|
609
|
+
*
|
|
610
|
+
* @param paramList - Параметры для вывода в консоль
|
|
611
|
+
*
|
|
612
|
+
* @example
|
|
613
|
+
* ```typescript
|
|
614
|
+
* Log.warning('Retry in progress')
|
|
615
|
+
* ```
|
|
616
|
+
*/
|
|
617
|
+
static warning(...paramList: LogParamList): void;
|
|
618
|
+
/**
|
|
619
|
+
* Выводит сообщение об ошибке.
|
|
620
|
+
*
|
|
621
|
+
* @param paramList - Параметры для вывода в консоль
|
|
622
|
+
*
|
|
623
|
+
* @example
|
|
624
|
+
* ```typescript
|
|
625
|
+
* Log.danger('Request failed', error)
|
|
626
|
+
* ```
|
|
627
|
+
*/
|
|
628
|
+
static danger(...paramList: LogParamList): void;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
type StorageItemConfig<Value = string> = Partial<StorageConfig> & {
|
|
632
|
+
defaultValue?: Value;
|
|
633
|
+
};
|
|
634
|
+
|
|
635
|
+
declare class StorageItem<Value = unknown> {
|
|
636
|
+
private key;
|
|
637
|
+
private model;
|
|
638
|
+
private config?;
|
|
639
|
+
constructor(key: string, model: StorageModel, config?: StorageConfig);
|
|
640
|
+
get(): Promise<Nullable<Value>>;
|
|
641
|
+
get(config: StorageItemConfig<Value>): Promise<Value>;
|
|
642
|
+
set(value: Value, config?: StorageItemConfig<Value>): Promise<void>;
|
|
643
|
+
delete(config?: StorageItemConfig<Value>): Promise<void>;
|
|
644
|
+
has(config?: StorageItemConfig<Value>): Promise<boolean>;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Тип экземпляра Storage после вызова .create(key): объект с полем key типа StorageItem<Value>.
|
|
649
|
+
* Позволяет типизировать storage.user, storage.settings и т.д.
|
|
650
|
+
*
|
|
651
|
+
* @example
|
|
652
|
+
* ```typescript
|
|
653
|
+
* type UserStorage = StorageInstance<'user', { name: string }>
|
|
654
|
+
* ```
|
|
655
|
+
*/
|
|
656
|
+
type StorageInstance<Key extends string = string, Value = unknown> = {
|
|
657
|
+
[key in Key]: StorageItem<Value>;
|
|
658
|
+
};
|
|
659
|
+
/**
|
|
660
|
+
* Абстрактная модель хранилища ключ–значение.
|
|
661
|
+
* Реализация может быть localStorage, sessionStorage, серверный API и т.д.
|
|
662
|
+
* Значения передаются как строки; сериализация/десериализация (например JSON) — в StorageItem.
|
|
663
|
+
*
|
|
664
|
+
* @example
|
|
665
|
+
* ```typescript
|
|
666
|
+
* const model: StorageModel = {
|
|
667
|
+
* get: (key) => localStorage.getItem(key),
|
|
668
|
+
* set: (key, value) => localStorage.setItem(key, value),
|
|
669
|
+
* delete: (key) => localStorage.removeItem(key)
|
|
670
|
+
* }
|
|
671
|
+
* ```
|
|
672
|
+
*/
|
|
673
|
+
type StorageModel = {
|
|
674
|
+
get: Callback<[string], MaybeAsync<Nullable<string>>>;
|
|
675
|
+
set: Callback<[string, string], MaybeAsync<void>>;
|
|
676
|
+
delete: Callback<[string], MaybeAsync<void>>;
|
|
677
|
+
};
|
|
678
|
+
/**
|
|
679
|
+
* Конфиг Storage/StorageItem: опция отладочного логирования через Log.
|
|
680
|
+
*
|
|
681
|
+
* @example
|
|
682
|
+
* ```typescript
|
|
683
|
+
* const config: StorageConfig = { withDebug: true }
|
|
684
|
+
* ```
|
|
685
|
+
*/
|
|
686
|
+
type StorageConfig = {
|
|
687
|
+
withDebug?: boolean;
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
/**
|
|
691
|
+
* Абстракция над ключ–значение хранилищем. Принимает модель (get/set/delete) и через .create(key)
|
|
692
|
+
* добавляет на экземпляр поле с StorageItem для данного ключа. Данные сериализуются в JSON в StorageItem.
|
|
693
|
+
*
|
|
694
|
+
* @example
|
|
695
|
+
* const model = { get: k => Promise.resolve(localStorage.getItem(k)), set: (k,v) => ..., delete: k => ... }
|
|
696
|
+
* const storage = new Storage(model).create('user')
|
|
697
|
+
* await storage.user.set({ name: 'John' })
|
|
698
|
+
* const user = await storage.user.get()
|
|
699
|
+
*/
|
|
700
|
+
declare class Storage {
|
|
701
|
+
private readonly model;
|
|
702
|
+
private readonly config?;
|
|
703
|
+
/**
|
|
704
|
+
* @param model - Реализация хранилища (например обёртка над localStorage или API)
|
|
705
|
+
* @param config - Опции (withDebug для отладочного логирования)
|
|
706
|
+
*
|
|
707
|
+
* @example
|
|
708
|
+
* ```typescript
|
|
709
|
+
* const storage = new Storage(model, { withDebug: true })
|
|
710
|
+
* ```
|
|
711
|
+
*/
|
|
712
|
+
constructor(model: StorageModel, config?: StorageConfig);
|
|
713
|
+
/**
|
|
714
|
+
* Должен вернуть все элементы хранилища.
|
|
715
|
+
* В базовой реализации не поддержан и выбрасывает `Not implemented`.
|
|
716
|
+
*
|
|
717
|
+
* @returns Никогда не завершается успешно в базовом классе
|
|
718
|
+
*
|
|
719
|
+
* @example
|
|
720
|
+
* ```typescript
|
|
721
|
+
* await storage.all() // Error: Not implemented
|
|
722
|
+
* ```
|
|
723
|
+
*/
|
|
724
|
+
all(): Promise<never>;
|
|
725
|
+
/**
|
|
726
|
+
* Должен очистить всё хранилище.
|
|
727
|
+
* В базовой реализации не поддержан и выбрасывает `Not implemented`.
|
|
728
|
+
*
|
|
729
|
+
* @returns Никогда не завершается успешно в базовом классе
|
|
730
|
+
*
|
|
731
|
+
* @example
|
|
732
|
+
* ```typescript
|
|
733
|
+
* await storage.clear() // Error: Not implemented
|
|
734
|
+
* ```
|
|
735
|
+
*/
|
|
736
|
+
clear(): Promise<never>;
|
|
737
|
+
/**
|
|
738
|
+
* Создаёт и привязывает к экземпляру Storage элемент хранилища с заданным ключом.
|
|
739
|
+
* Возвращает this с новым полем key типа StorageItem<Value> (типизация через StorageInstance).
|
|
740
|
+
*
|
|
741
|
+
* @param key - Имя ключа (и имени поля на экземпляре, например 'user' → storage.user)
|
|
742
|
+
* @returns this с добавленным полем key
|
|
743
|
+
*
|
|
744
|
+
* @example
|
|
745
|
+
* ```typescript
|
|
746
|
+
* const storage = new Storage(model).create<'user', { name: string }>('user')
|
|
747
|
+
* await storage.user.set({ name: 'John' })
|
|
748
|
+
* ```
|
|
749
|
+
*/
|
|
750
|
+
create<Key extends string = string, Value = unknown>(key: Key): this & StorageInstance<Key, Value>;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* Асинхронная задержка на указанное количество миллисекунд.
|
|
755
|
+
* Удобна для пауз между ретраями, анимациями или батч-обработкой.
|
|
756
|
+
*
|
|
757
|
+
* @param delay - Длительность ожидания в миллисекундах
|
|
758
|
+
* @returns Promise, который выполнится через указанное время
|
|
759
|
+
*
|
|
760
|
+
* @example
|
|
761
|
+
* ```typescript
|
|
762
|
+
* await wait(300)
|
|
763
|
+
* ```
|
|
764
|
+
*/
|
|
765
|
+
declare const wait: (delay: number) => Promise<unknown>;
|
|
766
|
+
/**
|
|
767
|
+
* Собирает объект из переданного значения и опционального исходного объекта.
|
|
768
|
+
* Поддерживает три сценария: вернуть объект как есть, слить два объекта или записать примитив по ключу.
|
|
769
|
+
*
|
|
770
|
+
* @param value - Объект целиком или значение для поля
|
|
771
|
+
* @param data - Исходный объект для объединения
|
|
772
|
+
* @param key - Ключ, в который нужно записать примитивное значение
|
|
773
|
+
* @returns Новый объект с объединёнными данными
|
|
774
|
+
*
|
|
775
|
+
* @example
|
|
776
|
+
* ```typescript
|
|
777
|
+
* compose({ name: 'John' }) // { name: 'John' }
|
|
778
|
+
* compose({ age: 18 }, { name: 'John' }) // { name: 'John', age: 18 }
|
|
779
|
+
* compose('John', { age: 18 }, 'name') // { age: 18, name: 'John' }
|
|
780
|
+
* ```
|
|
781
|
+
*/
|
|
782
|
+
declare function compose<Data extends object, Value extends Data>(value: Value): Value;
|
|
783
|
+
declare function compose<Data extends object, Value extends Data>(value: Value, data: Data): Data & Value;
|
|
784
|
+
declare function compose<Data extends object, Key extends KeyOf<Data>, Value extends Data[Key] | Data>(value: Value, data: Nullable<Partial<Data>>, key: Nullable<Key>): Data;
|
|
785
|
+
/**
|
|
786
|
+
* Возвращает значение объекта по ключу.
|
|
787
|
+
* Если ключ отсутствует или равен null/undefined, может вернуть значение по умолчанию.
|
|
788
|
+
*
|
|
789
|
+
* @param key - Ключ поля
|
|
790
|
+
* @param data - Объект-источник
|
|
791
|
+
* @param defaultValue - Резервное значение, если ключ не задан или значение отсутствует
|
|
792
|
+
* @returns Значение по ключу или defaultValue
|
|
793
|
+
*
|
|
794
|
+
* @example
|
|
795
|
+
* ```typescript
|
|
796
|
+
* getValueByKey('name', { name: 'John' }) // 'John'
|
|
797
|
+
* getValueByKey('age', { name: 'John' }, 18) // 18
|
|
798
|
+
* ```
|
|
799
|
+
*/
|
|
800
|
+
declare function getValueByKey<Value, Key extends BaseKey>(key: Key, data: BaseRecord<Value, Key>): Value;
|
|
801
|
+
declare function getValueByKey<Value, Key extends BaseKey, DefaultValue>(key: Nullable<Key>, data: Partial<BaseRecord<Value, Key>>, defaultValue: DefaultValue): Value | DefaultValue;
|
|
802
|
+
/**
|
|
803
|
+
* Преобразует значения объекта, сохраняя его исходные ключи.
|
|
804
|
+
*
|
|
805
|
+
* @param data - Объект, который нужно обойти
|
|
806
|
+
* @param callback - Функция преобразования значения
|
|
807
|
+
* @returns Новый объект с теми же ключами и результатами callback
|
|
808
|
+
*
|
|
809
|
+
* @example
|
|
810
|
+
* ```typescript
|
|
811
|
+
* mapRecord({ a: 1, b: 2 }, (_, value) => value * 2) // { a: 2, b: 4 }
|
|
812
|
+
* ```
|
|
813
|
+
*/
|
|
814
|
+
declare const mapRecord: <ResultValue, Data extends object, Key extends KeyOf<Data>, Value extends ValueOf<Data>, Result = BaseRecord<ResultValue, Key>>(data: Data, callback: (key: Key, value: Value, index: number, list: [Key, Value][]) => ResultValue) => Result;
|
|
815
|
+
/**
|
|
816
|
+
* Безопасно вызывает callback, если передано действительно вызываемое значение.
|
|
817
|
+
*
|
|
818
|
+
* @param callback - Функция для вызова
|
|
819
|
+
* @param paramList - Аргументы, которые будут переданы в callback
|
|
820
|
+
* @returns Результат callback или undefined, если callback не является функцией
|
|
821
|
+
*
|
|
822
|
+
* @example
|
|
823
|
+
* ```typescript
|
|
824
|
+
* runCallback((name: string) => `Hello, ${name}`, 'John') // 'Hello, John'
|
|
825
|
+
* runCallback(undefined, 'John') // undefined
|
|
826
|
+
* ```
|
|
827
|
+
*/
|
|
828
|
+
declare const runCallback: <Callback, Result = Callback extends AnyCallback ? ReturnType<Callback> : void>(callback: Callback, ...paramList: CallbackParamList<Callback>) => Result;
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* Создаёт функцию с отложенным вызовом callback.
|
|
832
|
+
* Повторный вызов до истечения delay сбрасывает предыдущий таймер.
|
|
833
|
+
*
|
|
834
|
+
* @param callback - Функция, которую нужно вызывать с задержкой
|
|
835
|
+
* @param delay - Задержка в миллисекундах
|
|
836
|
+
* @returns Обёртка с debounce-поведением
|
|
837
|
+
*
|
|
838
|
+
* @example
|
|
839
|
+
* ```typescript
|
|
840
|
+
* const save = debounce(() => api.save(), 300)
|
|
841
|
+
* input.addEventListener('input', save)
|
|
842
|
+
* ```
|
|
843
|
+
*/
|
|
844
|
+
declare const debounce: <Callback>(callback: Callback, delay: number) => (...params: CallbackParamList<Callback>) => void;
|
|
845
|
+
/**
|
|
846
|
+
* Создаёт функцию, которая допускает не более одного вызова за период delay.
|
|
847
|
+
*
|
|
848
|
+
* @param callback - Функция, которую нужно ограничить по частоте вызовов
|
|
849
|
+
* @param delay - Интервал блокировки в миллисекундах
|
|
850
|
+
* @returns Обёртка с throttle-поведением
|
|
851
|
+
*
|
|
852
|
+
* @example
|
|
853
|
+
* ```typescript
|
|
854
|
+
* const onScroll = throttle(() => console.log('scroll'), 100)
|
|
855
|
+
* window.addEventListener('scroll', onScroll)
|
|
856
|
+
* ```
|
|
857
|
+
*/
|
|
858
|
+
declare const throttle: <Callback>(callback: Callback, delay: number) => (...params: CallbackParamList<Callback>) => void;
|
|
859
|
+
|
|
860
|
+
/**
|
|
861
|
+
* Фильтрует список объектов по булевому полю.
|
|
862
|
+
* Если у элемента нет указанного ключа, такой элемент сохраняется.
|
|
863
|
+
*
|
|
864
|
+
* @param list - Исходный список объектов
|
|
865
|
+
* @param key - Булево поле для фильтрации, по умолчанию `isVisible`
|
|
866
|
+
* @returns Новый список, содержащий только подходящие элементы
|
|
867
|
+
*
|
|
868
|
+
* @example
|
|
869
|
+
* ```typescript
|
|
870
|
+
* filterByKey([{ isVisible: true }, { isVisible: false }]) // [{ isVisible: true }]
|
|
871
|
+
* ```
|
|
872
|
+
*/
|
|
873
|
+
declare function filterByKey<Key extends KeyOf<Item>, Item extends object & BaseRecord<boolean, Key>>(list: Item[], key?: Key): Item[];
|
|
874
|
+
/**
|
|
875
|
+
* Удаляет дубликаты из списка объектов по значению указанного ключа.
|
|
876
|
+
*
|
|
877
|
+
* @param data - Список объектов
|
|
878
|
+
* @param key - Ключ, по которому определяется уникальность
|
|
879
|
+
* @returns Новый список без повторяющихся значений key
|
|
880
|
+
*
|
|
881
|
+
* @example
|
|
882
|
+
* ```typescript
|
|
883
|
+
* filterDuplicateByKey([{ id: 1 }, { id: 1 }, { id: 2 }], 'id') // [{ id: 1 }, { id: 2 }]
|
|
884
|
+
* ```
|
|
885
|
+
*/
|
|
886
|
+
declare function filterDuplicateByKey<Key extends BaseKey, Item extends object & BaseRecord<any, Key>>(data: Item[], key: Key): Item[];
|
|
887
|
+
/**
|
|
888
|
+
* Возвращает элементы первого списка, которые присутствуют во втором.
|
|
889
|
+
*
|
|
890
|
+
* @param inputList - Список для проверки
|
|
891
|
+
* @param list - Список значений, с которыми нужно сравнить
|
|
892
|
+
* @returns Пересечение двух списков
|
|
893
|
+
*
|
|
894
|
+
* @example
|
|
895
|
+
* ```typescript
|
|
896
|
+
* filterEqualValues([1, 2, 3], [2, 4]) // [2]
|
|
897
|
+
* ```
|
|
898
|
+
*/
|
|
899
|
+
declare function filterEqualValues<Item>(inputList: Item[], list: Item[]): Item[];
|
|
900
|
+
/**
|
|
901
|
+
* Удаляет из списка `null` и `undefined`, одновременно сужая тип результата.
|
|
902
|
+
*
|
|
903
|
+
* @param list - Исходный список
|
|
904
|
+
* @returns Список только с непустыми значениями
|
|
905
|
+
*
|
|
906
|
+
* @example
|
|
907
|
+
* ```typescript
|
|
908
|
+
* filterNullableValues([1, null, 2, undefined]) // [1, 2]
|
|
909
|
+
* ```
|
|
910
|
+
*/
|
|
911
|
+
declare function filterNullableValues<Item>(list: Item[]): NotNullable<Item>[];
|
|
912
|
+
|
|
913
|
+
/**
|
|
914
|
+
* Проверяет, что объект не содержит перечисляемых свойств.
|
|
915
|
+
*
|
|
916
|
+
* @param object - Объект для проверки
|
|
917
|
+
* @returns `true`, если объект пустой
|
|
918
|
+
*
|
|
919
|
+
* @example
|
|
920
|
+
* ```typescript
|
|
921
|
+
* isObjectEmpty({}) // true
|
|
922
|
+
* isObjectEmpty({ id: 1 }) // false
|
|
923
|
+
* ```
|
|
924
|
+
*/
|
|
925
|
+
declare function isObjectEmpty<Param extends object>(object: Param): boolean;
|
|
926
|
+
/**
|
|
927
|
+
* Проверяет, что массив не содержит элементов.
|
|
928
|
+
*
|
|
929
|
+
* @param array - Массив для проверки
|
|
930
|
+
* @returns `true`, если массив пустой
|
|
931
|
+
*
|
|
932
|
+
* @example
|
|
933
|
+
* ```typescript
|
|
934
|
+
* isArrayEmpty([]) // true
|
|
935
|
+
* isArrayEmpty([1]) // false
|
|
936
|
+
* ```
|
|
937
|
+
*/
|
|
938
|
+
declare function isArrayEmpty<Param extends BaseList>(array: Param): boolean;
|
|
939
|
+
/**
|
|
940
|
+
* Проверяет наличие ключа в объекте и сужает тип data при успешной проверке.
|
|
941
|
+
*
|
|
942
|
+
* @param key - Ключ, наличие которого нужно проверить
|
|
943
|
+
* @param data - Значение, которое предполагается объектом
|
|
944
|
+
* @returns `true`, если ключ существует в объекте
|
|
945
|
+
*
|
|
946
|
+
* @example
|
|
947
|
+
* ```typescript
|
|
948
|
+
* if (hasKey('name', payload)) {
|
|
949
|
+
* console.log(payload.name)
|
|
950
|
+
* }
|
|
951
|
+
* ```
|
|
952
|
+
*/
|
|
953
|
+
declare function hasKey<Key extends BaseKey, Data, Value>(key: Key, data: Data): data is Data & BaseRecord<Value, Key>;
|
|
954
|
+
/**
|
|
955
|
+
* Проверяет, есть ли у двух списков хотя бы одно общее значение.
|
|
956
|
+
*
|
|
957
|
+
* @param inputList - Первый список
|
|
958
|
+
* @param list - Второй список
|
|
959
|
+
* @returns `true`, если найдено хотя бы одно совпадение
|
|
960
|
+
*
|
|
961
|
+
* @example
|
|
962
|
+
* ```typescript
|
|
963
|
+
* hasEqualValues(['a', 'b'], ['c', 'b']) // true
|
|
964
|
+
* hasEqualValues(['a'], ['c']) // false
|
|
965
|
+
* ```
|
|
966
|
+
*/
|
|
967
|
+
declare function hasEqualValues<Item>(inputList: Item[], list: Item[]): boolean;
|
|
968
|
+
|
|
969
|
+
/**
|
|
970
|
+
* Приводит значение к массиву: если передано одно значение — возвращает массив из одного элемента,
|
|
971
|
+
* если передан массив — возвращает его без изменений.
|
|
972
|
+
* Удобно для API, которые могут принимать как один элемент, так и массив.
|
|
973
|
+
*
|
|
974
|
+
* @param param - Один элемент или массив элементов
|
|
975
|
+
* @returns Массив элементов (всегда массив)
|
|
976
|
+
*
|
|
977
|
+
* @example
|
|
978
|
+
* ```typescript
|
|
979
|
+
* forceList(1) // [1]
|
|
980
|
+
* forceList([1, 2]) // [1, 2]
|
|
981
|
+
* ```
|
|
982
|
+
*
|
|
983
|
+
* @example
|
|
984
|
+
* ```typescript
|
|
985
|
+
* const ids = forceList(query.id) // query.id: string | string[]
|
|
986
|
+
* ids.forEach(processId)
|
|
987
|
+
* ```
|
|
988
|
+
*/
|
|
989
|
+
declare function forceList<Item>(param: Item | Item[]): Item[];
|
|
990
|
+
/**
|
|
991
|
+
* Разбивает массив на подмассивы заданного размера (чанки).
|
|
992
|
+
* Последний чанк может быть меньше size, если длина массива не кратна size.
|
|
993
|
+
*
|
|
994
|
+
* @param list - Исходный массив
|
|
995
|
+
* @param size - Размер одного чанка (целое положительное число)
|
|
996
|
+
* @returns Массив чанков (массив массивов)
|
|
997
|
+
*
|
|
998
|
+
* @example
|
|
999
|
+
* ```typescript
|
|
1000
|
+
* chunkList([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]
|
|
1001
|
+
* chunkList([], 3) // []
|
|
1002
|
+
* ```
|
|
1003
|
+
*
|
|
1004
|
+
* @example
|
|
1005
|
+
* ```typescript
|
|
1006
|
+
* const pages = chunkList(items, PAGE_SIZE)
|
|
1007
|
+
* for (const page of pages) {
|
|
1008
|
+
* await saveBatch(page)
|
|
1009
|
+
* }
|
|
1010
|
+
* ```
|
|
1011
|
+
*/
|
|
1012
|
+
declare function chunkList<Item>(list: Item[], size: number): Item[][];
|
|
1013
|
+
|
|
1014
|
+
/**
|
|
1015
|
+
* Проверяет, что значение равно `undefined`.
|
|
1016
|
+
*
|
|
1017
|
+
* @example
|
|
1018
|
+
* ```typescript
|
|
1019
|
+
* isUndefined(undefined) // true
|
|
1020
|
+
* isUndefined(null) // false
|
|
1021
|
+
* ```
|
|
1022
|
+
*/
|
|
1023
|
+
declare const isUndefined: (param: unknown) => param is undefined;
|
|
1024
|
+
/**
|
|
1025
|
+
* Проверяет, что значение равно `null`.
|
|
1026
|
+
*
|
|
1027
|
+
* @example
|
|
1028
|
+
* ```typescript
|
|
1029
|
+
* isNull(null) // true
|
|
1030
|
+
* isNull(undefined) // false
|
|
1031
|
+
* ```
|
|
1032
|
+
*/
|
|
1033
|
+
declare const isNull: (param: unknown) => param is null;
|
|
1034
|
+
/**
|
|
1035
|
+
* Проверяет, что значение равно `null` или `undefined`.
|
|
1036
|
+
*
|
|
1037
|
+
* @example
|
|
1038
|
+
* ```typescript
|
|
1039
|
+
* isNullable(undefined) // true
|
|
1040
|
+
* isNullable('value') // false
|
|
1041
|
+
* ```
|
|
1042
|
+
*/
|
|
1043
|
+
declare const isNullable: (param: unknown) => param is Nullable;
|
|
1044
|
+
/**
|
|
1045
|
+
* Проверяет, что значение имеет тип `string`.
|
|
1046
|
+
*
|
|
1047
|
+
* @example
|
|
1048
|
+
* ```typescript
|
|
1049
|
+
* isString('hello') // true
|
|
1050
|
+
* isString(42) // false
|
|
1051
|
+
* ```
|
|
1052
|
+
*/
|
|
1053
|
+
declare const isString: (param: unknown) => param is string;
|
|
1054
|
+
/**
|
|
1055
|
+
* Проверяет, что значение имеет тип `number`.
|
|
1056
|
+
*
|
|
1057
|
+
* @example
|
|
1058
|
+
* ```typescript
|
|
1059
|
+
* isNumber(42) // true
|
|
1060
|
+
* isNumber('42') // false
|
|
1061
|
+
* ```
|
|
1062
|
+
*/
|
|
1063
|
+
declare const isNumber: (param: unknown) => param is number;
|
|
1064
|
+
/**
|
|
1065
|
+
* Проверяет, что значение имеет тип `bigint`.
|
|
1066
|
+
*
|
|
1067
|
+
* @example
|
|
1068
|
+
* ```typescript
|
|
1069
|
+
* isBigint(10n) // true
|
|
1070
|
+
* isBigint(10) // false
|
|
1071
|
+
* ```
|
|
1072
|
+
*/
|
|
1073
|
+
declare const isBigint: (param: unknown) => param is bigint;
|
|
1074
|
+
/**
|
|
1075
|
+
* Проверяет, что значение является `NaN`.
|
|
1076
|
+
*
|
|
1077
|
+
* @example
|
|
1078
|
+
* ```typescript
|
|
1079
|
+
* isNaN(Number('foo')) // true
|
|
1080
|
+
* isNaN(10) // false
|
|
1081
|
+
* ```
|
|
1082
|
+
*/
|
|
1083
|
+
declare const isNaN: (param: unknown) => param is number;
|
|
1084
|
+
/**
|
|
1085
|
+
* Проверяет, что значение имеет тип `boolean`.
|
|
1086
|
+
*
|
|
1087
|
+
* @example
|
|
1088
|
+
* ```typescript
|
|
1089
|
+
* isBoolean(true) // true
|
|
1090
|
+
* isBoolean(0) // false
|
|
1091
|
+
* ```
|
|
1092
|
+
*/
|
|
1093
|
+
declare const isBoolean: (param: unknown) => param is boolean;
|
|
1094
|
+
/**
|
|
1095
|
+
* Проверяет, что значение имеет тип `symbol`.
|
|
1096
|
+
*
|
|
1097
|
+
* @example
|
|
1098
|
+
* ```typescript
|
|
1099
|
+
* isSymbol(Symbol('id')) // true
|
|
1100
|
+
* isSymbol('id') // false
|
|
1101
|
+
* ```
|
|
1102
|
+
*/
|
|
1103
|
+
declare const isSymbol: (param: unknown) => param is symbol;
|
|
1104
|
+
/**
|
|
1105
|
+
* Проверяет, что значение относится к объектным типам JavaScript.
|
|
1106
|
+
*
|
|
1107
|
+
* @example
|
|
1108
|
+
* ```typescript
|
|
1109
|
+
* isAnyObject({}) // true
|
|
1110
|
+
* isAnyObject(null) // true
|
|
1111
|
+
* ```
|
|
1112
|
+
*/
|
|
1113
|
+
declare const isAnyObject: (param: unknown) => param is object;
|
|
1114
|
+
/**
|
|
1115
|
+
* Проверяет, что значение является "простым" объектом, а не массивом, датой, ошибкой или другой специальной структурой.
|
|
1116
|
+
*
|
|
1117
|
+
* @param param - Значение для проверки
|
|
1118
|
+
* @returns `true`, если значение можно трактовать как обычный объект
|
|
1119
|
+
*
|
|
1120
|
+
* @example
|
|
1121
|
+
* ```typescript
|
|
1122
|
+
* isObject({ id: 1 }) // true
|
|
1123
|
+
* isObject([1, 2, 3]) // false
|
|
1124
|
+
* ```
|
|
1125
|
+
*/
|
|
1126
|
+
declare const isObject: <Param = object>(param: unknown) => param is Param;
|
|
1127
|
+
/**
|
|
1128
|
+
* Проверяет, что значение является массивом.
|
|
1129
|
+
*
|
|
1130
|
+
* @example
|
|
1131
|
+
* ```typescript
|
|
1132
|
+
* isArray([1, 2]) // true
|
|
1133
|
+
* isArray({ length: 2 }) // false
|
|
1134
|
+
* ```
|
|
1135
|
+
*/
|
|
1136
|
+
declare const isArray: <Param = unknown>(param: unknown) => param is Param[];
|
|
1137
|
+
/**
|
|
1138
|
+
* Проверяет, что значение является `ArrayBuffer`.
|
|
1139
|
+
*
|
|
1140
|
+
* @example
|
|
1141
|
+
* ```typescript
|
|
1142
|
+
* isArrayBuffer(new ArrayBuffer(8)) // true
|
|
1143
|
+
* ```
|
|
1144
|
+
*/
|
|
1145
|
+
declare const isArrayBuffer: (param: unknown) => param is ArrayBuffer;
|
|
1146
|
+
/**
|
|
1147
|
+
* Проверяет, что значение является `Map`.
|
|
1148
|
+
*
|
|
1149
|
+
* @example
|
|
1150
|
+
* ```typescript
|
|
1151
|
+
* isMap(new Map()) // true
|
|
1152
|
+
* ```
|
|
1153
|
+
*/
|
|
1154
|
+
declare const isMap: (param: unknown) => param is Map<unknown, unknown>;
|
|
1155
|
+
/**
|
|
1156
|
+
* Проверяет, что значение является `Set`.
|
|
1157
|
+
*
|
|
1158
|
+
* @example
|
|
1159
|
+
* ```typescript
|
|
1160
|
+
* isSet(new Set()) // true
|
|
1161
|
+
* ```
|
|
1162
|
+
*/
|
|
1163
|
+
declare const isSet: (param: unknown) => param is Set<unknown>;
|
|
1164
|
+
/**
|
|
1165
|
+
* Проверяет, что значение является `WeakMap`.
|
|
1166
|
+
*
|
|
1167
|
+
* @example
|
|
1168
|
+
* ```typescript
|
|
1169
|
+
* isWeakMap(new WeakMap()) // true
|
|
1170
|
+
* ```
|
|
1171
|
+
*/
|
|
1172
|
+
declare const isWeakMap: (param: unknown) => param is WeakMap<object, unknown>;
|
|
1173
|
+
/**
|
|
1174
|
+
* Проверяет, что значение является `WeakSet`.
|
|
1175
|
+
*
|
|
1176
|
+
* @example
|
|
1177
|
+
* ```typescript
|
|
1178
|
+
* isWeakSet(new WeakSet()) // true
|
|
1179
|
+
* ```
|
|
1180
|
+
*/
|
|
1181
|
+
declare const isWeakSet: (param: unknown) => param is WeakSet<object>;
|
|
1182
|
+
/**
|
|
1183
|
+
* Проверяет, что значение является объектом `Date`.
|
|
1184
|
+
*
|
|
1185
|
+
* @example
|
|
1186
|
+
* ```typescript
|
|
1187
|
+
* isDate(new Date()) // true
|
|
1188
|
+
* ```
|
|
1189
|
+
*/
|
|
1190
|
+
declare const isDate: (param: unknown) => param is Error;
|
|
1191
|
+
/**
|
|
1192
|
+
* Проверяет, что значение является экземпляром `Error`.
|
|
1193
|
+
*
|
|
1194
|
+
* @example
|
|
1195
|
+
* ```typescript
|
|
1196
|
+
* isError(new Error('boom')) // true
|
|
1197
|
+
* ```
|
|
1198
|
+
*/
|
|
1199
|
+
declare const isError: (param: unknown) => param is Error;
|
|
1200
|
+
/**
|
|
1201
|
+
* Проверяет, что значение является `Proxy`.
|
|
1202
|
+
*
|
|
1203
|
+
* @example
|
|
1204
|
+
* ```typescript
|
|
1205
|
+
* const value = new Proxy({}, {})
|
|
1206
|
+
* isProxy(value) // true
|
|
1207
|
+
* ```
|
|
1208
|
+
*/
|
|
1209
|
+
declare const isProxy: (param: unknown) => param is ProxyConstructor;
|
|
1210
|
+
/**
|
|
1211
|
+
* Проверяет, что значение является `RegExp`.
|
|
1212
|
+
*
|
|
1213
|
+
* @example
|
|
1214
|
+
* ```typescript
|
|
1215
|
+
* isRegExp(/test/) // true
|
|
1216
|
+
* ```
|
|
1217
|
+
*/
|
|
1218
|
+
declare const isRegExp: (param: unknown) => param is RegExp;
|
|
1219
|
+
/**
|
|
1220
|
+
* Проверяет, что значение является `Promise`.
|
|
1221
|
+
*
|
|
1222
|
+
* @example
|
|
1223
|
+
* ```typescript
|
|
1224
|
+
* isPromise(Promise.resolve()) // true
|
|
1225
|
+
* ```
|
|
1226
|
+
*/
|
|
1227
|
+
declare const isPromise: (param: unknown) => param is Promise<typeof param>;
|
|
1228
|
+
/**
|
|
1229
|
+
* Проверяет, что значение является функцией.
|
|
1230
|
+
*
|
|
1231
|
+
* @param param - Значение для проверки
|
|
1232
|
+
* @returns `true`, если значение можно вызвать как функцию
|
|
1233
|
+
*
|
|
1234
|
+
* @example
|
|
1235
|
+
* ```typescript
|
|
1236
|
+
* isFunction(() => true) // true
|
|
1237
|
+
* isFunction('callback') // false
|
|
1238
|
+
* ```
|
|
1239
|
+
*/
|
|
1240
|
+
declare const isFunction: <Callback = <ParamList extends BaseList, Result>(...paramList: ParamList) => Result>(param: unknown) => param is Callback;
|
|
1241
|
+
|
|
1242
|
+
export { ErrorHandler, ErrorHandlerEventName, EventEmitter, Log, Storage, chunkList, compose, debounce, filterByKey, filterDuplicateByKey, filterEqualValues, filterNullableValues, forceList, getValueByKey, hasEqualValues, hasKey, isAnyObject, isArray, isArrayBuffer, isArrayEmpty, isBigint, isBoolean, isDate, isError, isFunction, isMap, isNaN, isNull, isNullable, isNumber, isObject, isObjectEmpty, isPromise, isProxy, isRegExp, isSet, isString, isSymbol, isUndefined, isWeakMap, isWeakSet, mapRecord, runCallback, throttle, wait };
|
|
1243
|
+
export type { AnyAsyncCallback, AnyCallback, AsyncCallback, BaseKey, BaseList, BaseRecord, Callback, CallbackParamList, CallbackResult, Decrement, Divide, Entry, ErrorHandlerCaseConfig, ErrorHandlerConfig, ErrorHandlerError, ErrorHandlerErrors, ErrorHandlerEventParams, ErrorHandlerMessage, ErrorHandlerParseResult, Filled, Include, Increment, IterableOf, KeyOf, LevelRange, List, MaybeAsync, Noop, NotNullable, Nothing, Nullable, Numerable, Shared, SizeRange, StorageConfig, StorageInstance, StorageModel, ValueOf };
|