@astral/mobx-query 1.8.0 → 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.
- 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 +132 -0
- package/node/MobxQuery/MobxQuery.js +177 -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/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 +5 -0
- package/node/index.js +9 -0
- package/node/types.d.ts +55 -0
- package/node/types.js +2 -0
- package/package.json +7 -3
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { AuxiliaryQuery } from '../AuxiliaryQuery';
|
|
2
|
+
import type { FetchPolicy, QueryBaseActions, Sync, SyncParams } from '../types';
|
|
3
|
+
import type { DataStorage } from '../DataStorage';
|
|
4
|
+
import { QueryContainer } from '../QueryContainer';
|
|
5
|
+
import { type StatusStorage } from '../StatusStorage';
|
|
6
|
+
/**
|
|
7
|
+
* Исполнитель запроса
|
|
8
|
+
*/
|
|
9
|
+
export type QueryExecutor<TResult> = () => Promise<TResult>;
|
|
10
|
+
export type QueryParams<TResult, TError, TIsBackground extends boolean = false> = {
|
|
11
|
+
/**
|
|
12
|
+
* Обработчик ошибки, вызываемый по умолчанию
|
|
13
|
+
*/
|
|
14
|
+
onError?: SyncParams<TResult, TError>['onError'];
|
|
15
|
+
/**
|
|
16
|
+
* Флаг, отвечающий за автоматический запрос данных при обращении к полю data
|
|
17
|
+
*/
|
|
18
|
+
enabledAutoFetch?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Политика получения данных.
|
|
21
|
+
* @enum cache-first - данные сначала берутся из кеша, если их нет, тогда идет обращение к сети, ответ записывается в кэш
|
|
22
|
+
* @enum network-only - данные всегда берутся из сети, при этом ответ записывается в кэш
|
|
23
|
+
*/
|
|
24
|
+
fetchPolicy?: FetchPolicy;
|
|
25
|
+
/**
|
|
26
|
+
* Инстанс хранилища данных
|
|
27
|
+
*/
|
|
28
|
+
dataStorage: DataStorage<TResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Инстанс хранилища основных статусов
|
|
31
|
+
*/
|
|
32
|
+
statusStorage: StatusStorage<TError>;
|
|
33
|
+
/**
|
|
34
|
+
* Инстанс хранилища фоновых статусов
|
|
35
|
+
*/
|
|
36
|
+
backgroundStatusStorage?: TIsBackground extends true ? StatusStorage<TError> : null | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Колбэк, вызываемый при успешном завершении запроса, подразумевается использование, для подтверждения валидности данных, чтобы квери не был удален из памяти
|
|
39
|
+
*/
|
|
40
|
+
submitValidity?: () => void;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Стор для работы с запросами,
|
|
44
|
+
* которые должны быть закешированы,
|
|
45
|
+
* но им не требуется усложнение в виде работы с фильтрами и инфинити запросами
|
|
46
|
+
*/
|
|
47
|
+
export declare class Query<TResult, TError = void, TIsBackground extends boolean = false> extends QueryContainer<TError, AuxiliaryQuery<TResult, TError>, TIsBackground> implements QueryBaseActions<TResult, TError, undefined> {
|
|
48
|
+
private readonly executor;
|
|
49
|
+
/**
|
|
50
|
+
* Хранилище данных, для обеспечения возможности синхронизации данных между разными инстансами
|
|
51
|
+
*/
|
|
52
|
+
private storage;
|
|
53
|
+
/**
|
|
54
|
+
* Обработчик ошибки, вызываемый по умолчанию
|
|
55
|
+
*/
|
|
56
|
+
private defaultOnError?;
|
|
57
|
+
/**
|
|
58
|
+
* Флаг, отвечающий за автоматический запрос данных при обращении к полю data
|
|
59
|
+
*/
|
|
60
|
+
private enabledAutoFetch?;
|
|
61
|
+
/**
|
|
62
|
+
* Стандартное поведение политики кеширования
|
|
63
|
+
*/
|
|
64
|
+
private readonly defaultFetchPolicy?;
|
|
65
|
+
/**
|
|
66
|
+
* Колбэк, вызываемый при успешном завершении запроса, подразумевается использование, для подтверждения валидности данных, чтобы квери не был удален из памяти
|
|
67
|
+
*/
|
|
68
|
+
private readonly submitValidity?;
|
|
69
|
+
constructor(executor: QueryExecutor<TResult>, { onError, enabledAutoFetch, fetchPolicy, dataStorage, statusStorage, backgroundStatusStorage, submitValidity, }: QueryParams<TResult, TError, TIsBackground>);
|
|
70
|
+
private get isNetworkOnly();
|
|
71
|
+
/**
|
|
72
|
+
* Метод для инвалидации данных
|
|
73
|
+
*/
|
|
74
|
+
invalidate: () => void;
|
|
75
|
+
/**
|
|
76
|
+
* Синхронный метод получения данных
|
|
77
|
+
*/
|
|
78
|
+
sync: Sync<TResult, TError, undefined>;
|
|
79
|
+
/**
|
|
80
|
+
* Обработчик успешного ответа
|
|
81
|
+
*/
|
|
82
|
+
private submitSuccess;
|
|
83
|
+
/**
|
|
84
|
+
* Форс метод для установки данных
|
|
85
|
+
*/
|
|
86
|
+
forceUpdate: (data: TResult) => void;
|
|
87
|
+
/**
|
|
88
|
+
* Метод для переиспользования синхронной логики запроса
|
|
89
|
+
*/
|
|
90
|
+
protected proceedSync: Sync<TResult, TError>;
|
|
91
|
+
/**
|
|
92
|
+
* Асинхронный метод получения данных,
|
|
93
|
+
* предполагается, что нужно будет самостоятельно обрабатывать ошибку
|
|
94
|
+
*/
|
|
95
|
+
async: () => Promise<TResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Содержит реактивные данные
|
|
98
|
+
* благодаря mobx, при изменении isInvalid, свойство будет вычисляться заново,
|
|
99
|
+
* следовательно, стриггерится условие невалидности,
|
|
100
|
+
* и начнется запрос, в результате которого, данные обновятся
|
|
101
|
+
*/
|
|
102
|
+
get data(): TResult | undefined;
|
|
103
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Query = void 0;
|
|
4
|
+
const mobx_1 = require("mobx");
|
|
5
|
+
const AuxiliaryQuery_1 = require("../AuxiliaryQuery");
|
|
6
|
+
const QueryContainer_1 = require("../QueryContainer");
|
|
7
|
+
/**
|
|
8
|
+
* Стор для работы с запросами,
|
|
9
|
+
* которые должны быть закешированы,
|
|
10
|
+
* но им не требуется усложнение в виде работы с фильтрами и инфинити запросами
|
|
11
|
+
*/
|
|
12
|
+
class Query extends QueryContainer_1.QueryContainer {
|
|
13
|
+
constructor(executor, { onError, enabledAutoFetch, fetchPolicy, dataStorage, statusStorage, backgroundStatusStorage = null, submitValidity, }) {
|
|
14
|
+
super(statusStorage, backgroundStatusStorage, new AuxiliaryQuery_1.AuxiliaryQuery(statusStorage, backgroundStatusStorage));
|
|
15
|
+
this.executor = executor;
|
|
16
|
+
/**
|
|
17
|
+
* Метод для инвалидации данных
|
|
18
|
+
*/
|
|
19
|
+
this.invalidate = () => {
|
|
20
|
+
this.auxiliary.invalidate();
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Синхронный метод получения данных
|
|
24
|
+
*/
|
|
25
|
+
this.sync = (params) => {
|
|
26
|
+
const isInstanceAllow = !(this.isLoading || this.isSuccess);
|
|
27
|
+
if (this.isNetworkOnly || this.auxiliary.isInvalid || isInstanceAllow) {
|
|
28
|
+
this.proceedSync(params);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Обработчик успешного ответа
|
|
33
|
+
*/
|
|
34
|
+
this.submitSuccess = (resData) => {
|
|
35
|
+
var _a;
|
|
36
|
+
this.storage.setData(resData);
|
|
37
|
+
(_a = this.submitValidity) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
38
|
+
return resData;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Форс метод для установки данных
|
|
42
|
+
*/
|
|
43
|
+
this.forceUpdate = (data) => {
|
|
44
|
+
this.auxiliary.submitSuccess();
|
|
45
|
+
this.submitSuccess(data);
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Метод для переиспользования синхронной логики запроса
|
|
49
|
+
*/
|
|
50
|
+
this.proceedSync = (options) => {
|
|
51
|
+
const { onSuccess, onError } = options || {};
|
|
52
|
+
this.auxiliary
|
|
53
|
+
.getUnifiedPromise(this.executor, (res) => {
|
|
54
|
+
this.submitSuccess(res);
|
|
55
|
+
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(res);
|
|
56
|
+
})
|
|
57
|
+
.catch((e) => {
|
|
58
|
+
var _a;
|
|
59
|
+
if (onError) {
|
|
60
|
+
onError(e);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
(_a = this.defaultOnError) === null || _a === void 0 ? void 0 : _a.call(this, e);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Асинхронный метод получения данных,
|
|
69
|
+
* предполагается, что нужно будет самостоятельно обрабатывать ошибку
|
|
70
|
+
*/
|
|
71
|
+
this.async = () => {
|
|
72
|
+
if (!this.isNetworkOnly && this.isSuccess && !this.auxiliary.isInvalid) {
|
|
73
|
+
return Promise.resolve(this.storage.data);
|
|
74
|
+
}
|
|
75
|
+
return this.auxiliary.getUnifiedPromise(this.executor, this.submitSuccess);
|
|
76
|
+
};
|
|
77
|
+
this.defaultOnError = onError;
|
|
78
|
+
this.enabledAutoFetch = enabledAutoFetch;
|
|
79
|
+
this.defaultFetchPolicy = fetchPolicy;
|
|
80
|
+
this.storage = dataStorage;
|
|
81
|
+
this.submitValidity = submitValidity;
|
|
82
|
+
(0, mobx_1.makeObservable)(this, {
|
|
83
|
+
async: mobx_1.action,
|
|
84
|
+
sync: mobx_1.action,
|
|
85
|
+
forceUpdate: mobx_1.action,
|
|
86
|
+
data: mobx_1.computed,
|
|
87
|
+
submitSuccess: mobx_1.action,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
get isNetworkOnly() {
|
|
91
|
+
return this.defaultFetchPolicy === 'network-only';
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Содержит реактивные данные
|
|
95
|
+
* благодаря mobx, при изменении isInvalid, свойство будет вычисляться заново,
|
|
96
|
+
* следовательно, стриггерится условие невалидности,
|
|
97
|
+
* и начнется запрос, в результате которого, данные обновятся
|
|
98
|
+
*/
|
|
99
|
+
get data() {
|
|
100
|
+
const shouldSync = this.enabledAutoFetch &&
|
|
101
|
+
!this.isSuccess &&
|
|
102
|
+
!this.isLoading &&
|
|
103
|
+
!this.isError;
|
|
104
|
+
if (this.auxiliary.isInvalid || shouldSync) {
|
|
105
|
+
// т.к. при вызове апдейта, изменяются флаги, на которые подписан data,
|
|
106
|
+
// нужно вызывать этот экшн асинхронно
|
|
107
|
+
(0, mobx_1.when)(() => true, this.proceedSync);
|
|
108
|
+
}
|
|
109
|
+
// возвращаем имеющиеся данные
|
|
110
|
+
return this.storage.data;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.Query = Query;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Query';
|
|
@@ -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("./Query"), exports);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type StatusStorage } from '../StatusStorage';
|
|
2
|
+
export type QueryContainerAuxiliary = {
|
|
3
|
+
isIdle: boolean;
|
|
4
|
+
};
|
|
5
|
+
type Statuses<TError> = StatusStorage<TError>;
|
|
6
|
+
/**
|
|
7
|
+
* Контейнер для бойлерплейт части,
|
|
8
|
+
* позволяет не повторять в каждом наследуемом классе использование стандартных статусов
|
|
9
|
+
*/
|
|
10
|
+
export declare abstract class QueryContainer<TError, TAuxiliary extends QueryContainerAuxiliary, TIsBackground extends boolean> implements Statuses<TError> {
|
|
11
|
+
private readonly statusStorage;
|
|
12
|
+
private readonly backgroundStatusStorage;
|
|
13
|
+
protected readonly auxiliary: TAuxiliary;
|
|
14
|
+
protected constructor(statusStorage: StatusStorage<TError>, backgroundStatusStorage: StatusStorage<TError> | null, auxiliary: TAuxiliary);
|
|
15
|
+
/**
|
|
16
|
+
* Флаг загрузки данных
|
|
17
|
+
*/
|
|
18
|
+
get isLoading(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Флаг обозначающий, что последний запрос был зафейлен
|
|
21
|
+
*/
|
|
22
|
+
get isError(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Данные о последней ошибке
|
|
25
|
+
*/
|
|
26
|
+
get error(): TError | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Флаг обозначающий, что последний запрос был успешно завершен
|
|
29
|
+
*/
|
|
30
|
+
get isSuccess(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Флаг, обозначающий простаивание, т.е. запроса еще не было
|
|
33
|
+
*/
|
|
34
|
+
get isIdle(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Статусы, изменяющиеся после первого успешного запроса в режиме isBackground: true
|
|
37
|
+
* @example
|
|
38
|
+
* const query = mobxQuery.createQuery(
|
|
39
|
+
* ['some cache key'],
|
|
40
|
+
* () => Promise.resolve('foo'),
|
|
41
|
+
* { isBackground: true }
|
|
42
|
+
* );
|
|
43
|
+
*
|
|
44
|
+
* await query.async();
|
|
45
|
+
* console.log(query.isLoading); // переключался в true на момент запроса
|
|
46
|
+
* console.log(query.isSuccess); // true
|
|
47
|
+
*
|
|
48
|
+
* query.invalidate();
|
|
49
|
+
* await query.async();
|
|
50
|
+
* console.log(query.isLoading); // не изменялся
|
|
51
|
+
* console.log(query.isSuccess); // остался неизменным - true
|
|
52
|
+
*
|
|
53
|
+
* console.log(query.background.isLoading); // переключался в true на момент обновления
|
|
54
|
+
* console.log(query.background.isSuccess); // true
|
|
55
|
+
*
|
|
56
|
+
* @exception isBackground:false (а так же по умолчанию) background не доступен, и равен null
|
|
57
|
+
* @exception Mutation не доступен в мутации и равен null
|
|
58
|
+
*/
|
|
59
|
+
get background(): TIsBackground extends true ? Statuses<TError> : null;
|
|
60
|
+
}
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryContainer = void 0;
|
|
4
|
+
const mobx_1 = require("mobx");
|
|
5
|
+
/**
|
|
6
|
+
* Контейнер для бойлерплейт части,
|
|
7
|
+
* позволяет не повторять в каждом наследуемом классе использование стандартных статусов
|
|
8
|
+
*/
|
|
9
|
+
class QueryContainer {
|
|
10
|
+
constructor(statusStorage, backgroundStatusStorage, auxiliary) {
|
|
11
|
+
this.statusStorage = statusStorage;
|
|
12
|
+
this.backgroundStatusStorage = backgroundStatusStorage;
|
|
13
|
+
this.auxiliary = auxiliary;
|
|
14
|
+
(0, mobx_1.makeObservable)(this, {
|
|
15
|
+
error: mobx_1.computed,
|
|
16
|
+
isError: mobx_1.computed,
|
|
17
|
+
isIdle: mobx_1.computed,
|
|
18
|
+
isLoading: mobx_1.computed,
|
|
19
|
+
isSuccess: mobx_1.computed,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Флаг загрузки данных
|
|
24
|
+
*/
|
|
25
|
+
get isLoading() {
|
|
26
|
+
return this.statusStorage.isLoading;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Флаг обозначающий, что последний запрос был зафейлен
|
|
30
|
+
*/
|
|
31
|
+
get isError() {
|
|
32
|
+
return this.statusStorage.isError;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Данные о последней ошибке
|
|
36
|
+
*/
|
|
37
|
+
get error() {
|
|
38
|
+
return this.statusStorage.error;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Флаг обозначающий, что последний запрос был успешно завершен
|
|
42
|
+
*/
|
|
43
|
+
get isSuccess() {
|
|
44
|
+
return this.statusStorage.isSuccess;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Флаг, обозначающий простаивание, т.е. запроса еще не было
|
|
48
|
+
*/
|
|
49
|
+
get isIdle() {
|
|
50
|
+
return this.auxiliary.isIdle;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Статусы, изменяющиеся после первого успешного запроса в режиме isBackground: true
|
|
54
|
+
* @example
|
|
55
|
+
* const query = mobxQuery.createQuery(
|
|
56
|
+
* ['some cache key'],
|
|
57
|
+
* () => Promise.resolve('foo'),
|
|
58
|
+
* { isBackground: true }
|
|
59
|
+
* );
|
|
60
|
+
*
|
|
61
|
+
* await query.async();
|
|
62
|
+
* console.log(query.isLoading); // переключался в true на момент запроса
|
|
63
|
+
* console.log(query.isSuccess); // true
|
|
64
|
+
*
|
|
65
|
+
* query.invalidate();
|
|
66
|
+
* await query.async();
|
|
67
|
+
* console.log(query.isLoading); // не изменялся
|
|
68
|
+
* console.log(query.isSuccess); // остался неизменным - true
|
|
69
|
+
*
|
|
70
|
+
* console.log(query.background.isLoading); // переключался в true на момент обновления
|
|
71
|
+
* console.log(query.background.isSuccess); // true
|
|
72
|
+
*
|
|
73
|
+
* @exception isBackground:false (а так же по умолчанию) background не доступен, и равен null
|
|
74
|
+
* @exception Mutation не доступен в мутации и равен null
|
|
75
|
+
*/
|
|
76
|
+
get background() {
|
|
77
|
+
if (!this.backgroundStatusStorage) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return this.backgroundStatusStorage;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.QueryContainer = QueryContainer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './QueryContainer';
|
|
@@ -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("./QueryContainer"), exports);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { StorageFactory } from '../StorageFactory';
|
|
2
|
+
export declare class StatusStorage<TError> {
|
|
3
|
+
constructor();
|
|
4
|
+
/**
|
|
5
|
+
* Флаг обозначающий загрузку данных
|
|
6
|
+
*/
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Флаг обозначающий, что последний запрос был зафейлен
|
|
10
|
+
*/
|
|
11
|
+
isError: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Данные о последней ошибке
|
|
14
|
+
*/
|
|
15
|
+
error?: TError;
|
|
16
|
+
/**
|
|
17
|
+
* Флаг, обозначающий успешность завершения последнего запроса
|
|
18
|
+
*/
|
|
19
|
+
isSuccess: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class StatusStorageFactory extends StorageFactory<StatusStorage<void>> {
|
|
22
|
+
constructor();
|
|
23
|
+
getStorage: <TError>(keyHash: string) => StatusStorage<TError>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatusStorageFactory = exports.StatusStorage = void 0;
|
|
4
|
+
const mobx_1 = require("mobx");
|
|
5
|
+
const StorageFactory_1 = require("../StorageFactory");
|
|
6
|
+
class StatusStorage {
|
|
7
|
+
constructor() {
|
|
8
|
+
/**
|
|
9
|
+
* Флаг обозначающий загрузку данных
|
|
10
|
+
*/
|
|
11
|
+
this.isLoading = false;
|
|
12
|
+
/**
|
|
13
|
+
* Флаг обозначающий, что последний запрос был зафейлен
|
|
14
|
+
*/
|
|
15
|
+
this.isError = false;
|
|
16
|
+
/**
|
|
17
|
+
* Данные о последней ошибке
|
|
18
|
+
*/
|
|
19
|
+
this.error = undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Флаг, обозначающий успешность завершения последнего запроса
|
|
22
|
+
*/
|
|
23
|
+
this.isSuccess = false;
|
|
24
|
+
(0, mobx_1.makeObservable)(this, {
|
|
25
|
+
error: mobx_1.observable,
|
|
26
|
+
isError: mobx_1.observable,
|
|
27
|
+
isLoading: mobx_1.observable,
|
|
28
|
+
isSuccess: mobx_1.observable,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.StatusStorage = StatusStorage;
|
|
33
|
+
class StatusStorageFactory extends StorageFactory_1.StorageFactory {
|
|
34
|
+
constructor() {
|
|
35
|
+
super(() => new StatusStorage());
|
|
36
|
+
this.getStorage = (keyHash) => {
|
|
37
|
+
return this.getInternalStorage(keyHash);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.StatusStorageFactory = StatusStorageFactory;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './StatusStorage';
|
|
@@ -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("./StatusStorage"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare abstract class StorageFactory<TStorage extends {}> {
|
|
2
|
+
private readonly createStorage;
|
|
3
|
+
private readonly adaptableMap;
|
|
4
|
+
protected constructor(createStorage: () => TStorage);
|
|
5
|
+
/**
|
|
6
|
+
* Фабричный метод получения/создания инстанса хранилища по ключу
|
|
7
|
+
*/
|
|
8
|
+
getInternalStorage: (keyHash: string) => TStorage;
|
|
9
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StorageFactory = void 0;
|
|
4
|
+
const AdaptableMap_1 = require("../AdaptableMap");
|
|
5
|
+
class StorageFactory {
|
|
6
|
+
constructor(createStorage) {
|
|
7
|
+
this.createStorage = createStorage;
|
|
8
|
+
this.adaptableMap = new AdaptableMap_1.AdaptableMap();
|
|
9
|
+
/**
|
|
10
|
+
* Фабричный метод получения/создания инстанса хранилища по ключу
|
|
11
|
+
*/
|
|
12
|
+
this.getInternalStorage = (keyHash) => {
|
|
13
|
+
const storage = this.adaptableMap.get(keyHash);
|
|
14
|
+
if (!storage) {
|
|
15
|
+
const createdStorage = this.createStorage();
|
|
16
|
+
this.adaptableMap.set(keyHash, createdStorage);
|
|
17
|
+
return createdStorage;
|
|
18
|
+
}
|
|
19
|
+
return storage;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.StorageFactory = StorageFactory;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './StorageFactory';
|
|
@@ -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("./StorageFactory"), exports);
|
package/node/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { Mutation } from './Mutation';
|
|
2
|
+
export { Query } from './Query';
|
|
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/node/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MobxQuery = exports.Query = exports.Mutation = void 0;
|
|
4
|
+
var Mutation_1 = require("./Mutation");
|
|
5
|
+
Object.defineProperty(exports, "Mutation", { enumerable: true, get: function () { return Mutation_1.Mutation; } });
|
|
6
|
+
var Query_1 = require("./Query");
|
|
7
|
+
Object.defineProperty(exports, "Query", { enumerable: true, get: function () { return Query_1.Query; } });
|
|
8
|
+
var MobxQuery_1 = require("./MobxQuery");
|
|
9
|
+
Object.defineProperty(exports, "MobxQuery", { enumerable: true, get: function () { return MobxQuery_1.MobxQuery; } });
|
package/node/types.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type SyncParams<TResult, TError, TExecutorParams = void> = {
|
|
2
|
+
onSuccess?: (res: TResult) => void;
|
|
3
|
+
onError?: (e: TError) => void;
|
|
4
|
+
params?: TExecutorParams;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* синхронный метод получения данных
|
|
8
|
+
*/
|
|
9
|
+
export type Sync<TResult, TError, TExecutorParams = void> = (params?: SyncParams<TResult, TError, TExecutorParams>) => void;
|
|
10
|
+
/**
|
|
11
|
+
* асинхронный метод получения данных
|
|
12
|
+
*/
|
|
13
|
+
export type Async<TResult, TExecutorParams = void> = (params: TExecutorParams) => Promise<TResult>;
|
|
14
|
+
export type QueryBaseActions<TResult, TError, TExecutorParams = void> = {
|
|
15
|
+
/**
|
|
16
|
+
* синхронный метод получения данных
|
|
17
|
+
*/
|
|
18
|
+
sync: Sync<TResult, TError, TExecutorParams>;
|
|
19
|
+
/**
|
|
20
|
+
* асинхронный метод получения данных
|
|
21
|
+
*/
|
|
22
|
+
async: Async<TResult, TExecutorParams>;
|
|
23
|
+
/**
|
|
24
|
+
* флаг обозначающий загрузку данных
|
|
25
|
+
*/
|
|
26
|
+
isLoading: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* флаг обозначающий, что последний запрос был зафейлен
|
|
29
|
+
*/
|
|
30
|
+
isError: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* данные о последней ошибке
|
|
33
|
+
*/
|
|
34
|
+
error?: TError;
|
|
35
|
+
/**
|
|
36
|
+
* флаг обзначающий, что последний запрос был успешно выполнен
|
|
37
|
+
*/
|
|
38
|
+
isSuccess: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* флаг, обозначающий простаивание, т.е. запроса еще не было
|
|
41
|
+
*/
|
|
42
|
+
isIdle: boolean;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* политика получения данных.
|
|
46
|
+
* @enum cache-first - данные сначала берутся из кеша, если их нет, тогда идет обращение к сети, ответ записывается в кэш
|
|
47
|
+
* @enum network-only - данные всегда берутся из сети, при этом ответ записывается в кэш
|
|
48
|
+
*/
|
|
49
|
+
export type FetchPolicy = 'network-only' | 'cache-first';
|
|
50
|
+
/**
|
|
51
|
+
* ключ для кешированя
|
|
52
|
+
*/
|
|
53
|
+
export type CacheKey = string | number | boolean | null | undefined | CacheKey[] | {
|
|
54
|
+
[key: string]: CacheKey;
|
|
55
|
+
};
|
package/node/types.js
ADDED
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astral/mobx-query",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"browser": "./index.js",
|
|
5
|
-
"main": "./index.js",
|
|
5
|
+
"main": "./node/index.js",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"mobx": "^6.9.0"
|
|
8
8
|
},
|
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
"types": "./index.d.ts",
|
|
21
21
|
"module": "./index.js",
|
|
22
22
|
"exports": {
|
|
23
|
-
".":
|
|
23
|
+
".": {
|
|
24
|
+
"vitest": "./node/index.js",
|
|
25
|
+
"module": "./index.js",
|
|
26
|
+
"require": "./node/index.js"
|
|
27
|
+
}
|
|
24
28
|
}
|
|
25
29
|
}
|