@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.
Files changed (45) hide show
  1. package/bundles/reskin-core-directives.umd.js +303 -163
  2. package/bundles/reskin-core-directives.umd.js.map +1 -1
  3. package/bundles/reskin-core-guards.umd.js +119 -32
  4. package/bundles/reskin-core-guards.umd.js.map +1 -1
  5. package/bundles/reskin-core-interceptors.umd.js +310 -92
  6. package/bundles/reskin-core-interceptors.umd.js.map +1 -1
  7. package/bundles/reskin-core-utils.umd.js +220 -77
  8. package/bundles/reskin-core-utils.umd.js.map +1 -1
  9. package/directives/auth.directive.d.ts +56 -9
  10. package/directives/load.styles.directive.d.ts +45 -5
  11. package/directives/string.template.outlet.directive.d.ts +68 -11
  12. package/esm2015/directives/auth.directive.js +71 -30
  13. package/esm2015/directives/load.styles.directive.js +84 -15
  14. package/esm2015/directives/string.template.outlet.directive.js +118 -60
  15. package/esm2015/guards/auth.guard.js +117 -30
  16. package/esm2015/interceptors/blob.interceptor.js +67 -28
  17. package/esm2015/interceptors/cache.interceptor.js +46 -14
  18. package/esm2015/interceptors/error.interceptor.js +104 -12
  19. package/esm2015/interceptors/public-api.js +2 -1
  20. package/esm2015/interceptors/token.interceptor.js +86 -42
  21. package/esm2015/interceptors/types.js +5 -0
  22. package/esm2015/utils/array.js +42 -22
  23. package/esm2015/utils/dom.js +29 -11
  24. package/esm2015/utils/form.js +44 -13
  25. package/esm2015/utils/store.js +101 -26
  26. package/fesm2015/reskin-core-directives.js +269 -103
  27. package/fesm2015/reskin-core-directives.js.map +1 -1
  28. package/fesm2015/reskin-core-guards.js +116 -29
  29. package/fesm2015/reskin-core-guards.js.map +1 -1
  30. package/fesm2015/reskin-core-interceptors.js +302 -91
  31. package/fesm2015/reskin-core-interceptors.js.map +1 -1
  32. package/fesm2015/reskin-core-utils.js +212 -68
  33. package/fesm2015/reskin-core-utils.js.map +1 -1
  34. package/guards/auth.guard.d.ts +85 -5
  35. package/interceptors/blob.interceptor.d.ts +30 -3
  36. package/interceptors/cache.interceptor.d.ts +28 -4
  37. package/interceptors/error.interceptor.d.ts +43 -2
  38. package/interceptors/public-api.d.ts +1 -0
  39. package/interceptors/token.interceptor.d.ts +41 -12
  40. package/interceptors/types.d.ts +68 -0
  41. package/package.json +1 -1
  42. package/utils/array.d.ts +8 -1
  43. package/utils/dom.d.ts +32 -5
  44. package/utils/form.d.ts +37 -2
  45. 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 { of } from 'rxjs';
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((result) => {
13
- var _a;
14
- if (result.status === 401) {
15
- this.router.navigate(['/errors/401']).then();
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
- if (result.error.code) {
18
- return of(result.error);
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
- throw (_a = result.error.msg) !== null && _a !== void 0 ? _a : result.message;
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
- return { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvaW50ZXJjZXB0b3JzL2Vycm9yLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUF3RCxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9HLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFJNUMsTUFBTSxPQUFPLGdCQUFnQjtJQUN6QixZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUFHLENBQUM7SUFFdEMsU0FBUyxDQUFDLE9BQTZCLEVBQUUsSUFBaUI7UUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDNUIsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7O1lBQ2xCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNoRDtZQUNELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ25CLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMzQjtZQUNELE1BQU0sTUFBQSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsbUNBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQzs7OEdBZlEsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7QUFtQlg7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNuRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cEhhbmRsZXIsIEh0dHBFdmVudCwgSHR0cEludGVyY2VwdG9yLCBIVFRQX0lOVEVSQ0VQVE9SUyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEVycm9ySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge31cclxuXHJcbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcclxuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCkucGlwZShcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvZXJyb3JzLzQwMSddKS50aGVuKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVzdWx0LmVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvci5tc2cgPz8gcmVzdWx0Lm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDor7fmsYLplJnor6/mi6bmiKrlmahcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlckh0dHBFcnJvcigpIHtcclxuICAgIHJldHVybiB7IHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLCB1c2VDbGFzczogRXJyb3JJbnRlcmNlcHRvciwgbXVsdGk6IHRydWUgfTtcclxufVxyXG4iXX0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnJhcnkvY29yZS9pbnRlcmNlcHRvcnMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi90b2tlbi5pbnRlcmNlcHRvcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3IuaW50ZXJjZXB0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLmludGVyY2VwdG9yJztcclxuZXhwb3J0ICogZnJvbSAnLi9ibG9iLmludGVyY2VwdG9yJztcclxuIl19
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(service) {
7
- this.service = service;
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 tc = request.headers.get('Token-Control');
11
- // 检查是否提供了自定义token
12
- const customToken = request.headers.get('Custom-Token');
13
- if (tc !== 'no-token') {
14
- let headers = {};
15
- if (customToken) {
16
- // 使用自定义token
17
- headers['Authorization'] = customToken;
18
- }
19
- else {
20
- // 使用默认认证信息
21
- const auth = this.service.token;
22
- if (auth.token) {
23
- headers['Authorization'] = auth.token;
24
- headers['X-Auth-Id'] = auth.id;
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
- if (Object.keys(headers).length > 0) {
28
- request = request.clone({ setHeaders: headers });
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
- * 请求头增加token验证拦截器
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
- * 不带token验证信息请求
47
- * @param urls 地址
48
- * @param params 参数
49
- * @constructor
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
- let [url] = urls;
53
- if (params.length > 0) {
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
- * 使用自定义token的请求(模板字符串版本)
60
- * @param urls 地址
61
- * @param params 参数,第一个参数必须是token值
62
- * @constructor
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
- if (params.length === 0) {
66
- throw new Error('CustomTokenTemplate 至少需要一个参数作为token值');
67
- }
68
- const token = params[0];
69
- const url = String.raw(urls, ...params.slice(1));
70
- return [url, { headers: new HttpHeaders({ 'Custom-Token': token }) }];
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
@@ -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
- // 如果源对象为null或不是对象类型,则直接返回源对象
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
- const clonedArray = [];
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 (typeof source === 'object') {
49
+ // 处理普通对象
50
+ if (Object.prototype.toString.call(source) === '[object Object]') {
26
51
  const clonedObject = {};
27
- for (const key in source) {
28
- // 确保只处理对象自身的属性,避免原型链上的属性被克隆
29
- // @ts-ignore
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvdXRpbHMvYXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUksTUFBUztJQUNsQyw2QkFBNkI7SUFDN0IsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUMvQyxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVELDZCQUE2QjtJQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDdkIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCw0QkFBNEI7UUFDNUIsYUFBYTtRQUNiLE9BQU8sV0FBZ0IsQ0FBQztLQUMzQjtJQUVELGlDQUFpQztJQUNqQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLFlBQVksR0FBd0IsRUFBRSxDQUFDO1FBQzdDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFO1lBQ3RCLDRCQUE0QjtZQUM1QixhQUFhO1lBQ2IsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM1QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzlDO1NBQ0o7UUFDRCw0QkFBNEI7UUFDNUIsT0FBTyxZQUFpQixDQUFDO0tBQzVCO0lBRUQseUJBQXlCO0lBQ3pCLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog5rex5YWL6ZqG5LiA5Liq5a+56LGh5oiW5pWw57uEXHJcbiAqXHJcbiAqIOivpeWHveaVsOmAmui/h+mAkuW9kuaWueW8j+a3seWFi+mahui+k+WFpeeahOWvueixoeaIluaVsOe7hO+8jOehruS/neS4juWOn+WvueixoeaIluaVsOe7hOmalOemu++8jOS4jeS8muebuOS6kuW9seWTjVxyXG4gKlxyXG4gKiBAcGFyYW0gc291cmNlIOmcgOimgeWFi+mahueahOa6kOWvueixoeaIluaVsOe7hFxyXG4gKiBAcmV0dXJucyDov5Tlm57lhYvpmoblkI7nmoTlr7nosaHmiJbmlbDnu4RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmU8VD4oc291cmNlOiBUKTogVCB7XHJcbiAgICAvLyDlpoLmnpzmupDlr7nosaHkuLpudWxs5oiW5LiN5piv5a+56LGh57G75Z6L77yM5YiZ55u05o6l6L+U5Zue5rqQ5a+56LGhXHJcbiAgICBpZiAoc291cmNlID09PSBudWxsIHx8IHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmupDlr7nosaHmmK/mlbDnu4TvvIzliJnliJvlu7rkuIDkuKrmlrDmlbDnu4TlubbpgJLlvZLlhYvpmobmr4/kuKrlhYPntKBcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcclxuICAgICAgICBjb25zdCBjbG9uZWRBcnJheSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNsb25lZEFycmF5W2ldID0gZGVlcENsb25lKHNvdXJjZVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOW/veeVpeexu+Wei+ajgOafpeWZqOeahOitpuWRiu+8jOehruS/neiDveWkn+i/lOWbnuazm+Wei1TnsbvlnovnmoTmlbDnu4RcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIGNsb25lZEFycmF5IGFzIFQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5rqQ5a+56LGh5piv5pmu6YCa5a+56LGh77yM5YiZ5Yib5bu65LiA5Liq5paw55qE56m65a+56LGh5bm26YCS5b2S5YWL6ZqG5q+P5Liq5bGe5oCnXHJcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBjb25zdCBjbG9uZWRPYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgLy8g56Gu5L+d5Y+q5aSE55CG5a+56LGh6Ieq6Lqr55qE5bGe5oCn77yM6YG/5YWN5Y6f5Z6L6ZO+5LiK55qE5bGe5oCn6KKr5YWL6ZqGXHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBjbG9uZWRPYmplY3Rba2V5XSA9IGRlZXBDbG9uZShzb3VyY2Vba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5b+955Wl57G75Z6L5qOA5p+l5Zmo55qE6K2m5ZGK77yM56Gu5L+d6IO95aSf6L+U5Zue5rOb5Z6LVOexu+Wei+eahOWvueixoVxyXG4gICAgICAgIHJldHVybiBjbG9uZWRPYmplY3QgYXMgVDtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmupDlr7nosaHmmK/lhbbku5bpnZ7lr7nosaHnsbvlnovvvIzliJnnm7TmjqXov5Tlm57mupDlr7nosaFcclxuICAgIHJldHVybiBzb3VyY2U7XHJcbn1cclxuIl19
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=
@@ -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元素的大小变化它使用了ResizeObserver API来实现
6
- * 当元素的大小发生变化时,会发出一个包含变化记录的数组
6
+ * 此函数创建了一个 Observable,用于观察给定 HTMLElement 元素的大小变化。
7
+ * 它使用了 ResizeObserver API 来实现,当元素的大小发生变化时,会发出一个包含变化记录的数组。
7
8
  *
8
- * @param element 需要观察大小变化的HTMLElement元素
9
- * @returns 返回一个Observable,其中包含ResizeObserverEntry的数组,用于记录每次大小变化的信息
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
- return new Observable((observer) => {
13
- // 创建ResizeObserver实例,当观察的目标元素大小发生变化时,会调用回调函数
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicmFyeS9jb3JlL3V0aWxzL2RvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFvQjtJQUM5QyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDL0IsNkNBQTZDO1FBQzdDLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEQsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILFlBQVk7UUFDWixjQUFjLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLDBCQUEwQjtRQUMxQixPQUFPLEdBQUcsRUFBRTtZQUNSLFlBQVk7WUFDWixjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLGVBQWU7WUFDZixjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuLyoqXHJcbiAqIOebkeWQrOWFg+e0oOeahOWkp+Wwj+WPmOWMllxyXG4gKlxyXG4gKiDmraTlh73mlbDliJvlu7rkuobkuIDkuKpPYnNlcnZhYmxl77yM55So5LqO6KeC5a+f57uZ5a6aSFRNTEVsZW1lbnTlhYPntKDnmoTlpKflsI/lj5jljJblroPkvb/nlKjkuoZSZXNpemVPYnNlcnZlciBBUEnmnaXlrp7njrBcclxuICog5b2T5YWD57Sg55qE5aSn5bCP5Y+R55Sf5Y+Y5YyW5pe277yM5Lya5Y+R5Ye65LiA5Liq5YyF5ZCr5Y+Y5YyW6K6w5b2V55qE5pWw57uEXHJcbiAqXHJcbiAqIEBwYXJhbSBlbGVtZW50IOmcgOimgeinguWvn+Wkp+Wwj+WPmOWMlueahEhUTUxFbGVtZW505YWD57SgXHJcbiAqIEByZXR1cm5zIOi/lOWbnuS4gOS4qk9ic2VydmFibGXvvIzlhbbkuK3ljIXlkKtSZXNpemVPYnNlcnZlckVudHJ555qE5pWw57uE77yM55So5LqO6K6w5b2V5q+P5qyh5aSn5bCP5Y+Y5YyW55qE5L+h5oGvXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZVJlc2l6ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IE9ic2VydmFibGU8UmVzaXplT2JzZXJ2ZXJFbnRyeVtdPiB7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgLy8g5Yib5bu6UmVzaXplT2JzZXJ2ZXLlrp7kvovvvIzlvZPop4Llr5/nmoTnm67moIflhYPntKDlpKflsI/lj5HnlJ/lj5jljJbml7bvvIzkvJrosIPnlKjlm57osIPlh73mlbBcclxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGVudHJpZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIOW8gOWni+inguWvn+aMh+WumueahOWFg+e0oFxyXG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XHJcbiAgICAgICAgLy8g6L+U5Zue5LiA5Liq5Ye95pWw77yM55So5LqO5Zyo5YGc5q2i6KeC5a+f5pe26LCD55So77yM5Lul5riF55CG6LWE5rqQXHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgLy8g5YGc5q2i6KeC5a+f5oyH5a6a55qE5YWD57SgXHJcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50KTtcclxuICAgICAgICAgICAgLy8g5pat5byA5LiO5omA5pyJ55uu5qCH55qE6KeC5a+f6L+e5o6lXHJcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9O1xyXG4gICAgfSk7XHJcbn1cclxuIl19
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==
@@ -1,21 +1,52 @@
1
1
  /**
2
2
  * 表单验证
3
- * @param form
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 errList = [];
7
- for (const key in form.controls) {
8
- form.controls[key].markAsDirty();
9
- form.controls[key].updateValueAndValidity();
10
- if (form.controls[key].status !== 'VALID' && form.controls[key].status !== 'DISABLED') {
11
- errList.push(key);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnJhcnkvY29yZS91dGlscy9mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7R0FHRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQTBCLElBQWU7SUFDL0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ25CLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7WUFDbkYsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyQjtLQUNKO0lBQ0QsU0FBUztJQUNULElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUU7UUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLyoqXHJcbiAqIOihqOWNlemqjOivgVxyXG4gKiBAcGFyYW0gZm9ybVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1WZXJpZnk8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+KGZvcm06IEZvcm1Hcm91cCk6IGZhbHNlIHwgVCB7XHJcbiAgICBjb25zdCBlcnJMaXN0ID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgZm9ybS5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgZm9ybS5jb250cm9sc1trZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICBpZiAoZm9ybS5jb250cm9sc1trZXldLnN0YXR1cyAhPT0gJ1ZBTElEJyAmJiBmb3JtLmNvbnRyb2xzW2tleV0uc3RhdHVzICE9PSAnRElTQUJMRUQnKSB7XHJcbiAgICAgICAgICAgIGVyckxpc3QucHVzaChrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIOihqOWNlemqjOivgeeKtuaAgVxyXG4gICAgaWYgKGZvcm0uc3RhdHVzICE9PSAnVkFMSUQnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgRm9ybSB2YWxpZGF0aW9uIGZhaWxlZCBmaWVsZHPvvJoke2Vyckxpc3Quam9pbignLCcpfWApO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtLmdldFJhd1ZhbHVlKCk7XHJcbn1cclxuIl19
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=