rxtutils 1.1.1 → 1.1.2-beta.10
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/README.md +547 -0
- package/cjs/index.cjs +28 -0
- package/{dist/types → cjs}/index.d.ts +4 -1
- package/cjs/request/index.cjs +150 -0
- package/{dist/types → cjs}/request/index.d.ts +11 -8
- package/cjs/store/createGetter/index.cjs +45 -0
- package/cjs/store/createGetter/index.d.ts +30 -0
- package/cjs/validator/decorators.cjs +246 -0
- package/cjs/validator/decorators.d.ts +159 -0
- package/cjs/validator/validator.cjs +179 -0
- package/cjs/validator/validator.d.ts +89 -0
- package/es/cache/index.d.ts +135 -0
- package/es/cache/indexDB.d.ts +52 -0
- package/es/index.d.ts +7 -0
- package/es/index.mjs +6 -0
- package/es/request/error.d.ts +31 -0
- package/es/request/index.d.ts +139 -0
- package/es/request/index.mjs +148 -0
- package/es/store/createGetter/index.d.ts +30 -0
- package/es/store/createGetter/index.mjs +42 -0
- package/es/store/createStateStore/index.d.ts +42 -0
- package/es/validator/decorators.d.ts +159 -0
- package/es/validator/decorators.mjs +234 -0
- package/es/validator/validator.d.ts +89 -0
- package/es/validator/validator.mjs +177 -0
- package/package.json +11 -8
- package/dist/cjs/index.cjs +0 -11
- package/dist/cjs/request/index.cjs +0 -129
- package/dist/es/index.mjs +0 -3
- package/dist/es/request/index.mjs +0 -127
- /package/{dist/cjs → cjs}/cache/index.cjs +0 -0
- /package/{dist/types → cjs}/cache/index.d.ts +0 -0
- /package/{dist/cjs → cjs}/cache/indexDB.cjs +0 -0
- /package/{dist/types → cjs}/cache/indexDB.d.ts +0 -0
- /package/{dist/cjs → cjs}/defaultEquals.cjs +0 -0
- /package/{dist/cjs → cjs}/request/defaultHandlers.cjs +0 -0
- /package/{dist/cjs → cjs}/request/error.cjs +0 -0
- /package/{dist/types → cjs}/request/error.d.ts +0 -0
- /package/{dist/cjs → cjs/store}/createStateStore/index.cjs +0 -0
- /package/{dist/types → cjs/store}/createStateStore/index.d.ts +0 -0
- /package/{dist/es → es}/cache/index.mjs +0 -0
- /package/{dist/es → es}/cache/indexDB.mjs +0 -0
- /package/{dist/es → es}/defaultEquals.mjs +0 -0
- /package/{dist/es → es}/request/defaultHandlers.mjs +0 -0
- /package/{dist/es → es}/request/error.mjs +0 -0
- /package/{dist/es → es/store}/createStateStore/index.mjs +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tslib = require('tslib');
|
|
4
|
+
var axios = require('axios');
|
|
5
|
+
var lodash = require('lodash');
|
|
6
|
+
var defaultHandlers = require('./defaultHandlers.cjs');
|
|
7
|
+
var defaultEquals = require('../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(lodash.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;
|
|
@@ -14,7 +14,7 @@ type ErrorHandlerReturnType<D> = {
|
|
|
14
14
|
* - false: 不抛出错误
|
|
15
15
|
* - 'default': 使用默认错误处理逻辑
|
|
16
16
|
*/
|
|
17
|
-
throwError?: boolean |
|
|
17
|
+
throwError?: boolean | "default";
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
20
|
* 请求配置选项接口
|
|
@@ -53,7 +53,8 @@ interface Options<Params = any, Data = any> {
|
|
|
53
53
|
* 缓存时间(秒)
|
|
54
54
|
* @default 60
|
|
55
55
|
*/
|
|
56
|
-
cacheTime?: number;
|
|
56
|
+
cacheTime?: number;
|
|
57
|
+
/**
|
|
57
58
|
* 缓存数据的存储类型
|
|
58
59
|
* - localStorage: 使用浏览器本地存储,数据永久保存
|
|
59
60
|
* - sessionStorage: 使用会话存储,关闭浏览器后清除
|
|
@@ -75,7 +76,8 @@ interface Options<Params = any, Data = any> {
|
|
|
75
76
|
* 错误码在响应数据中的路径
|
|
76
77
|
* @default 'code'
|
|
77
78
|
*/
|
|
78
|
-
errorCodePath?: string;
|
|
79
|
+
errorCodePath?: string;
|
|
80
|
+
/**
|
|
79
81
|
* 错误码映射表
|
|
80
82
|
* 可以配置错误码对应的错误信息或处理函数
|
|
81
83
|
* @default {} 空对象,使用默认处理函数
|
|
@@ -85,7 +87,8 @@ interface Options<Params = any, Data = any> {
|
|
|
85
87
|
* 默认错误码处理函数
|
|
86
88
|
* 当错误码不在 errorCodeMap 中时调用
|
|
87
89
|
*/
|
|
88
|
-
defaultErrorCodeHandler?: (code: string, data: Data, res: AxiosResponse<Data>) => ErrorHandlerReturnType<Data> | void
|
|
90
|
+
defaultErrorCodeHandler?: (code: string, data: Data, res: AxiosResponse<Data>) => Promise<ErrorHandlerReturnType<Data> | void>;
|
|
91
|
+
/**
|
|
89
92
|
* 成功状态的错误码列表
|
|
90
93
|
* @default ['0', '200']
|
|
91
94
|
*/
|
|
@@ -95,18 +98,18 @@ interface Options<Params = any, Data = any> {
|
|
|
95
98
|
* 可以配置 HTTP 状态码对应的错误信息或处理函数
|
|
96
99
|
* @default {} 空对象,使用默认处理函数
|
|
97
100
|
*/
|
|
98
|
-
httpErrorCodeMap?: Record<string, string | ((code: number, res: AxiosResponse<Data>, requestParam: RequestOptions<Params>) => ErrorHandlerReturnType<Data> | void)>;
|
|
101
|
+
httpErrorCodeMap?: Record<string, string | ((code: number, res: AxiosResponse<Data>, requestParam: RequestOptions<Params>) => Promise<ErrorHandlerReturnType<Data> | void>)>;
|
|
99
102
|
/**
|
|
100
103
|
* 默认 HTTP 错误码处理函数
|
|
101
104
|
* 当 HTTP 状态码不在 httpErrorCodeMap 中时调用
|
|
102
105
|
*/
|
|
103
|
-
defaultHttpErrorCodeHandler?: (code: number, error: any) => ErrorHandlerReturnType<Data> | void
|
|
106
|
+
defaultHttpErrorCodeHandler?: (code: number, error: any) => Promise<ErrorHandlerReturnType<Data> | void>;
|
|
104
107
|
/**
|
|
105
108
|
* 其他错误处理函数
|
|
106
109
|
* 处理非 HTTP 错误和非业务错误码的错误
|
|
107
110
|
*/
|
|
108
|
-
otherErrorHandler?: (error: any) => ErrorHandlerReturnType<Data> | void
|
|
109
|
-
axiosOptions?: Omit<AxiosRequestConfig<Params>,
|
|
111
|
+
otherErrorHandler?: (error: any) => Promise<ErrorHandlerReturnType<Data> | void>;
|
|
112
|
+
axiosOptions?: Omit<AxiosRequestConfig<Params>, "method" | "url" | "params" | "data">;
|
|
110
113
|
}
|
|
111
114
|
/**
|
|
112
115
|
* 请求参数接口
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 创建 store getter
|
|
7
|
+
* @param store store实例
|
|
8
|
+
* @param getters getter函数
|
|
9
|
+
* @param getterNameMaps 将 getter 函数和 getter 名称一一映射
|
|
10
|
+
* @returns getter object
|
|
11
|
+
*/
|
|
12
|
+
var createStoreGetter = function (store, getters, getterNameMaps) {
|
|
13
|
+
var gettersObj = {};
|
|
14
|
+
Object.keys(getters).forEach(function (key) {
|
|
15
|
+
Object.defineProperty(gettersObj, getterNameMaps[key], {
|
|
16
|
+
get: function () { return getters[key](store.get()); }
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
return gettersObj;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
* @param store store实例
|
|
24
|
+
* @param getters getter函数
|
|
25
|
+
* @param getterNameMaps 将 getter 函数和 getter 名称一一映射
|
|
26
|
+
* @returns getter memo hook
|
|
27
|
+
*/
|
|
28
|
+
var createStoreGetterMemo = function (store, getters, getterNameMaps) {
|
|
29
|
+
// 创建缓存数据 hook
|
|
30
|
+
return function () {
|
|
31
|
+
var storeData = store.use()[0];
|
|
32
|
+
var reducedData = react.useMemo(function () {
|
|
33
|
+
return Object.keys(getters).reduce(function (acc, key) {
|
|
34
|
+
var mappedKey = getterNameMaps[key];
|
|
35
|
+
var getterValue = getters[key](storeData);
|
|
36
|
+
acc[mappedKey] = getterValue;
|
|
37
|
+
return acc;
|
|
38
|
+
}, {});
|
|
39
|
+
}, [storeData]);
|
|
40
|
+
return reducedData;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
exports.createStoreGetter = createStoreGetter;
|
|
45
|
+
exports.createStoreGetterMemo = createStoreGetterMemo;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import createStateStore from '../createStateStore/index.js';
|
|
2
|
+
|
|
3
|
+
type StoreGetter<S = any> = {
|
|
4
|
+
[K in string]: (store: S) => any;
|
|
5
|
+
};
|
|
6
|
+
type GetterNameMap<G extends StoreGetter<any>> = {
|
|
7
|
+
[K in keyof G]: string;
|
|
8
|
+
};
|
|
9
|
+
type ReducedData<G extends StoreGetter<any>, M extends GetterNameMap<G>> = {
|
|
10
|
+
[K in keyof M as M[K]]: G[K extends keyof G ? K : never] extends (store: any) => infer R ? R : never;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* 创建 store getter
|
|
14
|
+
* @param store store实例
|
|
15
|
+
* @param getters getter函数
|
|
16
|
+
* @param getterNameMaps 将 getter 函数和 getter 名称一一映射
|
|
17
|
+
* @returns getter object
|
|
18
|
+
*/
|
|
19
|
+
declare const createStoreGetter: <S, G extends StoreGetter<S>, M extends GetterNameMap<G>>(store: ReturnType<typeof createStateStore<S>>, getters: G, getterNameMaps: M) => ReducedData<G, M>;
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param store store实例
|
|
23
|
+
* @param getters getter函数
|
|
24
|
+
* @param getterNameMaps 将 getter 函数和 getter 名称一一映射
|
|
25
|
+
* @returns getter memo hook
|
|
26
|
+
*/
|
|
27
|
+
declare const createStoreGetterMemo: <S, G extends StoreGetter<S>, M extends GetterNameMap<G>>(store: ReturnType<typeof createStateStore<S>>, getters: G, getterNameMaps: M) => () => ReducedData<G, M>;
|
|
28
|
+
|
|
29
|
+
export { createStoreGetter, createStoreGetterMemo };
|
|
30
|
+
export type { GetterNameMap, ReducedData, StoreGetter };
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var validator = require('./validator.cjs');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 验证器装饰器模块
|
|
7
|
+
* 提供一系列用于数据验证的装饰器,可用于类属性的验证规则定义
|
|
8
|
+
* 这些装饰器基于 BaseValidator 的 decoratorCreator 方法创建
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 必填项验证装饰器
|
|
12
|
+
* 验证值是否存在且不在指定的无效值列表中
|
|
13
|
+
*
|
|
14
|
+
* @param noneVals 被视为无效的值数组,默认为 [undefined]
|
|
15
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* class User extends BaseValidator {
|
|
19
|
+
* @(VRequired()('用户名不能为空'))
|
|
20
|
+
* username?: string;
|
|
21
|
+
* }
|
|
22
|
+
*/
|
|
23
|
+
function VRequired(noneVals) {
|
|
24
|
+
if (noneVals === void 0) { noneVals = [undefined]; }
|
|
25
|
+
return validator.BaseValidator.decoratorCreator(function (val) {
|
|
26
|
+
if (noneVals.includes(val)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 字符串类型验证装饰器
|
|
34
|
+
* 验证值是否为字符串类型
|
|
35
|
+
*
|
|
36
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* class User extends BaseValidator {
|
|
40
|
+
* @VString('用户名必须为字符串')
|
|
41
|
+
* username?: string;
|
|
42
|
+
* }
|
|
43
|
+
*/
|
|
44
|
+
var VString = validator.BaseValidator.decoratorCreator(function (val) {
|
|
45
|
+
if (typeof val !== 'string') {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* 数字类型验证装饰器
|
|
52
|
+
* 验证值是否为数字类型
|
|
53
|
+
*
|
|
54
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* class User extends BaseValidator {
|
|
58
|
+
* @VNumber('年龄必须为数字')
|
|
59
|
+
* age?: number;
|
|
60
|
+
* }
|
|
61
|
+
*/
|
|
62
|
+
var VNumber = validator.BaseValidator.decoratorCreator(function (val) {
|
|
63
|
+
if (typeof val !== 'number') {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* 数组类型验证装饰器
|
|
70
|
+
* 验证值是否为数组类型
|
|
71
|
+
*
|
|
72
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* class User extends BaseValidator {
|
|
76
|
+
* @VArray('标签必须为数组')
|
|
77
|
+
* tags?: string[];
|
|
78
|
+
* }
|
|
79
|
+
*/
|
|
80
|
+
var VArray = validator.BaseValidator.decoratorCreator(function (val) {
|
|
81
|
+
if (!Array.isArray(val)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
});
|
|
86
|
+
/**
|
|
87
|
+
* 布尔类型验证装饰器
|
|
88
|
+
* 验证值是否为布尔类型
|
|
89
|
+
*
|
|
90
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* class User extends BaseValidator {
|
|
94
|
+
* @VBoolean('状态必须为布尔值')
|
|
95
|
+
* active?: boolean;
|
|
96
|
+
* }
|
|
97
|
+
*/
|
|
98
|
+
var VBoolean = validator.BaseValidator.decoratorCreator(function (val) {
|
|
99
|
+
if (typeof val !== 'boolean') {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* 最小值验证装饰器
|
|
106
|
+
* 验证数字是否大于或等于指定的最小值
|
|
107
|
+
*
|
|
108
|
+
* @param min 最小值
|
|
109
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* class User extends BaseValidator {
|
|
113
|
+
* @(VMin(18)('年龄必须大于或等于18岁'))
|
|
114
|
+
* age?: number;
|
|
115
|
+
* }
|
|
116
|
+
*/
|
|
117
|
+
var VMin = function (min) {
|
|
118
|
+
return validator.BaseValidator.decoratorCreator(function (val) {
|
|
119
|
+
if (typeof val !== 'number' || val < min) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* 最大值验证装饰器
|
|
127
|
+
* 验证数字是否小于或等于指定的最大值
|
|
128
|
+
*
|
|
129
|
+
* @param max 最大值
|
|
130
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* class User extends BaseValidator {
|
|
134
|
+
* @(VMax(120)('年龄必须小于或等于120岁'))
|
|
135
|
+
* age?: number;
|
|
136
|
+
* }
|
|
137
|
+
*/
|
|
138
|
+
var VMax = function (max) {
|
|
139
|
+
return validator.BaseValidator.decoratorCreator(function (val) {
|
|
140
|
+
if (typeof val !== 'number' || val > max) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* 最小长度验证装饰器
|
|
148
|
+
* 验证字符串或数组的长度是否大于或等于指定的最小长度
|
|
149
|
+
*
|
|
150
|
+
* @param minLen 最小长度
|
|
151
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* class User extends BaseValidator {
|
|
155
|
+
* @(VMinLength(6)('密码长度不能少于6位'))
|
|
156
|
+
* password?: string;
|
|
157
|
+
* }
|
|
158
|
+
*/
|
|
159
|
+
var VMinLength = function (minLen) {
|
|
160
|
+
return validator.BaseValidator.decoratorCreator(function (val) {
|
|
161
|
+
if (typeof val !== 'string' && !Array.isArray(val)) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
if (val.length < minLen) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
return true;
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* 最大长度验证装饰器
|
|
172
|
+
* 验证字符串或数组的长度是否小于或等于指定的最大长度
|
|
173
|
+
*
|
|
174
|
+
* @param maxLen 最大长度
|
|
175
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* class User extends BaseValidator {
|
|
179
|
+
* @(VMaxLength(20)('用户名长度不能超过20位'))
|
|
180
|
+
* username?: string;
|
|
181
|
+
* }
|
|
182
|
+
*/
|
|
183
|
+
var VMaxLength = function (maxLen) {
|
|
184
|
+
return validator.BaseValidator.decoratorCreator(function (val) {
|
|
185
|
+
if (typeof val !== 'string' && !Array.isArray(val)) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
if (val.length > maxLen) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* 邮箱格式验证装饰器
|
|
196
|
+
* 验证字符串是否符合邮箱格式
|
|
197
|
+
*
|
|
198
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* class User extends BaseValidator {
|
|
202
|
+
* @VEmail('邮箱格式不正确')
|
|
203
|
+
* email?: string;
|
|
204
|
+
* }
|
|
205
|
+
*/
|
|
206
|
+
var VEmail = validator.BaseValidator.decoratorCreator(function (val) {
|
|
207
|
+
if (typeof val !== 'string') {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
// 简单邮箱正则
|
|
211
|
+
var emailReg = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
212
|
+
return emailReg.test(val);
|
|
213
|
+
});
|
|
214
|
+
/**
|
|
215
|
+
* 正则表达式验证装饰器
|
|
216
|
+
* 验证字符串是否匹配指定的正则表达式模式
|
|
217
|
+
*
|
|
218
|
+
* @param pattern 正则表达式
|
|
219
|
+
* @returns 装饰器工厂函数,可接收自定义错误消息
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* class User extends BaseValidator {
|
|
223
|
+
* @(VPattern(/^1[3-9]\d{9}$/)('手机号格式不正确'))
|
|
224
|
+
* phone?: string;
|
|
225
|
+
* }
|
|
226
|
+
*/
|
|
227
|
+
var VPattern = function (pattern) {
|
|
228
|
+
return validator.BaseValidator.decoratorCreator(function (val) {
|
|
229
|
+
if (typeof val !== 'string') {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
return pattern.test(val);
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
exports.VArray = VArray;
|
|
237
|
+
exports.VBoolean = VBoolean;
|
|
238
|
+
exports.VEmail = VEmail;
|
|
239
|
+
exports.VMax = VMax;
|
|
240
|
+
exports.VMaxLength = VMaxLength;
|
|
241
|
+
exports.VMin = VMin;
|
|
242
|
+
exports.VMinLength = VMinLength;
|
|
243
|
+
exports.VNumber = VNumber;
|
|
244
|
+
exports.VPattern = VPattern;
|
|
245
|
+
exports.VRequired = VRequired;
|
|
246
|
+
exports.VString = VString;
|