@astral/mobx-query 1.7.2 → 1.8.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.
Files changed (50) hide show
  1. package/AuxiliaryQuery/AuxiliaryQuery.d.ts +1 -1
  2. package/MobxQuery/MobxQuery.d.ts +32 -9
  3. package/MobxQuery/MobxQuery.js +30 -11
  4. package/index.d.ts +3 -2
  5. package/index.js +1 -2
  6. package/node/AdaptableMap/AdaptableMap.d.ts +29 -0
  7. package/node/AdaptableMap/AdaptableMap.js +81 -0
  8. package/node/AdaptableMap/index.d.ts +1 -0
  9. package/node/AdaptableMap/index.js +17 -0
  10. package/node/AuxiliaryQuery/AuxiliaryQuery.d.ts +55 -0
  11. package/node/AuxiliaryQuery/AuxiliaryQuery.js +115 -0
  12. package/node/AuxiliaryQuery/index.d.ts +1 -0
  13. package/node/AuxiliaryQuery/index.js +17 -0
  14. package/node/DataStorage/DataStorage.d.ts +33 -0
  15. package/node/DataStorage/DataStorage.js +51 -0
  16. package/node/DataStorage/index.d.ts +1 -0
  17. package/node/DataStorage/index.js +17 -0
  18. package/node/InfiniteQuery/InfiniteQuery.d.ts +135 -0
  19. package/node/InfiniteQuery/InfiniteQuery.js +169 -0
  20. package/node/InfiniteQuery/index.d.ts +1 -0
  21. package/node/InfiniteQuery/index.js +17 -0
  22. package/node/MobxQuery/MobxQuery.d.ts +132 -0
  23. package/node/MobxQuery/MobxQuery.js +177 -0
  24. package/node/MobxQuery/index.d.ts +1 -0
  25. package/node/MobxQuery/index.js +17 -0
  26. package/node/Mutation/Mutation.d.ts +34 -0
  27. package/node/Mutation/Mutation.js +47 -0
  28. package/node/Mutation/index.d.ts +1 -0
  29. package/node/Mutation/index.js +17 -0
  30. package/node/Query/Query.d.ts +103 -0
  31. package/node/Query/Query.js +113 -0
  32. package/node/Query/index.d.ts +1 -0
  33. package/node/Query/index.js +17 -0
  34. package/node/QueryContainer/QueryContainer.d.ts +61 -0
  35. package/node/QueryContainer/QueryContainer.js +83 -0
  36. package/node/QueryContainer/index.d.ts +1 -0
  37. package/node/QueryContainer/index.js +17 -0
  38. package/node/StatusStorage/StatusStorage.d.ts +24 -0
  39. package/node/StatusStorage/StatusStorage.js +41 -0
  40. package/node/StatusStorage/index.d.ts +1 -0
  41. package/node/StatusStorage/index.js +17 -0
  42. package/node/StorageFactory/StorageFactory.d.ts +9 -0
  43. package/node/StorageFactory/StorageFactory.js +23 -0
  44. package/node/StorageFactory/index.d.ts +1 -0
  45. package/node/StorageFactory/index.js +17 -0
  46. package/node/index.d.ts +5 -0
  47. package/node/index.js +9 -0
  48. package/node/types.d.ts +55 -0
  49. package/node/types.js +2 -0
  50. package/package.json +7 -3
@@ -30,7 +30,7 @@ export declare class AuxiliaryQuery<TResult, TError = void> {
30
30
  * Метод ответственный за создание единого промиса,
31
31
  * для устранения гонки запросов
32
32
  */
33
- getUnifiedPromise: (executor: Executor<TResult>, onSuccess?: ((data: TResult) => void) | undefined) => Promise<TResult>;
33
+ getUnifiedPromise: (executor: Executor<TResult>, onSuccess?: (data: TResult) => void) => Promise<TResult>;
34
34
  private setSuccess;
35
35
  private checkBackgroundAndSet;
36
36
  /**
@@ -24,20 +24,27 @@ type MobxQueryParams = {
24
24
  */
25
25
  enabledAutoFetch?: boolean;
26
26
  };
27
- type CreateQueryParams<TResult, TError, TIsBackground extends boolean> = Omit<QueryParams<TResult, TError, TIsBackground>, 'dataStorage' | 'statusStorage' | 'backgroundStatusStorage' | 'submitValidity'> & {
27
+ export type CreateQueryParams<TResult, TError, TIsBackground extends boolean> = Omit<QueryParams<TResult, TError, TIsBackground>, 'dataStorage' | 'statusStorage' | 'backgroundStatusStorage' | 'submitValidity'> & {
28
28
  /**
29
29
  * Режим фонового обновления
30
30
  * @default false
31
31
  */
32
32
  isBackground?: TIsBackground;
33
33
  };
34
- type CreateInfiniteQueryParams<TResult, TError, TIsBackground extends boolean> = Omit<InfiniteQueryParams<TResult, TError, TIsBackground>, 'dataStorage' | 'statusStorage' | 'backgroundStatusStorage' | 'submitValidity'> & {
34
+ export type CreateInfiniteQueryParams<TResult, TError, TIsBackground extends boolean> = Omit<InfiniteQueryParams<TResult, TError, TIsBackground>, 'dataStorage' | 'statusStorage' | 'backgroundStatusStorage' | 'submitValidity'> & {
35
35
  /**
36
36
  * Режим фонового обновления
37
37
  * @default false
38
38
  */
39
39
  isBackground?: TIsBackground;
40
40
  };
41
+ export type CreateMutationParams<TResult, TError> = MutationParams<TResult, TError>;
42
+ /**
43
+ * Стратегия инвалидации кэша
44
+ * @property 'partial-match' - Проверяет наличие хотя бы одной части ключа в кэше
45
+ * @property 'chain-match' - Проверяет наличие полной связки ключей в кэше
46
+ */
47
+ type InvalidateStrategy = 'partial-match' | 'chain-match';
41
48
  /**
42
49
  * Сервис, позволяющий кэшировать данные.
43
50
  */
@@ -74,10 +81,26 @@ export declare class MobxQuery<TDefaultError = void> {
74
81
  private serialize;
75
82
  constructor({ onError, fetchPolicy, enabledAutoFetch, }?: MobxQueryParams);
76
83
  /**
77
- * Метод для инвалидации по списку ключей,
78
- * предполагается использование из домена
79
- */
80
- invalidate: (keysParts: CacheKey[]) => void;
84
+ * Проверяет пересечение ключей в зависимости от стратегии
85
+ * @param invalidatedKeys - Ключи для инвалидации
86
+ * @param queryKeys - Ключи запроса
87
+ * @param strategy - Стратегия проверки:
88
+ * - 'chain-match' - все ключи из invalidatedKeys должны присутствовать в queryKeys
89
+ * - 'partial-match' - хотя бы один ключ из invalidatedKeys должен быть в queryKeys
90
+ */
91
+ private checkTouchedElement;
92
+ /**
93
+ * Метод для инвалидации по списку ключей, предполагается использование из домена
94
+ * @param invalidatedKeys - Массив ключей для инвалидации
95
+ * @param strategy - Стратегия инвалидации. 'chain-match' - инвалидировать при совпадении связки ключей в кэше, 'partial-match' - инвалидировать при частичном совпадении ключей. По умолчанию 'partial-match'
96
+ * @example
97
+ * // Инвалидация по частичному совпадению ключей
98
+ * mobxQuery.invalidate(['users', '1']); // Инвалидирует все query, содержащие ключ 'users' или '1'
99
+ *
100
+ * // Инвалидация по совпадению связки ключей
101
+ * mobxQuery.invalidate(['users', '1'], 'chain-match'); // Инвалидирует только query с точным набором ключей ['users', '1']
102
+ */
103
+ invalidate: (invalidatedKeys: CacheKey[], strategy?: InvalidateStrategy) => void;
81
104
  private submitValidity;
82
105
  /**
83
106
  * Метод инвалидации всех query
@@ -96,14 +119,14 @@ export declare class MobxQuery<TDefaultError = void> {
96
119
  /**
97
120
  * Метод создания стора, кешируется
98
121
  */
99
- createQuery: <TResult, TError = TDefaultError, TIsBackground extends boolean = false>(key: CacheKey[], executor: QueryExecutor<TResult>, params?: CreateQueryParams<TResult, TError, TIsBackground> | undefined) => Query<TResult, TError, TIsBackground>;
122
+ createQuery: <TResult, TError = TDefaultError, TIsBackground extends boolean = false>(key: CacheKey[], executor: QueryExecutor<TResult>, params?: CreateQueryParams<TResult, TError, TIsBackground>) => Query<TResult, TError, TIsBackground>;
100
123
  /**
101
124
  * Метод создания инфинит стора, кешируется
102
125
  */
103
- createInfiniteQuery: <TResult, TError = TDefaultError, TIsBackground extends boolean = false>(key: CacheKey[], executor: InfiniteExecutor<TResult>, params?: CreateInfiniteQueryParams<TResult, TError, TIsBackground> | undefined) => InfiniteQuery<TResult, TError, TIsBackground>;
126
+ createInfiniteQuery: <TResult, TError = TDefaultError, TIsBackground extends boolean = false>(key: CacheKey[], executor: InfiniteExecutor<TResult>, params?: CreateInfiniteQueryParams<TResult, TError, TIsBackground>) => InfiniteQuery<TResult, TError, TIsBackground>;
104
127
  /**
105
128
  * Метод создания мутации, не кешируется
106
129
  */
107
- createMutation: <TResult, TError = TDefaultError, TExecutorParams = void>(executor: MutationExecutor<TResult, TExecutorParams>, params?: MutationParams<TResult, TError> | undefined) => Mutation<TResult, TError, TExecutorParams>;
130
+ createMutation: <TResult, TError = TDefaultError, TExecutorParams = void>(executor: MutationExecutor<TResult, TExecutorParams>, params?: CreateMutationParams<TResult, TError>) => Mutation<TResult, TError, TExecutorParams>;
108
131
  }
109
132
  export {};
@@ -27,20 +27,39 @@ export class MobxQuery {
27
27
  this.statusStorageFactory = new StatusStorageFactory();
28
28
  this.serialize = (data) => JSON.stringify(data);
29
29
  /**
30
- * Метод для инвалидации по списку ключей,
31
- * предполагается использование из домена
30
+ * Проверяет пересечение ключей в зависимости от стратегии
31
+ * @param invalidatedKeys - Ключи для инвалидации
32
+ * @param queryKeys - Ключи запроса
33
+ * @param strategy - Стратегия проверки:
34
+ * - 'chain-match' - все ключи из invalidatedKeys должны присутствовать в queryKeys
35
+ * - 'partial-match' - хотя бы один ключ из invalidatedKeys должен быть в queryKeys
32
36
  */
33
- this.invalidate = (keysParts) => {
34
- // Сет сериализованных ключей
35
- const keysSet = new Set(keysParts.map(this.serialize));
36
- [...this.keys.keys()].forEach((keyHash) => {
37
- const key = this.keys.get(keyHash);
38
- if (!key) {
37
+ this.checkTouchedElement = (invalidatedKeys, queryKeys, strategy) => {
38
+ const serializedInvalidatedKeys = invalidatedKeys.map(this.serialize);
39
+ if (strategy === 'chain-match') {
40
+ return serializedInvalidatedKeys.every((invalidatedKey) => queryKeys.some((queryKey) => invalidatedKey === this.serialize(queryKey)));
41
+ }
42
+ return queryKeys.some((queryKey) => serializedInvalidatedKeys.find((invalidatedKey) => invalidatedKey === this.serialize(queryKey)));
43
+ };
44
+ /**
45
+ * Метод для инвалидации по списку ключей, предполагается использование из домена
46
+ * @param invalidatedKeys - Массив ключей для инвалидации
47
+ * @param strategy - Стратегия инвалидации. 'chain-match' - инвалидировать при совпадении связки ключей в кэше, 'partial-match' - инвалидировать при частичном совпадении ключей. По умолчанию 'partial-match'
48
+ * @example
49
+ * // Инвалидация по частичному совпадению ключей
50
+ * mobxQuery.invalidate(['users', '1']); // Инвалидирует все query, содержащие ключ 'users' или '1'
51
+ *
52
+ * // Инвалидация по совпадению связки ключей
53
+ * mobxQuery.invalidate(['users', '1'], 'chain-match'); // Инвалидирует только query с точным набором ключей ['users', '1']
54
+ */
55
+ this.invalidate = (invalidatedKeys, strategy = 'partial-match') => {
56
+ for (const keyHash of this.keys.keys()) {
57
+ const queryKeys = this.keys.get(keyHash);
58
+ if (!queryKeys) {
39
59
  return;
40
60
  }
41
61
  // Проверяем, есть ли пересечение между закешированными ключами и набором ключей для инвалидации
42
- const hasTouchedElement = key.some((valuePart) => keysSet.has(this.serialize(valuePart)));
43
- if (hasTouchedElement) {
62
+ if (this.checkTouchedElement(invalidatedKeys, queryKeys, strategy)) {
44
63
  const query = this.queriesMap.get(keyHash);
45
64
  if (query) {
46
65
  query.invalidate();
@@ -49,7 +68,7 @@ export class MobxQuery {
49
68
  this.queriesMap.convertToWeak(keyHash);
50
69
  }
51
70
  }
52
- });
71
+ }
53
72
  };
54
73
  // Метод для подтверждения того, что квери успешно получил валидные данные
55
74
  this.submitValidity = (keyHash) => {
package/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { Mutation } from './Mutation';
2
2
  export { Query } from './Query';
3
- export { InfiniteQuery } from './InfiniteQuery';
4
- export { MobxQuery } from './MobxQuery';
3
+ export { type InfiniteParams } from './InfiniteQuery';
4
+ export { MobxQuery, type CreateQueryParams, type CreateInfiniteQueryParams, type CreateMutationParams, } from './MobxQuery';
5
+ export { type CacheKey, type FetchPolicy } from './types';
package/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  export { Mutation } from './Mutation';
2
2
  export { Query } from './Query';
3
- export { InfiniteQuery } from './InfiniteQuery';
4
- export { MobxQuery } from './MobxQuery';
3
+ export { MobxQuery, } from './MobxQuery';
@@ -0,0 +1,29 @@
1
+ export type SimplifiedMap<TData> = Pick<Map<string, TData>, 'get' | 'delete' | 'has'> & {
2
+ set: (key: string, value: TData) => void;
3
+ };
4
+ /**
5
+ * Фасад для работы с Map, умеющий в конвертацию хранимого значения в "слабое" состояние и в "сильное"
6
+ * По умолчанию все значения хранятся как "слабые".
7
+ * @enum "Слабое" состояние подразумевает то, что хранимое значение сохранено через WeakRef, следовательно, если в системе не останется ссылок на хранимое значение, сборщик мусора сможет удалить это значение из памяти.
8
+ * @enum "Сильное" состояние подразумевает то, что значение хранится как есть, т.е. даже если в системе не останется других ссылок на хранимое значение, сборщик мусора не сможет удалить его из памяти.
9
+ */
10
+ export declare class AdaptableMap<TData extends {}> implements SimplifiedMap<TData> {
11
+ private strong;
12
+ private weak;
13
+ get: (key: string) => TData | undefined;
14
+ set: (key: string, data: TData) => void;
15
+ delete: (key: string) => boolean;
16
+ has: (key: string) => boolean;
17
+ /**
18
+ * Метод перемещающий значение из одного Map в другой
19
+ */
20
+ private change;
21
+ /**
22
+ * Метод для конвертации значения из "сильного" в "слабое" состояние
23
+ */
24
+ convertToWeak: (key: string) => void;
25
+ /**
26
+ * Метод для конвертации значения из "слабого" в "сильное" состояние
27
+ */
28
+ convertToStrong: (key: string) => void;
29
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdaptableMap = void 0;
4
+ /**
5
+ * Фасад для работы с Map, хранящим значения как WeakRef
6
+ */
7
+ class WeakRefMap {
8
+ constructor() {
9
+ this.map = new Map();
10
+ this.get = (key) => {
11
+ var _a, _b;
12
+ // Проверка на старые браузеры, не умеющие в WeakRef
13
+ if (!globalThis.WeakRef) {
14
+ return this.map.get(key);
15
+ }
16
+ return (_b = (_a = this.map.get(key)) === null || _a === void 0 ? void 0 : _a.deref) === null || _b === void 0 ? void 0 : _b.call(_a);
17
+ };
18
+ this.set = (key, value) => {
19
+ // Проверка на старые браузеры, не умеющие в WeakRef
20
+ if (!globalThis.WeakRef) {
21
+ this.map.set(key, value);
22
+ }
23
+ else {
24
+ this.map.set(key, new globalThis.WeakRef(value));
25
+ }
26
+ };
27
+ this.delete = (key) => this.map.delete(key);
28
+ this.has = (key) => this.map.has(key);
29
+ }
30
+ }
31
+ /**
32
+ * Фасад для работы с Map, умеющий в конвертацию хранимого значения в "слабое" состояние и в "сильное"
33
+ * По умолчанию все значения хранятся как "слабые".
34
+ * @enum "Слабое" состояние подразумевает то, что хранимое значение сохранено через WeakRef, следовательно, если в системе не останется ссылок на хранимое значение, сборщик мусора сможет удалить это значение из памяти.
35
+ * @enum "Сильное" состояние подразумевает то, что значение хранится как есть, т.е. даже если в системе не останется других ссылок на хранимое значение, сборщик мусора не сможет удалить его из памяти.
36
+ */
37
+ class AdaptableMap {
38
+ constructor() {
39
+ this.strong = new Map();
40
+ this.weak = new WeakRefMap();
41
+ this.get = (key) => {
42
+ if (this.strong.has(key)) {
43
+ return this.strong.get(key);
44
+ }
45
+ return this.weak.get(key);
46
+ };
47
+ this.set = (key, data) => {
48
+ this.weak.set(key, data);
49
+ };
50
+ this.delete = (key) => {
51
+ // если успешно удалилось в "слабом" хранилище, тогда в "сильном" уже не имеет смысла удалять.
52
+ return this.weak.delete(key) || this.strong.delete(key);
53
+ };
54
+ this.has = (key) => {
55
+ return Boolean(this.weak.get(key)) || this.strong.has(key);
56
+ };
57
+ /**
58
+ * Метод перемещающий значение из одного Map в другой
59
+ */
60
+ this.change = (key, from, to) => {
61
+ const query = this.get(key);
62
+ if (query) {
63
+ from.delete(key);
64
+ to.set(key, query);
65
+ }
66
+ };
67
+ /**
68
+ * Метод для конвертации значения из "сильного" в "слабое" состояние
69
+ */
70
+ this.convertToWeak = (key) => {
71
+ this.change(key, this.strong, this.weak);
72
+ };
73
+ /**
74
+ * Метод для конвертации значения из "слабого" в "сильное" состояние
75
+ */
76
+ this.convertToStrong = (key) => {
77
+ this.change(key, this.weak, this.strong);
78
+ };
79
+ }
80
+ }
81
+ exports.AdaptableMap = AdaptableMap;
@@ -0,0 +1 @@
1
+ export * from './AdaptableMap';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AdaptableMap"), exports);
@@ -0,0 +1,55 @@
1
+ import { type StatusStorage } from '../StatusStorage';
2
+ /**
3
+ * Испольнитель запроса
4
+ */
5
+ type Executor<TResult> = () => Promise<TResult>;
6
+ /**
7
+ * Вспомогательное хранилище данных, для композиции в Query сторах,
8
+ * содержащее флаги загрузки и ошибки,
9
+ * колбэки на успешный запрос и на ошибку,
10
+ * данные последней ошибки,
11
+ * а так же, управляющее синглтон промисом.
12
+ */
13
+ export declare class AuxiliaryQuery<TResult, TError = void> {
14
+ private readonly statusStorage;
15
+ private readonly backgroundStatusStorage;
16
+ /**
17
+ * Флаг, обозначающий простаивание, т.е. запроса еще не было
18
+ */
19
+ isIdle: boolean;
20
+ /**
21
+ * Единый промис, для устранения гонки запросов
22
+ */
23
+ private unifiedPromise?;
24
+ /**
25
+ * Флаг, по которому реактивно определяется необходимость запуска инвалидации
26
+ */
27
+ isInvalid: boolean;
28
+ constructor(statusStorage: StatusStorage<TError>, backgroundStatusStorage: StatusStorage<TError> | null);
29
+ /**
30
+ * Метод ответственный за создание единого промиса,
31
+ * для устранения гонки запросов
32
+ */
33
+ getUnifiedPromise: (executor: Executor<TResult>, onSuccess?: (data: TResult) => void) => Promise<TResult>;
34
+ private setSuccess;
35
+ private checkBackgroundAndSet;
36
+ /**
37
+ * Обработчик успешного ответа
38
+ */
39
+ submitSuccess: () => void;
40
+ private setError;
41
+ /**
42
+ * Обработчик ошибки
43
+ */
44
+ submitError: (error: TError) => void;
45
+ private setLoading;
46
+ /**
47
+ * Метод, вызываемый в самом начале запроса, чтобы сбросить флаги в соответствующее значение
48
+ */
49
+ startLoading: () => void;
50
+ /**
51
+ * Метод для инвалидации данных
52
+ */
53
+ invalidate: () => void;
54
+ }
55
+ export {};
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuxiliaryQuery = void 0;
4
+ const mobx_1 = require("mobx");
5
+ /**
6
+ * Вспомогательное хранилище данных, для композиции в Query сторах,
7
+ * содержащее флаги загрузки и ошибки,
8
+ * колбэки на успешный запрос и на ошибку,
9
+ * данные последней ошибки,
10
+ * а так же, управляющее синглтон промисом.
11
+ */
12
+ class AuxiliaryQuery {
13
+ constructor(statusStorage, backgroundStatusStorage) {
14
+ this.statusStorage = statusStorage;
15
+ this.backgroundStatusStorage = backgroundStatusStorage;
16
+ /**
17
+ * Флаг, обозначающий простаивание, т.е. запроса еще не было
18
+ */
19
+ this.isIdle = true;
20
+ /**
21
+ * Флаг, по которому реактивно определяется необходимость запуска инвалидации
22
+ */
23
+ this.isInvalid = false;
24
+ /**
25
+ * Метод ответственный за создание единого промиса,
26
+ * для устранения гонки запросов
27
+ */
28
+ this.getUnifiedPromise = (executor, onSuccess) => {
29
+ // проверяем, если синглтона нет, то надо создать
30
+ if (!Boolean(this.unifiedPromise)) {
31
+ this.startLoading();
32
+ this.unifiedPromise = executor()
33
+ .then((resData) => {
34
+ (0, mobx_1.runInAction)(this.submitSuccess);
35
+ onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(resData);
36
+ return resData;
37
+ })
38
+ .catch((e) => {
39
+ (0, mobx_1.runInAction)(() => {
40
+ this.submitError(e);
41
+ });
42
+ throw e;
43
+ })
44
+ .finally(() => {
45
+ this.unifiedPromise = undefined;
46
+ (0, mobx_1.runInAction)(() => {
47
+ this.statusStorage.isLoading = false;
48
+ });
49
+ });
50
+ }
51
+ return this.unifiedPromise;
52
+ };
53
+ this.setSuccess = (storage) => {
54
+ storage.isError = false;
55
+ storage.isSuccess = true;
56
+ };
57
+ this.checkBackgroundAndSet = (setStorage) => {
58
+ if (this.backgroundStatusStorage && this.statusStorage.isSuccess) {
59
+ setStorage(this.backgroundStatusStorage);
60
+ }
61
+ else {
62
+ setStorage(this.statusStorage);
63
+ }
64
+ };
65
+ /**
66
+ * Обработчик успешного ответа
67
+ */
68
+ this.submitSuccess = () => {
69
+ this.checkBackgroundAndSet(this.setSuccess);
70
+ this.isInvalid = false;
71
+ };
72
+ this.setError = (storage, error) => {
73
+ storage.isSuccess = false;
74
+ storage.isError = true;
75
+ storage.error = error;
76
+ };
77
+ /**
78
+ * Обработчик ошибки
79
+ */
80
+ this.submitError = (error) => {
81
+ this.checkBackgroundAndSet((storage) => this.setError(storage, error));
82
+ };
83
+ this.setLoading = (storage) => {
84
+ storage.isLoading = true;
85
+ storage.isError = false;
86
+ storage.isSuccess = false;
87
+ };
88
+ /**
89
+ * Метод, вызываемый в самом начале запроса, чтобы сбросить флаги в соответствующее значение
90
+ */
91
+ this.startLoading = () => {
92
+ this.isIdle = false;
93
+ this.checkBackgroundAndSet(this.setLoading);
94
+ };
95
+ /**
96
+ * Метод для инвалидации данных
97
+ */
98
+ this.invalidate = () => {
99
+ this.isInvalid = true;
100
+ };
101
+ (0, mobx_1.makeObservable)(this, {
102
+ getUnifiedPromise: mobx_1.action,
103
+ isIdle: mobx_1.observable,
104
+ isInvalid: mobx_1.observable,
105
+ submitSuccess: mobx_1.action,
106
+ setSuccess: mobx_1.action,
107
+ setError: mobx_1.action,
108
+ setLoading: mobx_1.action,
109
+ submitError: mobx_1.action,
110
+ startLoading: mobx_1.action,
111
+ invalidate: mobx_1.action,
112
+ });
113
+ }
114
+ }
115
+ exports.AuxiliaryQuery = AuxiliaryQuery;
@@ -0,0 +1 @@
1
+ export * from './AuxiliaryQuery';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AuxiliaryQuery"), exports);
@@ -0,0 +1,33 @@
1
+ import { StorageFactory } from '../StorageFactory';
2
+ /**
3
+ * Хранилище данных, предназначено для обеспечения единого интерфейса при работе с данными
4
+ */
5
+ export declare class DataStorage<TData> {
6
+ /**
7
+ * Поле, отвечающее за непосредственное хранение данных
8
+ */
9
+ private internalData?;
10
+ constructor();
11
+ /**
12
+ * Флаг, отображающий наличие данных
13
+ */
14
+ get hasData(): boolean;
15
+ /**
16
+ * Метод для установки данных
17
+ */
18
+ setData: (value: TData) => void;
19
+ /**
20
+ * Геттер данных
21
+ */
22
+ get data(): TData | undefined;
23
+ }
24
+ /**
25
+ * Фабрика ответственная за создание и хранение экземляров хранилищ
26
+ */
27
+ export declare class DataStorageFactory extends StorageFactory<DataStorage<unknown>> {
28
+ constructor();
29
+ /**
30
+ * Фабричный метод получения/создания инстанса хранилища по ключу
31
+ */
32
+ getStorage: <TData>(keyHash: string) => DataStorage<TData>;
33
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataStorageFactory = exports.DataStorage = void 0;
4
+ const mobx_1 = require("mobx");
5
+ const StorageFactory_1 = require("../StorageFactory");
6
+ /**
7
+ * Хранилище данных, предназначено для обеспечения единого интерфейса при работе с данными
8
+ */
9
+ class DataStorage {
10
+ constructor() {
11
+ /**
12
+ * Поле, отвечающее за непосредственное хранение данных
13
+ */
14
+ this.internalData = undefined;
15
+ /**
16
+ * Метод для установки данных
17
+ */
18
+ this.setData = (value) => {
19
+ this.internalData = value;
20
+ };
21
+ (0, mobx_1.makeAutoObservable)(this);
22
+ }
23
+ /**
24
+ * Флаг, отображающий наличие данных
25
+ */
26
+ get hasData() {
27
+ return Boolean(this.internalData);
28
+ }
29
+ /**
30
+ * Геттер данных
31
+ */
32
+ get data() {
33
+ return this.internalData;
34
+ }
35
+ }
36
+ exports.DataStorage = DataStorage;
37
+ /**
38
+ * Фабрика ответственная за создание и хранение экземляров хранилищ
39
+ */
40
+ class DataStorageFactory extends StorageFactory_1.StorageFactory {
41
+ constructor() {
42
+ super(() => new DataStorage());
43
+ /**
44
+ * Фабричный метод получения/создания инстанса хранилища по ключу
45
+ */
46
+ this.getStorage = (keyHash) => {
47
+ return this.getInternalStorage(keyHash);
48
+ };
49
+ }
50
+ }
51
+ exports.DataStorageFactory = DataStorageFactory;
@@ -0,0 +1 @@
1
+ export * from './DataStorage';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./DataStorage"), exports);