rxtutils 1.1.2-beta.2 → 1.1.2-beta.20

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 (56) hide show
  1. package/README.md +144 -1
  2. package/{dist/cjs → cjs}/cache/index.cjs +28 -15
  3. package/{dist/types → cjs}/cache/index.d.ts +13 -7
  4. package/cjs/request/index.cjs +150 -0
  5. package/{dist/types → cjs}/request/index.d.ts +12 -8
  6. package/cjs/store/index.cjs +10 -0
  7. package/cjs/store/index.d.ts +2 -0
  8. package/cjs/validator/decorators.cjs +246 -0
  9. package/cjs/validator/decorators.d.ts +159 -0
  10. package/cjs/validator/index.cjs +19 -0
  11. package/cjs/validator/index.d.ts +2 -0
  12. package/{dist/cjs → cjs}/validator/validator.cjs +77 -12
  13. package/cjs/validator/validator.d.ts +84 -0
  14. package/es/cache/index.d.ts +141 -0
  15. package/{dist/es → es}/cache/index.mjs +28 -15
  16. package/es/cache/indexDB.d.ts +52 -0
  17. package/es/index.d.ts +7 -0
  18. package/es/request/error.d.ts +31 -0
  19. package/es/request/index.d.ts +140 -0
  20. package/es/request/index.mjs +148 -0
  21. package/es/store/createGetter/index.d.ts +30 -0
  22. package/es/store/createStateStore/index.d.ts +42 -0
  23. package/es/store/index.d.ts +2 -0
  24. package/es/store/index.mjs +2 -0
  25. package/es/validator/decorators.d.ts +159 -0
  26. package/es/validator/decorators.mjs +234 -0
  27. package/es/validator/index.d.ts +2 -0
  28. package/es/validator/index.mjs +2 -0
  29. package/es/validator/validator.d.ts +84 -0
  30. package/{dist/es → es}/validator/validator.mjs +77 -12
  31. package/package.json +12 -9
  32. package/dist/cjs/request/index.cjs +0 -129
  33. package/dist/cjs/validator/decorators.cjs +0 -104
  34. package/dist/es/request/index.mjs +0 -127
  35. package/dist/es/validator/decorators.mjs +0 -92
  36. package/dist/types/validator/decorators.d.ts +0 -15
  37. package/dist/types/validator/validator.d.ts +0 -24
  38. /package/{dist/cjs → cjs/_utils}/defaultEquals.cjs +0 -0
  39. /package/{dist/cjs → cjs}/cache/indexDB.cjs +0 -0
  40. /package/{dist/types → cjs}/cache/indexDB.d.ts +0 -0
  41. /package/{dist/cjs → cjs}/index.cjs +0 -0
  42. /package/{dist/types → cjs}/index.d.ts +0 -0
  43. /package/{dist/cjs → cjs}/request/defaultHandlers.cjs +0 -0
  44. /package/{dist/cjs → cjs}/request/error.cjs +0 -0
  45. /package/{dist/types → cjs}/request/error.d.ts +0 -0
  46. /package/{dist/cjs → cjs}/store/createGetter/index.cjs +0 -0
  47. /package/{dist/types → cjs}/store/createGetter/index.d.ts +0 -0
  48. /package/{dist/cjs → cjs}/store/createStateStore/index.cjs +0 -0
  49. /package/{dist/types → cjs}/store/createStateStore/index.d.ts +0 -0
  50. /package/{dist/es → es/_utils}/defaultEquals.mjs +0 -0
  51. /package/{dist/es → es}/cache/indexDB.mjs +0 -0
  52. /package/{dist/es → es}/index.mjs +0 -0
  53. /package/{dist/es → es}/request/defaultHandlers.mjs +0 -0
  54. /package/{dist/es → es}/request/error.mjs +0 -0
  55. /package/{dist/es → es}/store/createGetter/index.mjs +0 -0
  56. /package/{dist/es → es}/store/createStateStore/index.mjs +0 -0
package/README.md CHANGED
@@ -17,6 +17,7 @@ pnpm add rxtutils
17
17
  - **缓存管理** - 支持内存、localStorage、sessionStorage 和 IndexedDB 多种存储方式
18
18
  - **HTTP 请求** - 基于 axios 的请求封装,支持错误处理和缓存
19
19
  - **状态管理** - 轻量级的状态管理解决方案,支持 React Hook
20
+ - **数据验证** - 基于装饰器的数据验证系统,支持多种验证规则
20
21
  - **TypeScript** - 完整的 TypeScript 类型支持
21
22
 
22
23
  ## 📚 模块介绍
@@ -198,7 +199,149 @@ const currentUser = userStore.get();
198
199
  userStore.set({ name: 'Jane Doe', email: 'jane@example.com', isLoggedIn: true });
199
200
  ```
200
201
 
201
- ### 4. 状态计算器 (createStoreGetter)
202
+ ### 4. 数据验证 (Validator)
203
+
204
+ 基于装饰器的数据验证系统,提供多种验证规则和自定义验证能力。
205
+
206
+ #### 基本用法
207
+
208
+ ```typescript
209
+ import { BaseValidator, VString, VNumber, VRequired, VEmail, VMinLength } from 'rxtutils';
210
+
211
+ // 创建验证模型
212
+ class User extends BaseValidator {
213
+ @VString('用户名必须为字符串')
214
+ @(VRequired()('用户名不能为空'))
215
+ name?: string;
216
+
217
+ @VNumber('年龄必须为数字')
218
+ @(VRequired()('年龄不能为空'))
219
+ age?: number;
220
+
221
+ @VEmail('邮箱格式不正确')
222
+ @(VRequired()('邮箱不能为空'))
223
+ email?: string;
224
+
225
+ @(VMinLength(6)('密码长度不能少于6位'))
226
+ @(VRequired()('密码不能为空'))
227
+ password?: string;
228
+ }
229
+
230
+ // 使用验证
231
+ const user = new User();
232
+ user.name = '张三';
233
+ user.age = 25;
234
+ user.email = 'invalid-email'; // 无效的邮箱格式
235
+ user.password = '123'; // 密码长度不足
236
+
237
+ // 验证单个字段
238
+ const emailErrors = user.validate('email');
239
+ console.log(emailErrors); // [{ status: false, message: '邮箱格式不正确' }]
240
+
241
+ // 验证所有字段
242
+ const allErrors = user.validateAll();
243
+ console.log(allErrors); // 返回所有验证错误
244
+ ```
245
+
246
+ #### 内置验证装饰器
247
+
248
+ ```typescript
249
+ // 基本类型验证
250
+ @VString('必须为字符串')
251
+ @VNumber('必须为数字')
252
+ @VBoolean('必须为布尔值')
253
+ @VArray('必须为数组')
254
+
255
+ // 必填验证
256
+ @(VRequired()('不能为空'))
257
+
258
+ // 范围验证
259
+ @(VMin(18)('必须大于等于18'))
260
+ @(VMax(100)('必须小于等于100'))
261
+
262
+ // 长度验证
263
+ @(VMinLength(6)('长度不能少于6位'))
264
+ @(VMaxLength(20)('长度不能超过20位'))
265
+
266
+ // 格式验证
267
+ @VEmail('邮箱格式不正确')
268
+ @(VPattern(/^1[3-9]\d{9}$/)('手机号格式不正确'))
269
+ ```
270
+
271
+ #### 自定义验证装饰器
272
+
273
+ ```typescript
274
+ import { BaseValidator } from 'rxtutils';
275
+
276
+ // 创建自定义验证装饰器
277
+ const VCustom = BaseValidator.decoratorCreator(
278
+ (val) => {
279
+ // 自定义验证逻辑
280
+ return typeof val === 'string' && val.startsWith('custom-');
281
+ }
282
+ );
283
+
284
+ // 使用自定义验证装饰器
285
+ class Product extends BaseValidator {
286
+ @VCustom('产品编码必须以 custom- 开头')
287
+ code?: string;
288
+ }
289
+ ```
290
+
291
+ #### 验证方法
292
+
293
+ BaseValidator 类提供了两个主要的验证方法:
294
+
295
+ ```typescript
296
+ // 验证单个字段
297
+ validate(itemKey: string, itemAll: boolean = false): { status: boolean; message?: string }[] | null;
298
+
299
+ // 验证多个或所有字段
300
+ validateAll(itemAll: boolean = false, everyItem: boolean = false, order?: string[]): { status: boolean; message?: string }[] | null;
301
+ ```
302
+
303
+ 参数说明:
304
+
305
+ - `itemKey`: 要验证的字段名
306
+ - `itemAll`: 是否验证该字段的所有规则,为 true 时会验证所有规则,为 false 时遇到第一个失败的规则就停止
307
+ - `everyItem`: 是否验证所有字段,为 true 时会验证所有字段,为 false 时遇到第一个失败的字段就停止
308
+ - `order`: 验证字段的顺序,可以指定验证的字段名数组及其顺序
309
+
310
+ 使用示例:
311
+
312
+ ```typescript
313
+ // 创建验证模型
314
+ class LoginForm extends BaseValidator {
315
+ @VString('用户名必须为字符串')
316
+ @(VRequired()('用户名不能为空'))
317
+ @(VMinLength(3)('用户名长度不能少于3位'))
318
+ @(VMaxLength(20)('用户名长度不能超过20位'))
319
+ username?: string;
320
+
321
+ @(VRequired()('密码不能为空'))
322
+ @(VMinLength(6)('密码长度不能少于6位'))
323
+ password?: string;
324
+ }
325
+
326
+ const form = new LoginForm();
327
+ form.username = 'ab'; // 长度不足
328
+ form.password = '123456';
329
+
330
+ // 验证单个字段的所有规则
331
+ const usernameErrors = form.validate('username', true);
332
+ console.log(usernameErrors);
333
+ // [{ status: false, message: '用户名长度不能少于3位' }]
334
+
335
+ // 验证所有字段,每个字段遇到第一个错误就停止
336
+ const allErrors = form.validateAll(false, true);
337
+ console.log(allErrors);
338
+
339
+ // 按指定顺序验证字段,并验证每个字段的所有规则
340
+ const orderedErrors = form.validateAll(true, true, ['password', 'username']);
341
+ console.log(orderedErrors);
342
+ ```
343
+
344
+ ### 5. 状态计算器 (createStoreGetter)
202
345
 
203
346
  为状态存储提供计算属性和派生状态。
204
347
 
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib = require('tslib');
6
6
  var moment = require('moment');
7
7
  var indexDB = require('./indexDB.cjs');
8
- var defaultEquals = require('../defaultEquals.cjs');
8
+ var defaultEquals = require('../_utils/defaultEquals.cjs');
9
9
 
10
10
  /** 存储类型映射表 */
11
11
  var StorageMap = {
@@ -18,8 +18,16 @@ var StorageMap = {
18
18
  * @template Data 缓存数据类型
19
19
  */
20
20
  var Cache = /** @class */ (function () {
21
+ /**
22
+ * 构造函数
23
+ * @param cacheType 存储类型
24
+ * @param cacheKey 缓存键名
25
+ * @param cacheTime 缓存时间(秒)
26
+ * @param indexDBName IndexedDB 数据库名称,默认值为 '__apiCacheDatabase__'
27
+ * @param cacheKeyEquals 缓存键比较函数,默认使用 defaultEquals
28
+ */
21
29
  function Cache(cacheType, cacheKey, cacheTime, indexDBName, cacheKeyEquals) {
22
- if (indexDBName === void 0) { indexDBName = '__apiCacheDatabase__'; }
30
+ if (indexDBName === void 0) { indexDBName = "__apiCacheDatabase__"; }
23
31
  if (cacheKeyEquals === void 0) { cacheKeyEquals = defaultEquals; }
24
32
  /** 内存中的缓存数组 */
25
33
  this.cache = [];
@@ -30,10 +38,10 @@ var Cache = /** @class */ (function () {
30
38
  indexDBName: indexDBName,
31
39
  cacheKeyEquals: cacheKeyEquals,
32
40
  };
33
- if (cacheType === 'indexedDB') {
34
- this.storage = new indexDB.IndexedDBStorage(indexDBName, 'cacheStore');
41
+ if (cacheType === "indexedDB") {
42
+ this.storage = new indexDB.IndexedDBStorage(indexDBName, "cacheStore");
35
43
  }
36
- else if (typeof cacheType === 'string') {
44
+ else if (typeof cacheType === "string") {
37
45
  this.storage = StorageMap[cacheType];
38
46
  }
39
47
  this._init();
@@ -55,15 +63,15 @@ var Cache = /** @class */ (function () {
55
63
  _d = (_c = JSON).parse;
56
64
  return [4 /*yield*/, this.storage.getItem(cacheKey)];
57
65
  case 1:
58
- _b.cache = _d.apply(_c, [(_e.sent()) || '[]']);
66
+ _b.cache = _d.apply(_c, [(_e.sent()) || "[]"]);
59
67
  return [3 /*break*/, 3];
60
68
  case 2:
61
69
  if (this.storage instanceof Storage) {
62
70
  this.storage = StorageMap[cacheType];
63
71
  if (this.storage) {
64
- if (typeof cacheKey === 'string') {
72
+ if (typeof cacheKey === "string") {
65
73
  try {
66
- this.cache = JSON.parse(this.storage.getItem(cacheKey) || '[]');
74
+ this.cache = JSON.parse(this.storage.getItem(cacheKey) || "[]");
67
75
  }
68
76
  catch (e) {
69
77
  this.cache = [];
@@ -80,7 +88,8 @@ var Cache = /** @class */ (function () {
80
88
  }
81
89
  });
82
90
  });
83
- }; /**
91
+ };
92
+ /**
84
93
  * 过滤掉已过期的缓存项
85
94
  * 通过比较当前时间和过期时间,移除过期的缓存项
86
95
  * @private
@@ -90,18 +99,20 @@ var Cache = /** @class */ (function () {
90
99
  return moment(item.expireTime).isAfter(moment());
91
100
  });
92
101
  this.cache = newCache;
93
- }; /**
102
+ };
103
+ /**
94
104
  * 将当前缓存数据保存到存储中
95
105
  * 如果设置了缓存键名且存储实例存在,则将缓存数据序列化后保存
96
106
  * @private
97
107
  */
98
108
  Cache.prototype._saveToStorage = function () {
99
109
  if (this.storage) {
100
- if (typeof this.cacheOptions.cacheKey === 'string') {
110
+ if (typeof this.cacheOptions.cacheKey === "string") {
101
111
  this.storage.setItem(this.cacheOptions.cacheKey, JSON.stringify(this.cache));
102
112
  }
103
113
  }
104
- }; /**
114
+ };
115
+ /**
105
116
  * 设置缓存数据
106
117
  * @param params 缓存的参数
107
118
  * @param data 要缓存的数据
@@ -118,10 +129,11 @@ var Cache = /** @class */ (function () {
118
129
  this.cache.push({
119
130
  params: params,
120
131
  data: data,
121
- expireTime: moment().add(cacheTime, 'seconds').toJSON(),
132
+ expireTime: moment().add(cacheTime, "seconds").toJSON(),
122
133
  });
123
134
  this._saveToStorage();
124
- }; /**
135
+ };
136
+ /**
125
137
  * 获取缓存数据
126
138
  * @param params 查询参数
127
139
  * @returns 如果找到有效的缓存数据则返回数据,否则返回 null
@@ -142,7 +154,8 @@ var Cache = /** @class */ (function () {
142
154
  }
143
155
  }
144
156
  return null;
145
- }; /**
157
+ };
158
+ /**
146
159
  * 清空所有缓存数据
147
160
  * 清空内存中的缓存数组并同步到存储中
148
161
  */
@@ -6,7 +6,7 @@ import { IndexedDBStorage } from './indexDB.js';
6
6
  * - localStorage: 本地存储,永久保存
7
7
  * - indexedDB: IndexedDB 数据库存储
8
8
  */
9
- type StorageType = 'sessionStorage' | 'localStorage' | 'indexedDB';
9
+ type StorageType = "sessionStorage" | "localStorage" | "indexedDB";
10
10
  /**
11
11
  * 缓存项接口定义
12
12
  * 定义了单个缓存项的数据结构
@@ -89,7 +89,8 @@ declare class Cache<Param, Data> {
89
89
  /** 缓存选项 */
90
90
  private cacheOptions;
91
91
  /** 存储实例 */
92
- storage?: Storage | IndexedDBStorage; /**
92
+ storage?: Storage | IndexedDBStorage;
93
+ /**
93
94
  * 构造函数
94
95
  * @param cacheType 存储类型
95
96
  * @param cacheKey 缓存键名
@@ -103,28 +104,33 @@ declare class Cache<Param, Data> {
103
104
  * 从存储中加载已保存的缓存数据,并进行解析和过期处理
104
105
  * @private
105
106
  */
106
- private _init; /**
107
+ private _init;
108
+ /**
107
109
  * 过滤掉已过期的缓存项
108
110
  * 通过比较当前时间和过期时间,移除过期的缓存项
109
111
  * @private
110
112
  */
111
- private _filterExpired; /**
113
+ private _filterExpired;
114
+ /**
112
115
  * 将当前缓存数据保存到存储中
113
116
  * 如果设置了缓存键名且存储实例存在,则将缓存数据序列化后保存
114
117
  * @private
115
118
  */
116
- private _saveToStorage; /**
119
+ private _saveToStorage;
120
+ /**
117
121
  * 设置缓存数据
118
122
  * @param params 缓存的参数
119
123
  * @param data 要缓存的数据
120
124
  * @param cacheOptions 可选的缓存配置,可以覆盖默认的缓存时间
121
125
  */
122
- setCache(params: Param, data: Data, cacheOptions?: Omit<ICacheOptions<Param>, 'storageType' | 'cacheKey' | 'cacheKeyEquals'>): void; /**
126
+ setCache(params: Param, data: Data, cacheOptions?: Omit<ICacheOptions<Param>, "storageType" | "cacheKey" | "cacheKeyEquals">): void;
127
+ /**
123
128
  * 获取缓存数据
124
129
  * @param params 查询参数
125
130
  * @returns 如果找到有效的缓存数据则返回数据,否则返回 null
126
131
  */
127
- getCache(params: Param): Data; /**
132
+ getCache(params: Param): Data;
133
+ /**
128
134
  * 清空所有缓存数据
129
135
  * 清空内存中的缓存数组并同步到存储中
130
136
  */
@@ -0,0 +1,150 @@
1
+ 'use strict';
2
+
3
+ var tslib = require('tslib');
4
+ var axios = require('axios');
5
+ var at = require('lodash-es/at');
6
+ var defaultHandlers = require('./defaultHandlers.cjs');
7
+ var defaultEquals = require('../_utils/defaultEquals.cjs');
8
+ var index = require('../cache/index.cjs');
9
+ var error = require('./error.cjs');
10
+
11
+ /**
12
+ * 创建基础请求实例
13
+ * @param baseOptions 基础配置选项
14
+ * @returns 请求创建函数
15
+ */
16
+ function createBaseRequest(baseOptions) {
17
+ var baseURL = Object(baseOptions).baseURL;
18
+ // 创建新的 Axios 实例并配置基础URL和跨域凭证
19
+ var instance = axios.create({
20
+ baseURL: baseURL,
21
+ withCredentials: true,
22
+ });
23
+ /**
24
+ * 创建请求函数
25
+ * @template Param 请求参数类型
26
+ * @template Data 响应数据类型,必须是对象类型
27
+ * @param requestOptions 请求配置
28
+ * @param createOptions 创建选项(覆盖基础配置)
29
+ * @returns 发送请求的函数
30
+ */
31
+ return function createRequest(requestOptions, createOptions) {
32
+ var _a = tslib.__assign({}, requestOptions), method = _a.method, url = _a.url;
33
+ var _b = tslib.__assign(tslib.__assign({}, baseOptions), createOptions), baseURL = _b.baseURL, _c = _b.cacheDataKey, cacheDataKey = _c === void 0 ? "".concat(method, ":").concat(baseURL).concat(url) : _c, cacheDataInStorage = _b.cacheDataInStorage, _d = _b.cacheKeyEquals, cacheKeyEquals = _d === void 0 ? defaultEquals : _d, cacheTime = _b.cacheTime, _e = _b.indexDBName, indexDBName = _e === void 0 ? "__apiCacheDatabase__" : _e;
34
+ var cache = new index.default(cacheDataInStorage, cacheDataKey, cacheTime, indexDBName, cacheKeyEquals);
35
+ function request(requestParam, options) {
36
+ var _this = this;
37
+ var _a = tslib.__assign(tslib.__assign({}, requestOptions), requestParam), method = _a.method, url = _a.url, _b = _a.data, data = _b === void 0 ? {} : _b, _c = _a.params, params = _c === void 0 ? {} : _c;
38
+ var requestDataOrParams = params;
39
+ if (method.toLowerCase() === "post") {
40
+ requestDataOrParams = data;
41
+ }
42
+ var _d = tslib.__assign(tslib.__assign(tslib.__assign({}, baseOptions), createOptions), options).defaultMessageShower, defaultMessageShower = _d === void 0 ? console.error : _d;
43
+ var _e = tslib.__assign(tslib.__assign(tslib.__assign({}, baseOptions), createOptions), options), _f = _e.enableCache, enableCache = _f === void 0 ? false : _f, _g = _e.cacheData, cacheData = _g === void 0 ? false : _g, _h = _e.defaultErrorCodeHandler, defaultErrorCodeHandler = _h === void 0 ? defaultHandlers._defaultErrorCodeHandler.bind(null, defaultMessageShower) : _h, _j = _e.defaultHttpErrorCodeHandler, defaultHttpErrorCodeHandler = _j === void 0 ? defaultHandlers._defaultHttpErrorCodeHandler.bind(null, defaultMessageShower) : _j, _k = _e.otherErrorHandler, otherErrorHandler = _k === void 0 ? defaultHandlers._defaultOtherErrorCodeHandler.bind(null, defaultMessageShower) : _k, _l = _e.errorCodePath, errorCodePath = _l === void 0 ? "code" : _l, _m = _e.cacheTime, cacheTime = _m === void 0 ? 60 : _m, _o = _e.errorCodeMap, errorCodeMap = _o === void 0 ? {} : _o, _p = _e.successCodes, successCodes = _p === void 0 ? ["0", "200"] : _p, _q = _e.httpErrorCodeMap, httpErrorCodeMap = _q === void 0 ? {} : _q, _r = _e.axiosOptions, axiosOptions = _r === void 0 ? {} : _r, _s = _e.throwError, throwError = _s === void 0 ? true : _s;
44
+ if (enableCache) {
45
+ var cacheItem = cache.getCache(requestDataOrParams);
46
+ if (cacheItem) {
47
+ return Promise.resolve(cacheItem);
48
+ }
49
+ }
50
+ return instance
51
+ .request(tslib.__assign({ method: method, url: url, data: data, params: params }, axiosOptions))
52
+ .then(function (res) { return tslib.__awaiter(_this, void 0, void 0, function () {
53
+ var errorCode, _a, _b, _c, customHandler, err, _d, _e, replaceResData, _f, handlerThrowError, _g;
54
+ return tslib.__generator(this, function (_h) {
55
+ switch (_h.label) {
56
+ case 0:
57
+ errorCode = String(at(res.data, errorCodePath));
58
+ if (successCodes.includes(errorCode)) {
59
+ if (cacheData) {
60
+ cache.setCache(requestDataOrParams, res.data, { cacheTime: cacheTime });
61
+ }
62
+ return [2 /*return*/, res.data];
63
+ }
64
+ _a = errorCodeMap, _b = errorCode, _c = _a[_b], customHandler = _c === void 0 ? defaultErrorCodeHandler : _c;
65
+ err = new error("服务端错误", "server", res);
66
+ if (!(typeof customHandler === "string")) return [3 /*break*/, 1];
67
+ defaultMessageShower(customHandler);
68
+ return [3 /*break*/, 3];
69
+ case 1:
70
+ _g = Object;
71
+ return [4 /*yield*/, customHandler(errorCode, res.data, res, tslib.__assign(tslib.__assign({}, requestOptions), requestParam))];
72
+ case 2:
73
+ _d = _g.apply(void 0, [(_h.sent())]), _e = _d.replaceResData, replaceResData = _e === void 0 ? res.data : _e, _f = _d.throwError, handlerThrowError = _f === void 0 ? "default" : _f;
74
+ res.data = replaceResData;
75
+ switch (handlerThrowError) {
76
+ case true:
77
+ throw err;
78
+ case false:
79
+ return [2 /*return*/, res.data];
80
+ }
81
+ _h.label = 3;
82
+ case 3:
83
+ if (throwError) {
84
+ throw err;
85
+ }
86
+ return [2 /*return*/, res.data];
87
+ }
88
+ });
89
+ }); }, function (error$1) { return tslib.__awaiter(_this, void 0, void 0, function () {
90
+ var resData, _a, _b, _c, customHandler, err, _d, _e, replaceResData, _f, handlerThrowError, _g, resData, err, _h, _j, replaceResData, _k, handlerThrowError, _l;
91
+ return tslib.__generator(this, function (_m) {
92
+ switch (_m.label) {
93
+ case 0:
94
+ if (!error$1.response) return [3 /*break*/, 4];
95
+ resData = error$1;
96
+ _a = httpErrorCodeMap, _b = error$1.response.status, _c = _a[_b], customHandler = _c === void 0 ? defaultHttpErrorCodeHandler : _c;
97
+ err = new error("服务端错误", "http", error$1);
98
+ if (!(typeof customHandler === "string")) return [3 /*break*/, 1];
99
+ defaultMessageShower(customHandler);
100
+ return [3 /*break*/, 3];
101
+ case 1:
102
+ _g = Object;
103
+ return [4 /*yield*/, customHandler(error$1.response.status, error$1, tslib.__assign(tslib.__assign({}, requestOptions), requestParam))];
104
+ case 2:
105
+ _d = _g.apply(void 0, [(_m.sent())]), _e = _d.replaceResData, replaceResData = _e === void 0 ? error$1 : _e, _f = _d.throwError, handlerThrowError = _f === void 0 ? "default" : _f;
106
+ resData = replaceResData;
107
+ switch (handlerThrowError) {
108
+ case true:
109
+ throw err;
110
+ case false:
111
+ return [2 /*return*/, resData];
112
+ }
113
+ _m.label = 3;
114
+ case 3:
115
+ if (throwError) {
116
+ throw err;
117
+ }
118
+ return [2 /*return*/, resData];
119
+ case 4:
120
+ resData = error$1;
121
+ err = new error("服务端错误", "http", error$1);
122
+ err.type = "http";
123
+ err.data = error$1;
124
+ _l = Object;
125
+ return [4 /*yield*/, otherErrorHandler(error$1)];
126
+ case 5:
127
+ _h = (_l.apply(void 0, [(_m.sent())])), _j = _h.replaceResData, replaceResData = _j === void 0 ? error$1 : _j, _k = _h.throwError, handlerThrowError = _k === void 0 ? "default" : _k;
128
+ resData = replaceResData;
129
+ switch (handlerThrowError) {
130
+ case true:
131
+ throw err;
132
+ case false:
133
+ return [2 /*return*/, resData];
134
+ }
135
+ if (throwError) {
136
+ throw err;
137
+ }
138
+ return [2 /*return*/, resData];
139
+ }
140
+ });
141
+ }); });
142
+ }
143
+ request.clearCache = function () {
144
+ cache.clear();
145
+ };
146
+ return request;
147
+ };
148
+ }
149
+
150
+ module.exports = createBaseRequest;
@@ -1,5 +1,6 @@
1
1
  import { AxiosResponse, Method, AxiosRequestConfig } from 'axios';
2
2
  import { StorageType } from '../cache/index.js';
3
+ export { default as RequestError, RequestErrorType } from './error.js';
3
4
 
4
5
  /**
5
6
  * 错误处理器返回类型
@@ -14,7 +15,7 @@ type ErrorHandlerReturnType<D> = {
14
15
  * - false: 不抛出错误
15
16
  * - 'default': 使用默认错误处理逻辑
16
17
  */
17
- throwError?: boolean | 'default';
18
+ throwError?: boolean | "default";
18
19
  };
19
20
  /**
20
21
  * 请求配置选项接口
@@ -53,7 +54,8 @@ interface Options<Params = any, Data = any> {
53
54
  * 缓存时间(秒)
54
55
  * @default 60
55
56
  */
56
- cacheTime?: number; /**
57
+ cacheTime?: number;
58
+ /**
57
59
  * 缓存数据的存储类型
58
60
  * - localStorage: 使用浏览器本地存储,数据永久保存
59
61
  * - sessionStorage: 使用会话存储,关闭浏览器后清除
@@ -75,7 +77,8 @@ interface Options<Params = any, Data = any> {
75
77
  * 错误码在响应数据中的路径
76
78
  * @default 'code'
77
79
  */
78
- errorCodePath?: string; /**
80
+ errorCodePath?: string;
81
+ /**
79
82
  * 错误码映射表
80
83
  * 可以配置错误码对应的错误信息或处理函数
81
84
  * @default {} 空对象,使用默认处理函数
@@ -85,7 +88,8 @@ interface Options<Params = any, Data = any> {
85
88
  * 默认错误码处理函数
86
89
  * 当错误码不在 errorCodeMap 中时调用
87
90
  */
88
- defaultErrorCodeHandler?: (code: string, data: Data, res: AxiosResponse<Data>) => ErrorHandlerReturnType<Data> | void; /**
91
+ defaultErrorCodeHandler?: (code: string, data: Data, res: AxiosResponse<Data>) => Promise<ErrorHandlerReturnType<Data> | void>;
92
+ /**
89
93
  * 成功状态的错误码列表
90
94
  * @default ['0', '200']
91
95
  */
@@ -95,18 +99,18 @@ interface Options<Params = any, Data = any> {
95
99
  * 可以配置 HTTP 状态码对应的错误信息或处理函数
96
100
  * @default {} 空对象,使用默认处理函数
97
101
  */
98
- httpErrorCodeMap?: Record<string, string | ((code: number, res: AxiosResponse<Data>, requestParam: RequestOptions<Params>) => ErrorHandlerReturnType<Data> | void)>;
102
+ httpErrorCodeMap?: Record<string, string | ((code: number, res: AxiosResponse<Data>, requestParam: RequestOptions<Params>) => Promise<ErrorHandlerReturnType<Data> | void>)>;
99
103
  /**
100
104
  * 默认 HTTP 错误码处理函数
101
105
  * 当 HTTP 状态码不在 httpErrorCodeMap 中时调用
102
106
  */
103
- defaultHttpErrorCodeHandler?: (code: number, error: any) => ErrorHandlerReturnType<Data> | void;
107
+ defaultHttpErrorCodeHandler?: (code: number, error: any) => Promise<ErrorHandlerReturnType<Data> | void>;
104
108
  /**
105
109
  * 其他错误处理函数
106
110
  * 处理非 HTTP 错误和非业务错误码的错误
107
111
  */
108
- otherErrorHandler?: (error: any) => ErrorHandlerReturnType<Data> | void;
109
- axiosOptions?: Omit<AxiosRequestConfig<Params>, 'method' | 'url' | 'params' | 'data'>;
112
+ otherErrorHandler?: (error: any) => Promise<ErrorHandlerReturnType<Data> | void>;
113
+ axiosOptions?: Omit<AxiosRequestConfig<Params>, "method" | "url" | "params" | "data">;
110
114
  }
111
115
  /**
112
116
  * 请求参数接口
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var index = require('./createGetter/index.cjs');
4
+ var index$1 = require('./createStateStore/index.cjs');
5
+
6
+
7
+
8
+ exports.createStoreGetter = index.createStoreGetter;
9
+ exports.createStoreGetterMemo = index.createStoreGetterMemo;
10
+ exports.createStateStore = index$1.default;
@@ -0,0 +1,2 @@
1
+ export { GetterNameMap, ReducedData, StoreGetter, createStoreGetter, createStoreGetterMemo } from './createGetter/index.js';
2
+ export { IHookStateInitAction, IHookStateInitialSetter, IHookStateResolvable, IHookStateSetAction, IHookStateSetter, default as createStateStore } from './createStateStore/index.js';