@mirta/store 0.3.5 → 0.4.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.md +295 -1
- package/README.ru.md +286 -1
- package/dist/index.d.mts +416 -11
- package/dist/index.mjs +508 -40
- package/package.json +13 -4
package/dist/index.d.mts
CHANGED
|
@@ -1,18 +1,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Рекурсивная версия утилитарного типа `Partial<T>`.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.4.0
|
|
5
|
+
*
|
|
6
|
+
**/
|
|
7
|
+
type DeepPartial<TTarget> = TTarget extends (infer TItem)[] ? TItem[] : TTarget extends object ? {
|
|
8
|
+
[K in keyof TTarget]?: DeepPartial<TTarget[K]>;
|
|
9
|
+
} : TTarget;
|
|
10
|
+
/**
|
|
11
|
+
* Тип, представляющий дерево состояния хранилища.
|
|
12
|
+
*
|
|
13
|
+
* Является объектом, где ключи — строки, числа или символы (`PropertyKey`),
|
|
14
|
+
* а значения могут быть любого типа (`unknown`).
|
|
15
|
+
*
|
|
16
|
+
* Используется как базовый тип для `state` в хранилище.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const state = { count: 0, active: true }
|
|
21
|
+
* // Это StateTree
|
|
22
|
+
* ```
|
|
23
|
+
* @since 0.0.2
|
|
24
|
+
*
|
|
25
|
+
**/
|
|
1
26
|
type StateTree = Record<PropertyKey, unknown>;
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Тип, представляющий дерево геттеров хранилища.
|
|
29
|
+
*
|
|
30
|
+
* Каждый геттер может быть:
|
|
31
|
+
* - Функцией, принимающей `state` и возвращающей значение.
|
|
32
|
+
* - Функцией без параметров, которая может использовать `this` для доступа к хранилищу.
|
|
33
|
+
*
|
|
34
|
+
* @template TState - Тип состояния, доступного в геттерах первого типа.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* const getters = {
|
|
39
|
+
* double: (state: { count: number }) => state.count * 2,
|
|
40
|
+
* label: () => `Значение: ${this.count}`
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
* @since 0.4.0
|
|
44
|
+
*
|
|
45
|
+
* @internal
|
|
46
|
+
*
|
|
47
|
+
**/
|
|
48
|
+
type _GettersTree<TState extends StateTree> = Record<string, ((state: TState) => unknown) | (() => unknown)>;
|
|
49
|
+
/**
|
|
50
|
+
* Тип, представляющий дерево действий (actions) хранилища.
|
|
51
|
+
*
|
|
52
|
+
* Каждое действие — это метод, принимающий любые аргументы и возвращающий любое значение.
|
|
53
|
+
* Внутри действия доступен `this` с полным контекстом хранилища.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const actions = {
|
|
58
|
+
* increment(payload: number) {
|
|
59
|
+
* this.count += payload
|
|
60
|
+
* }
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
* @since 0.4.0
|
|
64
|
+
*
|
|
65
|
+
* @internal
|
|
66
|
+
*
|
|
67
|
+
**/
|
|
68
|
+
type _ActionsTree = Record<string, (...args: unknown[]) => unknown>;
|
|
69
|
+
/**
|
|
70
|
+
* Интерфейс, добавляющий к хранилищу методы управления состоянием.
|
|
71
|
+
*
|
|
72
|
+
* Обеспечивает доступ к:
|
|
73
|
+
* - `$id` — идентификатор экземпляра хранилища.
|
|
74
|
+
* - `$state` — полное состояние хранилища.
|
|
75
|
+
* - `$patch` — метод для частичного обновления состояния.
|
|
76
|
+
* - `$reset` — метод для сброса состояния к начальному.
|
|
77
|
+
*
|
|
78
|
+
* @template TState - Тип состояния хранилища.
|
|
79
|
+
*
|
|
80
|
+
* @since 0.0.2
|
|
81
|
+
*
|
|
82
|
+
* @internal
|
|
83
|
+
*
|
|
84
|
+
**/
|
|
5
85
|
interface _StoreWithState<TState extends StateTree> {
|
|
6
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Идентификатор экземпляра хранилища.
|
|
88
|
+
* Формируется как `typeId` или `typeId/id` для именованных экземпляров.
|
|
89
|
+
*
|
|
90
|
+
**/
|
|
91
|
+
readonly $id: string;
|
|
92
|
+
/**
|
|
93
|
+
* Ссылка на полное состояние хранилища.
|
|
94
|
+
*
|
|
95
|
+
**/
|
|
96
|
+
readonly $state: TState;
|
|
97
|
+
/**
|
|
98
|
+
* Обновляет состояние путём слияния с переданным объектом.
|
|
99
|
+
* Выполняет глубокое слияние.
|
|
100
|
+
*
|
|
101
|
+
* @param state - Объект с полями, которые нужно обновить.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* store.$patch({ count: 5, name: 'Новое имя' })
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
**/
|
|
109
|
+
$patch(state: DeepPartial<TState>): void;
|
|
110
|
+
/**
|
|
111
|
+
* Обновляет состояние с помощью функции-мутатора.
|
|
112
|
+
* Позволяет выполнять сложные обновления на основе текущего состояния.
|
|
113
|
+
*
|
|
114
|
+
* @param stateMutator - Функция, которая принимает текущее состояние и изменяет его.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```ts
|
|
118
|
+
* store.$patch(state => {
|
|
119
|
+
* state.count++
|
|
120
|
+
* state.log.push('increment')
|
|
121
|
+
* })
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
**/
|
|
7
125
|
$patch(stateMutator: (state: TState) => void): void;
|
|
126
|
+
/**
|
|
127
|
+
* Сбрасывает состояние хранилища до начального.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```ts
|
|
131
|
+
* store.$reset()
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
**/
|
|
8
135
|
$reset(): void;
|
|
9
136
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Тип, представляющий геттеры как свойства хранилища.
|
|
139
|
+
*
|
|
140
|
+
* Преобразует объект геттеров в объект значений:
|
|
141
|
+
* - Каждый геттер `(state) => value` становится свойством с типом `value`.
|
|
142
|
+
* - Каждый геттер `() => value` становится свойством с типом `value`.
|
|
143
|
+
*
|
|
144
|
+
* @template TGetters - Тип дерева геттеров.
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```ts
|
|
148
|
+
* type Getters = { double: (s: S) => number, label: () => string }
|
|
149
|
+
* type Result = _StoreWithGetters<Getters> // { double: number, label: string }
|
|
150
|
+
* ```
|
|
151
|
+
* @since 0.4.0
|
|
152
|
+
*
|
|
153
|
+
* @internal
|
|
154
|
+
*
|
|
155
|
+
**/
|
|
156
|
+
type _StoreWithGetters<TGetters> = {
|
|
157
|
+
readonly [K in keyof TGetters]: TGetters[K] extends (...args: unknown[]) => infer R ? R : never;
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* Тип, представляющий действия как методы хранилища.
|
|
161
|
+
*
|
|
162
|
+
* @template TActions - Тип дерева действий.
|
|
163
|
+
*
|
|
164
|
+
* @since 0.4.0
|
|
165
|
+
*
|
|
166
|
+
* @internal
|
|
167
|
+
*
|
|
168
|
+
**/
|
|
169
|
+
type _StoreWithActions<TActions> = {
|
|
170
|
+
readonly [K in keyof TActions]: TActions[K];
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Полный тип хранилища - итоговый тип, возвращаемый `defineStore`.
|
|
174
|
+
*
|
|
175
|
+
* Представляет собой объединение (intersection) всех компонентов хранилища.
|
|
176
|
+
*
|
|
177
|
+
* @template TState - Тип состояния.
|
|
178
|
+
* @template TGetters - Тип геттеров.
|
|
179
|
+
* @template TActions - Тип действий.
|
|
180
|
+
*
|
|
181
|
+
* @since 0.0.2
|
|
182
|
+
*
|
|
183
|
+
**/
|
|
184
|
+
type Store<TState extends StateTree, TGetters, TActions extends _ActionsTree> = _StoreWithState<TState> & TState & _StoreWithGetters<TGetters> & _StoreWithActions<TActions>;
|
|
185
|
+
/**
|
|
186
|
+
* Универсальный тип хранилища, используемый для кэширования и внутренних операций.
|
|
187
|
+
*
|
|
188
|
+
* Подходит для переменных, которые могут содержать любое хранилище.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```ts
|
|
192
|
+
* const stores: Record<string, StoreGeneric> = {}
|
|
193
|
+
* ```
|
|
194
|
+
* @since 0.0.2
|
|
195
|
+
*
|
|
196
|
+
**/
|
|
197
|
+
type StoreGeneric = Store<StateTree, unknown, _ActionsTree>;
|
|
198
|
+
/**
|
|
199
|
+
* Опции, передаваемые в функцию `defineStore` для создания хранилища.
|
|
200
|
+
*
|
|
201
|
+
* Позволяет определить:
|
|
202
|
+
* - `state` — функцию, возвращающую начальное состояние.
|
|
203
|
+
* - `getters` — вычисляемые свойства.
|
|
204
|
+
* - `actions` — методы для изменения состояния.
|
|
205
|
+
*
|
|
206
|
+
* Типы `ThisType` обеспечивают корректную типизацию `this` внутри геттеров и действий.
|
|
207
|
+
*
|
|
208
|
+
* @template TState - Тип состояния хранилища.
|
|
209
|
+
* @template TGetters - Тип геттеров.
|
|
210
|
+
* @template TActions - Тип действий.
|
|
211
|
+
*
|
|
212
|
+
* @since 0.0.2
|
|
213
|
+
*
|
|
214
|
+
**/
|
|
215
|
+
interface DefineStoreOptions<TState extends StateTree, TGetters extends _GettersTree<TState>, TActions extends _ActionsTree> {
|
|
216
|
+
/**
|
|
217
|
+
* Функция, возвращающая начальное состояние хранилища.
|
|
218
|
+
* Вызывается при создании и сбросе хранилища.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* state: () => ({
|
|
222
|
+
* count: 0,
|
|
223
|
+
* items: []
|
|
224
|
+
* })
|
|
225
|
+
*
|
|
226
|
+
**/
|
|
227
|
+
state?: () => TState;
|
|
228
|
+
/**
|
|
229
|
+
* Объект с геттерами (вычисляемыми свойствами).
|
|
230
|
+
*
|
|
231
|
+
* Внутри геттеров разрешён доступ к:
|
|
232
|
+
* - `state` — если геттер принимает `state` как параметр.
|
|
233
|
+
* - `this` — если геттер не принимает параметров (`() => ...`), через который доступны
|
|
234
|
+
* другие геттеры и состояние.
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```ts
|
|
238
|
+
* getters: {
|
|
239
|
+
* double: (state) => state.count * 2,
|
|
240
|
+
* doublePlusOne: () => this.double + 1
|
|
241
|
+
* }
|
|
242
|
+
* ```
|
|
243
|
+
* @since 0.4.0
|
|
244
|
+
*
|
|
245
|
+
**/
|
|
246
|
+
getters?: TGetters & ThisType<TState & _StoreWithGetters<TGetters>>;
|
|
247
|
+
/**
|
|
248
|
+
* Объект с действиями (методами изменения состояния).
|
|
249
|
+
*
|
|
250
|
+
* Внутри действий разрешён доступ к:
|
|
251
|
+
* - `this` — для чтения/записи `state`, вызова геттеров, использования `$patch`, `$reset`.
|
|
252
|
+
*
|
|
253
|
+
* @example
|
|
254
|
+
* ```ts
|
|
255
|
+
* actions: {
|
|
256
|
+
* increment() {
|
|
257
|
+
* this.count++
|
|
258
|
+
* },
|
|
259
|
+
* setCount(value: number) {
|
|
260
|
+
* this.$patch({ count: value })
|
|
261
|
+
* }
|
|
262
|
+
* }
|
|
263
|
+
* ```
|
|
264
|
+
* @since 0.4.0
|
|
265
|
+
*
|
|
266
|
+
**/
|
|
267
|
+
actions?: TActions & ThisType<TState & _StoreWithGetters<TGetters> & _StoreWithActions<TActions> & _StoreWithState<TState>>;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Тип, представляющий результат вызова `defineStore()`.
|
|
271
|
+
*
|
|
272
|
+
* Это функция, которую можно вызвать для получения экземпляра хранилища,
|
|
273
|
+
* с дополнительным свойством `$typeId`.
|
|
274
|
+
*
|
|
275
|
+
* @template TState - Тип состояния.
|
|
276
|
+
* @template TGetters - Тип геттеров.
|
|
277
|
+
* @template TActions - Тип действий.
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```ts
|
|
281
|
+
* const useStore = defineStore('counter', { state: () => ({ count: 0 }) })
|
|
282
|
+
* const store = useStore() // Получение экземпляра
|
|
283
|
+
* ```
|
|
284
|
+
*
|
|
285
|
+
**/
|
|
286
|
+
interface StoreDefinition<TState extends StateTree, TGetters extends _GettersTree<TState>, TActions extends _ActionsTree> {
|
|
287
|
+
/**
|
|
288
|
+
* Идентификатор типа хранилища (указывается при вызове `defineStore`).
|
|
289
|
+
* Используется для проверки дубликатов и логирования.
|
|
290
|
+
*
|
|
291
|
+
* @since 0.4.0
|
|
292
|
+
*
|
|
293
|
+
**/
|
|
294
|
+
readonly $typeId: string;
|
|
295
|
+
/**
|
|
296
|
+
* Функция для получения экземпляра хранилища.
|
|
297
|
+
*
|
|
298
|
+
* @param scope - Опциональный ключ для создания именованного экземпляра.
|
|
299
|
+
* При передаче создаётся хранилище с идентификатором `typeId/scope`.
|
|
300
|
+
* При отсутствии возвращает общий экземпляр `typeId`.
|
|
301
|
+
*
|
|
302
|
+
* @returns Экземпляр хранилища.
|
|
303
|
+
*
|
|
304
|
+
* @example
|
|
305
|
+
* ```ts
|
|
306
|
+
* const store1 = useStore()
|
|
307
|
+
* const store2 = useStore('sensor1')
|
|
308
|
+
* const store3 = useStore('sensor2')
|
|
309
|
+
* ```
|
|
310
|
+
* @since 0.0.2
|
|
311
|
+
*
|
|
312
|
+
**/
|
|
313
|
+
(scope?: string): Store<TState, TGetters, TActions>;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Определяет новое хранилище с заданным именем и параметрами.
|
|
318
|
+
*
|
|
319
|
+
* Является основной точкой входа для создания хранилищ.
|
|
320
|
+
* Возвращает функцию `useStore()`, используемую для получения экземпляра хранилища.
|
|
321
|
+
*
|
|
322
|
+
* @param type - Уникальный тип хранилища.
|
|
323
|
+
* @param options - Конфигурация хранилища: `state`, `getters`, `actions`.
|
|
324
|
+
* @returns Функция `useStore`, создающая или возвращающая экземпляр хранилища.
|
|
325
|
+
*
|
|
326
|
+
* @template TState - Тип состояния хранилища.
|
|
327
|
+
* @template TGetters - Тип вычисляемых свойств.
|
|
328
|
+
* @template TActions - Тип методов мутации состояния.
|
|
329
|
+
*
|
|
330
|
+
* @throws {StoreError} Если хранилище с таким именем уже определено.
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```ts
|
|
334
|
+
* const useCounter = defineStore('counter', {
|
|
335
|
+
* state: () => ({ count: 0 }),
|
|
336
|
+
* getters: { double: (state) => state.count * 2 },
|
|
337
|
+
* actions: { increment() { this.count++ } }
|
|
338
|
+
* })
|
|
339
|
+
*
|
|
340
|
+
* const store = useCounter()
|
|
341
|
+
* ```
|
|
342
|
+
* @since 0.0.2
|
|
343
|
+
*
|
|
344
|
+
**/
|
|
345
|
+
declare function defineStore<TState extends StateTree, TGetters extends _GettersTree<TState>, TActions extends _ActionsTree>(typeId: string, options: DefineStoreOptions<TState, TGetters, TActions>): StoreDefinition<TState, TGetters, TActions>;
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Специализированный класс для обработки ошибок, связанных с работой хранилища Store.
|
|
349
|
+
*
|
|
350
|
+
* Предоставляет структурированные и типизированные ошибки с использованием кодов, что упрощает
|
|
351
|
+
* программную обработку исключений в инструментах, работающих с пакетами.
|
|
352
|
+
*
|
|
353
|
+
* @example
|
|
354
|
+
* ```ts
|
|
355
|
+
* throw StoreError.get('alreadyDefined', 'mystore')
|
|
356
|
+
* ```
|
|
357
|
+
* @since 0.4.0
|
|
358
|
+
*
|
|
359
|
+
**/
|
|
360
|
+
declare class StoreError extends Error {
|
|
361
|
+
/**
|
|
362
|
+
* Код ошибки для программной идентификации.
|
|
363
|
+
*
|
|
364
|
+
* Позволяет точно определить причину ошибки в обработчиках `try/catch`.
|
|
365
|
+
*
|
|
366
|
+
**/
|
|
367
|
+
readonly code: string;
|
|
368
|
+
/**
|
|
369
|
+
* Приватный конструктор, используемый только внутри
|
|
370
|
+
* класса для создания экземпляров ошибки.
|
|
371
|
+
*
|
|
372
|
+
* @param message - Полное сообщение об ошибке.
|
|
373
|
+
* @param code - Код ошибки для идентификации.
|
|
374
|
+
* @param scope - Пространство имён или модуль, в котором возникла ошибка.
|
|
375
|
+
* По умолчанию — {@link THIS_PACKAGE_NAME}.
|
|
376
|
+
*
|
|
377
|
+
**/
|
|
378
|
+
private constructor();
|
|
379
|
+
/** Карта кодов ошибок с соответствующими сообщениями. */
|
|
380
|
+
private static readonly codeMappings;
|
|
381
|
+
/**
|
|
382
|
+
* Фабричный метод для создания экземпляра ошибки по её коду.
|
|
383
|
+
*
|
|
384
|
+
* Автоматически подставляет сообщение из `codeMappings` и формирует ошибку с заданными параметрами.
|
|
385
|
+
*
|
|
386
|
+
* @template T - Ограниченный ключами `codeMappings` тип, гарантирующий корректность кода.
|
|
387
|
+
* @param code - Код ошибки (например, `'alreadyDefined'`).
|
|
388
|
+
* @param args - Аргументы, соответствующие параметрам функции сообщения из `codeMappings`.
|
|
389
|
+
* @returns Новый экземпляр {@link StoreError} с шаблонным сообщением.
|
|
390
|
+
*
|
|
391
|
+
* @example
|
|
392
|
+
* ```ts
|
|
393
|
+
* const error = StoreError.get('alreadyDefined')
|
|
394
|
+
* ```
|
|
395
|
+
*/
|
|
396
|
+
static get<T extends keyof typeof StoreError['codeMappings']>(code: T, ...args: Parameters<typeof StoreError['codeMappings'][T]>): StoreError;
|
|
397
|
+
/**
|
|
398
|
+
* Фабричный метод, аналогичный `get`, но с возможностью указать
|
|
399
|
+
* пользовательское пространство имён (scope).
|
|
400
|
+
*
|
|
401
|
+
* Полезно при использовании в других модулях, где нужно указать
|
|
402
|
+
* иной контекст ошибки.
|
|
403
|
+
*
|
|
404
|
+
* @template TKey - Тип кода ошибки, аналогично `get`.
|
|
405
|
+
*
|
|
406
|
+
* @param scope - Пространство имён ошибки (например, `'@mirta/store'`).
|
|
407
|
+
* @param code - Код ошибки.
|
|
408
|
+
* @param args - Аргументы для формирования сообщения.
|
|
409
|
+
*
|
|
410
|
+
* @returns Новый экземпляр {@link StoreError} с пользовательским
|
|
411
|
+
* префиксом и шаблонным сообщением.
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
*
|
|
415
|
+
* ```ts
|
|
416
|
+
* const error = StoreError.getScoped('@mirta/bot-remote', 'alreadyDefined')
|
|
417
|
+
* ```
|
|
418
|
+
**/
|
|
419
|
+
static getScoped<TKey extends keyof typeof StoreError['codeMappings']>(scope: string, code: TKey, ...args: Parameters<typeof StoreError['codeMappings'][TKey]>): StoreError;
|
|
14
420
|
}
|
|
15
|
-
declare function defineStore<TState extends StateTree>(id: string, options: DefineStoreOptions<TState>): StoreDefinition<TState>;
|
|
16
421
|
|
|
17
|
-
export { defineStore };
|
|
18
|
-
export type { StateTree };
|
|
422
|
+
export { StoreError, defineStore };
|
|
423
|
+
export type { DefineStoreOptions, StateTree, Store, StoreDefinition, StoreGeneric };
|