@astral/mobx-query 1.11.0 → 1.12.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.
@@ -97,7 +97,7 @@ export declare class InfiniteQuery<TResult, TError = void, TIsBackground extends
97
97
  /**
98
98
  * Форс метод для установки данных
99
99
  */
100
- forceUpdate: (data: TResult[]) => void;
100
+ forceUpdate: (param: TResult[] | ((data?: TResult[]) => TResult[])) => void;
101
101
  /**
102
102
  * Метод для обогащения параметров текущими значениями для инфинити
103
103
  */
@@ -45,9 +45,14 @@ export class InfiniteQuery extends QueryContainer {
45
45
  /**
46
46
  * Форс метод для установки данных
47
47
  */
48
- this.forceUpdate = (data) => {
48
+ this.forceUpdate = (param) => {
49
49
  this.auxiliary.submitSuccess();
50
- this.submitSuccess(data);
50
+ if (typeof param === 'function') {
51
+ this.submitSuccess(param(this.storage.data));
52
+ }
53
+ else {
54
+ this.submitSuccess(param);
55
+ }
51
56
  };
52
57
  /**
53
58
  * Метод для инвалидации данных
@@ -40,12 +40,16 @@ export type CreateInfiniteQueryParams<TResult, TError, TIsBackground extends boo
40
40
  isBackground?: TIsBackground;
41
41
  };
42
42
  export type CreateMutationParams<TResult, TError> = MutationParams<TResult, TError>;
43
+ /**
44
+ * Внутриний тип кешируемого стора
45
+ */
46
+ type CachedQuery<TResult, TError, TIsBackground extends boolean> = Query<TResult, TError, TIsBackground> | InfiniteQuery<TResult, TError, TIsBackground>;
43
47
  /**
44
48
  * Стратегия инвалидации кэша
45
49
  * @property 'partial-match' - Проверяет наличие хотя бы одной части ключа в кэше
46
50
  * @property 'chain-match' - Проверяет наличие полной связки ключей в кэше
47
51
  */
48
- type InvalidateStrategy = 'partial-match' | 'chain-match';
52
+ export type InvalidateStrategy = 'partial-match' | 'chain-match';
49
53
  /**
50
54
  * Сервис, позволяющий кэшировать данные.
51
55
  */
@@ -102,6 +106,14 @@ export declare class MobxQuery<TDefaultError = void> {
102
106
  * mobxQuery.invalidate(['users', '1'], 'chain-match'); // Инвалидирует только query с точным набором ключей ['users', '1']
103
107
  */
104
108
  invalidate: (invalidatedKeys: CacheKey[], strategy?: InvalidateStrategy) => void;
109
+ /**
110
+ * Метод для получения массива хешей ключей на основании ключей и стратегии
111
+ */
112
+ private getExistsKeyHashes;
113
+ /**
114
+ * метод для получения массива существующий квери на основании ключей и стратегии
115
+ */
116
+ getExistsQueries: <TQuery = CachedQuery<unknown, unknown, false>>(keys: CacheKey[], strategy?: InvalidateStrategy) => TQuery[];
105
117
  private submitValidity;
106
118
  /**
107
119
  * Метод инвалидации всех query
@@ -54,23 +54,28 @@ export class MobxQuery {
54
54
  * mobxQuery.invalidate(['users', '1'], 'chain-match'); // Инвалидирует только query с точным набором ключей ['users', '1']
55
55
  */
56
56
  this.invalidate = (invalidatedKeys, strategy = 'partial-match') => {
57
- for (const keyHash of this.keys.keys()) {
58
- const queryKeys = this.keys.get(keyHash);
59
- if (!queryKeys) {
60
- return;
61
- }
62
- // Проверяем, есть ли пересечение между закешированными ключами и набором ключей для инвалидации
63
- if (this.checkTouchedElement(invalidatedKeys, queryKeys, strategy)) {
64
- const query = this.queriesMap.get(keyHash);
65
- if (query) {
66
- query.invalidate();
67
- // Конвертируем инвалидированный квери в слабый,
68
- // чтобы сборщик мусора мог удалить неиспользуемые квери
69
- this.queriesMap.convertToWeak(keyHash);
70
- }
71
- }
72
- }
57
+ this.getExistsKeyHashes(invalidatedKeys, strategy).forEach(({ keyHash }) => {
58
+ var _a;
59
+ (_a = this.queriesMap.get(keyHash)) === null || _a === void 0 ? void 0 : _a.invalidate();
60
+ // Конвертируем инвалидированный квери в слабый,
61
+ // чтобы сборщик мусора мог удалить неиспользуемые квери
62
+ this.queriesMap.convertToWeak(keyHash);
63
+ });
73
64
  };
65
+ /**
66
+ * Метод для получения массива хешей ключей на основании ключей и стратегии
67
+ */
68
+ this.getExistsKeyHashes = (keys, strategy = 'partial-match') => [...this.keys.keys()]
69
+ .map((keyHash) => ({ keyHash, queryKeys: this.keys.get(keyHash) }))
70
+ .filter(({ queryKeys, keyHash }) =>
71
+ // Проверяем, есть ли пересечение между закешированными ключами и набором ключей для инвалидации
72
+ queryKeys &&
73
+ this.checkTouchedElement(keys, queryKeys, strategy) &&
74
+ this.queriesMap.has(keyHash));
75
+ /**
76
+ * метод для получения массива существующий квери на основании ключей и стратегии
77
+ */
78
+ this.getExistsQueries = (keys, strategy = 'partial-match') => this.getExistsKeyHashes(keys, strategy).map(({ keyHash }) => this.queriesMap.get(keyHash));
74
79
  // Метод для подтверждения того, что квери успешно получил валидные данные
75
80
  this.submitValidity = (keyHash) => {
76
81
  // конвертируем квери в сильный,
package/Query/Query.d.ts CHANGED
@@ -83,7 +83,7 @@ export declare class Query<TResult, TError = void, TIsBackground extends boolean
83
83
  /**
84
84
  * Форс метод для установки данных
85
85
  */
86
- forceUpdate: (data: TResult) => void;
86
+ forceUpdate: (param: TResult | ((data?: TResult) => TResult)) => void;
87
87
  /**
88
88
  * Метод для переиспользования синхронной логики запроса
89
89
  */
package/Query/Query.js CHANGED
@@ -42,9 +42,14 @@ export class Query extends QueryContainer {
42
42
  /**
43
43
  * Форс метод для установки данных
44
44
  */
45
- this.forceUpdate = (data) => {
45
+ this.forceUpdate = (param) => {
46
46
  this.auxiliary.submitSuccess();
47
- this.submitSuccess(data);
47
+ if (typeof param === 'function') {
48
+ this.submitSuccess(param(this.storage.data));
49
+ }
50
+ else {
51
+ this.submitSuccess(param);
52
+ }
48
53
  };
49
54
  /**
50
55
  * Метод для переиспользования синхронной логики запроса
@@ -57,4 +57,8 @@ export declare class InfiniteQuerySet<TParams extends any[], TResponse, TDefault
57
57
  */
58
58
  invalidate: (...params: DeepPartial<TParams>) => void;
59
59
  private configureQuery;
60
+ /**
61
+ * Форс метод для установки данных во все зависимые квери
62
+ */
63
+ forceUpdate: (update: (data?: TResponse[]) => TResponse[], ...params: DeepPartial<TParams>) => void;
60
64
  }
@@ -66,6 +66,15 @@ export class InfiniteQuerySet {
66
66
  execute,
67
67
  };
68
68
  };
69
+ /**
70
+ * Форс метод для установки данных во все зависимые квери
71
+ */
72
+ this.forceUpdate = (update, ...params) => {
73
+ const { keys } = this.configureQuery(...params);
74
+ this._cache
75
+ .getExistsQueries(keys, 'chain-match')
76
+ .forEach((query) => query.forceUpdate(update));
77
+ };
69
78
  this.baseKey = (_a = config === null || config === void 0 ? void 0 : config.name) !== null && _a !== void 0 ? _a : generateQuerySetBaseKey(_queryConfigurator);
70
79
  }
71
80
  }
@@ -61,4 +61,8 @@ export declare class QuerySet<TParams extends any[], TResponse, TDefaultError =
61
61
  */
62
62
  invalidate: (...params: DeepPartial<TParams>) => void;
63
63
  private configureQuery;
64
+ /**
65
+ * Форс метод для установки данных во все зависимые квери
66
+ */
67
+ forceUpdate: (update: (data?: TResponse) => TResponse, ...params: DeepPartial<TParams>) => void;
64
68
  }
@@ -67,6 +67,17 @@ export class QuerySet {
67
67
  execute,
68
68
  };
69
69
  };
70
+ /**
71
+ * Форс метод для установки данных во все зависимые квери
72
+ */
73
+ this.forceUpdate = (update, ...params) => {
74
+ const { keys } = this.configureQuery(...params);
75
+ this._cache
76
+ .getExistsQueries(keys, 'chain-match')
77
+ .forEach((query) => {
78
+ query.forceUpdate(update);
79
+ });
80
+ };
70
81
  this.baseKey = (_a = config === null || config === void 0 ? void 0 : config.name) !== null && _a !== void 0 ? _a : generateQuerySetBaseKey(_queryConfigurator);
71
82
  }
72
83
  }
@@ -97,7 +97,7 @@ export declare class InfiniteQuery<TResult, TError = void, TIsBackground extends
97
97
  /**
98
98
  * Форс метод для установки данных
99
99
  */
100
- forceUpdate: (data: TResult[]) => void;
100
+ forceUpdate: (param: TResult[] | ((data?: TResult[]) => TResult[])) => void;
101
101
  /**
102
102
  * Метод для обогащения параметров текущими значениями для инфинити
103
103
  */
@@ -48,9 +48,14 @@ class InfiniteQuery extends QueryContainer_1.QueryContainer {
48
48
  /**
49
49
  * Форс метод для установки данных
50
50
  */
51
- this.forceUpdate = (data) => {
51
+ this.forceUpdate = (param) => {
52
52
  this.auxiliary.submitSuccess();
53
- this.submitSuccess(data);
53
+ if (typeof param === 'function') {
54
+ this.submitSuccess(param(this.storage.data));
55
+ }
56
+ else {
57
+ this.submitSuccess(param);
58
+ }
54
59
  };
55
60
  /**
56
61
  * Метод для инвалидации данных
@@ -40,12 +40,16 @@ export type CreateInfiniteQueryParams<TResult, TError, TIsBackground extends boo
40
40
  isBackground?: TIsBackground;
41
41
  };
42
42
  export type CreateMutationParams<TResult, TError> = MutationParams<TResult, TError>;
43
+ /**
44
+ * Внутриний тип кешируемого стора
45
+ */
46
+ type CachedQuery<TResult, TError, TIsBackground extends boolean> = Query<TResult, TError, TIsBackground> | InfiniteQuery<TResult, TError, TIsBackground>;
43
47
  /**
44
48
  * Стратегия инвалидации кэша
45
49
  * @property 'partial-match' - Проверяет наличие хотя бы одной части ключа в кэше
46
50
  * @property 'chain-match' - Проверяет наличие полной связки ключей в кэше
47
51
  */
48
- type InvalidateStrategy = 'partial-match' | 'chain-match';
52
+ export type InvalidateStrategy = 'partial-match' | 'chain-match';
49
53
  /**
50
54
  * Сервис, позволяющий кэшировать данные.
51
55
  */
@@ -102,6 +106,14 @@ export declare class MobxQuery<TDefaultError = void> {
102
106
  * mobxQuery.invalidate(['users', '1'], 'chain-match'); // Инвалидирует только query с точным набором ключей ['users', '1']
103
107
  */
104
108
  invalidate: (invalidatedKeys: CacheKey[], strategy?: InvalidateStrategy) => void;
109
+ /**
110
+ * Метод для получения массива хешей ключей на основании ключей и стратегии
111
+ */
112
+ private getExistsKeyHashes;
113
+ /**
114
+ * метод для получения массива существующий квери на основании ключей и стратегии
115
+ */
116
+ getExistsQueries: <TQuery = CachedQuery<unknown, unknown, false>>(keys: CacheKey[], strategy?: InvalidateStrategy) => TQuery[];
105
117
  private submitValidity;
106
118
  /**
107
119
  * Метод инвалидации всех query
@@ -57,23 +57,28 @@ class MobxQuery {
57
57
  * mobxQuery.invalidate(['users', '1'], 'chain-match'); // Инвалидирует только query с точным набором ключей ['users', '1']
58
58
  */
59
59
  this.invalidate = (invalidatedKeys, strategy = 'partial-match') => {
60
- for (const keyHash of this.keys.keys()) {
61
- const queryKeys = this.keys.get(keyHash);
62
- if (!queryKeys) {
63
- return;
64
- }
65
- // Проверяем, есть ли пересечение между закешированными ключами и набором ключей для инвалидации
66
- if (this.checkTouchedElement(invalidatedKeys, queryKeys, strategy)) {
67
- const query = this.queriesMap.get(keyHash);
68
- if (query) {
69
- query.invalidate();
70
- // Конвертируем инвалидированный квери в слабый,
71
- // чтобы сборщик мусора мог удалить неиспользуемые квери
72
- this.queriesMap.convertToWeak(keyHash);
73
- }
74
- }
75
- }
60
+ this.getExistsKeyHashes(invalidatedKeys, strategy).forEach(({ keyHash }) => {
61
+ var _a;
62
+ (_a = this.queriesMap.get(keyHash)) === null || _a === void 0 ? void 0 : _a.invalidate();
63
+ // Конвертируем инвалидированный квери в слабый,
64
+ // чтобы сборщик мусора мог удалить неиспользуемые квери
65
+ this.queriesMap.convertToWeak(keyHash);
66
+ });
76
67
  };
68
+ /**
69
+ * Метод для получения массива хешей ключей на основании ключей и стратегии
70
+ */
71
+ this.getExistsKeyHashes = (keys, strategy = 'partial-match') => [...this.keys.keys()]
72
+ .map((keyHash) => ({ keyHash, queryKeys: this.keys.get(keyHash) }))
73
+ .filter(({ queryKeys, keyHash }) =>
74
+ // Проверяем, есть ли пересечение между закешированными ключами и набором ключей для инвалидации
75
+ queryKeys &&
76
+ this.checkTouchedElement(keys, queryKeys, strategy) &&
77
+ this.queriesMap.has(keyHash));
78
+ /**
79
+ * метод для получения массива существующий квери на основании ключей и стратегии
80
+ */
81
+ this.getExistsQueries = (keys, strategy = 'partial-match') => this.getExistsKeyHashes(keys, strategy).map(({ keyHash }) => this.queriesMap.get(keyHash));
77
82
  // Метод для подтверждения того, что квери успешно получил валидные данные
78
83
  this.submitValidity = (keyHash) => {
79
84
  // конвертируем квери в сильный,
@@ -83,7 +83,7 @@ export declare class Query<TResult, TError = void, TIsBackground extends boolean
83
83
  /**
84
84
  * Форс метод для установки данных
85
85
  */
86
- forceUpdate: (data: TResult) => void;
86
+ forceUpdate: (param: TResult | ((data?: TResult) => TResult)) => void;
87
87
  /**
88
88
  * Метод для переиспользования синхронной логики запроса
89
89
  */
@@ -45,9 +45,14 @@ class Query extends QueryContainer_1.QueryContainer {
45
45
  /**
46
46
  * Форс метод для установки данных
47
47
  */
48
- this.forceUpdate = (data) => {
48
+ this.forceUpdate = (param) => {
49
49
  this.auxiliary.submitSuccess();
50
- this.submitSuccess(data);
50
+ if (typeof param === 'function') {
51
+ this.submitSuccess(param(this.storage.data));
52
+ }
53
+ else {
54
+ this.submitSuccess(param);
55
+ }
51
56
  };
52
57
  /**
53
58
  * Метод для переиспользования синхронной логики запроса
@@ -57,4 +57,8 @@ export declare class InfiniteQuerySet<TParams extends any[], TResponse, TDefault
57
57
  */
58
58
  invalidate: (...params: DeepPartial<TParams>) => void;
59
59
  private configureQuery;
60
+ /**
61
+ * Форс метод для установки данных во все зависимые квери
62
+ */
63
+ forceUpdate: (update: (data?: TResponse[]) => TResponse[], ...params: DeepPartial<TParams>) => void;
60
64
  }
@@ -69,6 +69,15 @@ class InfiniteQuerySet {
69
69
  execute,
70
70
  };
71
71
  };
72
+ /**
73
+ * Форс метод для установки данных во все зависимые квери
74
+ */
75
+ this.forceUpdate = (update, ...params) => {
76
+ const { keys } = this.configureQuery(...params);
77
+ this._cache
78
+ .getExistsQueries(keys, 'chain-match')
79
+ .forEach((query) => query.forceUpdate(update));
80
+ };
72
81
  this.baseKey = (_a = config === null || config === void 0 ? void 0 : config.name) !== null && _a !== void 0 ? _a : (0, utils_1.generateQuerySetBaseKey)(_queryConfigurator);
73
82
  }
74
83
  }
@@ -61,4 +61,8 @@ export declare class QuerySet<TParams extends any[], TResponse, TDefaultError =
61
61
  */
62
62
  invalidate: (...params: DeepPartial<TParams>) => void;
63
63
  private configureQuery;
64
+ /**
65
+ * Форс метод для установки данных во все зависимые квери
66
+ */
67
+ forceUpdate: (update: (data?: TResponse) => TResponse, ...params: DeepPartial<TParams>) => void;
64
68
  }
@@ -70,6 +70,17 @@ class QuerySet {
70
70
  execute,
71
71
  };
72
72
  };
73
+ /**
74
+ * Форс метод для установки данных во все зависимые квери
75
+ */
76
+ this.forceUpdate = (update, ...params) => {
77
+ const { keys } = this.configureQuery(...params);
78
+ this._cache
79
+ .getExistsQueries(keys, 'chain-match')
80
+ .forEach((query) => {
81
+ query.forceUpdate(update);
82
+ });
83
+ };
73
84
  this.baseKey = (_a = config === null || config === void 0 ? void 0 : config.name) !== null && _a !== void 0 ? _a : (0, utils_1.generateQuerySetBaseKey)(_queryConfigurator);
74
85
  }
75
86
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astral/mobx-query",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "browser": "./index.js",
5
5
  "main": "./node/index.js",
6
6
  "dependencies": {