@ibiz-template/core 0.0.4-beta.4 → 0.1.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/dist/index.esm.js +429 -97
- package/dist/index.system.min.js +2 -1
- package/dist/index.system.min.js.map +1 -0
- package/out/constant/core/core.d.ts +2 -2
- package/out/constant/core/core.js +3 -4
- package/out/constant/util/util.d.ts.map +1 -1
- package/out/context/index.d.ts +17 -7
- package/out/context/index.d.ts.map +1 -1
- package/out/context/index.js +82 -40
- package/out/environment/environment.d.ts.map +1 -1
- package/out/environment/environment.js +5 -0
- package/out/error/model-error/model-error.d.ts +2 -2
- package/out/error/model-error/model-error.d.ts.map +1 -1
- package/out/error/model-error/model-error.js +0 -1
- package/out/error/runtime-model-error/runtime-model-error.d.ts +2 -2
- package/out/error/runtime-model-error/runtime-model-error.d.ts.map +1 -1
- package/out/error/runtime-model-error/runtime-model-error.js +0 -1
- package/out/ibizsys.d.ts +6 -4
- package/out/ibizsys.d.ts.map +1 -1
- package/out/ibizsys.js +6 -4
- package/out/index.d.ts +0 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js +0 -1
- package/out/install.d.ts.map +1 -1
- package/out/install.js +0 -2
- package/out/interface/i-environment/i-environment.d.ts +39 -0
- package/out/interface/i-environment/i-environment.d.ts.map +1 -1
- package/out/types.d.ts +11 -22
- package/out/types.d.ts.map +1 -1
- package/out/utils/download-file/download-file.d.ts.map +1 -1
- package/out/utils/index.d.ts +1 -1
- package/out/utils/index.d.ts.map +1 -1
- package/out/utils/index.js +1 -1
- package/out/utils/interceptor/core-interceptor.d.ts.map +1 -1
- package/out/utils/interceptor/core-interceptor.js +6 -2
- package/out/utils/interceptor/interceptor.d.ts +2 -2
- package/out/utils/interceptor/interceptor.d.ts.map +1 -1
- package/out/utils/logger/logger.d.ts +2 -2
- package/out/utils/logger/logger.d.ts.map +1 -1
- package/out/utils/logger/logger.js +5 -1
- package/out/utils/namespace/namespace.d.ts.map +1 -1
- package/out/utils/net/net.d.ts +12 -2
- package/out/utils/net/net.d.ts.map +1 -1
- package/out/utils/net/net.js +31 -5
- package/out/utils/recursive/find-recursive-child.d.ts +43 -0
- package/out/utils/recursive/find-recursive-child.d.ts.map +1 -0
- package/out/utils/recursive/find-recursive-child.js +90 -0
- package/out/utils/string-util/string-util.js +1 -2
- package/out/utils/style/remote-style.d.ts.map +1 -1
- package/out/utils/style/remote-style.js +1 -2
- package/out/utils/sync/count-latch.d.ts.map +1 -1
- package/out/utils/types/types.d.ts +10 -0
- package/out/utils/types/types.d.ts.map +1 -1
- package/out/utils/upload/select-file.d.ts.map +1 -1
- package/out/utils/upload/select-file.js +1 -1
- package/out/utils/upload/upload-file.d.ts.map +1 -1
- package/out/utils/upload/upload-file.js +2 -1
- package/out/utils/url-helper/url-helper.d.ts.map +1 -1
- package/out/utils/url-helper/url-helper.js +2 -1
- package/out/utils/util/util.d.ts +58 -0
- package/out/utils/util/util.d.ts.map +1 -1
- package/out/utils/util/util.js +123 -0
- package/package.json +9 -6
- package/src/constant/core/core.ts +2 -2
- package/src/constant/util/util.ts +1 -1
- package/src/context/index.ts +91 -47
- package/src/environment/environment.ts +5 -0
- package/src/error/model-error/model-error.ts +4 -2
- package/src/error/runtime-model-error/runtime-model-error.ts +4 -2
- package/src/ibizsys.ts +7 -4
- package/src/index.ts +0 -1
- package/src/install.ts +0 -2
- package/src/interface/i-environment/i-environment.ts +44 -0
- package/src/types.ts +12 -23
- package/src/utils/click-outside/click-outside.ts +6 -6
- package/src/utils/download-file/download-file.ts +2 -2
- package/src/utils/event/event.ts +1 -1
- package/src/utils/index.ts +1 -1
- package/src/utils/interceptor/core-interceptor.ts +7 -2
- package/src/utils/interceptor/interceptor.ts +3 -3
- package/src/utils/logger/logger.ts +8 -1
- package/src/utils/namespace/namespace.ts +4 -1
- package/src/utils/net/net.ts +35 -11
- package/src/utils/recursive/find-recursive-child.ts +133 -0
- package/src/utils/style/remote-style.ts +1 -3
- package/src/utils/sync/count-latch.ts +5 -5
- package/src/utils/types/types.ts +13 -0
- package/src/utils/upload/select-file.ts +2 -2
- package/src/utils/upload/upload-file.ts +6 -5
- package/src/utils/url-helper/url-helper.ts +6 -5
- package/src/utils/util/util.ts +144 -2
- package/out/factory-center.d.ts +0 -11
- package/out/factory-center.d.ts.map +0 -1
- package/out/factory-center.js +0 -10
- package/src/factory-center.ts +0 -9
package/out/utils/net/net.js
CHANGED
|
@@ -28,6 +28,16 @@ export class Net {
|
|
|
28
28
|
* @protected
|
|
29
29
|
*/
|
|
30
30
|
this.urlReg = /^http[s]?:\/\/[^\s]*/;
|
|
31
|
+
/**
|
|
32
|
+
* 请求等待队列,防止重复请求。当有完全相同请求参数的请求时,会等待上一个请求完成后把结果返回给当前请求,不会重复请求
|
|
33
|
+
* key: 由请求的 config 生成的字符串,用于唯一标识请求
|
|
34
|
+
* value: 当前正在请求的 Promise
|
|
35
|
+
*
|
|
36
|
+
* @author chitanda
|
|
37
|
+
* @date 2023-06-07 14:06:19
|
|
38
|
+
* @protected
|
|
39
|
+
*/
|
|
40
|
+
this.waitRequest = new Map();
|
|
31
41
|
/**
|
|
32
42
|
* 注册的拦截器
|
|
33
43
|
*
|
|
@@ -142,10 +152,6 @@ export class Net {
|
|
|
142
152
|
* @return {*} {Promise<IHttpResponse>}
|
|
143
153
|
*/
|
|
144
154
|
async get(url, params = {}, headers = {}, option = {}) {
|
|
145
|
-
// if (params.srfparentdata) {
|
|
146
|
-
// Object.assign(params, params.srfparentdata);
|
|
147
|
-
// delete params.srfparentdata;
|
|
148
|
-
// }
|
|
149
155
|
url = this.attachUrlParam(url, params);
|
|
150
156
|
try {
|
|
151
157
|
const response = await this.request(url, merge({ method: 'get', headers }, option));
|
|
@@ -230,11 +236,31 @@ export class Net {
|
|
|
230
236
|
* @returns {*} {Promise<IHttpResponse>}
|
|
231
237
|
*/
|
|
232
238
|
async request(url, config = {}) {
|
|
239
|
+
// axios 请求参数配置
|
|
240
|
+
const cfg = this.mergeConfig({ url }, config);
|
|
241
|
+
// 当前请求的唯一标识
|
|
242
|
+
const key = JSON.stringify(cfg);
|
|
233
243
|
try {
|
|
234
|
-
|
|
244
|
+
let requestPromise = null;
|
|
245
|
+
if (!this.waitRequest.has(key)) {
|
|
246
|
+
requestPromise = this.instance.request(cfg);
|
|
247
|
+
this.waitRequest.set(key, requestPromise);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
requestPromise = this.waitRequest.get(key);
|
|
251
|
+
}
|
|
252
|
+
const response = await requestPromise;
|
|
253
|
+
// 当第一个请求完成后就删除等待队列中的请求
|
|
254
|
+
if (this.waitRequest.has(key)) {
|
|
255
|
+
this.waitRequest.delete(key);
|
|
256
|
+
}
|
|
235
257
|
return this.doResponseResult(response);
|
|
236
258
|
}
|
|
237
259
|
catch (error) {
|
|
260
|
+
// 请求异常删除等待队列中的请求体
|
|
261
|
+
if (this.waitRequest.has(key)) {
|
|
262
|
+
this.waitRequest.delete(key);
|
|
263
|
+
}
|
|
238
264
|
throw new HttpError(error);
|
|
239
265
|
}
|
|
240
266
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** 默认配置参数 */
|
|
2
|
+
declare const IterateOpts: {
|
|
3
|
+
/** 子集合属性数组 */
|
|
4
|
+
childrenFields: string[];
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* 递归遍历子元素
|
|
8
|
+
* @author lxm
|
|
9
|
+
* @date 2023-04-23 09:07:06
|
|
10
|
+
* @export
|
|
11
|
+
* @param {IData} parent 父元素
|
|
12
|
+
* @param {(item: any) => boolean} callback 每一个子元素的回调
|
|
13
|
+
* @param {Partial<typeof IterateOpts>} [opts]
|
|
14
|
+
*/
|
|
15
|
+
export declare function recursiveIterate(parent: IData, callback: (item: any) => boolean | void, opts?: Partial<typeof IterateOpts>): void;
|
|
16
|
+
/** 默认配置参数 */
|
|
17
|
+
declare const CompareOpts: {
|
|
18
|
+
/** 比较的属性 */
|
|
19
|
+
compareField: string;
|
|
20
|
+
/** 子集合属性数组 */
|
|
21
|
+
childrenFields: string[];
|
|
22
|
+
};
|
|
23
|
+
type ICompareOpts = Partial<typeof CompareOpts> & {
|
|
24
|
+
/**
|
|
25
|
+
* 自定义比较回调
|
|
26
|
+
* @author lxm
|
|
27
|
+
* @date 2023-04-23 09:06:42
|
|
28
|
+
*/
|
|
29
|
+
compareCallback?: (child: IData, key: string, compareField: string) => boolean;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* 递归查找子元素
|
|
33
|
+
* @author lxm
|
|
34
|
+
* @date 2023-04-20 08:53:35
|
|
35
|
+
* @export
|
|
36
|
+
* @param {IData} parent 父对象
|
|
37
|
+
* @param {string} key 子元素的比较属性的值
|
|
38
|
+
* @param {ICompareOpts} [opts]
|
|
39
|
+
* @return {*} {(IData | undefined)}
|
|
40
|
+
*/
|
|
41
|
+
export declare function findRecursiveChild(parent: IData, key: string, opts?: ICompareOpts): IData | undefined;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=find-recursive-child.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-recursive-child.d.ts","sourceRoot":"","sources":["../../../src/utils/recursive/find-recursive-child.ts"],"names":[],"mappings":"AAGA,aAAa;AACb,QAAA,MAAM,WAAW;IACf,cAAc;;CAEf,CAAC;AA0CF;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,KAAK,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,GAAG,IAAI,EACvC,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,WAAW,CAAC,GACjC,IAAI,CAQN;AAED,aAAa;AACb,QAAA,MAAM,WAAW;IAEf,YAAY;;IAtEZ,cAAc;;CAwEf,CAAC;AAEF,KAAK,YAAY,GAAG,OAAO,CAAC,OAAO,WAAW,CAAC,GAAG;IAChD;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,KAAK,EACb,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,YAAY,GAClB,KAAK,GAAG,SAAS,CA0BnB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { mergeDeepRight } from 'ramda';
|
|
3
|
+
/** 默认配置参数 */
|
|
4
|
+
const IterateOpts = {
|
|
5
|
+
/** 子集合属性数组 */
|
|
6
|
+
childrenFields: ['children'],
|
|
7
|
+
};
|
|
8
|
+
const BreakError = new Error('中断操作');
|
|
9
|
+
/**
|
|
10
|
+
* 获取子属性集合
|
|
11
|
+
* @author lxm
|
|
12
|
+
* @date 2023-04-20 08:54:32
|
|
13
|
+
* @param {IData} parent
|
|
14
|
+
* @param {string[]} fields 子集合可能的属性名称
|
|
15
|
+
* @return {*} {(IData[] | undefined)}
|
|
16
|
+
*/
|
|
17
|
+
function getChildField(parent, fields) {
|
|
18
|
+
var _a;
|
|
19
|
+
for (const field of fields) {
|
|
20
|
+
if ((_a = parent[field]) === null || _a === void 0 ? void 0 : _a.length) {
|
|
21
|
+
return parent[field];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function _recursiveIterate(parent, callback, opts) {
|
|
26
|
+
const { childrenFields } = mergeDeepRight(IterateOpts, opts || {});
|
|
27
|
+
const children = getChildField(parent, childrenFields);
|
|
28
|
+
if (children === null || children === void 0 ? void 0 : children.length) {
|
|
29
|
+
for (const child of children) {
|
|
30
|
+
// 递归自身的子成员
|
|
31
|
+
const isBreak = callback(child);
|
|
32
|
+
// 如果回调返回true则退出
|
|
33
|
+
if (isBreak) {
|
|
34
|
+
throw BreakError;
|
|
35
|
+
}
|
|
36
|
+
// 递归孙的成员
|
|
37
|
+
recursiveIterate(child, callback, opts);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 递归遍历子元素
|
|
43
|
+
* @author lxm
|
|
44
|
+
* @date 2023-04-23 09:07:06
|
|
45
|
+
* @export
|
|
46
|
+
* @param {IData} parent 父元素
|
|
47
|
+
* @param {(item: any) => boolean} callback 每一个子元素的回调
|
|
48
|
+
* @param {Partial<typeof IterateOpts>} [opts]
|
|
49
|
+
*/
|
|
50
|
+
export function recursiveIterate(parent, callback, opts) {
|
|
51
|
+
try {
|
|
52
|
+
_recursiveIterate(parent, callback, opts);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error !== BreakError) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** 默认配置参数 */
|
|
61
|
+
const CompareOpts = Object.assign(Object.assign({}, IterateOpts), {
|
|
62
|
+
/** 比较的属性 */
|
|
63
|
+
compareField: 'name' });
|
|
64
|
+
/**
|
|
65
|
+
* 递归查找子元素
|
|
66
|
+
* @author lxm
|
|
67
|
+
* @date 2023-04-20 08:53:35
|
|
68
|
+
* @export
|
|
69
|
+
* @param {IData} parent 父对象
|
|
70
|
+
* @param {string} key 子元素的比较属性的值
|
|
71
|
+
* @param {ICompareOpts} [opts]
|
|
72
|
+
* @return {*} {(IData | undefined)}
|
|
73
|
+
*/
|
|
74
|
+
export function findRecursiveChild(parent, key, opts) {
|
|
75
|
+
const { compareField, compareCallback } = mergeDeepRight(CompareOpts, opts || {});
|
|
76
|
+
// 默认比较方法
|
|
77
|
+
const _compareCallback = compareCallback ||
|
|
78
|
+
((child) => {
|
|
79
|
+
return child[compareField] === key;
|
|
80
|
+
});
|
|
81
|
+
// 递归遍历,找到后中断遍历,返回找到项
|
|
82
|
+
let find;
|
|
83
|
+
recursiveIterate(parent, item => {
|
|
84
|
+
if (_compareCallback(item, key, compareField)) {
|
|
85
|
+
find = item;
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}, opts);
|
|
89
|
+
return find;
|
|
90
|
+
}
|
|
@@ -7,7 +7,7 @@ import { notNilEmpty } from 'qx-util';
|
|
|
7
7
|
* @export
|
|
8
8
|
* @class StringUtil
|
|
9
9
|
*/
|
|
10
|
-
class StringUtil {
|
|
10
|
+
export class StringUtil {
|
|
11
11
|
/**
|
|
12
12
|
* 填充字符串中的数据
|
|
13
13
|
*
|
|
@@ -55,4 +55,3 @@ StringUtil.contextReg = /\$\{context.[a-zA-Z_$][a-zA-Z0-9_$]{1,}\}/g;
|
|
|
55
55
|
* @static
|
|
56
56
|
*/
|
|
57
57
|
StringUtil.dataReg = /\$\{data.[a-zA-Z_$][a-zA-Z0-9_$]{1,}\}/g;
|
|
58
|
-
export { StringUtil };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-style.d.ts","sourceRoot":"","sources":["../../../src/utils/style/remote-style.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remote-style.d.ts","sourceRoot":"","sources":["../../../src/utils/style/remote-style.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/D"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Logger } from '../logger/logger';
|
|
2
1
|
/**
|
|
3
2
|
* 设置远程样式表
|
|
4
3
|
*
|
|
@@ -17,6 +16,6 @@ export async function setRemoteStyle(url) {
|
|
|
17
16
|
document.head.appendChild(styleDom);
|
|
18
17
|
}
|
|
19
18
|
catch (error) {
|
|
20
|
-
|
|
19
|
+
ibiz.log.debug('加载远程样式表失败', url);
|
|
21
20
|
}
|
|
22
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"count-latch.d.ts","sourceRoot":"","sources":["../../../src/utils/sync/count-latch.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;IAE7C,OAAO,CAAC,OAAO,CAAwC;IAEvD;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAK;IAElB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAMpB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAQlB;;;;;;OAMG;IACH,IAAI;
|
|
1
|
+
{"version":3,"file":"count-latch.d.ts","sourceRoot":"","sources":["../../../src/utils/sync/count-latch.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;IAE7C,OAAO,CAAC,OAAO,CAAwC;IAEvD;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAK;IAElB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAMpB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAQlB;;;;;;OAMG;IACH,IAAI,IAAI,IAAI;IAOZ;;;;;;OAMG;IACH,MAAM,IAAI,IAAI;IAUd;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -4,8 +4,18 @@
|
|
|
4
4
|
export type OmitObject<T, U> = {
|
|
5
5
|
[K in keyof Omit<T, keyof U>]: T[K];
|
|
6
6
|
};
|
|
7
|
+
/**
|
|
8
|
+
* 返回T和U的并集,其中U里面的属性都变成可选
|
|
9
|
+
*/
|
|
10
|
+
export type PartialWithObject<T, U> = {
|
|
11
|
+
[K in keyof Omit<T, keyof U>]: T[K];
|
|
12
|
+
} & Partial<U>;
|
|
7
13
|
/**
|
|
8
14
|
* 从T里面只获取索引类型为string的键
|
|
9
15
|
*/
|
|
10
16
|
export type StrKeyOf<T> = Extract<keyof T, string>;
|
|
17
|
+
/**
|
|
18
|
+
* 构造函数接口,声明一个返回对象是T的构造函数,不传则返回类型是any
|
|
19
|
+
*/
|
|
20
|
+
export type Constructor<T extends object = any> = new (...args: any[]) => T;
|
|
11
21
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/types/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/types/types.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI;KACnC,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACpC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEf;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-file.d.ts","sourceRoot":"","sources":["../../../src/utils/upload/select-file.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAE,CAMxD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,UAAU,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"select-file.d.ts","sourceRoot":"","sources":["../../../src/utils/upload/select-file.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAE,CAMxD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,UAAU,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAwBtD"}
|
|
@@ -32,7 +32,7 @@ export function selectFile(_opts) {
|
|
|
32
32
|
input.setAttribute('type', 'file');
|
|
33
33
|
input.setAttribute('multiple', `${opts.multiple}`);
|
|
34
34
|
input.setAttribute('accept', opts.accept);
|
|
35
|
-
input.onchange = e => {
|
|
35
|
+
input.onchange = (e) => {
|
|
36
36
|
const inputEl = e.target;
|
|
37
37
|
const files = inputEl.files ? fileListToArr(inputEl.files) : [];
|
|
38
38
|
if (files.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-file.d.ts","sourceRoot":"","sources":["../../../src/utils/upload/upload-file.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upload-file.d.ts","sourceRoot":"","sources":["../../../src/utils/upload/upload-file.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC;IACrE,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACpE,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CA2JvD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
2
2
|
/* eslint-disable no-param-reassign */
|
|
3
3
|
import { cloneDeep, isFunction, merge, round, uniqueId } from 'lodash-es';
|
|
4
|
+
import { RuntimeError } from '../../error';
|
|
4
5
|
import { selectFile } from './select-file';
|
|
5
6
|
/**
|
|
6
7
|
* 使用上传文件逻辑
|
|
@@ -62,7 +63,7 @@ export function uploadFile(_opts) {
|
|
|
62
63
|
// onUploadProgress: onProgress,
|
|
63
64
|
// });
|
|
64
65
|
// return res;
|
|
65
|
-
throw new
|
|
66
|
+
throw new RuntimeError(`多应用模式等待重新实现请求`);
|
|
66
67
|
};
|
|
67
68
|
/**
|
|
68
69
|
* 执行一次上传,可能是一个文件也可能是多个文件
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-helper.d.ts","sourceRoot":"","sources":["../../../src/utils/url-helper/url-helper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB;;;;;;;;OAQG;IACH,MAAM,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"url-helper.d.ts","sourceRoot":"","sources":["../../../src/utils/url-helper/url-helper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB;;;;;;;;OAQG;IACH,MAAM,KAAK,SAAS,IAAI,MAAM,CAG7B;IAED;;;;;;;;OAQG;IACH,MAAM,KAAK,OAAO,IAAI,MAAM,CAG3B;IAED;;;;;;;;OAQG;IACH,MAAM,KAAK,SAAS,IAAI,MAAM,CAE7B;IAED;;;;;;;;OAQG;IACH,MAAM,KAAK,QAAQ,IAAI,MAAM,CAE5B;CACF"}
|
package/out/utils/util/util.d.ts
CHANGED
|
@@ -18,6 +18,17 @@ export declare function getToken(): string | null;
|
|
|
18
18
|
* @returns {*} {boolean}
|
|
19
19
|
*/
|
|
20
20
|
export declare function isOverlap(arr1: any[], arr2: any[]): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 是否元素相同
|
|
23
|
+
* @author lxm
|
|
24
|
+
* @date 2023-05-22 12:50:53
|
|
25
|
+
* @export
|
|
26
|
+
* @param {any[]} arr1
|
|
27
|
+
* @param {any[]} arr2
|
|
28
|
+
* @param {string} [field] 比较元素里的某个固定属性
|
|
29
|
+
* @return {*} {boolean}
|
|
30
|
+
*/
|
|
31
|
+
export declare function isElementSame(arr1: any[], arr2: any[], field?: string): boolean;
|
|
21
32
|
/**
|
|
22
33
|
* 防抖并合并每次的参数,
|
|
23
34
|
* 最后一次才会执行
|
|
@@ -52,4 +63,51 @@ export declare function debounceAndMerge<T extends (...args: any[]) => any>(func
|
|
|
52
63
|
* @returns {*}
|
|
53
64
|
*/
|
|
54
65
|
export declare function debounceAndAsyncMerge<T extends (...args: any[]) => Promise<any>>(func: T, mergeFunc: (oldParams: Parameters<T>, newParams: Parameters<T>) => Parameters<T>, wait?: number): T;
|
|
66
|
+
/**
|
|
67
|
+
* 把右侧的对象里非空的属性合并到左侧对象里
|
|
68
|
+
* @author lxm
|
|
69
|
+
* @date 2023-05-16 02:23:39
|
|
70
|
+
* @param {IData} l
|
|
71
|
+
* @param {IData} r
|
|
72
|
+
*/
|
|
73
|
+
export declare function mergeInLeft(l: IData, r: IData): void;
|
|
74
|
+
/**
|
|
75
|
+
* 把右侧的对象里非空的属性合并到左侧对象属性为空里
|
|
76
|
+
*
|
|
77
|
+
* @author zk
|
|
78
|
+
* @date 2023-06-01 02:06:36
|
|
79
|
+
* @export
|
|
80
|
+
* @param {IData} l
|
|
81
|
+
* @param {IData} r
|
|
82
|
+
*/
|
|
83
|
+
export declare function mergeDefaultInLeft(l: IData, r: IData): void;
|
|
84
|
+
/**
|
|
85
|
+
* 比较两个数组集合,找出相同和不同的元素
|
|
86
|
+
* @author lxm
|
|
87
|
+
* @date 2023-05-29 12:33:55
|
|
88
|
+
* @export
|
|
89
|
+
* @param {IData[]} arr1 数组一
|
|
90
|
+
* @param {IData[]} arr2 数组二
|
|
91
|
+
* @param {string} [keyField] 主键属性,有主键比较主键
|
|
92
|
+
* @return {*} {{
|
|
93
|
+
* more: IData[]; arr1多的元素
|
|
94
|
+
* less: IData[]; arr1少的元素
|
|
95
|
+
* same: IData[]; 相同的元素
|
|
96
|
+
* }}
|
|
97
|
+
*/
|
|
98
|
+
export declare function compareArr(arr1: IData[], arr2: IData[], keyField?: string): {
|
|
99
|
+
more: IData[];
|
|
100
|
+
less: IData[];
|
|
101
|
+
same: IData[];
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* 转换为数字或undefined
|
|
105
|
+
* - 如果是undefined或null 返回undefined
|
|
106
|
+
* - 其他情况转成数字,能转成数字的返回数字,NaN的返回undefined
|
|
107
|
+
* @author lxm
|
|
108
|
+
* @date 2023-06-08 06:30:57
|
|
109
|
+
* @param {unknown} value 值
|
|
110
|
+
* @return {*} {(number | undefined)}
|
|
111
|
+
*/
|
|
112
|
+
export declare function toNumberOrNil(value: unknown): number | undefined;
|
|
55
113
|
//# sourceMappingURL=util.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/utils/util/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/utils/util/util.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAExC;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAG3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,GAAG,EAAE,EACX,IAAI,EAAE,GAAG,EAAE,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAUT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAChE,IAAI,EAAE,CAAC,EACP,SAAS,EAAE,CACT,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,EACxB,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,KACrB,UAAU,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,CAiBjC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAE1C,IAAI,EAAE,CAAC,EACP,SAAS,EAAE,CACT,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,EACxB,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,KACrB,UAAU,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,CAAC,CAoCH;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,CAMpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,CAM3D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,KAAK,EAAE,EACb,IAAI,EAAE,KAAK,EAAE,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB;IACD,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,IAAI,EAAE,KAAK,EAAE,CAAC;CACf,CAuCA;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAShE"}
|
package/out/utils/util/util.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { debounce } from 'lodash-es';
|
|
3
3
|
import { getCookie } from 'qx-util';
|
|
4
|
+
import { isNotNil, isNil } from 'ramda';
|
|
4
5
|
import { CoreConst } from '../../constant';
|
|
5
6
|
/**
|
|
6
7
|
* 获取认证令牌
|
|
@@ -27,6 +28,26 @@ export function isOverlap(arr1, arr2) {
|
|
|
27
28
|
const newArr = Array.from(new Set([...arr1, ...arr2]));
|
|
28
29
|
return newArr.length !== arr1.length + arr2.length;
|
|
29
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* 是否元素相同
|
|
33
|
+
* @author lxm
|
|
34
|
+
* @date 2023-05-22 12:50:53
|
|
35
|
+
* @export
|
|
36
|
+
* @param {any[]} arr1
|
|
37
|
+
* @param {any[]} arr2
|
|
38
|
+
* @param {string} [field] 比较元素里的某个固定属性
|
|
39
|
+
* @return {*} {boolean}
|
|
40
|
+
*/
|
|
41
|
+
export function isElementSame(arr1, arr2, field) {
|
|
42
|
+
if (arr1.length !== arr2.length) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const allElements = field
|
|
46
|
+
? [...arr1.map(item => item[field]), ...arr2.map(item => item[field])]
|
|
47
|
+
: [...arr1, ...arr2];
|
|
48
|
+
const newArr = Array.from(new Set(allElements));
|
|
49
|
+
return newArr.length === arr1.length;
|
|
50
|
+
}
|
|
30
51
|
/**
|
|
31
52
|
* 防抖并合并每次的参数,
|
|
32
53
|
* 最后一次才会执行
|
|
@@ -115,3 +136,105 @@ export function debounceAndAsyncMerge(func, mergeFunc, wait) {
|
|
|
115
136
|
};
|
|
116
137
|
return fun;
|
|
117
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* 把右侧的对象里非空的属性合并到左侧对象里
|
|
141
|
+
* @author lxm
|
|
142
|
+
* @date 2023-05-16 02:23:39
|
|
143
|
+
* @param {IData} l
|
|
144
|
+
* @param {IData} r
|
|
145
|
+
*/
|
|
146
|
+
export function mergeInLeft(l, r) {
|
|
147
|
+
Object.keys(r).forEach(key => {
|
|
148
|
+
if (isNotNil(r[key])) {
|
|
149
|
+
l[key] = r[key];
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 把右侧的对象里非空的属性合并到左侧对象属性为空里
|
|
155
|
+
*
|
|
156
|
+
* @author zk
|
|
157
|
+
* @date 2023-06-01 02:06:36
|
|
158
|
+
* @export
|
|
159
|
+
* @param {IData} l
|
|
160
|
+
* @param {IData} r
|
|
161
|
+
*/
|
|
162
|
+
export function mergeDefaultInLeft(l, r) {
|
|
163
|
+
Object.keys(r).forEach(key => {
|
|
164
|
+
if (isNotNil(r[key]) && isNil(l[key])) {
|
|
165
|
+
l[key] = r[key];
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* 比较两个数组集合,找出相同和不同的元素
|
|
171
|
+
* @author lxm
|
|
172
|
+
* @date 2023-05-29 12:33:55
|
|
173
|
+
* @export
|
|
174
|
+
* @param {IData[]} arr1 数组一
|
|
175
|
+
* @param {IData[]} arr2 数组二
|
|
176
|
+
* @param {string} [keyField] 主键属性,有主键比较主键
|
|
177
|
+
* @return {*} {{
|
|
178
|
+
* more: IData[]; arr1多的元素
|
|
179
|
+
* less: IData[]; arr1少的元素
|
|
180
|
+
* same: IData[]; 相同的元素
|
|
181
|
+
* }}
|
|
182
|
+
*/
|
|
183
|
+
export function compareArr(arr1, arr2, keyField) {
|
|
184
|
+
const all = new Set([...arr1, ...arr2]);
|
|
185
|
+
const more = [];
|
|
186
|
+
const less = [];
|
|
187
|
+
const same = [];
|
|
188
|
+
if (keyField) {
|
|
189
|
+
const arr1Keys = arr1.map(item => item[keyField]);
|
|
190
|
+
const arr2Keys = arr2.map(item => item[keyField]);
|
|
191
|
+
all.forEach(item => {
|
|
192
|
+
if (!arr1Keys.includes(item[keyField])) {
|
|
193
|
+
less.push(item);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!arr2Keys.includes(item[keyField])) {
|
|
197
|
+
more.push(item);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
same.push(item);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
all.forEach(item => {
|
|
205
|
+
if (!arr1.includes(item)) {
|
|
206
|
+
less.push(item);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (!arr2.includes(item)) {
|
|
210
|
+
more.push(item);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
same.push(item);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
more,
|
|
218
|
+
less,
|
|
219
|
+
same,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* 转换为数字或undefined
|
|
224
|
+
* - 如果是undefined或null 返回undefined
|
|
225
|
+
* - 其他情况转成数字,能转成数字的返回数字,NaN的返回undefined
|
|
226
|
+
* @author lxm
|
|
227
|
+
* @date 2023-06-08 06:30:57
|
|
228
|
+
* @param {unknown} value 值
|
|
229
|
+
* @return {*} {(number | undefined)}
|
|
230
|
+
*/
|
|
231
|
+
export function toNumberOrNil(value) {
|
|
232
|
+
if (isNil(value)) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const num = Number(value);
|
|
236
|
+
if (Number.isNaN(num)) {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
return num;
|
|
240
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ibiz-template/core",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "核心包",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "out/index.js",
|
|
@@ -24,8 +24,10 @@
|
|
|
24
24
|
"clean": "rimraf out dist",
|
|
25
25
|
"test": "jest",
|
|
26
26
|
"prepublish": "npm run build",
|
|
27
|
-
"publish:next": "npm publish --access public --tag
|
|
28
|
-
"publish:
|
|
27
|
+
"publish:next": "npm publish --access public --tag=next",
|
|
28
|
+
"publish:dev": "npm publish --access public --tag=dev",
|
|
29
|
+
"publish:beta": "npm publish --access public --tag=beta",
|
|
30
|
+
"publish:npm": "npm publish --access public --registry=https://registry.npmjs.org/"
|
|
29
31
|
},
|
|
30
32
|
"author": "chitanda",
|
|
31
33
|
"license": "MIT",
|
|
@@ -33,7 +35,8 @@
|
|
|
33
35
|
"axios": "^1.4.0",
|
|
34
36
|
"lodash-es": "^4.17.21",
|
|
35
37
|
"loglevel": "^1.8.1",
|
|
36
|
-
"
|
|
38
|
+
"loglevel-plugin-prefix": "^0.8.4",
|
|
39
|
+
"qs": "^6.11.2",
|
|
37
40
|
"qx-util": "^0.4.8",
|
|
38
41
|
"ramda": "^0.29.0"
|
|
39
42
|
},
|
|
@@ -41,11 +44,11 @@
|
|
|
41
44
|
"@types/qs": "^6.9.7"
|
|
42
45
|
},
|
|
43
46
|
"peerDependencies": {
|
|
44
|
-
"axios": "^1.
|
|
47
|
+
"axios": "^1.4.0",
|
|
45
48
|
"lodash-es": "^4.17.21",
|
|
46
49
|
"qs": "^6.11.0",
|
|
47
50
|
"qx-util": "^0.4.8",
|
|
48
51
|
"ramda": "^0.29.0"
|
|
49
52
|
},
|
|
50
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "764e1420d9056bd84442181ab3d68218c984515d"
|
|
51
54
|
}
|
|
@@ -19,7 +19,7 @@ export class CoreConst {
|
|
|
19
19
|
* @date 2022-07-20 15:07:28
|
|
20
20
|
* @static
|
|
21
21
|
*/
|
|
22
|
-
static readonly TOKEN = '
|
|
22
|
+
static readonly TOKEN = 'ibzuaa-token';
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* 访问令牌标识过期时间
|
|
@@ -29,5 +29,5 @@ export class CoreConst {
|
|
|
29
29
|
* @static
|
|
30
30
|
* @memberof CoreConst
|
|
31
31
|
*/
|
|
32
|
-
static readonly TOKEN_EXPIRES = '
|
|
32
|
+
static readonly TOKEN_EXPIRES = 'ibzuaa-token_expires';
|
|
33
33
|
}
|