@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,20 +1,77 @@
1
1
  import { OnChanges, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- export declare class RkStringTemplateOutletDirective<_T = unknown> implements OnChanges {
4
- private viewContainer;
3
+ /**
4
+ * 字符串模板输出上下文
5
+ */
6
+ export declare class RkStringTemplateOutletContext<T = any> {
7
+ /** 隐式上下文值 */
8
+ $implicit: T | null;
9
+ }
10
+ /**
11
+ * 字符串模板输出指令
12
+ * 支持动态渲染字符串或 TemplateRef
13
+ *
14
+ * @example
15
+ * ```html
16
+ * <!-- 渲染字符串 -->
17
+ * <ng-container *rkStringTemplateOutlet="'Hello World'">
18
+ * <ng-template>默认模板</ng-template>
19
+ * </ng-container>
20
+ *
21
+ * <!-- 渲染 TemplateRef -->
22
+ * <ng-container *rkStringTemplateOutlet="customTemplate; context: { $implicit: data }">
23
+ * </ng-container>
24
+ * <ng-template #customTemplate let-item>
25
+ * <div>{{ item }}</div>
26
+ * </ng-template>
27
+ *
28
+ * <!-- 动态切换 -->
29
+ * <ng-container *rkStringTemplateOutlet="isTemplate ? templateRef : 'Static Text'">
30
+ * </ng-container>
31
+ * ```
32
+ */
33
+ export declare class RkStringTemplateOutletDirective<T = unknown> implements OnChanges {
34
+ private viewContainerRef;
5
35
  private templateRef;
6
36
  private embeddedViewRef;
7
37
  private context;
8
- rkStringTemplateOutletContext: any | null;
9
- rkStringTemplateOutlet: any | TemplateRef<any>;
10
- static rkTemplateContextGuard<T>(_dir: RkStringTemplateOutletDirective<T>, _ctx: any): _ctx is RkStringTemplateOutletContext;
38
+ /**
39
+ * 输出内容
40
+ * 可以是字符串或 TemplateRef
41
+ */
42
+ rkStringTemplateOutlet: T | TemplateRef<RkStringTemplateOutletContext<T>> | null;
43
+ /**
44
+ * 模板上下文
45
+ * 当 rkStringTemplateOutlet 是 TemplateRef 时使用
46
+ */
47
+ rkStringTemplateOutletContext: RkStringTemplateOutletContext<T> | null;
48
+ /**
49
+ * 类型守卫
50
+ * 用于 Angular 模板类型检查
51
+ */
52
+ static rkTemplateContextGuard<T>(_dir: RkStringTemplateOutletDirective<T>, _ctx: any): _ctx is RkStringTemplateOutletContext<T>;
53
+ constructor(viewContainerRef: ViewContainerRef, templateRef: TemplateRef<RkStringTemplateOutletContext<T>>);
54
+ ngOnChanges(changes: SimpleChanges): void;
55
+ /**
56
+ * 判断是否需要重建视图
57
+ */
58
+ private shouldRecreateView;
59
+ /**
60
+ * 检查 outlet 类型是否变化
61
+ */
62
+ private isOutletTypeChanged;
63
+ /**
64
+ * 检查上下文结构是否变化
65
+ */
66
+ private isContextShapeChanged;
67
+ /**
68
+ * 重建视图
69
+ */
11
70
  private recreateView;
71
+ /**
72
+ * 更新视图上下文
73
+ */
12
74
  private updateContext;
13
- constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef<any>);
14
- ngOnChanges(changes: SimpleChanges): void;
15
75
  static ɵfac: i0.ɵɵFactoryDeclaration<RkStringTemplateOutletDirective<any>, never>;
16
- static ɵdir: i0.ɵɵDirectiveDeclaration<RkStringTemplateOutletDirective<any>, "[rkStringTemplateOutlet]", never, { "rkStringTemplateOutletContext": "rkStringTemplateOutletContext"; "rkStringTemplateOutlet": "rkStringTemplateOutlet"; }, {}, never>;
17
- }
18
- export declare class RkStringTemplateOutletContext {
19
- $implicit: any;
76
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RkStringTemplateOutletDirective<any>, "[rkStringTemplateOutlet]", never, { "rkStringTemplateOutlet": "rkStringTemplateOutlet"; "rkStringTemplateOutletContext": "rkStringTemplateOutletContext"; }, {}, never>;
20
77
  }
@@ -1,62 +1,103 @@
1
1
  import { Directive, Input } from '@angular/core';
2
- import { map } from 'rxjs/operators';
2
+ import { Subject } from 'rxjs';
3
+ import { map, takeUntil } from 'rxjs/operators';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@reskin/core/services";
6
+ /**
7
+ * 权限指令
8
+ * 根据权限标识符控制模板的显示与隐藏
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <!-- 基础用法 -->
13
+ * <div *rkAuth="'user:edit'">有编辑权限才显示</div>
14
+ *
15
+ * <!-- 多个权限(或关系) -->
16
+ * <div *rkAuth="['user:edit', 'user:delete']">有任一权限即显示</div>
17
+ *
18
+ * <!-- 使用 then/else 模板 -->
19
+ * <ng-container *rkAuth="'user:edit'; then hasAuth; else noAuth"></ng-container>
20
+ * <ng-template #hasAuth let-menu>
21
+ * <p>有权限,菜单信息:{{ menu | json }}</p>
22
+ * </ng-template>
23
+ * <ng-template #noAuth>
24
+ * <p>无权限</p>
25
+ * </ng-template>
26
+ * ```
27
+ */
5
28
  export class RkAuthDirective {
6
- constructor(menu, viewContainerRef, templateRef) {
7
- this.menu = menu;
29
+ constructor(menuService, viewContainerRef, templateRef) {
30
+ this.menuService = menuService;
8
31
  this.viewContainerRef = viewContainerRef;
9
32
  this.templateRef = templateRef;
10
33
  this.condition = '';
34
+ this.destroy$ = new Subject();
11
35
  this.thenTemplateRef = templateRef;
12
36
  }
13
37
  /**
14
- * 传递多个标识符时,逗号分隔,匹配按"或者"运算
15
- * @param condition
38
+ * 权限标识符
39
+ * 传递多个标识符时,匹配按"或"运算
16
40
  */
17
41
  set rkAuth(condition) {
18
42
  this.condition = condition;
19
43
  this.updateView();
20
44
  }
45
+ /**
46
+ * 有权限时显示的模板
47
+ */
21
48
  set rkAuthThen(templateRef) {
22
49
  this.thenTemplateRef = templateRef;
23
50
  this.updateView();
24
51
  }
52
+ /**
53
+ * 无权限时显示的模板
54
+ */
25
55
  set rkAuthElse(templateRef) {
26
56
  this.elseTemplateRef = templateRef;
27
57
  this.updateView();
28
58
  }
29
59
  ngOnDestroy() {
30
- var _a;
31
- (_a = this.authSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
60
+ this.destroy$.next();
61
+ this.destroy$.complete();
32
62
  }
63
+ /**
64
+ * 更新视图显示
65
+ */
33
66
  updateView() {
34
- var _a;
35
- (_a = this.authSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
36
- this.authSubscription = this.hasAuth(this.condition).subscribe((context) => {
67
+ if (!this.condition) {
37
68
  this.viewContainerRef.clear();
38
- if (context.status) {
39
- if (this.thenTemplateRef) {
40
- this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);
41
- }
42
- }
43
- else {
44
- if (this.elseTemplateRef) {
45
- this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);
46
- }
47
- }
69
+ return;
70
+ }
71
+ this.checkAuth(this.condition)
72
+ .pipe(takeUntil(this.destroy$))
73
+ .subscribe((context) => {
74
+ this.renderView(context);
48
75
  });
49
76
  }
50
- hasAuth(tags) {
51
- const tagList = typeof tags === 'string' ? [tags] : tags;
52
- return this.menu.requestData().pipe(map((json) => {
53
- const menus = json.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));
54
- if (!menus.length)
55
- return { $implicit: [], status: false };
56
- return {
57
- $implicit: typeof tags === 'string' ? menus[0] : menus,
58
- status: !!menus.length,
77
+ /**
78
+ * 渲染视图
79
+ */
80
+ renderView(context) {
81
+ this.viewContainerRef.clear();
82
+ if (context.status && this.thenTemplateRef) {
83
+ this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);
84
+ }
85
+ else if (!context.status && this.elseTemplateRef) {
86
+ this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);
87
+ }
88
+ }
89
+ /**
90
+ * 检查权限
91
+ */
92
+ checkAuth(tags) {
93
+ const tagList = Array.isArray(tags) ? tags : [tags];
94
+ return this.menuService.requestData().pipe(map((response) => {
95
+ const matchedMenus = response.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));
96
+ const context = {
97
+ $implicit: Array.isArray(tags) ? matchedMenus : matchedMenus[0] || null,
98
+ status: matchedMenus.length > 0,
59
99
  };
100
+ return context;
60
101
  }));
61
102
  }
62
103
  }
@@ -74,4 +115,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
74
115
  }], rkAuthElse: [{
75
116
  type: Input
76
117
  }] } });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvZGlyZWN0aXZlcy9hdXRoLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNEMsTUFBTSxlQUFlLENBQUM7QUFFM0YsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFNckMsTUFBTSxPQUFPLGVBQWU7SUF1QnhCLFlBQ1ksSUFBbUIsRUFDbkIsZ0JBQWtDLEVBQ25DLFdBQTZCO1FBRjVCLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNuQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFLaEMsY0FBUyxHQUFzQixFQUFFLENBQUM7UUFIdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7SUFDdkMsQ0FBQztJQTVCRDs7O09BR0c7SUFDSCxJQUNJLE1BQU0sQ0FBQyxTQUE0QjtRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQ0ksVUFBVSxDQUFDLFdBQTZCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxVQUFVLENBQUMsV0FBNkI7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFlRCxXQUFXOztRQUNQLE1BQUEsSUFBSSxDQUFDLGdCQUFnQiwwQ0FBRSxXQUFXLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRU8sVUFBVTs7UUFDZCxNQUFBLElBQUksQ0FBQyxnQkFBZ0IsMENBQUUsV0FBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQzNFO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDM0U7YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLE9BQU8sQ0FBQyxJQUF1QjtRQUNuQyxNQUFNLE9BQU8sR0FBYSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUMvQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNULE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUMzRCxPQUFPO2dCQUNILFNBQVMsRUFBRSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDdEQsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTTthQUN6QixDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7OzZHQXBFUSxlQUFlO2lHQUFmLGVBQWU7NEZBQWYsZUFBZTtrQkFIM0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsVUFBVTtpQkFDdkI7NkpBT08sTUFBTTtzQkFEVCxLQUFLO2dCQU9GLFVBQVU7c0JBRGIsS0FBSztnQkFPRixVQUFVO3NCQURiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPbkRlc3Ryb3ksIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJrTWVudVNlcnZpY2UgfSBmcm9tICdAcmVza2luL2NvcmUvc2VydmljZXMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tya0F1dGhdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJrQXV0aERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICAvKipcclxuICAgICAqIOS8oOmAkuWkmuS4quagh+ivhuespuaXtu+8jOmAl+WPt+WIhumalO+8jOWMuemFjeaMiVwi5oiW6ICFXCLov5DnrpdcclxuICAgICAqIEBwYXJhbSBjb25kaXRpb25cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBya0F1dGgoY29uZGl0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgcmtBdXRoVGhlbih0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMudGhlblRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBya0F1dGhFbHNlKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XHJcbiAgICAgICAgdGhpcy5lbHNlVGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIG1lbnU6IFJrTWVudVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgIHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMudGhlblRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25kaXRpb246IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XHJcbiAgICBwcml2YXRlIHRoZW5UZW1wbGF0ZVJlZj86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBwcml2YXRlIGVsc2VUZW1wbGF0ZVJlZj86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBwcml2YXRlIGF1dGhTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5hdXRoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlVmlldygpIHtcclxuICAgICAgICB0aGlzLmF1dGhTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5hdXRoU3Vic2NyaXB0aW9uID0gdGhpcy5oYXNBdXRoKHRoaXMuY29uZGl0aW9uKS5zdWJzY3JpYmUoKGNvbnRleHQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGhlblRlbXBsYXRlUmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRoZW5UZW1wbGF0ZVJlZiwgY29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbHNlVGVtcGxhdGVSZWYpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuZWxzZVRlbXBsYXRlUmVmLCBjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzQXV0aCh0YWdzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgICAgIGNvbnN0IHRhZ0xpc3Q6IHN0cmluZ1tdID0gdHlwZW9mIHRhZ3MgPT09ICdzdHJpbmcnID8gW3RhZ3NdIDogdGFncztcclxuICAgICAgICByZXR1cm4gdGhpcy5tZW51LnJlcXVlc3REYXRhKCkucGlwZShcclxuICAgICAgICAgICAgbWFwKChqc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZW51cyA9IGpzb24uZGF0YS5maWx0ZXIoKG1lbnUpID0+IHRhZ0xpc3QuaW5jbHVkZXMobWVudS5TWVNURU1fUkVTT1VSQ0VfR1VBUkRfSUQpKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWVudXMubGVuZ3RoKSByZXR1cm4geyAkaW1wbGljaXQ6IFtdLCBzdGF0dXM6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogdHlwZW9mIHRhZ3MgPT09ICdzdHJpbmcnID8gbWVudXNbMF0gOiBtZW51cyxcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICEhbWVudXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG4iXX0=
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvZGlyZWN0aXZlcy9hdXRoLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNEMsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFhaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUlILE1BQU0sT0FBTyxlQUFlO0lBa0N4QixZQUNZLFdBQTBCLEVBQzFCLGdCQUFrQyxFQUNuQyxXQUE2QjtRQUY1QixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ25DLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQXBDaEMsY0FBUyxHQUFzQixFQUFFLENBQUM7UUFHekIsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFtQzVDLElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO0lBQ3ZDLENBQUM7SUFsQ0Q7OztPQUdHO0lBQ0gsSUFDSSxNQUFNLENBQUMsU0FBNEI7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQ0ksVUFBVSxDQUFDLFdBQTZCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNJLFVBQVUsQ0FBQyxXQUE2QjtRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQVVELFdBQVc7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBQyxPQUFzQjtRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFOUIsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDM0U7YUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzNFO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxDQUFDLElBQXVCO1FBQ3JDLE1BQU0sT0FBTyxHQUFhLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUN0QyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNiLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7WUFFckcsTUFBTSxPQUFPLEdBQWtCO2dCQUMzQixTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTtnQkFDdkUsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQzthQUNsQyxDQUFDO1lBRUYsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7OzZHQTlGUSxlQUFlO2lHQUFmLGVBQWU7NEZBQWYsZUFBZTtrQkFIM0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsVUFBVTtpQkFDdkI7NkpBWU8sTUFBTTtzQkFEVCxLQUFLO2dCQVVGLFVBQVU7c0JBRGIsS0FBSztnQkFVRixVQUFVO3NCQURiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPbkRlc3Ryb3ksIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJrTWVudVNlcnZpY2UgfSBmcm9tICdAcmVza2luL2NvcmUvc2VydmljZXMnO1xyXG5cclxuLyoqXHJcbiAqIOadg+mZkOaMh+S7pOS4iuS4i+aWh1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSa0F1dGhDb250ZXh0PFQgPSBhbnk+IHtcclxuICAgIC8qKiDpmpDlvI/kuIrkuIvmlofvvIzljIXlkKvljLnphY3nmoToj5zljZXmlbDmja4gKi9cclxuICAgICRpbXBsaWNpdDogVDtcclxuICAgIC8qKiDmnYPpmZDpqozor4HnirbmgIEgKi9cclxuICAgIHN0YXR1czogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIOadg+mZkOaMh+S7pFxyXG4gKiDmoLnmja7mnYPpmZDmoIfor4bnrKbmjqfliLbmqKHmnb/nmoTmmL7npLrkuI7pmpDol49cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8IS0tIOWfuuehgOeUqOazlSAtLT5cclxuICogPGRpdiAqcmtBdXRoPVwiJ3VzZXI6ZWRpdCdcIj7mnInnvJbovpHmnYPpmZDmiY3mmL7npLo8L2Rpdj5cclxuICpcclxuICogPCEtLSDlpJrkuKrmnYPpmZDvvIjmiJblhbPns7vvvIkgLS0+XHJcbiAqIDxkaXYgKnJrQXV0aD1cIlsndXNlcjplZGl0JywgJ3VzZXI6ZGVsZXRlJ11cIj7mnInku7vkuIDmnYPpmZDljbPmmL7npLo8L2Rpdj5cclxuICpcclxuICogPCEtLSDkvb/nlKggdGhlbi9lbHNlIOaooeadvyAtLT5cclxuICogPG5nLWNvbnRhaW5lciAqcmtBdXRoPVwiJ3VzZXI6ZWRpdCc7IHRoZW4gaGFzQXV0aDsgZWxzZSBub0F1dGhcIj48L25nLWNvbnRhaW5lcj5cclxuICogPG5nLXRlbXBsYXRlICNoYXNBdXRoIGxldC1tZW51PlxyXG4gKiAgIDxwPuacieadg+mZkO+8jOiPnOWNleS/oeaBr++8mnt7IG1lbnUgfCBqc29uIH19PC9wPlxyXG4gKiA8L25nLXRlbXBsYXRlPlxyXG4gKiA8bmctdGVtcGxhdGUgI25vQXV0aD5cclxuICogICA8cD7ml6DmnYPpmZA8L3A+XHJcbiAqIDwvbmctdGVtcGxhdGU+XHJcbiAqIGBgYFxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tya0F1dGhdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJrQXV0aERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIGNvbmRpdGlvbjogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcclxuICAgIHByaXZhdGUgdGhlblRlbXBsYXRlUmVmPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIHByaXZhdGUgZWxzZVRlbXBsYXRlUmVmPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5p2D6ZmQ5qCH6K+G56ymXHJcbiAgICAgKiDkvKDpgJLlpJrkuKrmoIfor4bnrKbml7bvvIzljLnphY3mjIlcIuaIllwi6L+Q566XXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgcmtBdXRoKGNvbmRpdGlvbjogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOacieadg+mZkOaXtuaYvuekuueahOaooeadv1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHJrQXV0aFRoZW4odGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgICAgICB0aGlzLnRoZW5UZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5peg5p2D6ZmQ5pe25pi+56S655qE5qih5p2/XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgcmtBdXRoRWxzZSh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMuZWxzZVRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBtZW51U2VydmljZTogUmtNZW51U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgcHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy50aGVuVGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmm7TmlrDop4blm77mmL7npLpcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tBdXRoKHRoaXMuY29uZGl0aW9uKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNvbnRleHQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVmlldyhjb250ZXh0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuLLmn5Pop4blm75cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZW5kZXJWaWV3KGNvbnRleHQ6IFJrQXV0aENvbnRleHQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRleHQuc3RhdHVzICYmIHRoaXMudGhlblRlbXBsYXRlUmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50aGVuVGVtcGxhdGVSZWYsIGNvbnRleHQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWNvbnRleHQuc3RhdHVzICYmIHRoaXMuZWxzZVRlbXBsYXRlUmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5lbHNlVGVtcGxhdGVSZWYsIGNvbnRleHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOajgOafpeadg+mZkFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNoZWNrQXV0aCh0YWdzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgICAgIGNvbnN0IHRhZ0xpc3Q6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheSh0YWdzKSA/IHRhZ3MgOiBbdGFnc107XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1lbnVTZXJ2aWNlLnJlcXVlc3REYXRhKCkucGlwZShcclxuICAgICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZE1lbnVzID0gcmVzcG9uc2UuZGF0YS5maWx0ZXIoKG1lbnUpID0+IHRhZ0xpc3QuaW5jbHVkZXMobWVudS5TWVNURU1fUkVTT1VSQ0VfR1VBUkRfSUQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0OiBSa0F1dGhDb250ZXh0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogQXJyYXkuaXNBcnJheSh0YWdzKSA/IG1hdGNoZWRNZW51cyA6IG1hdGNoZWRNZW51c1swXSB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogbWF0Y2hlZE1lbnVzLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -1,31 +1,100 @@
1
1
  import { Directive, Input, Output, EventEmitter } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
2
4
  import * as i0 from "@angular/core";
3
5
  import * as i1 from "@reskin/core/services";
6
+ /**
7
+ * 样式按需加载指令
8
+ * 在指令初始化时加载指定的样式文件,销毁时自动卸载
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <!-- 加载单个样式 -->
13
+ * <div [rkLoadStyles]="'assets/styles/theme.css'">内容</div>
14
+ *
15
+ * <!-- 加载多个样式 -->
16
+ * <div [rkLoadStyles]="['assets/styles/theme.css', 'assets/styles/components.css']">内容</div>
17
+ *
18
+ * <!-- 监听加载完成事件 -->
19
+ * <div [rkLoadStyles]="styleUrls" (stylesLoaded)="onLoaded($event)">内容</div>
20
+ * ```
21
+ */
4
22
  export class RkLoadStylesDirective {
5
- constructor(styleLoader) {
6
- this.styleLoader = styleLoader;
23
+ constructor(styleLoaderService) {
24
+ this.styleLoaderService = styleLoaderService;
25
+ this.destroy$ = new Subject();
26
+ this.styleUrls = [];
27
+ /**
28
+ * 样式文件路径
29
+ * 可以是单个路径字符串或路径数组
30
+ */
7
31
  this.hrefs = [];
8
- // (可选) 输出加载完成事件,以便父组件可以响应
32
+ /**
33
+ * 样式加载完成事件
34
+ * 返回每个样式文件的加载结果
35
+ */
9
36
  this.stylesLoaded = new EventEmitter();
10
- this.styleUrls = [];
11
37
  }
12
38
  ngOnInit() {
13
- this.styleUrls = Array.isArray(this.hrefs) ? this.hrefs : [this.hrefs];
14
- if (this.styleUrls.length > 0) {
15
- this.subscription = this.styleLoader.load(...this.styleUrls).subscribe((results) => {
16
- this.stylesLoaded.emit(results);
17
- });
18
- }
39
+ this.loadStyles();
19
40
  }
20
41
  ngOnDestroy() {
21
- if (this.subscription) {
22
- this.subscription.unsubscribe();
42
+ this.destroy$.next();
43
+ this.destroy$.complete();
44
+ this.unloadStyles();
45
+ }
46
+ /**
47
+ * 加载样式文件
48
+ */
49
+ loadStyles() {
50
+ this.styleUrls = this.normalizeHrefs(this.hrefs);
51
+ if (this.styleUrls.length === 0) {
52
+ return;
23
53
  }
24
- // 指令销毁时,自动调用 unload,服务内部会处理引用计数
54
+ this.styleLoaderService
55
+ .load(...this.styleUrls)
56
+ .pipe(takeUntil(this.destroy$))
57
+ .subscribe({
58
+ next: (results) => {
59
+ this.stylesLoaded.emit(results);
60
+ this.logLoadResults(results);
61
+ },
62
+ error: (error) => {
63
+ console.error('[RkLoadStyles] 样式加载失败:', error);
64
+ },
65
+ });
66
+ }
67
+ /**
68
+ * 卸载样式文件
69
+ */
70
+ unloadStyles() {
25
71
  if (this.styleUrls.length > 0) {
26
- this.styleLoader.unload(...this.styleUrls);
72
+ this.styleLoaderService.unload(...this.styleUrls);
27
73
  }
28
74
  }
75
+ /**
76
+ * 标准化 hrefs 输入为数组
77
+ */
78
+ normalizeHrefs(hrefs) {
79
+ if (!hrefs) {
80
+ return [];
81
+ }
82
+ return Array.isArray(hrefs) ? hrefs : [hrefs];
83
+ }
84
+ /**
85
+ * 记录加载结果(仅在开发模式)
86
+ */
87
+ logLoadResults(results) {
88
+ // 开发模式下记录加载结果
89
+ results.forEach((result) => {
90
+ if (result.success) {
91
+ console.log(`[RkLoadStyles] 样式加载成功: ${result.href}`);
92
+ }
93
+ else {
94
+ console.error(`[RkLoadStyles] 样式加载失败: ${result.href}`, result.error);
95
+ }
96
+ });
97
+ }
29
98
  }
30
99
  RkLoadStylesDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkLoadStylesDirective, deps: [{ token: i1.RkStyleLoaderService }], target: i0.ɵɵFactoryTarget.Directive });
31
100
  RkLoadStylesDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: RkLoadStylesDirective, selector: "[rkLoadStyles]", inputs: { hrefs: ["rkLoadStyles", "hrefs"] }, outputs: { stylesLoaded: "stylesLoaded" }, ngImport: i0 });
@@ -40,4 +109,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
40
109
  }], stylesLoaded: [{
41
110
  type: Output
42
111
  }] } });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zdHlsZXMuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicmFyeS9jb3JlL2RpcmVjdGl2ZXMvbG9hZC5zdHlsZXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPMUYsTUFBTSxPQUFPLHFCQUFxQjtJQVM5QixZQUFvQixXQUFpQztRQUFqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBc0I7UUFSOUIsVUFBSyxHQUFzQixFQUFFLENBQUM7UUFFckQsMEJBQTBCO1FBQ2hCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFHbkQsY0FBUyxHQUFhLEVBQUUsQ0FBQztJQUV1QixDQUFDO0lBRXpELFFBQVE7UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMvRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNuQztRQUNELGdDQUFnQztRQUNoQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM5QztJQUNMLENBQUM7O21IQTVCUSxxQkFBcUI7dUdBQXJCLHFCQUFxQjs0RkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzdCOzJHQUUwQixLQUFLO3NCQUEzQixLQUFLO3VCQUFDLGNBQWM7Z0JBR1gsWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSUxvYWRSZXN1bHQsIFJrU3R5bGVMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnQHJlc2tpbi9jb3JlL3NlcnZpY2VzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbcmtMb2FkU3R5bGVzXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSa0xvYWRTdHlsZXNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBASW5wdXQoJ3JrTG9hZFN0eWxlcycpIGhyZWZzOiBzdHJpbmdbXSB8IHN0cmluZyA9IFtdO1xyXG5cclxuICAgIC8vICjlj6/pgIkpIOi+k+WHuuWKoOi9veWujOaIkOS6i+S7tu+8jOS7peS+v+eItue7hOS7tuWPr+S7peWTjeW6lFxyXG4gICAgQE91dHB1dCgpIHN0eWxlc0xvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUxvYWRSZXN1bHRbXT4oKTtcclxuXHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBzdHlsZVVybHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdHlsZUxvYWRlcjogUmtTdHlsZUxvYWRlclNlcnZpY2UpIHt9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdHlsZVVybHMgPSBBcnJheS5pc0FycmF5KHRoaXMuaHJlZnMpID8gdGhpcy5ocmVmcyA6IFt0aGlzLmhyZWZzXTtcclxuICAgICAgICBpZiAodGhpcy5zdHlsZVVybHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuc3R5bGVMb2FkZXIubG9hZCguLi50aGlzLnN0eWxlVXJscykuc3Vic2NyaWJlKChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc0xvYWRlZC5lbWl0KHJlc3VsdHMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOaMh+S7pOmUgOavgeaXtu+8jOiHquWKqOiwg+eUqCB1bmxvYWTvvIzmnI3liqHlhoXpg6jkvJrlpITnkIblvJXnlKjorqHmlbBcclxuICAgICAgICBpZiAodGhpcy5zdHlsZVVybHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlTG9hZGVyLnVubG9hZCguLi50aGlzLnN0eWxlVXJscyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zdHlsZXMuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicmFyeS9jb3JlL2RpcmVjdGl2ZXMvbG9hZC5zdHlsZXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFHM0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLHFCQUFxQjtJQWdCOUIsWUFBb0Isa0JBQXdDO1FBQXhDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBc0I7UUFmM0MsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDeEMsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUVqQzs7O1dBR0c7UUFDb0IsVUFBSyxHQUFzQixFQUFFLENBQUM7UUFFckQ7OztXQUdHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUVJLENBQUM7SUFFaEUsUUFBUTtRQUNKLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVTtRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGtCQUFrQjthQUNsQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25ELENBQUM7U0FDSixDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDckQ7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsS0FBd0I7UUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsT0FBc0I7UUFDekMsY0FBYztRQUNkLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ3hEO2lCQUFNO2dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEU7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O21IQW5GUSxxQkFBcUI7dUdBQXJCLHFCQUFxQjs0RkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzdCOzJHQVMwQixLQUFLO3NCQUEzQixLQUFLO3VCQUFDLGNBQWM7Z0JBTVgsWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSUxvYWRSZXN1bHQsIFJrU3R5bGVMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnQHJlc2tpbi9jb3JlL3NlcnZpY2VzJztcclxuXHJcbi8qKlxyXG4gKiDmoLflvI/mjInpnIDliqDovb3mjIfku6RcclxuICog5Zyo5oyH5Luk5Yid5aeL5YyW5pe25Yqg6L295oyH5a6a55qE5qC35byP5paH5Lu277yM6ZSA5q+B5pe26Ieq5Yqo5Y246L29XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPCEtLSDliqDovb3ljZXkuKrmoLflvI8gLS0+XHJcbiAqIDxkaXYgW3JrTG9hZFN0eWxlc109XCInYXNzZXRzL3N0eWxlcy90aGVtZS5jc3MnXCI+5YaF5a65PC9kaXY+XHJcbiAqXHJcbiAqIDwhLS0g5Yqg6L295aSa5Liq5qC35byPIC0tPlxyXG4gKiA8ZGl2IFtya0xvYWRTdHlsZXNdPVwiWydhc3NldHMvc3R5bGVzL3RoZW1lLmNzcycsICdhc3NldHMvc3R5bGVzL2NvbXBvbmVudHMuY3NzJ11cIj7lhoXlrrk8L2Rpdj5cclxuICpcclxuICogPCEtLSDnm5HlkKzliqDovb3lrozmiJDkuovku7YgLS0+XHJcbiAqIDxkaXYgW3JrTG9hZFN0eWxlc109XCJzdHlsZVVybHNcIiAoc3R5bGVzTG9hZGVkKT1cIm9uTG9hZGVkKCRldmVudClcIj7lhoXlrrk8L2Rpdj5cclxuICogYGBgXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW3JrTG9hZFN0eWxlc10nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmtMb2FkU3R5bGVzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIHN0eWxlVXJsczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOagt+W8j+aWh+S7tui3r+W+hFxyXG4gICAgICog5Y+v5Lul5piv5Y2V5Liq6Lev5b6E5a2X56ym5Liy5oiW6Lev5b6E5pWw57uEXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgncmtMb2FkU3R5bGVzJykgaHJlZnM6IHN0cmluZyB8IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLflvI/liqDovb3lrozmiJDkuovku7ZcclxuICAgICAqIOi/lOWbnuavj+S4quagt+W8j+aWh+S7tueahOWKoOi9vee7k+aenFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgc3R5bGVzTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJTG9hZFJlc3VsdFtdPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3R5bGVMb2FkZXJTZXJ2aWNlOiBSa1N0eWxlTG9hZGVyU2VydmljZSkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvYWRTdHlsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgdGhpcy51bmxvYWRTdHlsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veagt+W8j+aWh+S7tlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvYWRTdHlsZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdHlsZVVybHMgPSB0aGlzLm5vcm1hbGl6ZUhyZWZzKHRoaXMuaHJlZnMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zdHlsZVVybHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3R5bGVMb2FkZXJTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5sb2FkKC4uLnRoaXMuc3R5bGVVcmxzKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc0xvYWRlZC5lbWl0KHJlc3VsdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nTG9hZFJlc3VsdHMocmVzdWx0cyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSa0xvYWRTdHlsZXNdIOagt+W8j+WKoOi9veWksei0pTonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWNuOi9veagt+W8j+aWh+S7tlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVubG9hZFN0eWxlcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zdHlsZVVybHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlTG9hZGVyU2VydmljZS51bmxvYWQoLi4udGhpcy5zdHlsZVVybHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOagh+WHhuWMliBocmVmcyDovpPlhaXkuLrmlbDnu4RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBub3JtYWxpemVIcmVmcyhocmVmczogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgaWYgKCFocmVmcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGhyZWZzKSA/IGhyZWZzIDogW2hyZWZzXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiusOW9leWKoOi9vee7k+aenO+8iOS7heWcqOW8gOWPkeaooeW8j++8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvZ0xvYWRSZXN1bHRzKHJlc3VsdHM6IElMb2FkUmVzdWx0W10pOiB2b2lkIHtcclxuICAgICAgICAvLyDlvIDlj5HmqKHlvI/kuIvorrDlvZXliqDovb3nu5PmnpxcclxuICAgICAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbUmtMb2FkU3R5bGVzXSDmoLflvI/liqDovb3miJDlip86ICR7cmVzdWx0LmhyZWZ9YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbUmtMb2FkU3R5bGVzXSDmoLflvI/liqDovb3lpLHotKU6ICR7cmVzdWx0LmhyZWZ9YCwgcmVzdWx0LmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -1,91 +1,149 @@
1
1
  import { Directive, Input, TemplateRef } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
+ /**
4
+ * 字符串模板输出上下文
5
+ */
6
+ export class RkStringTemplateOutletContext {
7
+ constructor() {
8
+ /** 隐式上下文值 */
9
+ this.$implicit = null;
10
+ }
11
+ }
12
+ /**
13
+ * 字符串模板输出指令
14
+ * 支持动态渲染字符串或 TemplateRef
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <!-- 渲染字符串 -->
19
+ * <ng-container *rkStringTemplateOutlet="'Hello World'">
20
+ * <ng-template>默认模板</ng-template>
21
+ * </ng-container>
22
+ *
23
+ * <!-- 渲染 TemplateRef -->
24
+ * <ng-container *rkStringTemplateOutlet="customTemplate; context: { $implicit: data }">
25
+ * </ng-container>
26
+ * <ng-template #customTemplate let-item>
27
+ * <div>{{ item }}</div>
28
+ * </ng-template>
29
+ *
30
+ * <!-- 动态切换 -->
31
+ * <ng-container *rkStringTemplateOutlet="isTemplate ? templateRef : 'Static Text'">
32
+ * </ng-container>
33
+ * ```
34
+ */
3
35
  export class RkStringTemplateOutletDirective {
4
- constructor(viewContainer, templateRef) {
5
- this.viewContainer = viewContainer;
36
+ constructor(viewContainerRef, templateRef) {
37
+ this.viewContainerRef = viewContainerRef;
6
38
  this.templateRef = templateRef;
7
39
  this.embeddedViewRef = null;
8
40
  this.context = new RkStringTemplateOutletContext();
9
- this.rkStringTemplateOutletContext = null;
41
+ /**
42
+ * 输出内容
43
+ * 可以是字符串或 TemplateRef
44
+ */
10
45
  this.rkStringTemplateOutlet = null;
46
+ /**
47
+ * 模板上下文
48
+ * 当 rkStringTemplateOutlet 是 TemplateRef 时使用
49
+ */
50
+ this.rkStringTemplateOutletContext = null;
11
51
  }
52
+ /**
53
+ * 类型守卫
54
+ * 用于 Angular 模板类型检查
55
+ */
12
56
  static rkTemplateContextGuard(_dir, _ctx) {
13
57
  return true;
14
58
  }
15
- recreateView() {
16
- this.viewContainer.clear();
17
- const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
18
- const templateRef = (isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef);
19
- this.embeddedViewRef = this.viewContainer.createEmbeddedView(templateRef, isTemplateRef ? this.rkStringTemplateOutletContext : this.context);
20
- }
21
- updateContext() {
22
- const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
23
- const newCtx = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;
24
- const oldCtx = this.embeddedViewRef.context;
25
- if (newCtx) {
26
- for (const propName of Object.keys(newCtx)) {
27
- oldCtx[propName] = newCtx[propName];
28
- }
29
- }
30
- }
31
59
  ngOnChanges(changes) {
32
- const { rkStringTemplateOutletContext, rkStringTemplateOutlet } = changes;
33
- const shouldRecreateView = () => {
34
- let shouldOutletRecreate = false;
35
- if (rkStringTemplateOutlet) {
36
- if (rkStringTemplateOutlet.firstChange) {
37
- shouldOutletRecreate = true;
38
- }
39
- else {
40
- const isPreviousOutletTemplate = rkStringTemplateOutlet.previousValue instanceof TemplateRef;
41
- const isCurrentOutletTemplate = rkStringTemplateOutlet.currentValue instanceof TemplateRef;
42
- shouldOutletRecreate = isPreviousOutletTemplate || isCurrentOutletTemplate;
43
- }
44
- }
45
- const hasContextShapeChanged = (ctxChange) => {
46
- const prevCtxKeys = Object.keys(ctxChange.previousValue || {});
47
- const currCtxKeys = Object.keys(ctxChange.currentValue || {});
48
- if (prevCtxKeys.length === currCtxKeys.length) {
49
- for (const propName of currCtxKeys) {
50
- if (prevCtxKeys.indexOf(propName) === -1) {
51
- return true;
52
- }
53
- }
54
- return false;
55
- }
56
- else {
57
- return true;
58
- }
59
- };
60
- const shouldContextRecreate = rkStringTemplateOutletContext && hasContextShapeChanged(rkStringTemplateOutletContext);
61
- return shouldContextRecreate || shouldOutletRecreate;
62
- };
60
+ const { rkStringTemplateOutlet, rkStringTemplateOutletContext } = changes;
61
+ // 更新隐式上下文
63
62
  if (rkStringTemplateOutlet) {
64
63
  this.context.$implicit = rkStringTemplateOutlet.currentValue;
65
64
  }
66
- const recreateView = shouldRecreateView();
67
- if (recreateView) {
68
- /** recreate view when context shape or outlet change **/
65
+ // 判断是否需要重建视图
66
+ if (this.shouldRecreateView(rkStringTemplateOutlet, rkStringTemplateOutletContext)) {
69
67
  this.recreateView();
70
68
  }
71
69
  else {
72
- /** update context **/
73
70
  this.updateContext();
74
71
  }
75
72
  }
73
+ /**
74
+ * 判断是否需要重建视图
75
+ */
76
+ shouldRecreateView(outletChange, contextChange) {
77
+ // 首次变更需要创建视图
78
+ if (outletChange === null || outletChange === void 0 ? void 0 : outletChange.firstChange) {
79
+ return true;
80
+ }
81
+ // outlet 在 TemplateRef 和非 TemplateRef 之间切换时需要重建
82
+ if (outletChange && this.isOutletTypeChanged(outletChange)) {
83
+ return true;
84
+ }
85
+ // 上下文结构变化时需要重建
86
+ if (contextChange && this.isContextShapeChanged(contextChange)) {
87
+ return true;
88
+ }
89
+ return false;
90
+ }
91
+ /**
92
+ * 检查 outlet 类型是否变化
93
+ */
94
+ isOutletTypeChanged(change) {
95
+ const isPreviousTemplate = change.previousValue instanceof TemplateRef;
96
+ const isCurrentTemplate = change.currentValue instanceof TemplateRef;
97
+ return isPreviousTemplate !== isCurrentTemplate;
98
+ }
99
+ /**
100
+ * 检查上下文结构是否变化
101
+ */
102
+ isContextShapeChanged(change) {
103
+ const prevKeys = Object.keys(change.previousValue || {});
104
+ const currKeys = Object.keys(change.currentValue || {});
105
+ if (prevKeys.length !== currKeys.length) {
106
+ return true;
107
+ }
108
+ return currKeys.some((key) => !prevKeys.includes(key));
109
+ }
110
+ /**
111
+ * 重建视图
112
+ */
113
+ recreateView() {
114
+ this.viewContainerRef.clear();
115
+ const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
116
+ const templateRef = isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef;
117
+ const context = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;
118
+ this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(templateRef, context || this.context);
119
+ }
120
+ /**
121
+ * 更新视图上下文
122
+ */
123
+ updateContext() {
124
+ if (!this.embeddedViewRef) {
125
+ return;
126
+ }
127
+ const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;
128
+ const newContext = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;
129
+ const viewContext = this.embeddedViewRef.context;
130
+ if (newContext) {
131
+ Object.keys(newContext).forEach((key) => {
132
+ viewContext[key] = newContext[key];
133
+ });
134
+ }
135
+ }
76
136
  }
77
137
  RkStringTemplateOutletDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkStringTemplateOutletDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
78
- RkStringTemplateOutletDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: RkStringTemplateOutletDirective, selector: "[rkStringTemplateOutlet]", inputs: { rkStringTemplateOutletContext: "rkStringTemplateOutletContext", rkStringTemplateOutlet: "rkStringTemplateOutlet" }, usesOnChanges: true, ngImport: i0 });
138
+ RkStringTemplateOutletDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: RkStringTemplateOutletDirective, selector: "[rkStringTemplateOutlet]", inputs: { rkStringTemplateOutlet: "rkStringTemplateOutlet", rkStringTemplateOutletContext: "rkStringTemplateOutletContext" }, usesOnChanges: true, ngImport: i0 });
79
139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkStringTemplateOutletDirective, decorators: [{
80
140
  type: Directive,
81
141
  args: [{
82
142
  selector: '[rkStringTemplateOutlet]',
83
143
  }]
84
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { rkStringTemplateOutletContext: [{
144
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { rkStringTemplateOutlet: [{
85
145
  type: Input
86
- }], rkStringTemplateOutlet: [{
146
+ }], rkStringTemplateOutletContext: [{
87
147
  type: Input
88
148
  }] } });
89
- export class RkStringTemplateOutletContext {
90
- }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLnRlbXBsYXRlLm91dGxldC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvZGlyZWN0aXZlcy9zdHJpbmcudGVtcGxhdGUub3V0bGV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFtQixLQUFLLEVBQTBDLFdBQVcsRUFBb0IsTUFBTSxlQUFlLENBQUM7O0FBS3pJLE1BQU0sT0FBTywrQkFBK0I7SUErQnhDLFlBQ1ksYUFBK0IsRUFDL0IsV0FBNkI7UUFEN0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQWhDakMsb0JBQWUsR0FBZ0MsSUFBSSxDQUFDO1FBQ3BELFlBQU8sR0FBRyxJQUFJLDZCQUE2QixFQUFFLENBQUM7UUFDN0Msa0NBQTZCLEdBQWUsSUFBSSxDQUFDO1FBQ2pELDJCQUFzQixHQUEyQixJQUFJLENBQUM7SUE4QjVELENBQUM7SUE1QkosTUFBTSxDQUFDLHNCQUFzQixDQUFJLElBQXdDLEVBQUUsSUFBUztRQUNoRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sWUFBWTtRQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsWUFBWSxXQUFXLENBQUM7UUFDekUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBUSxDQUFDO1FBQzVGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FDeEQsV0FBVyxFQUNYLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxJQUFJ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Q0FFekMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVtYmVkZGVkVmlld1JlZiwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlLCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tya1N0cmluZ1RlbXBsYXRlT3V0bGV0XScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSa1N0cmluZ1RlbXBsYXRlT3V0bGV0RGlyZWN0aXZlPF9UID0gdW5rbm93bj4gaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gICAgcHJpdmF0ZSBlbWJlZGRlZFZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjxhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIGNvbnRleHQgPSBuZXcgUmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQoKTtcclxuICAgIEBJbnB1dCgpIHJrU3RyaW5nVGVtcGxhdGVPdXRsZXRDb250ZXh0OiBhbnkgfCBudWxsID0gbnVsbDtcclxuICAgIEBJbnB1dCgpIHJrU3RyaW5nVGVtcGxhdGVPdXRsZXQ6IGFueSB8IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xyXG5cclxuICAgIHN0YXRpYyBya1RlbXBsYXRlQ29udGV4dEd1YXJkPFQ+KF9kaXI6IFJrU3RyaW5nVGVtcGxhdGVPdXRsZXREaXJlY3RpdmU8VD4sIF9jdHg6IGFueSk6IF9jdHggaXMgUmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVjcmVhdGVWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICAgIGNvbnN0IGlzVGVtcGxhdGVSZWYgPSB0aGlzLnJrU3RyaW5nVGVtcGxhdGVPdXRsZXQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVJlZiA9IChpc1RlbXBsYXRlUmVmID8gdGhpcy5ya1N0cmluZ1RlbXBsYXRlT3V0bGV0IDogdGhpcy50ZW1wbGF0ZVJlZikgYXMgYW55O1xyXG4gICAgICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhcclxuICAgICAgICAgICAgdGVtcGxhdGVSZWYsXHJcbiAgICAgICAgICAgIGlzVGVtcGxhdGVSZWYgPyB0aGlzLnJrU3RyaW5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IDogdGhpcy5jb250ZXh0LFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDb250ZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlzVGVtcGxhdGVSZWYgPSB0aGlzLnJrU3RyaW5nVGVtcGxhdGVPdXRsZXQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcclxuICAgICAgICBjb25zdCBuZXdDdHggPSBpc1RlbXBsYXRlUmVmID8gdGhpcy5ya1N0cmluZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCA6IHRoaXMuY29udGV4dDtcclxuICAgICAgICBjb25zdCBvbGRDdHggPSB0aGlzLmVtYmVkZGVkVmlld1JlZiEuY29udGV4dCBhcyBhbnk7XHJcbiAgICAgICAgaWYgKG5ld0N0eCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKG5ld0N0eCkpIHtcclxuICAgICAgICAgICAgICAgIG9sZEN0eFtwcm9wTmFtZV0gPSBuZXdDdHhbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHJrU3RyaW5nVGVtcGxhdGVPdXRsZXRDb250ZXh0LCBya1N0cmluZ1RlbXBsYXRlT3V0bGV0IH0gPSBjaGFuZ2VzO1xyXG4gICAgICAgIGNvbnN0IHNob3VsZFJlY3JlYXRlVmlldyA9ICgpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgbGV0IHNob3VsZE91dGxldFJlY3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChya1N0cmluZ1RlbXBsYXRlT3V0bGV0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmtTdHJpbmdUZW1wbGF0ZU91dGxldC5maXJzdENoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZE91dGxldFJlY3JlYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQcmV2aW91c091dGxldFRlbXBsYXRlID0gcmtTdHJpbmdUZW1wbGF0ZU91dGxldC5wcmV2aW91c1ZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50T3V0bGV0VGVtcGxhdGUgPSBya1N0cmluZ1RlbXBsYXRlT3V0bGV0LmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZE91dGxldFJlY3JlYXRlID0gaXNQcmV2aW91c091dGxldFRlbXBsYXRlIHx8IGlzQ3VycmVudE91dGxldFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc0NvbnRleHRTaGFwZUNoYW5nZWQgPSAoY3R4Q2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLnByZXZpb3VzVmFsdWUgfHwge30pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VyckN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UuY3VycmVudFZhbHVlIHx8IHt9KTtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2Q3R4S2V5cy5sZW5ndGggPT09IGN1cnJDdHhLZXlzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgY3VyckN0eEtleXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDdHhLZXlzLmluZGV4T2YocHJvcE5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ29udGV4dFJlY3JlYXRlID0gcmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQgJiYgaGFzQ29udGV4dFNoYXBlQ2hhbmdlZChya1N0cmluZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBzaG91bGRDb250ZXh0UmVjcmVhdGUgfHwgc2hvdWxkT3V0bGV0UmVjcmVhdGU7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHJrU3RyaW5nVGVtcGxhdGVPdXRsZXQpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LiRpbXBsaWNpdCA9IHJrU3RyaW5nVGVtcGxhdGVPdXRsZXQuY3VycmVudFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVjcmVhdGVWaWV3ID0gc2hvdWxkUmVjcmVhdGVWaWV3KCk7XHJcbiAgICAgICAgaWYgKHJlY3JlYXRlVmlldykge1xyXG4gICAgICAgICAgICAvKiogcmVjcmVhdGUgdmlldyB3aGVuIGNvbnRleHQgc2hhcGUgb3Igb3V0bGV0IGNoYW5nZSAqKi9cclxuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZVZpZXcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKiogdXBkYXRlIGNvbnRleHQgKiovXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJrU3RyaW5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IHtcclxuICAgIHB1YmxpYyAkaW1wbGljaXQ6IGFueTtcclxufVxyXG4iXX0=
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLnRlbXBsYXRlLm91dGxldC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvZGlyZWN0aXZlcy9zdHJpbmcudGVtcGxhdGUub3V0bGV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFtQixLQUFLLEVBQTBDLFdBQVcsRUFBb0IsTUFBTSxlQUFlLENBQUM7O0FBRXpJOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDZCQUE2QjtJQUExQztRQUNJLGFBQWE7UUFDTixjQUFTLEdBQWEsSUFBSSxDQUFDO0lBQ3RDLENBQUM7Q0FBQTtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBSUgsTUFBTSxPQUFPLCtCQUErQjtJQTJCeEMsWUFDWSxnQkFBa0MsRUFDbEMsV0FBMEQ7UUFEMUQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBK0M7UUE1QjlELG9CQUFlLEdBQTZELElBQUksQ0FBQztRQUNqRixZQUFPLEdBQUcsSUFBSSw2QkFBNkIsRUFBSyxDQUFDO1FBRXpEOzs7V0FHRztRQUNNLDJCQUFzQixHQUE2RCxJQUFJLENBQUM7UUFFakc7OztXQUdHO1FBQ00sa0NBQTZCLEdBQTRDLElBQUksQ0FBQztJQWdCcEYsQ0FBQztJQWRKOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FDekIsSUFBd0MsRUFDeEMsSUFBUztRQUVULE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFPRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsTUFBTSxFQUFFLHNCQUFzQixFQUFFLDZCQUE2QixFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTFFLFVBQVU7UUFDVixJQUFJLHNCQUFzQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQztT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QUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDbkMsV0FBbUIsQ0FBQyxHQUFHLENBQUMsR0FBSSxVQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDOzs2SEE5SFEsK0JBQStCO2lIQUEvQiwrQkFBK0I7NEZBQS9CLCtCQUErQjtrQkFIM0MsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsMEJBQTBCO2lCQUN2QztpSUFTWSxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBTUcsNkJBQTZCO3NCQUFyQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbWJlZGRlZFZpZXdSZWYsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiDlrZfnrKbkuLLmqKHmnb/ovpPlh7rkuIrkuIvmlodcclxuICovXHJcbmV4cG9ydCBjbGFzcyBSa1N0cmluZ1RlbXBsYXRlT3V0bGV0Q29udGV4dDxUID0gYW55PiB7XHJcbiAgICAvKiog6ZqQ5byP5LiK5LiL5paH5YC8ICovXHJcbiAgICBwdWJsaWMgJGltcGxpY2l0OiBUIHwgbnVsbCA9IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDlrZfnrKbkuLLmqKHmnb/ovpPlh7rmjIfku6RcclxuICog5pSv5oyB5Yqo5oCB5riy5p+T5a2X56ym5Liy5oiWIFRlbXBsYXRlUmVmXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPCEtLSDmuLLmn5PlrZfnrKbkuLIgLS0+XHJcbiAqIDxuZy1jb250YWluZXIgKnJrU3RyaW5nVGVtcGxhdGVPdXRsZXQ9XCInSGVsbG8gV29ybGQnXCI+XHJcbiAqICAgPG5nLXRlbXBsYXRlPum7mOiupOaooeadvzwvbmctdGVtcGxhdGU+XHJcbiAqIDwvbmctY29udGFpbmVyPlxyXG4gKlxyXG4gKiA8IS0tIOa4suafkyBUZW1wbGF0ZVJlZiAtLT5cclxuICogPG5nLWNvbnRhaW5lciAqcmtTdHJpbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGF0YSB9XCI+XHJcbiAqIDwvbmctY29udGFpbmVyPlxyXG4gKiA8bmctdGVtcGxhdGUgI2N1c3RvbVRlbXBsYXRlIGxldC1pdGVtPlxyXG4gKiAgIDxkaXY+e3sgaXRlbSB9fTwvZGl2PlxyXG4gKiA8L25nLXRlbXBsYXRlPlxyXG4gKlxyXG4gKiA8IS0tIOWKqOaAgeWIh+aNoiAtLT5cclxuICogPG5nLWNvbnRhaW5lciAqcmtTdHJpbmdUZW1wbGF0ZU91dGxldD1cImlzVGVtcGxhdGUgPyB0ZW1wbGF0ZVJlZiA6ICdTdGF0aWMgVGV4dCdcIj5cclxuICogPC9uZy1jb250YWluZXI+XHJcbiAqIGBgYFxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tya1N0cmluZ1RlbXBsYXRlT3V0bGV0XScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSa1N0cmluZ1RlbXBsYXRlT3V0bGV0RGlyZWN0aXZlPFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgICBwcml2YXRlIGVtYmVkZGVkVmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPFJrU3RyaW5nVGVtcGxhdGVPdXRsZXRDb250ZXh0PFQ+PiB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjb250ZXh0ID0gbmV3IFJrU3RyaW5nVGVtcGxhdGVPdXRsZXRDb250ZXh0PFQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDovpPlh7rlhoXlrrlcclxuICAgICAqIOWPr+S7peaYr+Wtl+espuS4suaIliBUZW1wbGF0ZVJlZlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBya1N0cmluZ1RlbXBsYXRlT3V0bGV0OiBUIHwgVGVtcGxhdGVSZWY8UmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQ8VD4+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmqKHmnb/kuIrkuIvmlodcclxuICAgICAqIOW9kyBya1N0cmluZ1RlbXBsYXRlT3V0bGV0IOaYryBUZW1wbGF0ZVJlZiDml7bkvb/nlKhcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQ6IFJrU3RyaW5nVGVtcGxhdGVPdXRsZXRDb250ZXh0PFQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnsbvlnovlrojljatcclxuICAgICAqIOeUqOS6jiBBbmd1bGFyIOaooeadv+exu+Wei+ajgOafpVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmtUZW1wbGF0ZUNvbnRleHRHdWFyZDxUPihcclxuICAgICAgICBfZGlyOiBSa1N0cmluZ1RlbXBsYXRlT3V0bGV0RGlyZWN0aXZlPFQ+LFxyXG4gICAgICAgIF9jdHg6IGFueSxcclxuICAgICk6IF9jdHggaXMgUmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQ8VD4ge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxSa1N0cmluZ1RlbXBsYXRlT3V0bGV0Q29udGV4dDxUPj4sXHJcbiAgICApIHt9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgcmtTdHJpbmdUZW1wbGF0ZU91dGxldCwgcmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQgfSA9IGNoYW5nZXM7XHJcblxyXG4gICAgICAgIC8vIOabtOaWsOmakOW8j+S4iuS4i+aWh1xyXG4gICAgICAgIGlmIChya1N0cmluZ1RlbXBsYXRlT3V0bGV0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC4kaW1wbGljaXQgPSBya1N0cmluZ1RlbXBsYXRlT3V0bGV0LmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOWIpOaWreaYr+WQpumcgOimgemHjeW7uuinhuWbvlxyXG4gICAgICAgIGlmICh0aGlzLnNob3VsZFJlY3JlYXRlVmlldyhya1N0cmluZ1RlbXBsYXRlT3V0bGV0LCBya1N0cmluZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZVZpZXcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRleHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliKTmlq3mmK/lkKbpnIDopoHph43lu7rop4blm75cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzaG91bGRSZWNyZWF0ZVZpZXcob3V0bGV0Q2hhbmdlPzogU2ltcGxlQ2hhbmdlLCBjb250ZXh0Q2hhbmdlPzogU2ltcGxlQ2hhbmdlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgLy8g6aaW5qyh5Y+Y5pu06ZyA6KaB5Yib5bu66KeG5Zu+XHJcbiAgICAgICAgaWYgKG91dGxldENoYW5nZT8uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBvdXRsZXQg5ZyoIFRlbXBsYXRlUmVmIOWSjOmdniBUZW1wbGF0ZVJlZiDkuYvpl7TliIfmjaLml7bpnIDopoHph43lu7pcclxuICAgICAgICBpZiAob3V0bGV0Q2hhbmdlICYmIHRoaXMuaXNPdXRsZXRUeXBlQ2hhbmdlZChvdXRsZXRDaGFuZ2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5LiK5LiL5paH57uT5p6E5Y+Y5YyW5pe26ZyA6KaB6YeN5bu6XHJcbiAgICAgICAgaWYgKGNvbnRleHRDaGFuZ2UgJiYgdGhpcy5pc0NvbnRleHRTaGFwZUNoYW5nZWQoY29udGV4dENoYW5nZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmo4Dmn6Ugb3V0bGV0IOexu+Wei+aYr+WQpuWPmOWMllxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzT3V0bGV0VHlwZUNoYW5nZWQoY2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBpc1ByZXZpb3VzVGVtcGxhdGUgPSBjaGFuZ2UucHJldmlvdXNWYWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xyXG4gICAgICAgIGNvbnN0IGlzQ3VycmVudFRlbXBsYXRlID0gY2hhbmdlLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xyXG4gICAgICAgIHJldHVybiBpc1ByZXZpb3VzVGVtcGxhdGUgIT09IGlzQ3VycmVudFRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qOA5p+l5LiK5LiL5paH57uT5p6E5piv5ZCm5Y+Y5YyWXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXNDb250ZXh0U2hhcGVDaGFuZ2VkKGNoYW5nZTogU2ltcGxlQ2hhbmdlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgcHJldktleXMgPSBPYmplY3Qua2V5cyhjaGFuZ2UucHJldmlvdXNWYWx1ZSB8fCB7fSk7XHJcbiAgICAgICAgY29uc3QgY3VycktleXMgPSBPYmplY3Qua2V5cyhjaGFuZ2UuY3VycmVudFZhbHVlIHx8IHt9KTtcclxuXHJcbiAgICAgICAgaWYgKHByZXZLZXlzLmxlbmd0aCAhPT0gY3VycktleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJLZXlzLnNvbWUoKGtleSkgPT4gIXByZXZLZXlzLmluY2x1ZGVzKGtleSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YeN5bu66KeG5Zu+XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVjcmVhdGVWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG5cclxuICAgICAgICBjb25zdCBpc1RlbXBsYXRlUmVmID0gdGhpcy5ya1N0cmluZ1RlbXBsYXRlT3V0bGV0IGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVSZWYgPSBpc1RlbXBsYXRlUmVmID8gdGhpcy5ya1N0cmluZ1RlbXBsYXRlT3V0bGV0IDogdGhpcy50ZW1wbGF0ZVJlZjtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gaXNUZW1wbGF0ZVJlZiA/IHRoaXMucmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQgOiB0aGlzLmNvbnRleHQ7XHJcblxyXG4gICAgICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhcclxuICAgICAgICAgICAgdGVtcGxhdGVSZWYgYXMgVGVtcGxhdGVSZWY8UmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQ8VD4+LFxyXG4gICAgICAgICAgICBjb250ZXh0IHx8IHRoaXMuY29udGV4dCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw6KeG5Zu+5LiK5LiL5paHXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQ29udGV4dCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZW1iZWRkZWRWaWV3UmVmKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGlzVGVtcGxhdGVSZWYgPSB0aGlzLnJrU3RyaW5nVGVtcGxhdGVPdXRsZXQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcclxuICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0gaXNUZW1wbGF0ZVJlZiA/IHRoaXMucmtTdHJpbmdUZW1wbGF0ZU91dGxldENvbnRleHQgOiB0aGlzLmNvbnRleHQ7XHJcbiAgICAgICAgY29uc3Qgdmlld0NvbnRleHQgPSB0aGlzLmVtYmVkZGVkVmlld1JlZi5jb250ZXh0O1xyXG5cclxuICAgICAgICBpZiAobmV3Q29udGV4dCkge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhuZXdDb250ZXh0KS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgICh2aWV3Q29udGV4dCBhcyBhbnkpW2tleV0gPSAobmV3Q29udGV4dCBhcyBhbnkpW2tleV07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=