@astral/mobx-query 1.8.0 → 1.9.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/MobxQuery/MobxQuery.d.ts +44 -0
- package/MobxQuery/MobxQuery.js +48 -0
- package/README.md +1048 -287
- package/Sets/InfiniteQuerySet/InfiniteQuerySet.d.ts +60 -0
- package/Sets/InfiniteQuerySet/InfiniteQuerySet.js +71 -0
- package/Sets/InfiniteQuerySet/index.d.ts +1 -0
- package/Sets/InfiniteQuerySet/index.js +1 -0
- package/Sets/MutationSet/MutationSet.d.ts +32 -0
- package/Sets/MutationSet/MutationSet.js +31 -0
- package/Sets/MutationSet/index.d.ts +1 -0
- package/Sets/MutationSet/index.js +1 -0
- package/Sets/QuerySet/QuerySet.d.ts +64 -0
- package/Sets/QuerySet/QuerySet.js +72 -0
- package/Sets/QuerySet/index.d.ts +1 -0
- package/Sets/QuerySet/index.js +1 -0
- package/Sets/index.d.ts +3 -0
- package/Sets/index.js +3 -0
- package/Sets/utils/generateQuerySetBaseKey/generateQuerySetBaseKey.d.ts +4 -0
- package/Sets/utils/generateQuerySetBaseKey/generateQuerySetBaseKey.js +5 -0
- package/Sets/utils/generateQuerySetBaseKey/index.d.ts +1 -0
- package/Sets/utils/generateQuerySetBaseKey/index.js +1 -0
- package/Sets/utils/generateQuerySetKeys/generateQuerySetKeys.d.ts +9 -0
- package/Sets/utils/generateQuerySetKeys/generateQuerySetKeys.js +20 -0
- package/Sets/utils/generateQuerySetKeys/index.d.ts +1 -0
- package/Sets/utils/generateQuerySetKeys/index.js +1 -0
- package/Sets/utils/index.d.ts +2 -0
- package/Sets/utils/index.js +2 -0
- package/index.d.ts +2 -1
- package/index.js +1 -0
- package/node/AdaptableMap/AdaptableMap.d.ts +29 -0
- package/node/AdaptableMap/AdaptableMap.js +81 -0
- package/node/AdaptableMap/index.d.ts +1 -0
- package/node/AdaptableMap/index.js +17 -0
- package/node/AuxiliaryQuery/AuxiliaryQuery.d.ts +55 -0
- package/node/AuxiliaryQuery/AuxiliaryQuery.js +115 -0
- package/node/AuxiliaryQuery/index.d.ts +1 -0
- package/node/AuxiliaryQuery/index.js +17 -0
- package/node/DataStorage/DataStorage.d.ts +33 -0
- package/node/DataStorage/DataStorage.js +51 -0
- package/node/DataStorage/index.d.ts +1 -0
- package/node/DataStorage/index.js +17 -0
- package/node/InfiniteQuery/InfiniteQuery.d.ts +135 -0
- package/node/InfiniteQuery/InfiniteQuery.js +169 -0
- package/node/InfiniteQuery/index.d.ts +1 -0
- package/node/InfiniteQuery/index.js +17 -0
- package/node/MobxQuery/MobxQuery.d.ts +176 -0
- package/node/MobxQuery/MobxQuery.js +225 -0
- package/node/MobxQuery/index.d.ts +1 -0
- package/node/MobxQuery/index.js +17 -0
- package/node/Mutation/Mutation.d.ts +34 -0
- package/node/Mutation/Mutation.js +47 -0
- package/node/Mutation/index.d.ts +1 -0
- package/node/Mutation/index.js +17 -0
- package/node/Query/Query.d.ts +103 -0
- package/node/Query/Query.js +113 -0
- package/node/Query/index.d.ts +1 -0
- package/node/Query/index.js +17 -0
- package/node/QueryContainer/QueryContainer.d.ts +61 -0
- package/node/QueryContainer/QueryContainer.js +83 -0
- package/node/QueryContainer/index.d.ts +1 -0
- package/node/QueryContainer/index.js +17 -0
- package/node/Sets/InfiniteQuerySet/InfiniteQuerySet.d.ts +60 -0
- package/node/Sets/InfiniteQuerySet/InfiniteQuerySet.js +75 -0
- package/node/Sets/InfiniteQuerySet/index.d.ts +1 -0
- package/node/Sets/InfiniteQuerySet/index.js +17 -0
- package/node/Sets/MutationSet/MutationSet.d.ts +32 -0
- package/node/Sets/MutationSet/MutationSet.js +35 -0
- package/node/Sets/MutationSet/index.d.ts +1 -0
- package/node/Sets/MutationSet/index.js +17 -0
- package/node/Sets/QuerySet/QuerySet.d.ts +64 -0
- package/node/Sets/QuerySet/QuerySet.js +76 -0
- package/node/Sets/QuerySet/index.d.ts +1 -0
- package/node/Sets/QuerySet/index.js +17 -0
- package/node/Sets/index.d.ts +3 -0
- package/node/Sets/index.js +19 -0
- package/node/Sets/utils/generateQuerySetBaseKey/generateQuerySetBaseKey.d.ts +4 -0
- package/node/Sets/utils/generateQuerySetBaseKey/generateQuerySetBaseKey.js +12 -0
- package/node/Sets/utils/generateQuerySetBaseKey/index.d.ts +1 -0
- package/node/Sets/utils/generateQuerySetBaseKey/index.js +17 -0
- package/node/Sets/utils/generateQuerySetKeys/generateQuerySetKeys.d.ts +9 -0
- package/node/Sets/utils/generateQuerySetKeys/generateQuerySetKeys.js +27 -0
- package/node/Sets/utils/generateQuerySetKeys/index.d.ts +1 -0
- package/node/Sets/utils/generateQuerySetKeys/index.js +17 -0
- package/node/Sets/utils/index.d.ts +2 -0
- package/node/Sets/utils/index.js +18 -0
- package/node/StatusStorage/StatusStorage.d.ts +24 -0
- package/node/StatusStorage/StatusStorage.js +41 -0
- package/node/StatusStorage/index.d.ts +1 -0
- package/node/StatusStorage/index.js +17 -0
- package/node/StorageFactory/StorageFactory.d.ts +9 -0
- package/node/StorageFactory/StorageFactory.js +23 -0
- package/node/StorageFactory/index.d.ts +1 -0
- package/node/StorageFactory/index.js +17 -0
- package/node/index.d.ts +6 -0
- package/node/index.js +11 -0
- package/node/types.d.ts +55 -0
- package/node/types.js +2 -0
- package/package.json +11 -4
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type DeepPartial } from 'utility-types';
|
|
2
|
+
import { type CacheKey } from '../../types';
|
|
3
|
+
import { type InfiniteParams, type InfiniteQuery } from '../../InfiniteQuery';
|
|
4
|
+
import { type CreateInfiniteQueryParams, type MobxQuery } from '../../MobxQuery';
|
|
5
|
+
export type InfiniteQuerySetConfig = {
|
|
6
|
+
name?: string;
|
|
7
|
+
};
|
|
8
|
+
export type InfiniteQuerySetConfigurator<TParams extends any[], TResponse> = (...params: TParams) => {
|
|
9
|
+
keys?: CacheKey[];
|
|
10
|
+
execute: (infiniteParams: InfiniteParams) => Promise<TResponse[]>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Набор infinite queries под одним ключем с целью повышения читаемости кода и удобства инвалидации по общему ключу
|
|
14
|
+
*/
|
|
15
|
+
export declare class InfiniteQuerySet<TParams extends any[], TResponse, TDefaultError = unknown> {
|
|
16
|
+
private readonly _cache;
|
|
17
|
+
private readonly _queryConfigurator;
|
|
18
|
+
private readonly baseKey;
|
|
19
|
+
constructor(_cache: MobxQuery, _queryConfigurator: InfiniteQuerySetConfigurator<TParams, TResponse>, config?: InfiniteQuerySetConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Создает infinite query в кэше. Добавляет его в набор
|
|
22
|
+
* @returns InfiniteQuery объект
|
|
23
|
+
* @example
|
|
24
|
+
* const docListQuery = docFetcher.infiniteQueries.docList.create()
|
|
25
|
+
* // Получает данные
|
|
26
|
+
* docListQuery.sync()
|
|
27
|
+
*/
|
|
28
|
+
create: <TError = TDefaultError>(...params: TParams) => InfiniteQuery<TResponse, TError>;
|
|
29
|
+
/**
|
|
30
|
+
* Создает infinite query в кэше с дополнительными параметрами конфигурации. Добавляет его в набор
|
|
31
|
+
* @param config - Параметры конфигурации infinite query. Например, fetchPolicy или incrementCount
|
|
32
|
+
* @param params - Параметры запроса
|
|
33
|
+
* @returns InfiniteQuery объект
|
|
34
|
+
* @example
|
|
35
|
+
* const docListQuery = docFetcher.infiniteQueries.docList.createWithConfig(
|
|
36
|
+
* { fetchPolicy: 'network-only', incrementCount: 10 },
|
|
37
|
+
* 'docId',
|
|
38
|
+
* )
|
|
39
|
+
* // Получает данные из query
|
|
40
|
+
* docListQuery.sync()
|
|
41
|
+
*/
|
|
42
|
+
createWithConfig: <TError = TDefaultError, TIsBackground extends boolean = false>(config: CreateInfiniteQueryParams<TResponse, TError, TIsBackground>, ...params: TParams) => InfiniteQuery<TResponse, TError, TIsBackground>;
|
|
43
|
+
/**
|
|
44
|
+
* Инвалидирует текущий набор infinite queries в кэше
|
|
45
|
+
* @param params - Параметры функции, переданной в createInfiniteQuerySet при создании набора. Если не указаны, то инвалидируется все query
|
|
46
|
+
* @example
|
|
47
|
+
* const docFetcher = {
|
|
48
|
+
* infiniteQueries: {
|
|
49
|
+
* docList: createInfiniteQuerySet('docList', (search: string) => ({
|
|
50
|
+
* execute: ({ count, offset }) => httpService.get(`/doc/${search}?count=${count}&offset=${offset}`),
|
|
51
|
+
* }),
|
|
52
|
+
* }
|
|
53
|
+
* };
|
|
54
|
+
*
|
|
55
|
+
* // Инвалидирует infinite query с конкретным переданным search
|
|
56
|
+
* docFetcher.infiniteQueries.docList.invalidate('документ1')
|
|
57
|
+
*/
|
|
58
|
+
invalidate: (...params: DeepPartial<TParams>) => void;
|
|
59
|
+
private configureQuery;
|
|
60
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { generateQuerySetBaseKey, generateQuerySetKeys } from '../utils';
|
|
2
|
+
/**
|
|
3
|
+
* Набор infinite queries под одним ключем с целью повышения читаемости кода и удобства инвалидации по общему ключу
|
|
4
|
+
*/
|
|
5
|
+
export class InfiniteQuerySet {
|
|
6
|
+
constructor(_cache, _queryConfigurator, config) {
|
|
7
|
+
var _a;
|
|
8
|
+
this._cache = _cache;
|
|
9
|
+
this._queryConfigurator = _queryConfigurator;
|
|
10
|
+
/**
|
|
11
|
+
* Создает infinite query в кэше. Добавляет его в набор
|
|
12
|
+
* @returns InfiniteQuery объект
|
|
13
|
+
* @example
|
|
14
|
+
* const docListQuery = docFetcher.infiniteQueries.docList.create()
|
|
15
|
+
* // Получает данные
|
|
16
|
+
* docListQuery.sync()
|
|
17
|
+
*/
|
|
18
|
+
this.create = (...params) => {
|
|
19
|
+
const { keys, execute } = this.configureQuery(...params);
|
|
20
|
+
return this._cache.createInfiniteQuery(keys, execute);
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Создает infinite query в кэше с дополнительными параметрами конфигурации. Добавляет его в набор
|
|
24
|
+
* @param config - Параметры конфигурации infinite query. Например, fetchPolicy или incrementCount
|
|
25
|
+
* @param params - Параметры запроса
|
|
26
|
+
* @returns InfiniteQuery объект
|
|
27
|
+
* @example
|
|
28
|
+
* const docListQuery = docFetcher.infiniteQueries.docList.createWithConfig(
|
|
29
|
+
* { fetchPolicy: 'network-only', incrementCount: 10 },
|
|
30
|
+
* 'docId',
|
|
31
|
+
* )
|
|
32
|
+
* // Получает данные из query
|
|
33
|
+
* docListQuery.sync()
|
|
34
|
+
*/
|
|
35
|
+
this.createWithConfig = (config, ...params) => {
|
|
36
|
+
const { keys, execute } = this.configureQuery(...params);
|
|
37
|
+
return this._cache.createInfiniteQuery(keys, execute, config);
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Инвалидирует текущий набор infinite queries в кэше
|
|
41
|
+
* @param params - Параметры функции, переданной в createInfiniteQuerySet при создании набора. Если не указаны, то инвалидируется все query
|
|
42
|
+
* @example
|
|
43
|
+
* const docFetcher = {
|
|
44
|
+
* infiniteQueries: {
|
|
45
|
+
* docList: createInfiniteQuerySet('docList', (search: string) => ({
|
|
46
|
+
* execute: ({ count, offset }) => httpService.get(`/doc/${search}?count=${count}&offset=${offset}`),
|
|
47
|
+
* }),
|
|
48
|
+
* }
|
|
49
|
+
* };
|
|
50
|
+
*
|
|
51
|
+
* // Инвалидирует infinite query с конкретным переданным search
|
|
52
|
+
* docFetcher.infiniteQueries.docList.invalidate('документ1')
|
|
53
|
+
*/
|
|
54
|
+
this.invalidate = (...params) => {
|
|
55
|
+
if (params.length === 0) {
|
|
56
|
+
this._cache.invalidate([this.baseKey]);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const { keys } = this.configureQuery(...params);
|
|
60
|
+
this._cache.invalidate(keys, 'chain-match');
|
|
61
|
+
};
|
|
62
|
+
this.configureQuery = (...params) => {
|
|
63
|
+
const { keys, execute } = this._queryConfigurator(...params);
|
|
64
|
+
return {
|
|
65
|
+
keys: generateQuerySetKeys(this.baseKey, keys !== null && keys !== void 0 ? keys : params),
|
|
66
|
+
execute,
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
this.baseKey = (_a = config === null || config === void 0 ? void 0 : config.name) !== null && _a !== void 0 ? _a : generateQuerySetBaseKey(_queryConfigurator);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './InfiniteQuerySet';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './InfiniteQuerySet';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type MobxQuery } from '../../MobxQuery';
|
|
2
|
+
import { type Mutation, type MutationExecutor } from '../../Mutation';
|
|
3
|
+
/**
|
|
4
|
+
* Налор мутаций. Цель: единый интерфейс создания и использования наборов Query и Mutation
|
|
5
|
+
* @example
|
|
6
|
+
* const docFetcher = {
|
|
7
|
+
* mutations: {
|
|
8
|
+
* editDoc: mobxQuery.createMutationSet((params: DocsEndpointsDTO.EditDocInput) => {
|
|
9
|
+
* return docsEndpoint.editDoc(params);
|
|
10
|
+
* }),
|
|
11
|
+
* },
|
|
12
|
+
* queries: {
|
|
13
|
+
* doc: mobxQuery.createQuerySet((id: string) => ({
|
|
14
|
+
* execute: () => docsEndpoint.getDoc(id).then(({ data }) => data),
|
|
15
|
+
* })),
|
|
16
|
+
* },
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
export declare class MutationSet<TResponse, TParams = void, TDefaultError = unknown> {
|
|
20
|
+
private readonly _cache;
|
|
21
|
+
private readonly _executor;
|
|
22
|
+
constructor(_cache: MobxQuery, _executor: MutationExecutor<TResponse, TParams>);
|
|
23
|
+
/**
|
|
24
|
+
* Создает мутацию
|
|
25
|
+
* @returns Mutation объект
|
|
26
|
+
* @example
|
|
27
|
+
* const editDocMutation = docFetcher.mutations.editDoc.create();
|
|
28
|
+
* // Выполняет мутацию
|
|
29
|
+
* editDocMutation.sync({ params: { id: 'docId', content: 'Новое содержимое' } });
|
|
30
|
+
*/
|
|
31
|
+
create: <TError = TDefaultError>() => Mutation<TResponse, TError, TParams>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Налор мутаций. Цель: единый интерфейс создания и использования наборов Query и Mutation
|
|
3
|
+
* @example
|
|
4
|
+
* const docFetcher = {
|
|
5
|
+
* mutations: {
|
|
6
|
+
* editDoc: mobxQuery.createMutationSet((params: DocsEndpointsDTO.EditDocInput) => {
|
|
7
|
+
* return docsEndpoint.editDoc(params);
|
|
8
|
+
* }),
|
|
9
|
+
* },
|
|
10
|
+
* queries: {
|
|
11
|
+
* doc: mobxQuery.createQuerySet((id: string) => ({
|
|
12
|
+
* execute: () => docsEndpoint.getDoc(id).then(({ data }) => data),
|
|
13
|
+
* })),
|
|
14
|
+
* },
|
|
15
|
+
* }
|
|
16
|
+
*/
|
|
17
|
+
export class MutationSet {
|
|
18
|
+
constructor(_cache, _executor) {
|
|
19
|
+
this._cache = _cache;
|
|
20
|
+
this._executor = _executor;
|
|
21
|
+
/**
|
|
22
|
+
* Создает мутацию
|
|
23
|
+
* @returns Mutation объект
|
|
24
|
+
* @example
|
|
25
|
+
* const editDocMutation = docFetcher.mutations.editDoc.create();
|
|
26
|
+
* // Выполняет мутацию
|
|
27
|
+
* editDocMutation.sync({ params: { id: 'docId', content: 'Новое содержимое' } });
|
|
28
|
+
*/
|
|
29
|
+
this.create = () => this._cache.createMutation(this._executor);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MutationSet';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MutationSet';
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type DeepPartial } from 'utility-types';
|
|
2
|
+
import { type CacheKey } from '../../types';
|
|
3
|
+
import { type Query } from '../../Query';
|
|
4
|
+
import { type CreateQueryParams, type MobxQuery } from '../../MobxQuery';
|
|
5
|
+
export type QuerySetConfig = {
|
|
6
|
+
name?: string;
|
|
7
|
+
};
|
|
8
|
+
export type QuerySetConfigurator<TParams extends any[], TResponse> = (...params: TParams) => {
|
|
9
|
+
keys?: CacheKey[];
|
|
10
|
+
execute: () => Promise<TResponse>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Набор queries под одним ключем с целью повышения читаемости кода и удобства инвалидации по общему ключу
|
|
14
|
+
*/
|
|
15
|
+
export declare class QuerySet<TParams extends any[], TResponse, TDefaultError = unknown> {
|
|
16
|
+
private readonly _cache;
|
|
17
|
+
private readonly _queryConfigurator;
|
|
18
|
+
/**
|
|
19
|
+
* Хэш от queryConfigurator
|
|
20
|
+
*/
|
|
21
|
+
private readonly baseKey;
|
|
22
|
+
constructor(_cache: MobxQuery, _queryConfigurator: QuerySetConfigurator<TParams, TResponse>, config?: QuerySetConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Создает query в кэше. Добавляет его в набор
|
|
25
|
+
* @returns Query объект
|
|
26
|
+
* @example
|
|
27
|
+
* const docQuery = docFetcher.queries.doc.create('docId')
|
|
28
|
+
* // Получает данные
|
|
29
|
+
* docQuery.sync()
|
|
30
|
+
*/
|
|
31
|
+
create: <TError = TDefaultError>(...params: TParams) => Query<TResponse, TError>;
|
|
32
|
+
/**
|
|
33
|
+
* Создает query в кэше с дополнительными параметрами конфигурации. Добавляет его в набор
|
|
34
|
+
* @param config - Параметры конфигурации query. Например, fetchPolicy
|
|
35
|
+
* @param params - Параметры запроса
|
|
36
|
+
* @returns Query объект
|
|
37
|
+
* @example
|
|
38
|
+
* const docQuery = docFetcher.queries.doc.createWithConfig(
|
|
39
|
+
* { fetchPolicy: 'network-only' },
|
|
40
|
+
* 'docId',
|
|
41
|
+
* )
|
|
42
|
+
* // Получает данные из query
|
|
43
|
+
* docQuery.sync()
|
|
44
|
+
*/
|
|
45
|
+
createWithConfig: <TError = TDefaultError, TIsBackground extends boolean = false>(config: CreateQueryParams<Awaited<TResponse>, TError, TIsBackground>, ...params: TParams) => Query<TResponse, TError, TIsBackground>;
|
|
46
|
+
/**
|
|
47
|
+
* Инвалидирует текущий query в кэше
|
|
48
|
+
* @param keys - Дополнительные ключи для инвалидации. Если не указаны, то инвалидируется весь набор query
|
|
49
|
+
* @example
|
|
50
|
+
* const docFetcher = {
|
|
51
|
+
* doc: mobxQuery.createQuerySet((id: string) => ({
|
|
52
|
+
* execute: () => httpService.get(`/doc/${id}?page=${page}`),
|
|
53
|
+
* })),
|
|
54
|
+
* };
|
|
55
|
+
*
|
|
56
|
+
* // Инвалидирует все query doc
|
|
57
|
+
* docFetcher.doc.invalidate()
|
|
58
|
+
*
|
|
59
|
+
* // Инвалидирует query doc с конкретным переданным id. Доступные ключи инвалидации зависят от указанных additionalKeys, переданных при определении query в фабрике createDataFetcher
|
|
60
|
+
* docFetcher.doc.invalidate('docId')
|
|
61
|
+
*/
|
|
62
|
+
invalidate: (...params: DeepPartial<TParams>) => void;
|
|
63
|
+
private configureQuery;
|
|
64
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { generateQuerySetBaseKey, generateQuerySetKeys } from '../utils';
|
|
2
|
+
/**
|
|
3
|
+
* Набор queries под одним ключем с целью повышения читаемости кода и удобства инвалидации по общему ключу
|
|
4
|
+
*/
|
|
5
|
+
export class QuerySet {
|
|
6
|
+
constructor(_cache, _queryConfigurator, config) {
|
|
7
|
+
var _a;
|
|
8
|
+
this._cache = _cache;
|
|
9
|
+
this._queryConfigurator = _queryConfigurator;
|
|
10
|
+
/**
|
|
11
|
+
* Создает query в кэше. Добавляет его в набор
|
|
12
|
+
* @returns Query объект
|
|
13
|
+
* @example
|
|
14
|
+
* const docQuery = docFetcher.queries.doc.create('docId')
|
|
15
|
+
* // Получает данные
|
|
16
|
+
* docQuery.sync()
|
|
17
|
+
*/
|
|
18
|
+
this.create = (...params) => {
|
|
19
|
+
const { keys, execute } = this.configureQuery(...params);
|
|
20
|
+
return this._cache.createQuery(keys, execute);
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Создает query в кэше с дополнительными параметрами конфигурации. Добавляет его в набор
|
|
24
|
+
* @param config - Параметры конфигурации query. Например, fetchPolicy
|
|
25
|
+
* @param params - Параметры запроса
|
|
26
|
+
* @returns Query объект
|
|
27
|
+
* @example
|
|
28
|
+
* const docQuery = docFetcher.queries.doc.createWithConfig(
|
|
29
|
+
* { fetchPolicy: 'network-only' },
|
|
30
|
+
* 'docId',
|
|
31
|
+
* )
|
|
32
|
+
* // Получает данные из query
|
|
33
|
+
* docQuery.sync()
|
|
34
|
+
*/
|
|
35
|
+
this.createWithConfig = (config, ...params) => {
|
|
36
|
+
const { keys, execute } = this.configureQuery(...params);
|
|
37
|
+
return this._cache.createQuery(keys, execute, config);
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Инвалидирует текущий query в кэше
|
|
41
|
+
* @param keys - Дополнительные ключи для инвалидации. Если не указаны, то инвалидируется весь набор query
|
|
42
|
+
* @example
|
|
43
|
+
* const docFetcher = {
|
|
44
|
+
* doc: mobxQuery.createQuerySet((id: string) => ({
|
|
45
|
+
* execute: () => httpService.get(`/doc/${id}?page=${page}`),
|
|
46
|
+
* })),
|
|
47
|
+
* };
|
|
48
|
+
*
|
|
49
|
+
* // Инвалидирует все query doc
|
|
50
|
+
* docFetcher.doc.invalidate()
|
|
51
|
+
*
|
|
52
|
+
* // Инвалидирует query doc с конкретным переданным id. Доступные ключи инвалидации зависят от указанных additionalKeys, переданных при определении query в фабрике createDataFetcher
|
|
53
|
+
* docFetcher.doc.invalidate('docId')
|
|
54
|
+
*/
|
|
55
|
+
this.invalidate = (...params) => {
|
|
56
|
+
if (params.length === 0) {
|
|
57
|
+
this._cache.invalidate([this.baseKey]);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const { keys } = this.configureQuery(...params);
|
|
61
|
+
this._cache.invalidate(keys, 'chain-match');
|
|
62
|
+
};
|
|
63
|
+
this.configureQuery = (...params) => {
|
|
64
|
+
const { keys, execute } = this._queryConfigurator(...params);
|
|
65
|
+
return {
|
|
66
|
+
keys: generateQuerySetKeys(this.baseKey, keys !== null && keys !== void 0 ? keys : params),
|
|
67
|
+
execute,
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
this.baseKey = (_a = config === null || config === void 0 ? void 0 : config.name) !== null && _a !== void 0 ? _a : generateQuerySetBaseKey(_queryConfigurator);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './QuerySet';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './QuerySet';
|
package/Sets/index.d.ts
ADDED
package/Sets/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './generateQuerySetBaseKey';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './generateQuerySetBaseKey';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type CacheKey } from '../../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Создает ключи на основе каждого параметра
|
|
4
|
+
* @param additionalKeys - Создает для каждого параметра отдельный ключ, чтобы по нему можно было инвалидировать query
|
|
5
|
+
* @example
|
|
6
|
+
* // Создаст ключи ['22f4', ['22f4', 'organizationID', '1'], ['22f4', 'employeeID', '2']]
|
|
7
|
+
* generateQuerySetKeys('22f4', params)
|
|
8
|
+
*/
|
|
9
|
+
export declare const generateQuerySetKeys: (baseKey: string, params: CacheKey[]) => CacheKey[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import isPlainObj from 'is-plain-obj';
|
|
2
|
+
/**
|
|
3
|
+
* Создает ключи на основе каждого параметра
|
|
4
|
+
* @param additionalKeys - Создает для каждого параметра отдельный ключ, чтобы по нему можно было инвалидировать query
|
|
5
|
+
* @example
|
|
6
|
+
* // Создаст ключи ['22f4', ['22f4', 'organizationID', '1'], ['22f4', 'employeeID', '2']]
|
|
7
|
+
* generateQuerySetKeys('22f4', params)
|
|
8
|
+
*/
|
|
9
|
+
export const generateQuerySetKeys = (baseKey, params) => {
|
|
10
|
+
const resultKeys = [];
|
|
11
|
+
params.forEach((param) => {
|
|
12
|
+
if (isPlainObj(param)) {
|
|
13
|
+
resultKeys.push(...Object.entries(param).map(([key, value]) => [baseKey, key, value]));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
resultKeys.push(param);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
return [baseKey, ...resultKeys];
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './generateQuerySetKeys';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './generateQuerySetKeys';
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { Mutation } from './Mutation';
|
|
2
2
|
export { Query } from './Query';
|
|
3
|
-
export { type InfiniteParams } from './InfiniteQuery';
|
|
3
|
+
export { type InfiniteParams, InfiniteQuery } from './InfiniteQuery';
|
|
4
4
|
export { MobxQuery, type CreateQueryParams, type CreateInfiniteQueryParams, type CreateMutationParams, } from './MobxQuery';
|
|
5
|
+
export { type QuerySet, type InfiniteQuerySet, type MutationSet } from './Sets';
|
|
5
6
|
export { type CacheKey, type FetchPolicy } from './types';
|
package/index.js
CHANGED
|
@@ -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 {};
|