@reskin/core 0.0.21 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/reskin-core-directives.umd.js +303 -163
- package/bundles/reskin-core-directives.umd.js.map +1 -1
- package/bundles/reskin-core-guards.umd.js +119 -32
- package/bundles/reskin-core-guards.umd.js.map +1 -1
- package/bundles/reskin-core-interceptors.umd.js +310 -92
- package/bundles/reskin-core-interceptors.umd.js.map +1 -1
- package/bundles/reskin-core-utils.umd.js +220 -77
- package/bundles/reskin-core-utils.umd.js.map +1 -1
- package/directives/auth.directive.d.ts +56 -9
- package/directives/load.styles.directive.d.ts +45 -5
- package/directives/string.template.outlet.directive.d.ts +68 -11
- package/esm2015/directives/auth.directive.js +71 -30
- package/esm2015/directives/load.styles.directive.js +84 -15
- package/esm2015/directives/string.template.outlet.directive.js +118 -60
- package/esm2015/guards/auth.guard.js +117 -30
- package/esm2015/interceptors/blob.interceptor.js +67 -28
- package/esm2015/interceptors/cache.interceptor.js +46 -14
- package/esm2015/interceptors/error.interceptor.js +104 -12
- package/esm2015/interceptors/public-api.js +2 -1
- package/esm2015/interceptors/token.interceptor.js +86 -42
- package/esm2015/interceptors/types.js +5 -0
- package/esm2015/utils/array.js +42 -22
- package/esm2015/utils/dom.js +29 -11
- package/esm2015/utils/form.js +44 -13
- package/esm2015/utils/store.js +101 -26
- package/fesm2015/reskin-core-directives.js +269 -103
- package/fesm2015/reskin-core-directives.js.map +1 -1
- package/fesm2015/reskin-core-guards.js +116 -29
- package/fesm2015/reskin-core-guards.js.map +1 -1
- package/fesm2015/reskin-core-interceptors.js +302 -91
- package/fesm2015/reskin-core-interceptors.js.map +1 -1
- package/fesm2015/reskin-core-utils.js +212 -68
- package/fesm2015/reskin-core-utils.js.map +1 -1
- package/guards/auth.guard.d.ts +85 -5
- package/interceptors/blob.interceptor.d.ts +30 -3
- package/interceptors/cache.interceptor.d.ts +28 -4
- package/interceptors/error.interceptor.d.ts +43 -2
- package/interceptors/public-api.d.ts +1 -0
- package/interceptors/token.interceptor.d.ts +41 -12
- package/interceptors/types.d.ts +68 -0
- package/package.json +1 -1
- package/utils/array.d.ts +8 -1
- package/utils/dom.d.ts +32 -5
- package/utils/form.d.ts +37 -2
- package/utils/store.d.ts +56 -15
|
@@ -1,20 +1,77 @@
|
|
|
1
1
|
import { OnChanges, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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, { "
|
|
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 {
|
|
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(
|
|
7
|
-
this.
|
|
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
|
-
*
|
|
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
|
-
|
|
31
|
-
|
|
60
|
+
this.destroy$.next();
|
|
61
|
+
this.destroy$.complete();
|
|
32
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* 更新视图显示
|
|
65
|
+
*/
|
|
33
66
|
updateView() {
|
|
34
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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,
|
|
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(
|
|
6
|
-
this.
|
|
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.
|
|
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
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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(
|
|
5
|
-
this.
|
|
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
|
-
|
|
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 {
|
|
33
|
-
|
|
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
|
-
|
|
67
|
-
if (
|
|
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: {
|
|
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: {
|
|
144
|
+
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { rkStringTemplateOutlet: [{
|
|
85
145
|
type: Input
|
|
86
|
-
}],
|
|
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=
|