@reskin/core 0.0.21 → 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/bundles/reskin-core-directives.umd.js +303 -163
- package/bundles/reskin-core-directives.umd.js.map +1 -1
- package/bundles/reskin-core-guards.umd.js +119 -32
- package/bundles/reskin-core-guards.umd.js.map +1 -1
- package/bundles/reskin-core-interceptors.umd.js +310 -92
- package/bundles/reskin-core-interceptors.umd.js.map +1 -1
- package/bundles/reskin-core-utils.umd.js +220 -77
- package/bundles/reskin-core-utils.umd.js.map +1 -1
- package/directives/auth.directive.d.ts +56 -9
- package/directives/load.styles.directive.d.ts +45 -5
- package/directives/string.template.outlet.directive.d.ts +68 -11
- package/esm2015/directives/auth.directive.js +71 -30
- package/esm2015/directives/load.styles.directive.js +84 -15
- package/esm2015/directives/string.template.outlet.directive.js +118 -60
- package/esm2015/guards/auth.guard.js +117 -30
- package/esm2015/interceptors/blob.interceptor.js +67 -28
- package/esm2015/interceptors/cache.interceptor.js +46 -14
- package/esm2015/interceptors/error.interceptor.js +104 -12
- package/esm2015/interceptors/public-api.js +2 -1
- package/esm2015/interceptors/token.interceptor.js +86 -42
- package/esm2015/interceptors/types.js +5 -0
- package/esm2015/utils/array.js +42 -22
- package/esm2015/utils/dom.js +29 -11
- package/esm2015/utils/form.js +44 -13
- package/esm2015/utils/store.js +101 -26
- package/fesm2015/reskin-core-directives.js +269 -103
- package/fesm2015/reskin-core-directives.js.map +1 -1
- package/fesm2015/reskin-core-guards.js +116 -29
- package/fesm2015/reskin-core-guards.js.map +1 -1
- package/fesm2015/reskin-core-interceptors.js +302 -91
- package/fesm2015/reskin-core-interceptors.js.map +1 -1
- package/fesm2015/reskin-core-utils.js +212 -68
- package/fesm2015/reskin-core-utils.js.map +1 -1
- package/guards/auth.guard.d.ts +85 -5
- package/interceptors/blob.interceptor.d.ts +30 -3
- package/interceptors/cache.interceptor.d.ts +28 -4
- package/interceptors/error.interceptor.d.ts +43 -2
- package/interceptors/public-api.d.ts +1 -0
- package/interceptors/token.interceptor.d.ts +41 -12
- package/interceptors/types.d.ts +68 -0
- package/package.json +1 -1
- package/utils/array.d.ts +8 -1
- package/utils/dom.d.ts +32 -5
- package/utils/form.d.ts +37 -2
- package/utils/store.d.ts +56 -15
|
@@ -1,25 +1,91 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
3
|
-
import {
|
|
3
|
+
import { throwError } from 'rxjs';
|
|
4
4
|
import { catchError } from 'rxjs/operators';
|
|
5
|
+
import { Router } from '@angular/router';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@angular/router";
|
|
8
|
+
/**
|
|
9
|
+
* 默认配置
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_CONFIG = {
|
|
12
|
+
unauthorizedPath: '/errors/401',
|
|
13
|
+
enableLogging: false,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* HTTP 错误拦截器
|
|
17
|
+
* 统一处理 HTTP 请求错误,包括 401 未授权错误的自动跳转
|
|
18
|
+
*/
|
|
7
19
|
export class ErrorInterceptor {
|
|
8
20
|
constructor(router) {
|
|
9
21
|
this.router = router;
|
|
22
|
+
this.config = DEFAULT_CONFIG;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 设置拦截器配置
|
|
26
|
+
* @param config 配置对象
|
|
27
|
+
*/
|
|
28
|
+
setConfig(config) {
|
|
29
|
+
this.config = Object.assign(Object.assign({}, DEFAULT_CONFIG), config);
|
|
10
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* 拦截 HTTP 请求,处理错误响应
|
|
33
|
+
* @param request HTTP 请求对象
|
|
34
|
+
* @param next 下一个拦截器处理器
|
|
35
|
+
* @returns Observable<HttpEvent<unknown>>
|
|
36
|
+
*/
|
|
11
37
|
intercept(request, next) {
|
|
12
|
-
return next.handle(request).pipe(catchError((
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
this.
|
|
38
|
+
return next.handle(request).pipe(catchError((error) => {
|
|
39
|
+
// 处理 401 未授权错误
|
|
40
|
+
if (error.status === 401) {
|
|
41
|
+
this.handleUnauthorizedError();
|
|
42
|
+
return throwError(error);
|
|
16
43
|
}
|
|
17
|
-
|
|
18
|
-
|
|
44
|
+
// 记录错误日志
|
|
45
|
+
if (this.config.enableLogging) {
|
|
46
|
+
console.error('[HTTP Error]', {
|
|
47
|
+
url: request.url,
|
|
48
|
+
method: request.method,
|
|
49
|
+
status: error.status,
|
|
50
|
+
message: error.message,
|
|
51
|
+
error: error.error,
|
|
52
|
+
});
|
|
19
53
|
}
|
|
20
|
-
|
|
54
|
+
// 提取错误信息
|
|
55
|
+
const errorMessage = this.extractErrorMessage(error);
|
|
56
|
+
return throwError(new Error(errorMessage));
|
|
21
57
|
}));
|
|
22
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* 处理 401 未授权错误
|
|
61
|
+
*/
|
|
62
|
+
handleUnauthorizedError() {
|
|
63
|
+
const path = this.config.unauthorizedPath || DEFAULT_CONFIG.unauthorizedPath;
|
|
64
|
+
this.router.navigate([path]).catch((err) => {
|
|
65
|
+
console.error('导航到错误页面失败:', err);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 提取错误信息
|
|
70
|
+
* @param error HTTP 错误响应
|
|
71
|
+
* @returns 错误信息字符串
|
|
72
|
+
*/
|
|
73
|
+
extractErrorMessage(error) {
|
|
74
|
+
if (error.error) {
|
|
75
|
+
// 尝试从 error.error 中提取信息
|
|
76
|
+
if (typeof error.error === 'string') {
|
|
77
|
+
return error.error;
|
|
78
|
+
}
|
|
79
|
+
if (error.error.msg) {
|
|
80
|
+
return error.error.msg;
|
|
81
|
+
}
|
|
82
|
+
if (error.error.message) {
|
|
83
|
+
return error.error.message;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 使用默认错误信息
|
|
87
|
+
return error.message || `HTTP Error ${error.status}`;
|
|
88
|
+
}
|
|
23
89
|
}
|
|
24
90
|
ErrorInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ErrorInterceptor, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
25
91
|
ErrorInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ErrorInterceptor });
|
|
@@ -27,9 +93,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
27
93
|
type: Injectable
|
|
28
94
|
}], ctorParameters: function () { return [{ type: i1.Router }]; } });
|
|
29
95
|
/**
|
|
30
|
-
*
|
|
96
|
+
* 提供 HTTP 错误拦截器
|
|
97
|
+
* @param config 可选的配置对象
|
|
98
|
+
* @returns Provider 配置对象
|
|
99
|
+
* @example
|
|
100
|
+
* providers: [
|
|
101
|
+
* providerHttpError({ unauthorizedPath: '/login', enableLogging: true })
|
|
102
|
+
* ]
|
|
31
103
|
*/
|
|
32
|
-
export function providerHttpError() {
|
|
33
|
-
|
|
104
|
+
export function providerHttpError(config) {
|
|
105
|
+
if (config) {
|
|
106
|
+
// 如果有配置,使用 useFactory
|
|
107
|
+
return {
|
|
108
|
+
provide: HTTP_INTERCEPTORS,
|
|
109
|
+
useFactory: (router) => {
|
|
110
|
+
const interceptor = new ErrorInterceptor(router);
|
|
111
|
+
interceptor.setConfig(config);
|
|
112
|
+
return interceptor;
|
|
113
|
+
},
|
|
114
|
+
deps: [Router],
|
|
115
|
+
multi: true,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// 没有配置,直接使用 useClass
|
|
120
|
+
return {
|
|
121
|
+
provide: HTTP_INTERCEPTORS,
|
|
122
|
+
useClass: ErrorInterceptor,
|
|
123
|
+
multi: true,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
34
126
|
}
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvaW50ZXJjZXB0b3JzL2Vycm9yLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUF3RCxpQkFBaUIsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNsSSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUd6Qzs7R0FFRztBQUNILE1BQU0sY0FBYyxHQUEyQjtJQUMzQyxnQkFBZ0IsRUFBRSxhQUFhO0lBQy9CLGFBQWEsRUFBRSxLQUFLO0NBQ3ZCLENBQUM7QUFFRjs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBR3pCLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRjFCLFdBQU0sR0FBMkIsY0FBYyxDQUFDO0lBRW5CLENBQUM7SUFFdEM7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLE1BQThCO1FBQ3BDLElBQUksQ0FBQyxNQUFNLG1DQUFRLGNBQWMsR0FBSyxNQUFNLENBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsT0FBNkIsRUFBRSxJQUFpQjtRQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUM1QixVQUFVLENBQUMsQ0FBQyxLQUF3QixFQUFFLEVBQUU7WUFDcEMsZUFBZTtZQUNmLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUMvQixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QjtZQUVELFNBQVM7WUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO2dCQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtvQkFDMUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO29CQUNoQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3RCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDcEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUN0QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7aUJBQ3JCLENBQUMsQ0FBQzthQUNOO1lBRUQsU0FBUztZQUNULE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUI7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxjQUFjLENBQUMsZ0JBQWdCLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtQkFBbUIsQ0FBQyxLQUF3QjtRQUNoRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDYix3QkFBd0I7WUFDeEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUNqQyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7YUFDdEI7WUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQzFCO1lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDckIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzthQUM5QjtTQUNKO1FBQ0QsV0FBVztRQUNYLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxjQUFjLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6RCxDQUFDOzs4R0E1RVEsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7QUFnRlg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsTUFBK0I7SUFDN0QsSUFBSSxNQUFNLEVBQUU7UUFDUixzQkFBc0I7UUFDdEIsT0FBTztZQUNILE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsVUFBVSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUU7Z0JBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDZCxLQUFLLEVBQUUsSUFBSTtTQUNkLENBQUM7S0FDTDtTQUFNO1FBQ0gscUJBQXFCO1FBQ3JCLE9BQU87WUFDSCxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsS0FBSyxFQUFFLElBQUk7U0FDZCxDQUFDO0tBQ0w7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cEhhbmRsZXIsIEh0dHBFdmVudCwgSHR0cEludGVyY2VwdG9yLCBIVFRQX0lOVEVSQ0VQVE9SUywgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgRXJyb3JJbnRlcmNlcHRvckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIOm7mOiupOmFjee9rlxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9DT05GSUc6IEVycm9ySW50ZXJjZXB0b3JDb25maWcgPSB7XHJcbiAgICB1bmF1dGhvcml6ZWRQYXRoOiAnL2Vycm9ycy80MDEnLFxyXG4gICAgZW5hYmxlTG9nZ2luZzogZmFsc2UsXHJcbn07XHJcblxyXG4vKipcclxuICogSFRUUCDplJnor6/mi6bmiKrlmahcclxuICog57uf5LiA5aSE55CGIEhUVFAg6K+35rGC6ZSZ6K+v77yM5YyF5ousIDQwMSDmnKrmjojmnYPplJnor6/nmoToh6rliqjot7PovaxcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEVycm9ySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgcHJpdmF0ZSBjb25maWc6IEVycm9ySW50ZXJjZXB0b3JDb25maWcgPSBERUZBVUxUX0NPTkZJRztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u5oum5oiq5Zmo6YWN572uXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIOmFjee9ruWvueixoVxyXG4gICAgICovXHJcbiAgICBzZXRDb25maWcoY29uZmlnOiBFcnJvckludGVyY2VwdG9yQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi5jb25maWcgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaLpuaIqiBIVFRQIOivt+axgu+8jOWkhOeQhumUmeivr+WTjeW6lFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3QgSFRUUCDor7fmsYLlr7nosaFcclxuICAgICAqIEBwYXJhbSBuZXh0IOS4i+S4gOS4quaLpuaIquWZqOWkhOeQhuWZqFxyXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+XHJcbiAgICAgKi9cclxuICAgIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xyXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIOWkhOeQhiA0MDEg5pyq5o6I5p2D6ZSZ6K+vXHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVVuYXV0aG9yaXplZEVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIOiusOW9lemUmeivr+aXpeW/l1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmVuYWJsZUxvZ2dpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSFRUUCBFcnJvcl0nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogZXJyb3Iuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g5o+Q5Y+W6ZSZ6K+v5L+h5oGvXHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLmV4dHJhY3RFcnJvck1lc3NhZ2UoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5aSE55CGIDQwMSDmnKrmjojmnYPplJnor69cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVVbmF1dGhvcml6ZWRFcnJvcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5jb25maWcudW5hdXRob3JpemVkUGF0aCB8fCBERUZBVUxUX0NPTkZJRy51bmF1dGhvcml6ZWRQYXRoO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYXRoXSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCflr7zoiKrliLDplJnor6/pobXpnaLlpLHotKU6JywgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaPkOWPlumUmeivr+S/oeaBr1xyXG4gICAgICogQHBhcmFtIGVycm9yIEhUVFAg6ZSZ6K+v5ZON5bqUXHJcbiAgICAgKiBAcmV0dXJucyDplJnor6/kv6Hmga/lrZfnrKbkuLJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBleHRyYWN0RXJyb3JNZXNzYWdlKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGVycm9yLmVycm9yKSB7XHJcbiAgICAgICAgICAgIC8vIOWwneivleS7jiBlcnJvci5lcnJvciDkuK3mj5Dlj5bkv6Hmga9cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvci5lcnJvciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5lcnJvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXJyb3IuZXJyb3IubXNnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IuZXJyb3IubXNnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IuZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDkvb/nlKjpu5jorqTplJnor6/kv6Hmga9cclxuICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCBgSFRUUCBFcnJvciAke2Vycm9yLnN0YXR1c31gO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICog5o+Q5L6bIEhUVFAg6ZSZ6K+v5oum5oiq5ZmoXHJcbiAqIEBwYXJhbSBjb25maWcg5Y+v6YCJ55qE6YWN572u5a+56LGhXHJcbiAqIEByZXR1cm5zIFByb3ZpZGVyIOmFjee9ruWvueixoVxyXG4gKiBAZXhhbXBsZVxyXG4gKiBwcm92aWRlcnM6IFtcclxuICogICBwcm92aWRlckh0dHBFcnJvcih7IHVuYXV0aG9yaXplZFBhdGg6ICcvbG9naW4nLCBlbmFibGVMb2dnaW5nOiB0cnVlIH0pXHJcbiAqIF1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlckh0dHBFcnJvcihjb25maWc/OiBFcnJvckludGVyY2VwdG9yQ29uZmlnKSB7XHJcbiAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgICAgLy8g5aaC5p6c5pyJ6YWN572u77yM5L2/55SoIHVzZUZhY3RvcnlcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUyxcclxuICAgICAgICAgICAgdXNlRmFjdG9yeTogKHJvdXRlcjogUm91dGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9IG5ldyBFcnJvckludGVyY2VwdG9yKHJvdXRlcik7XHJcbiAgICAgICAgICAgICAgICBpbnRlcmNlcHRvci5zZXRDb25maWcoY29uZmlnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmNlcHRvcjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGVwczogW1JvdXRlcl0sXHJcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOayoeaciemFjee9ru+8jOebtOaOpeS9v+eUqCB1c2VDbGFzc1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxyXG4gICAgICAgICAgICB1c2VDbGFzczogRXJyb3JJbnRlcmNlcHRvcixcclxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
export * from './types';
|
|
1
2
|
export * from './token.interceptor';
|
|
2
3
|
export * from './error.interceptor';
|
|
3
4
|
export * from './cache.interceptor';
|
|
4
5
|
export * from './blob.interceptor';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnJhcnkvY29yZS9pbnRlcmNlcHRvcnMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdG9rZW4uaW50ZXJjZXB0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL2Vycm9yLmludGVyY2VwdG9yJztcclxuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS5pbnRlcmNlcHRvcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vYmxvYi5pbnRlcmNlcHRvcic7XHJcbiJdfQ==
|
|
@@ -2,31 +2,54 @@ import { Injectable } from '@angular/core';
|
|
|
2
2
|
import { HTTP_INTERCEPTORS, HttpHeaders } from '@angular/common/http';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@reskin/core/services";
|
|
5
|
+
/**
|
|
6
|
+
* Token 拦截器常量
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_TOKEN_HEADER_NAME = 'Authorization';
|
|
9
|
+
const TOKEN_CONTROL_HEADER = 'Token-Control';
|
|
10
|
+
const CUSTOM_TOKEN_HEADER = 'Custom-Token';
|
|
11
|
+
const CUSTOM_TOKEN_HEADER_NAME = 'Custom-Token-Header';
|
|
12
|
+
const AUTH_ID_HEADER = 'X-Auth-Id';
|
|
13
|
+
/**
|
|
14
|
+
* Token 拦截器
|
|
15
|
+
* 自动为 HTTP 请求添加认证 Token
|
|
16
|
+
*/
|
|
5
17
|
export class TokenInterceptor {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
18
|
+
constructor(authService) {
|
|
19
|
+
this.authService = authService;
|
|
8
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* 拦截 HTTP 请求,添加 Token 认证信息
|
|
23
|
+
* @param request HTTP 请求对象
|
|
24
|
+
* @param next 下一个拦截器处理器
|
|
25
|
+
* @returns Observable<HttpEvent<unknown>>
|
|
26
|
+
*/
|
|
9
27
|
intercept(request, next) {
|
|
10
|
-
const
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
const tokenControl = request.headers.get(TOKEN_CONTROL_HEADER);
|
|
29
|
+
// 如果明确指定不需要 Token,直接放行
|
|
30
|
+
if (tokenControl === 'no-token') {
|
|
31
|
+
return next.handle(request);
|
|
32
|
+
}
|
|
33
|
+
const customToken = request.headers.get(CUSTOM_TOKEN_HEADER);
|
|
34
|
+
const customTokenHeaderName = request.headers.get(CUSTOM_TOKEN_HEADER_NAME) || DEFAULT_TOKEN_HEADER_NAME;
|
|
35
|
+
const headers = {};
|
|
36
|
+
if (customToken) {
|
|
37
|
+
// 使用自定义 Token
|
|
38
|
+
headers[customTokenHeaderName] = customToken;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// 使用默认认证信息
|
|
42
|
+
const auth = this.authService.token;
|
|
43
|
+
if (auth === null || auth === void 0 ? void 0 : auth.token) {
|
|
44
|
+
headers[DEFAULT_TOKEN_HEADER_NAME] = auth.token;
|
|
45
|
+
if (auth.id) {
|
|
46
|
+
headers[AUTH_ID_HEADER] = auth.id;
|
|
25
47
|
}
|
|
26
48
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
49
|
+
}
|
|
50
|
+
// 如果有需要添加的 Header,克隆请求并添加
|
|
51
|
+
if (Object.keys(headers).length > 0) {
|
|
52
|
+
request = request.clone({ setHeaders: headers });
|
|
30
53
|
}
|
|
31
54
|
return next.handle(request);
|
|
32
55
|
}
|
|
@@ -37,36 +60,57 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
37
60
|
type: Injectable
|
|
38
61
|
}], ctorParameters: function () { return [{ type: i1.RkAuthService }]; } });
|
|
39
62
|
/**
|
|
40
|
-
*
|
|
63
|
+
* 提供 Token 拦截器
|
|
64
|
+
* @returns Provider 配置对象
|
|
41
65
|
*/
|
|
42
66
|
export function providerAuthToken() {
|
|
43
67
|
return { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true };
|
|
44
68
|
}
|
|
45
69
|
/**
|
|
46
|
-
*
|
|
47
|
-
* @param urls
|
|
48
|
-
* @param params
|
|
49
|
-
* @
|
|
70
|
+
* 创建不带 Token 的请求配置
|
|
71
|
+
* @param urls 模板字符串数组
|
|
72
|
+
* @param params 模板参数
|
|
73
|
+
* @returns [url, options] 元组
|
|
74
|
+
* @example
|
|
75
|
+
* this.http.get(...NoAuthTokenTemplate`/api/public/data`).subscribe();
|
|
50
76
|
*/
|
|
51
77
|
export function NoAuthTokenTemplate(urls, ...params) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
url = String.raw(urls, ...params);
|
|
55
|
-
}
|
|
56
|
-
return [url, { headers: new HttpHeaders({ 'Token-Control': 'no-token' }) }];
|
|
78
|
+
const url = params.length > 0 ? String.raw(urls, ...params) : urls[0];
|
|
79
|
+
return [url, { headers: new HttpHeaders({ [TOKEN_CONTROL_HEADER]: 'no-token' }) }];
|
|
57
80
|
}
|
|
58
81
|
/**
|
|
59
|
-
*
|
|
60
|
-
* @param
|
|
61
|
-
* @param
|
|
62
|
-
* @
|
|
82
|
+
* 创建使用自定义 Token 的请求配置
|
|
83
|
+
* @param token 自定义 Token 值
|
|
84
|
+
* @param urls 模板字符串数组
|
|
85
|
+
* @param params 模板参数
|
|
86
|
+
* @returns [url, options] 元组
|
|
87
|
+
* @example
|
|
88
|
+
* this.http.get(...CustomTokenTemplate('my-token', `/api/data`)).subscribe();
|
|
63
89
|
*/
|
|
64
|
-
export function CustomTokenTemplate(urls, ...params) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
90
|
+
export function CustomTokenTemplate(token, urls, ...params) {
|
|
91
|
+
const url = params.length > 0 ? String.raw(urls, ...params) : urls[0];
|
|
92
|
+
return [url, { headers: new HttpHeaders({ [CUSTOM_TOKEN_HEADER]: token }) }];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 创建使用自定义 Token 和自定义 Header 名称的请求配置
|
|
96
|
+
* @param token 自定义 Token 值
|
|
97
|
+
* @param headerName 自定义 Header 名称
|
|
98
|
+
* @param urls 模板字符串数组
|
|
99
|
+
* @param params 模板参数
|
|
100
|
+
* @returns [url, options] 元组
|
|
101
|
+
* @example
|
|
102
|
+
* this.http.get(...CustomTokenWithHeaderTemplate('my-token', 'X-API-Key', `/api/data`)).subscribe();
|
|
103
|
+
*/
|
|
104
|
+
export function CustomTokenWithHeaderTemplate(token, headerName, urls, ...params) {
|
|
105
|
+
const url = params.length > 0 ? String.raw(urls, ...params) : urls[0];
|
|
106
|
+
return [
|
|
107
|
+
url,
|
|
108
|
+
{
|
|
109
|
+
headers: new HttpHeaders({
|
|
110
|
+
[CUSTOM_TOKEN_HEADER]: token,
|
|
111
|
+
[CUSTOM_TOKEN_HEADER_NAME]: headerName,
|
|
112
|
+
}),
|
|
113
|
+
},
|
|
114
|
+
];
|
|
71
115
|
}
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvaW50ZXJjZXB0b3JzL3Rva2VuLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUF3RCxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBTTVILE1BQU0sT0FBTyxnQkFBZ0I7SUFDekIsWUFBb0IsT0FBc0I7UUFBdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZTtJQUFHLENBQUM7SUFFOUMsU0FBUyxDQUFDLE9BQTZCLEVBQUUsSUFBaUI7UUFDdEQsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsa0JBQWtCO1FBQ2xCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXhELElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUNuQixJQUFJLE9BQU8sR0FBMEMsRUFBRSxDQUFDO1lBRXhELElBQUksV0FBVyxFQUFFO2dCQUNiLGFBQWE7Z0JBQ2IsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUMxQztpQkFBTTtnQkFDSCxXQUFXO2dCQUNYLE1BQU0sSUFBSSxHQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ1osT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ3RDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUNsQzthQUNKO1lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDcEQ7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDOzs4R0E1QlEsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7QUFnQ1g7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNuRixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBMEIsRUFBRSxHQUFHLE1BQWE7SUFDNUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNqQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ25CLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBMEIsRUFBRSxHQUFHLE1BQWE7SUFDNUUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7S0FDM0Q7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakQsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cEhhbmRsZXIsIEh0dHBFdmVudCwgSHR0cEludGVyY2VwdG9yLCBIVFRQX0lOVEVSQ0VQVE9SUywgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmtBdXRoU2VydmljZSB9IGZyb20gJ0ByZXNraW4vY29yZS9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IElBdXRoIH0gZnJvbSAnQHJlc2tpbi9jb3JlL2VudGl0eS91c2VyJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRva2VuSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBSa0F1dGhTZXJ2aWNlKSB7fVxyXG5cclxuICAgIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xyXG4gICAgICAgIGNvbnN0IHRjID0gcmVxdWVzdC5oZWFkZXJzLmdldCgnVG9rZW4tQ29udHJvbCcpO1xyXG4gICAgICAgIC8vIOajgOafpeaYr+WQpuaPkOS+m+S6huiHquWumuS5iXRva2VuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tVG9rZW4gPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCdDdXN0b20tVG9rZW4nKTtcclxuXHJcbiAgICAgICAgaWYgKHRjICE9PSAnbm8tdG9rZW4nKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWFkZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9ID0ge307XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VzdG9tVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIC8vIOS9v+eUqOiHquWumuS5iXRva2VuXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBjdXN0b21Ub2tlbjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIOS9v+eUqOm7mOiupOiupOivgeS/oeaBr1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aDogSUF1dGggPSB0aGlzLnNlcnZpY2UudG9rZW47XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aC50b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGF1dGgudG9rZW47XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1snWC1BdXRoLUlkJ10gPSBhdXRoLmlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoeyBzZXRIZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIOivt+axguWktOWinuWKoHRva2Vu6aqM6K+B5oum5oiq5ZmoXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZXJBdXRoVG9rZW4oKSB7XHJcbiAgICByZXR1cm4geyBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUywgdXNlQ2xhc3M6IFRva2VuSW50ZXJjZXB0b3IsIG11bHRpOiB0cnVlIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDkuI3luKZ0b2tlbumqjOivgeS/oeaBr+ivt+axglxyXG4gKiBAcGFyYW0gdXJscyDlnLDlnYBcclxuICogQHBhcmFtIHBhcmFtcyDlj4LmlbBcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gTm9BdXRoVG9rZW5UZW1wbGF0ZSh1cmxzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4ucGFyYW1zOiBhbnlbXSk6IFtzdHJpbmcsIHsgaGVhZGVyczogSHR0cEhlYWRlcnMgfV0ge1xyXG4gICAgbGV0IFt1cmxdID0gdXJscztcclxuICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHVybCA9IFN0cmluZy5yYXcodXJscywgLi4ucGFyYW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbdXJsLCB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdUb2tlbi1Db250cm9sJzogJ25vLXRva2VuJyB9KSB9XTtcclxufVxyXG5cclxuLyoqXHJcbiAqIOS9v+eUqOiHquWumuS5iXRva2Vu55qE6K+35rGCKOaooeadv+Wtl+espuS4sueJiOacrClcclxuICogQHBhcmFtIHVybHMg5Zyw5Z2AXHJcbiAqIEBwYXJhbSBwYXJhbXMg5Y+C5pWw77yM56ys5LiA5Liq5Y+C5pWw5b+F6aG75pivdG9rZW7lgLxcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gQ3VzdG9tVG9rZW5UZW1wbGF0ZSh1cmxzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4ucGFyYW1zOiBhbnlbXSk6IFtzdHJpbmcsIHsgaGVhZGVyczogSHR0cEhlYWRlcnMgfV0ge1xyXG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0N1c3RvbVRva2VuVGVtcGxhdGUg6Iez5bCR6ZyA6KaB5LiA5Liq5Y+C5pWw5L2c5Li6dG9rZW7lgLwnKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b2tlbiA9IHBhcmFtc1swXTtcclxuICAgIGNvbnN0IHVybCA9IFN0cmluZy5yYXcodXJscywgLi4ucGFyYW1zLnNsaWNlKDEpKTtcclxuXHJcbiAgICByZXR1cm4gW3VybCwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ3VzdG9tLVRva2VuJzogdG9rZW4gfSkgfV07XHJcbn1cclxuIl19
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvaW50ZXJjZXB0b3JzL3Rva2VuLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUF3RCxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBSzVIOztHQUVHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxlQUFlLENBQUM7QUFDbEQsTUFBTSxvQkFBb0IsR0FBRyxlQUFlLENBQUM7QUFDN0MsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUM7QUFDM0MsTUFBTSx3QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN2RCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUM7QUFFbkM7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUN6QixZQUFvQixXQUEwQjtRQUExQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtJQUFHLENBQUM7SUFFbEQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsT0FBNkIsRUFBRSxJQUFpQjtRQUN0RCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRS9ELHVCQUF1QjtRQUN2QixJQUFJLFlBQVksS0FBSyxVQUFVLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQy9CO1FBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLElBQUkseUJBQXlCLENBQUM7UUFFekcsTUFBTSxPQUFPLEdBQTBDLEVBQUUsQ0FBQztRQUUxRCxJQUFJLFdBQVcsRUFBRTtZQUNiLGNBQWM7WUFDZCxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxXQUFXLENBQUM7U0FDaEQ7YUFBTTtZQUNILFdBQVc7WUFDWCxNQUFNLElBQUksR0FBVSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUMzQyxJQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxLQUFLLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLHlCQUF5QixDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDaEQsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUNyQzthQUNKO1NBQ0o7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNwRDtRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDOzs4R0ExQ1EsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7QUE4Q1g7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDbkYsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBMEIsRUFBRSxHQUFHLE1BQWE7SUFDNUUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsSUFBMEIsRUFBRSxHQUFHLE1BQWE7SUFDM0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQ3pDLEtBQWEsRUFDYixVQUFrQixFQUNsQixJQUEwQixFQUMxQixHQUFHLE1BQWE7SUFFaEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPO1FBQ0gsR0FBRztRQUNIO1lBQ0ksT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixDQUFDLG1CQUFtQixDQUFDLEVBQUUsS0FBSztnQkFDNUIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLFVBQVU7YUFDekMsQ0FBQztTQUNMO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwSGFuZGxlciwgSHR0cEV2ZW50LCBIdHRwSW50ZXJjZXB0b3IsIEhUVFBfSU5URVJDRVBUT1JTLCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSa0F1dGhTZXJ2aWNlIH0gZnJvbSAnQHJlc2tpbi9jb3JlL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgSUF1dGggfSBmcm9tICdAcmVza2luL2NvcmUvZW50aXR5L3VzZXInO1xyXG5cclxuLyoqXHJcbiAqIFRva2VuIOaLpuaIquWZqOW4uOmHj1xyXG4gKi9cclxuY29uc3QgREVGQVVMVF9UT0tFTl9IRUFERVJfTkFNRSA9ICdBdXRob3JpemF0aW9uJztcclxuY29uc3QgVE9LRU5fQ09OVFJPTF9IRUFERVIgPSAnVG9rZW4tQ29udHJvbCc7XHJcbmNvbnN0IENVU1RPTV9UT0tFTl9IRUFERVIgPSAnQ3VzdG9tLVRva2VuJztcclxuY29uc3QgQ1VTVE9NX1RPS0VOX0hFQURFUl9OQU1FID0gJ0N1c3RvbS1Ub2tlbi1IZWFkZXInO1xyXG5jb25zdCBBVVRIX0lEX0hFQURFUiA9ICdYLUF1dGgtSWQnO1xyXG5cclxuLyoqXHJcbiAqIFRva2VuIOaLpuaIquWZqFxyXG4gKiDoh6rliqjkuLogSFRUUCDor7fmsYLmt7vliqDorqTor4EgVG9rZW5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRva2VuSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoU2VydmljZTogUmtBdXRoU2VydmljZSkge31cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaLpuaIqiBIVFRQIOivt+axgu+8jOa3u+WKoCBUb2tlbiDorqTor4Hkv6Hmga9cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0IEhUVFAg6K+35rGC5a+56LGhXHJcbiAgICAgKiBAcGFyYW0gbmV4dCDkuIvkuIDkuKrmi6bmiKrlmajlpITnkIblmahcclxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PlxyXG4gICAgICovXHJcbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcclxuICAgICAgICBjb25zdCB0b2tlbkNvbnRyb2wgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KFRPS0VOX0NPTlRST0xfSEVBREVSKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyDlpoLmnpzmmI7noa7mjIflrprkuI3pnIDopoEgVG9rZW7vvIznm7TmjqXmlL7ooYxcclxuICAgICAgICBpZiAodG9rZW5Db250cm9sID09PSAnbm8tdG9rZW4nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbVRva2VuID0gcmVxdWVzdC5oZWFkZXJzLmdldChDVVNUT01fVE9LRU5fSEVBREVSKTtcclxuICAgICAgICBjb25zdCBjdXN0b21Ub2tlbkhlYWRlck5hbWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KENVU1RPTV9UT0tFTl9IRUFERVJfTkFNRSkgfHwgREVGQVVMVF9UT0tFTl9IRUFERVJfTkFNRTtcclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoY3VzdG9tVG9rZW4pIHtcclxuICAgICAgICAgICAgLy8g5L2/55So6Ieq5a6a5LmJIFRva2VuXHJcbiAgICAgICAgICAgIGhlYWRlcnNbY3VzdG9tVG9rZW5IZWFkZXJOYW1lXSA9IGN1c3RvbVRva2VuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIOS9v+eUqOm7mOiupOiupOivgeS/oeaBr1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoOiBJQXV0aCA9IHRoaXMuYXV0aFNlcnZpY2UudG9rZW47XHJcbiAgICAgICAgICAgIGlmIChhdXRoPy50b2tlbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyc1tERUZBVUxUX1RPS0VOX0hFQURFUl9OQU1FXSA9IGF1dGgudG9rZW47XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aC5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbQVVUSF9JRF9IRUFERVJdID0gYXV0aC5pZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5aaC5p6c5pyJ6ZyA6KaB5re75Yqg55qEIEhlYWRlcu+8jOWFi+mahuivt+axguW5tua3u+WKoFxyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHsgc2V0SGVhZGVyczogaGVhZGVycyB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIOaPkOS+myBUb2tlbiDmi6bmiKrlmahcclxuICogQHJldHVybnMgUHJvdmlkZXIg6YWN572u5a+56LGhXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZXJBdXRoVG9rZW4oKSB7XHJcbiAgICByZXR1cm4geyBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUywgdXNlQ2xhc3M6IFRva2VuSW50ZXJjZXB0b3IsIG11bHRpOiB0cnVlIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDliJvlu7rkuI3luKYgVG9rZW4g55qE6K+35rGC6YWN572uXHJcbiAqIEBwYXJhbSB1cmxzIOaooeadv+Wtl+espuS4suaVsOe7hFxyXG4gKiBAcGFyYW0gcGFyYW1zIOaooeadv+WPguaVsFxyXG4gKiBAcmV0dXJucyBbdXJsLCBvcHRpb25zXSDlhYPnu4RcclxuICogQGV4YW1wbGVcclxuICogdGhpcy5odHRwLmdldCguLi5Ob0F1dGhUb2tlblRlbXBsYXRlYC9hcGkvcHVibGljL2RhdGFgKS5zdWJzY3JpYmUoKTtcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBOb0F1dGhUb2tlblRlbXBsYXRlKHVybHM6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi5wYXJhbXM6IGFueVtdKTogW3N0cmluZywgeyBoZWFkZXJzOiBIdHRwSGVhZGVycyB9XSB7XHJcbiAgICBjb25zdCB1cmwgPSBwYXJhbXMubGVuZ3RoID4gMCA/IFN0cmluZy5yYXcodXJscywgLi4ucGFyYW1zKSA6IHVybHNbMF07XHJcbiAgICByZXR1cm4gW3VybCwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBbVE9LRU5fQ09OVFJPTF9IRUFERVJdOiAnbm8tdG9rZW4nIH0pIH1dO1xyXG59XHJcblxyXG4vKipcclxuICog5Yib5bu65L2/55So6Ieq5a6a5LmJIFRva2VuIOeahOivt+axgumFjee9rlxyXG4gKiBAcGFyYW0gdG9rZW4g6Ieq5a6a5LmJIFRva2VuIOWAvFxyXG4gKiBAcGFyYW0gdXJscyDmqKHmnb/lrZfnrKbkuLLmlbDnu4RcclxuICogQHBhcmFtIHBhcmFtcyDmqKHmnb/lj4LmlbBcclxuICogQHJldHVybnMgW3VybCwgb3B0aW9uc10g5YWD57uEXHJcbiAqIEBleGFtcGxlXHJcbiAqIHRoaXMuaHR0cC5nZXQoLi4uQ3VzdG9tVG9rZW5UZW1wbGF0ZSgnbXktdG9rZW4nLCBgL2FwaS9kYXRhYCkpLnN1YnNjcmliZSgpO1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEN1c3RvbVRva2VuVGVtcGxhdGUodG9rZW46IHN0cmluZywgdXJsczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnBhcmFtczogYW55W10pOiBbc3RyaW5nLCB7IGhlYWRlcnM6IEh0dHBIZWFkZXJzIH1dIHtcclxuICAgIGNvbnN0IHVybCA9IHBhcmFtcy5sZW5ndGggPiAwID8gU3RyaW5nLnJhdyh1cmxzLCAuLi5wYXJhbXMpIDogdXJsc1swXTtcclxuICAgIHJldHVybiBbdXJsLCB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7IFtDVVNUT01fVE9LRU5fSEVBREVSXTogdG9rZW4gfSkgfV07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDliJvlu7rkvb/nlKjoh6rlrprkuYkgVG9rZW4g5ZKM6Ieq5a6a5LmJIEhlYWRlciDlkI3np7DnmoTor7fmsYLphY3nva5cclxuICogQHBhcmFtIHRva2VuIOiHquWumuS5iSBUb2tlbiDlgLxcclxuICogQHBhcmFtIGhlYWRlck5hbWUg6Ieq5a6a5LmJIEhlYWRlciDlkI3np7BcclxuICogQHBhcmFtIHVybHMg5qih5p2/5a2X56ym5Liy5pWw57uEXHJcbiAqIEBwYXJhbSBwYXJhbXMg5qih5p2/5Y+C5pWwXHJcbiAqIEByZXR1cm5zIFt1cmwsIG9wdGlvbnNdIOWFg+e7hFxyXG4gKiBAZXhhbXBsZVxyXG4gKiB0aGlzLmh0dHAuZ2V0KC4uLkN1c3RvbVRva2VuV2l0aEhlYWRlclRlbXBsYXRlKCdteS10b2tlbicsICdYLUFQSS1LZXknLCBgL2FwaS9kYXRhYCkpLnN1YnNjcmliZSgpO1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEN1c3RvbVRva2VuV2l0aEhlYWRlclRlbXBsYXRlKFxyXG4gICAgdG9rZW46IHN0cmluZyxcclxuICAgIGhlYWRlck5hbWU6IHN0cmluZyxcclxuICAgIHVybHM6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxyXG4gICAgLi4ucGFyYW1zOiBhbnlbXVxyXG4pOiBbc3RyaW5nLCB7IGhlYWRlcnM6IEh0dHBIZWFkZXJzIH1dIHtcclxuICAgIGNvbnN0IHVybCA9IHBhcmFtcy5sZW5ndGggPiAwID8gU3RyaW5nLnJhdyh1cmxzLCAuLi5wYXJhbXMpIDogdXJsc1swXTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgdXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIFtDVVNUT01fVE9LRU5fSEVBREVSXTogdG9rZW4sXHJcbiAgICAgICAgICAgICAgICBbQ1VTVE9NX1RPS0VOX0hFQURFUl9OQU1FXTogaGVhZGVyTmFtZSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgfSxcclxuICAgIF07XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP 拦截器相关类型定义
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvaW50ZXJjZXB0b3JzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEhUVFAg5oum5oiq5Zmo55u45YWz57G75Z6L5a6a5LmJXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRva2VuIOaLpuaIquWZqOmFjee9rlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUb2tlbkludGVyY2VwdG9yQ29uZmlnIHtcclxuICAgIC8qKlxyXG4gICAgICog6buY6K6k55qEIFRva2VuIEhlYWRlciDlkI3np7BcclxuICAgICAqIEBkZWZhdWx0ICdBdXRob3JpemF0aW9uJ1xyXG4gICAgICovXHJcbiAgICB0b2tlbkhlYWRlck5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIOiupOivgSBJRCBIZWFkZXIg5ZCN56ewXHJcbiAgICAgKiBAZGVmYXVsdCAnWC1BdXRoLUlkJ1xyXG4gICAgICovXHJcbiAgICBhdXRoSWRIZWFkZXJOYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICog6ZSZ6K+v5oum5oiq5Zmo6YWN572uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEVycm9ySW50ZXJjZXB0b3JDb25maWcge1xyXG4gICAgLyoqXHJcbiAgICAgKiA0MDEg6ZSZ6K+v6Lez6L2s6Lev5b6EXHJcbiAgICAgKiBAZGVmYXVsdCAnL2Vycm9ycy80MDEnXHJcbiAgICAgKi9cclxuICAgIHVuYXV0aG9yaXplZFBhdGg/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuWQr+eUqOmUmeivr+aXpeW/l1xyXG4gICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAqL1xyXG4gICAgZW5hYmxlTG9nZ2luZz86IGJvb2xlYW47XHJcbiAgICAvKipcclxuICAgICAqIOiHquWumuS5iemUmeivr+WkhOeQhuWHveaVsFxyXG4gICAgICovXHJcbiAgICBjdXN0b21FcnJvckhhbmRsZXI/OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIOe8k+WtmOaLpuaIquWZqOmFjee9rlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUludGVyY2VwdG9yQ29uZmlnIHtcclxuICAgIC8qKlxyXG4gICAgICog57yT5a2Y5pyA5aSn5pWw6YePXHJcbiAgICAgKiBAZGVmYXVsdCAxMDBcclxuICAgICAqL1xyXG4gICAgbWF4Q2FjaGVTaXplPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiDnvJPlrZjov4fmnJ/ml7bpl7TvvIjmr6vnp5LvvIlcclxuICAgICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAo5rC45LiN6L+H5pyfKVxyXG4gICAgICovXHJcbiAgICBjYWNoZUV4cGlyYXRpb24/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIVFRQIOivt+axgumAiemhueaJqeWxlVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVxdWVzdE9wdGlvbnMge1xyXG4gICAgaGVhZGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUb2tlbiDmjqfliLbnsbvlnotcclxuICovXHJcbmV4cG9ydCB0eXBlIFRva2VuQ29udHJvbCA9ICduby10b2tlbicgfCAnY3VzdG9tLXRva2VuJztcclxuXHJcbi8qKlxyXG4gKiDnvJPlrZjnrZbnlaXnsbvlnotcclxuICovXHJcbmV4cG9ydCB0eXBlIENhY2hlU3RyYXRlZ3kgPSAnU3RvcmFnZScgfCAnTWVtb3J5JztcclxuIl19
|
package/esm2015/utils/array.js
CHANGED
|
@@ -1,40 +1,60 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 深克隆一个对象或数组
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 该函数通过递归方式深克隆输入的对象或数组,确保与原对象或数组隔离,不会相互影响。
|
|
5
|
+
* 支持克隆:普通对象、数组、Date、Map、Set、RegExp 等类型。
|
|
5
6
|
*
|
|
6
7
|
* @param source 需要克隆的源对象或数组
|
|
7
8
|
* @returns 返回克隆后的对象或数组
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const obj = { a: 1, b: { c: 2 } };
|
|
12
|
+
* const cloned = deepClone(obj);
|
|
13
|
+
* cloned.b.c = 3;
|
|
14
|
+
* console.log(obj.b.c); // 输出: 2
|
|
8
15
|
*/
|
|
9
16
|
export function deepClone(source) {
|
|
10
|
-
//
|
|
17
|
+
// 处理 null 和基本类型
|
|
11
18
|
if (source === null || typeof source !== 'object') {
|
|
12
19
|
return source;
|
|
13
20
|
}
|
|
14
|
-
//
|
|
21
|
+
// 处理 Date 对象
|
|
22
|
+
if (source instanceof Date) {
|
|
23
|
+
return new Date(source.getTime());
|
|
24
|
+
}
|
|
25
|
+
// 处理 RegExp 对象
|
|
26
|
+
if (source instanceof RegExp) {
|
|
27
|
+
return new RegExp(source.source, source.flags);
|
|
28
|
+
}
|
|
29
|
+
// 处理 Map 对象
|
|
30
|
+
if (source instanceof Map) {
|
|
31
|
+
const clonedMap = new Map();
|
|
32
|
+
source.forEach((value, key) => {
|
|
33
|
+
clonedMap.set(deepClone(key), deepClone(value));
|
|
34
|
+
});
|
|
35
|
+
return clonedMap;
|
|
36
|
+
}
|
|
37
|
+
// 处理 Set 对象
|
|
38
|
+
if (source instanceof Set) {
|
|
39
|
+
const clonedSet = new Set();
|
|
40
|
+
source.forEach((value) => {
|
|
41
|
+
clonedSet.add(deepClone(value));
|
|
42
|
+
});
|
|
43
|
+
return clonedSet;
|
|
44
|
+
}
|
|
45
|
+
// 处理数组
|
|
15
46
|
if (Array.isArray(source)) {
|
|
16
|
-
|
|
17
|
-
for (let i = 0; i < source.length; i++) {
|
|
18
|
-
clonedArray[i] = deepClone(source[i]);
|
|
19
|
-
}
|
|
20
|
-
// 忽略类型检查器的警告,确保能够返回泛型T类型的数组
|
|
21
|
-
// @ts-ignore
|
|
22
|
-
return clonedArray;
|
|
47
|
+
return source.map((item) => deepClone(item));
|
|
23
48
|
}
|
|
24
|
-
//
|
|
25
|
-
if (
|
|
49
|
+
// 处理普通对象
|
|
50
|
+
if (Object.prototype.toString.call(source) === '[object Object]') {
|
|
26
51
|
const clonedObject = {};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (source.hasOwnProperty(key)) {
|
|
31
|
-
clonedObject[key] = deepClone(source[key]);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// 忽略类型检查器的警告,确保能够返回泛型T类型的对象
|
|
52
|
+
Object.keys(source).forEach((key) => {
|
|
53
|
+
clonedObject[key] = deepClone(source[key]);
|
|
54
|
+
});
|
|
35
55
|
return clonedObject;
|
|
36
56
|
}
|
|
37
|
-
//
|
|
57
|
+
// 其他类型直接返回(如函数、Symbol 等)
|
|
38
58
|
return source;
|
|
39
59
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvdXRpbHMvYXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFJLE1BQVM7SUFDbEMsZ0JBQWdCO0lBQ2hCLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDL0MsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFFRCxhQUFhO0lBQ2IsSUFBSSxNQUFNLFlBQVksSUFBSSxFQUFFO1FBQ3hCLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFpQixDQUFDO0tBQ3JEO0lBRUQsZUFBZTtJQUNmLElBQUksTUFBTSxZQUFZLE1BQU0sRUFBRTtRQUMxQixPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBaUIsQ0FBQztLQUNsRTtJQUVELFlBQVk7SUFDWixJQUFJLE1BQU0sWUFBWSxHQUFHLEVBQUU7UUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxTQUF5QixDQUFDO0tBQ3BDO0lBRUQsWUFBWTtJQUNaLElBQUksTUFBTSxZQUFZLEdBQUcsRUFBRTtRQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQixTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxTQUF5QixDQUFDO0tBQ3BDO0lBRUQsT0FBTztJQUNQLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN2QixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBaUIsQ0FBQztLQUNoRTtJQUVELFNBQVM7SUFDVCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxpQkFBaUIsRUFBRTtRQUM5RCxNQUFNLFlBQVksR0FBRyxFQUFPLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMvQixZQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBRSxNQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0tBQ3ZCO0lBRUQseUJBQXlCO0lBQ3pCLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog5rex5YWL6ZqG5LiA5Liq5a+56LGh5oiW5pWw57uEXHJcbiAqXHJcbiAqIOivpeWHveaVsOmAmui/h+mAkuW9kuaWueW8j+a3seWFi+mahui+k+WFpeeahOWvueixoeaIluaVsOe7hO+8jOehruS/neS4juWOn+WvueixoeaIluaVsOe7hOmalOemu++8jOS4jeS8muebuOS6kuW9seWTjeOAglxyXG4gKiDmlK/mjIHlhYvpmobvvJrmma7pgJrlr7nosaHjgIHmlbDnu4TjgIFEYXRl44CBTWFw44CBU2V044CBUmVnRXhwIOetieexu+Wei+OAglxyXG4gKlxyXG4gKiBAcGFyYW0gc291cmNlIOmcgOimgeWFi+mahueahOa6kOWvueixoeaIluaVsOe7hFxyXG4gKiBAcmV0dXJucyDov5Tlm57lhYvpmoblkI7nmoTlr7nosaHmiJbmlbDnu4RcclxuICpcclxuICogQGV4YW1wbGVcclxuICogY29uc3Qgb2JqID0geyBhOiAxLCBiOiB7IGM6IDIgfSB9O1xyXG4gKiBjb25zdCBjbG9uZWQgPSBkZWVwQ2xvbmUob2JqKTtcclxuICogY2xvbmVkLmIuYyA9IDM7XHJcbiAqIGNvbnNvbGUubG9nKG9iai5iLmMpOyAvLyDovpPlh7o6IDJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmU8VD4oc291cmNlOiBUKTogVCB7XHJcbiAgICAvLyDlpITnkIYgbnVsbCDlkozln7rmnKznsbvlnotcclxuICAgIGlmIChzb3VyY2UgPT09IG51bGwgfHwgdHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4gc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWkhOeQhiBEYXRlIOWvueixoVxyXG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUoc291cmNlLmdldFRpbWUoKSkgYXMgdW5rbm93biBhcyBUO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWkhOeQhiBSZWdFeHAg5a+56LGhXHJcbiAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVnRXhwKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLmZsYWdzKSBhcyB1bmtub3duIGFzIFQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aSE55CGIE1hcCDlr7nosaFcclxuICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYXApIHtcclxuICAgICAgICBjb25zdCBjbG9uZWRNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgc291cmNlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY2xvbmVkTWFwLnNldChkZWVwQ2xvbmUoa2V5KSwgZGVlcENsb25lKHZhbHVlKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lZE1hcCBhcyB1bmtub3duIGFzIFQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aSE55CGIFNldCDlr7nosaFcclxuICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTZXQpIHtcclxuICAgICAgICBjb25zdCBjbG9uZWRTZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgc291cmNlLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGNsb25lZFNldC5hZGQoZGVlcENsb25lKHZhbHVlKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lZFNldCBhcyB1bmtub3duIGFzIFQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aSE55CG5pWw57uEXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5tYXAoKGl0ZW0pID0+IGRlZXBDbG9uZShpdGVtKSkgYXMgdW5rbm93biBhcyBUO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWkhOeQhuaZrumAmuWvueixoVxyXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzb3VyY2UpID09PSAnW29iamVjdCBPYmplY3RdJykge1xyXG4gICAgICAgIGNvbnN0IGNsb25lZE9iamVjdCA9IHt9IGFzIFQ7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgKGNsb25lZE9iamVjdCBhcyBhbnkpW2tleV0gPSBkZWVwQ2xvbmUoKHNvdXJjZSBhcyBhbnkpW2tleV0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjbG9uZWRPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5YW25LuW57G75Z6L55u05o6l6L+U5Zue77yI5aaC5Ye95pWw44CBU3ltYm9sIOetie+8iVxyXG4gICAgcmV0dXJuIHNvdXJjZTtcclxufVxyXG4iXX0=
|
package/esm2015/utils/dom.js
CHANGED
|
@@ -1,28 +1,46 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
import { debounceTime } from 'rxjs/operators';
|
|
2
3
|
/**
|
|
3
4
|
* 监听元素的大小变化
|
|
4
5
|
*
|
|
5
|
-
* 此函数创建了一个Observable,用于观察给定HTMLElement
|
|
6
|
-
*
|
|
6
|
+
* 此函数创建了一个 Observable,用于观察给定 HTMLElement 元素的大小变化。
|
|
7
|
+
* 它使用了 ResizeObserver API 来实现,当元素的大小发生变化时,会发出一个包含变化记录的数组。
|
|
7
8
|
*
|
|
8
|
-
* @param element 需要观察大小变化的HTMLElement元素
|
|
9
|
-
* @
|
|
9
|
+
* @param element 需要观察大小变化的 HTMLElement 元素
|
|
10
|
+
* @param options 配置选项
|
|
11
|
+
* @returns 返回一个 Observable,其中包含 ResizeObserverEntry 的数组,用于记录每次大小变化的信息
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // 基础用法
|
|
15
|
+
* const element = document.querySelector('.container');
|
|
16
|
+
* observeResize(element).subscribe(entries => {
|
|
17
|
+
* const { width, height } = entries[0].contentRect;
|
|
18
|
+
* console.log(`元素尺寸: ${width}x${height}`);
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // 使用防抖优化性能
|
|
23
|
+
* observeResize(element, { debounce: 300 }).subscribe(entries => {
|
|
24
|
+
* // 300ms 内的多次变化只会触发一次
|
|
25
|
+
* console.log('元素大小已稳定');
|
|
26
|
+
* });
|
|
10
27
|
*/
|
|
11
|
-
export function observeResize(element) {
|
|
12
|
-
|
|
13
|
-
|
|
28
|
+
export function observeResize(element, options) {
|
|
29
|
+
const { debounce } = options || {};
|
|
30
|
+
const resize$ = new Observable((observer) => {
|
|
31
|
+
// 创建 ResizeObserver 实例,当观察的目标元素大小发生变化时,会调用回调函数
|
|
14
32
|
const resizeObserver = new ResizeObserver((entries) => {
|
|
15
33
|
observer.next(entries);
|
|
16
34
|
});
|
|
17
35
|
// 开始观察指定的元素
|
|
18
36
|
resizeObserver.observe(element);
|
|
19
|
-
//
|
|
37
|
+
// 返回清理函数,用于在取消订阅时调用
|
|
20
38
|
return () => {
|
|
21
|
-
// 停止观察指定的元素
|
|
22
39
|
resizeObserver.unobserve(element);
|
|
23
|
-
// 断开与所有目标的观察连接
|
|
24
40
|
resizeObserver.disconnect();
|
|
25
41
|
};
|
|
26
42
|
});
|
|
43
|
+
// 如果设置了防抖,则应用防抖操作符
|
|
44
|
+
return debounce ? resize$.pipe(debounceTime(debounce)) : resize$;
|
|
27
45
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicmFyeS9jb3JlL3V0aWxzL2RvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWM5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFvQixFQUFFLE9BQThCO0lBQzlFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBRW5DLE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUF3QixDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQy9ELCtDQUErQztRQUMvQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZO1FBQ1osY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVoQyxvQkFBb0I7UUFDcEIsT0FBTyxHQUFHLEVBQUU7WUFDUixjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztJQUVILG1CQUFtQjtJQUNuQixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4gKiDnm5HlkKzlhYPntKDlpKflsI/lj5jljJbnmoTphY3nva7pgInpoblcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgT2JzZXJ2ZVJlc2l6ZU9wdGlvbnMge1xyXG4gICAgLyoqXHJcbiAgICAgKiDpmLLmipblu7bov5/ml7bpl7TvvIjmr6vnp5LvvIlcclxuICAgICAqIOiuvue9ruWQjuS8muWvuemikee5geeahOWkp+Wwj+WPmOWMluS6i+S7tui/m+ihjOmYsuaKluWkhOeQhlxyXG4gICAgICogQGRlZmF1bHQgdW5kZWZpbmVkICjkuI3pmLLmipYpXHJcbiAgICAgKi9cclxuICAgIGRlYm91bmNlPzogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICog55uR5ZCs5YWD57Sg55qE5aSn5bCP5Y+Y5YyWXHJcbiAqXHJcbiAqIOatpOWHveaVsOWIm+W7uuS6huS4gOS4qiBPYnNlcnZhYmxl77yM55So5LqO6KeC5a+f57uZ5a6aIEhUTUxFbGVtZW50IOWFg+e0oOeahOWkp+Wwj+WPmOWMluOAglxyXG4gKiDlroPkvb/nlKjkuoYgUmVzaXplT2JzZXJ2ZXIgQVBJIOadpeWunueOsO+8jOW9k+WFg+e0oOeahOWkp+Wwj+WPkeeUn+WPmOWMluaXtu+8jOS8muWPkeWHuuS4gOS4quWMheWQq+WPmOWMluiusOW9leeahOaVsOe7hOOAglxyXG4gKlxyXG4gKiBAcGFyYW0gZWxlbWVudCDpnIDopoHop4Llr5/lpKflsI/lj5jljJbnmoQgSFRNTEVsZW1lbnQg5YWD57SgXHJcbiAqIEBwYXJhbSBvcHRpb25zIOmFjee9rumAiemhuVxyXG4gKiBAcmV0dXJucyDov5Tlm57kuIDkuKogT2JzZXJ2YWJsZe+8jOWFtuS4reWMheWQqyBSZXNpemVPYnNlcnZlckVudHJ5IOeahOaVsOe7hO+8jOeUqOS6juiusOW9leavj+asoeWkp+Wwj+WPmOWMlueahOS/oeaBr1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyDln7rnoYDnlKjms5VcclxuICogY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWluZXInKTtcclxuICogb2JzZXJ2ZVJlc2l6ZShlbGVtZW50KS5zdWJzY3JpYmUoZW50cmllcyA9PiB7XHJcbiAqICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0O1xyXG4gKiAgIGNvbnNvbGUubG9nKGDlhYPntKDlsLrlr7g6ICR7d2lkdGh9eCR7aGVpZ2h0fWApO1xyXG4gKiB9KTtcclxuICpcclxuICogQGV4YW1wbGVcclxuICogLy8g5L2/55So6Ziy5oqW5LyY5YyW5oCn6IO9XHJcbiAqIG9ic2VydmVSZXNpemUoZWxlbWVudCwgeyBkZWJvdW5jZTogMzAwIH0pLnN1YnNjcmliZShlbnRyaWVzID0+IHtcclxuICogICAvLyAzMDBtcyDlhoXnmoTlpJrmrKHlj5jljJblj6rkvJrop6blj5HkuIDmrKFcclxuICogICBjb25zb2xlLmxvZygn5YWD57Sg5aSn5bCP5bey56iz5a6aJyk7XHJcbiAqIH0pO1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVSZXNpemUoZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBPYnNlcnZlUmVzaXplT3B0aW9ucyk6IE9ic2VydmFibGU8UmVzaXplT2JzZXJ2ZXJFbnRyeVtdPiB7XHJcbiAgICBjb25zdCB7IGRlYm91bmNlIH0gPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuICAgIGNvbnN0IHJlc2l6ZSQgPSBuZXcgT2JzZXJ2YWJsZTxSZXNpemVPYnNlcnZlckVudHJ5W10+KChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgIC8vIOWIm+W7uiBSZXNpemVPYnNlcnZlciDlrp7kvovvvIzlvZPop4Llr5/nmoTnm67moIflhYPntKDlpKflsI/lj5HnlJ/lj5jljJbml7bvvIzkvJrosIPnlKjlm57osIPlh73mlbBcclxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGVudHJpZXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDlvIDlp4vop4Llr5/mjIflrprnmoTlhYPntKBcclxuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAvLyDov5Tlm57muIXnkIblh73mlbDvvIznlKjkuo7lnKjlj5bmtojorqLpmIXml7bosIPnlKhcclxuICAgICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5aaC5p6c6K6+572u5LqG6Ziy5oqW77yM5YiZ5bqU55So6Ziy5oqW5pON5L2c56ymXHJcbiAgICByZXR1cm4gZGVib3VuY2UgPyByZXNpemUkLnBpcGUoZGVib3VuY2VUaW1lKGRlYm91bmNlKSkgOiByZXNpemUkO1xyXG59XHJcbiJdfQ==
|
package/esm2015/utils/form.js
CHANGED
|
@@ -1,21 +1,52 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 表单验证
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* 遍历表单所有控件,标记为脏状态并触发验证。
|
|
5
|
+
* 如果表单验证通过,返回表单的原始值;否则返回 false。
|
|
6
|
+
*
|
|
7
|
+
* @param form Angular 表单组对象
|
|
8
|
+
* @param options 验证配置选项
|
|
9
|
+
* @returns 验证通过返回表单值,验证失败返回 false
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* const result = formVerify(this.form);
|
|
13
|
+
* if (result) {
|
|
14
|
+
* console.log('表单数据:', result);
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // 自定义错误处理
|
|
19
|
+
* formVerify(this.form, {
|
|
20
|
+
* logError: false,
|
|
21
|
+
* onError: (fields) => {
|
|
22
|
+
* this.message.error(`以下字段验证失败: ${fields.join(', ')}`);
|
|
23
|
+
* }
|
|
24
|
+
* });
|
|
4
25
|
*/
|
|
5
|
-
export function formVerify(form) {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
26
|
+
export function formVerify(form, options) {
|
|
27
|
+
const { logError = true, onError } = options || {};
|
|
28
|
+
const invalidFields = [];
|
|
29
|
+
// 遍历所有控件,标记为脏状态并更新验证状态
|
|
30
|
+
Object.keys(form.controls).forEach((key) => {
|
|
31
|
+
const control = form.controls[key];
|
|
32
|
+
control.markAsDirty();
|
|
33
|
+
control.updateValueAndValidity();
|
|
34
|
+
// 收集验证失败的字段(排除禁用状态)
|
|
35
|
+
if (control.status !== 'VALID' && control.status !== 'DISABLED') {
|
|
36
|
+
invalidFields.push(key);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
// 表单验证失败(排除全部禁用的情况)
|
|
40
|
+
if (form.status !== 'VALID' && form.status !== 'DISABLED') {
|
|
41
|
+
if (logError) {
|
|
42
|
+
console.error(`表单验证失败,字段: ${invalidFields.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
if (onError) {
|
|
45
|
+
onError(invalidFields);
|
|
12
46
|
}
|
|
13
|
-
}
|
|
14
|
-
// 表单验证状态
|
|
15
|
-
if (form.status !== 'VALID') {
|
|
16
|
-
console.error(`Form validation failed fields:${errList.join(',')}`);
|
|
17
47
|
return false;
|
|
18
48
|
}
|
|
49
|
+
// 验证通过,返回表单原始值(包含禁用字段)
|
|
19
50
|
return form.getRawValue();
|
|
20
51
|
}
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnJhcnkvY29yZS91dGlscy9mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBMEIsSUFBZSxFQUFFLE9BQTJCO0lBQzVGLE1BQU0sRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDbkQsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBRW5DLHVCQUF1QjtJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVqQyxvQkFBb0I7UUFDcEIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtZQUM3RCxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxvQkFBb0I7SUFDcEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtRQUN2RCxJQUFJLFFBQVEsRUFBRTtZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksT0FBTyxFQUFFO1lBQ1QsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFFRCx1QkFBdUI7SUFDdkIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8qKlxyXG4gKiDooajljZXpqozor4HphY3nva5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVZlcmlmeU9wdGlvbnMge1xyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblnKjmjqfliLblj7DovpPlh7rplJnor6/kv6Hmga9cclxuICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAqL1xyXG4gICAgbG9nRXJyb3I/OiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiDoh6rlrprkuYnplJnor6/lpITnkIblh73mlbBcclxuICAgICAqL1xyXG4gICAgb25FcnJvcj86IChpbnZhbGlkRmllbGRzOiBzdHJpbmdbXSkgPT4gdm9pZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIOihqOWNlemqjOivgVxyXG4gKlxyXG4gKiDpgY3ljobooajljZXmiYDmnInmjqfku7bvvIzmoIforrDkuLrohI/nirbmgIHlubbop6blj5Hpqozor4HjgIJcclxuICog5aaC5p6c6KGo5Y2V6aqM6K+B6YCa6L+H77yM6L+U5Zue6KGo5Y2V55qE5Y6f5aeL5YC877yb5ZCm5YiZ6L+U5ZueIGZhbHNl44CCXHJcbiAqXHJcbiAqIEBwYXJhbSBmb3JtIEFuZ3VsYXIg6KGo5Y2V57uE5a+56LGhXHJcbiAqIEBwYXJhbSBvcHRpb25zIOmqjOivgemFjee9rumAiemhuVxyXG4gKiBAcmV0dXJucyDpqozor4HpgJrov4fov5Tlm57ooajljZXlgLzvvIzpqozor4HlpLHotKXov5Tlm54gZmFsc2VcclxuICpcclxuICogQGV4YW1wbGVcclxuICogY29uc3QgcmVzdWx0ID0gZm9ybVZlcmlmeSh0aGlzLmZvcm0pO1xyXG4gKiBpZiAocmVzdWx0KSB7XHJcbiAqICAgY29uc29sZS5sb2coJ+ihqOWNleaVsOaNrjonLCByZXN1bHQpO1xyXG4gKiB9XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vIOiHquWumuS5iemUmeivr+WkhOeQhlxyXG4gKiBmb3JtVmVyaWZ5KHRoaXMuZm9ybSwge1xyXG4gKiAgIGxvZ0Vycm9yOiBmYWxzZSxcclxuICogICBvbkVycm9yOiAoZmllbGRzKSA9PiB7XHJcbiAqICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoYOS7peS4i+Wtl+autemqjOivgeWksei0pTogJHtmaWVsZHMuam9pbignLCAnKX1gKTtcclxuICogICB9XHJcbiAqIH0pO1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1WZXJpZnk8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+KGZvcm06IEZvcm1Hcm91cCwgb3B0aW9ucz86IEZvcm1WZXJpZnlPcHRpb25zKTogZmFsc2UgfCBUIHtcclxuICAgIGNvbnN0IHsgbG9nRXJyb3IgPSB0cnVlLCBvbkVycm9yIH0gPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgY29uc3QgaW52YWxpZEZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvLyDpgY3ljobmiYDmnInmjqfku7bvvIzmoIforrDkuLrohI/nirbmgIHlubbmm7TmlrDpqozor4HnirbmgIFcclxuICAgIE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmNvbnRyb2xzW2tleV07XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgICAgICAvLyDmlLbpm4bpqozor4HlpLHotKXnmoTlrZfmrrXvvIjmjpLpmaTnpoHnlKjnirbmgIHvvIlcclxuICAgICAgICBpZiAoY29udHJvbC5zdGF0dXMgIT09ICdWQUxJRCcgJiYgY29udHJvbC5zdGF0dXMgIT09ICdESVNBQkxFRCcpIHtcclxuICAgICAgICAgICAgaW52YWxpZEZpZWxkcy5wdXNoKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g6KGo5Y2V6aqM6K+B5aSx6LSl77yI5o6S6Zmk5YWo6YOo56aB55So55qE5oOF5Ya177yJXHJcbiAgICBpZiAoZm9ybS5zdGF0dXMgIT09ICdWQUxJRCcgJiYgZm9ybS5zdGF0dXMgIT09ICdESVNBQkxFRCcpIHtcclxuICAgICAgICBpZiAobG9nRXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihg6KGo5Y2V6aqM6K+B5aSx6LSl77yM5a2X5q61OiAke2ludmFsaWRGaWVsZHMuam9pbignLCAnKX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIHtcclxuICAgICAgICAgICAgb25FcnJvcihpbnZhbGlkRmllbGRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOmqjOivgemAmui/h++8jOi/lOWbnuihqOWNleWOn+Wni+WAvO+8iOWMheWQq+emgeeUqOWtl+aute+8iVxyXG4gICAgcmV0dXJuIGZvcm0uZ2V0UmF3VmFsdWUoKTtcclxufVxyXG4iXX0=
|