@yelon/acl 15.2.4 → 16.0.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/LICENSE +21 -21
- package/README.md +23 -23
- package/{esm2020 → esm2022}/acl.mjs +4 -4
- package/{esm2020 → esm2022}/index.mjs +7 -7
- package/esm2022/src/acl-guard.mjs +58 -0
- package/esm2022/src/acl-if.directive.mjs +80 -0
- package/{esm2020 → esm2022}/src/acl.config.mjs +3 -3
- package/esm2022/src/acl.directive.mjs +49 -0
- package/esm2022/src/acl.module.mjs +28 -0
- package/esm2022/src/acl.service.mjs +196 -0
- package/{esm2020 → esm2022}/src/acl.type.mjs +6 -6
- package/{fesm2020 → fesm2022}/acl.mjs +405 -405
- package/{fesm2020 → fesm2022}/acl.mjs.map +1 -1
- package/index.d.ts +7 -7
- package/package.json +45 -51
- package/src/acl-guard.d.ts +28 -28
- package/src/acl-if.directive.d.ts +26 -26
- package/src/acl.config.d.ts +2 -2
- package/src/acl.directive.d.ts +18 -18
- package/src/acl.module.d.ts +11 -11
- package/src/acl.service.d.ts +78 -78
- package/src/acl.type.d.ts +32 -32
- package/src/style/index.less +7 -7
- package/esm2020/src/acl-guard.mjs +0 -57
- package/esm2020/src/acl-if.directive.mjs +0 -79
- package/esm2020/src/acl.directive.mjs +0 -48
- package/esm2020/src/acl.module.mjs +0 -27
- package/esm2020/src/acl.service.mjs +0 -195
- package/fesm2015/acl.mjs +0 -395
- package/fesm2015/acl.mjs.map +0 -1
package/src/acl.type.d.ts
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NOTE:`ACLType` 类型可能会被其他类库所引用,为了减少类库间彼此的依赖性,其他类库会以复制的形式存在
|
|
3
|
-
* 当这里有变化时,请务必同步更新,涉及:`MenuService.acl`、`util.YunzaiACLType`
|
|
4
|
-
* TODO: 尝试增加 `@yelon/core` 类库用于处理这种通用型
|
|
5
|
-
*/
|
|
6
|
-
import { Injector } from '@angular/core';
|
|
7
|
-
import { Observable } from 'rxjs';
|
|
8
|
-
import type { ACLService } from './acl.service';
|
|
9
|
-
export interface ACLType {
|
|
10
|
-
/**
|
|
11
|
-
* 角色
|
|
12
|
-
*/
|
|
13
|
-
role?: string[];
|
|
14
|
-
/**
|
|
15
|
-
* 权限点
|
|
16
|
-
*/
|
|
17
|
-
ability?: number[] | string[];
|
|
18
|
-
/**
|
|
19
|
-
* Validated against, default: `oneOf`
|
|
20
|
-
* - `allOf` the value validates against all the roles or abilities
|
|
21
|
-
* - `oneOf` the value validates against exactly one of the roles or abilities
|
|
22
|
-
*/
|
|
23
|
-
mode?: 'allOf' | 'oneOf';
|
|
24
|
-
/**
|
|
25
|
-
* 是否取反,即结果为 `true` 时表示未授权
|
|
26
|
-
*/
|
|
27
|
-
except?: boolean;
|
|
28
|
-
[key: string]: any;
|
|
29
|
-
}
|
|
30
|
-
export type ACLCanType = number | number[] | string | string[] | ACLType;
|
|
31
|
-
export type ACLGuardFunctionType = (srv: ACLService, injector: Injector) => Observable<ACLCanType>;
|
|
32
|
-
export type ACLGuardType = ACLCanType | Observable<ACLCanType> | ACLGuardFunctionType;
|
|
1
|
+
/**
|
|
2
|
+
* NOTE:`ACLType` 类型可能会被其他类库所引用,为了减少类库间彼此的依赖性,其他类库会以复制的形式存在
|
|
3
|
+
* 当这里有变化时,请务必同步更新,涉及:`MenuService.acl`、`util.YunzaiACLType`
|
|
4
|
+
* TODO: 尝试增加 `@yelon/core` 类库用于处理这种通用型
|
|
5
|
+
*/
|
|
6
|
+
import { Injector } from '@angular/core';
|
|
7
|
+
import { Observable } from 'rxjs';
|
|
8
|
+
import type { ACLService } from './acl.service';
|
|
9
|
+
export interface ACLType {
|
|
10
|
+
/**
|
|
11
|
+
* 角色
|
|
12
|
+
*/
|
|
13
|
+
role?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* 权限点
|
|
16
|
+
*/
|
|
17
|
+
ability?: number[] | string[];
|
|
18
|
+
/**
|
|
19
|
+
* Validated against, default: `oneOf`
|
|
20
|
+
* - `allOf` the value validates against all the roles or abilities
|
|
21
|
+
* - `oneOf` the value validates against exactly one of the roles or abilities
|
|
22
|
+
*/
|
|
23
|
+
mode?: 'allOf' | 'oneOf';
|
|
24
|
+
/**
|
|
25
|
+
* 是否取反,即结果为 `true` 时表示未授权
|
|
26
|
+
*/
|
|
27
|
+
except?: boolean;
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
}
|
|
30
|
+
export type ACLCanType = number | number[] | string | string[] | ACLType;
|
|
31
|
+
export type ACLGuardFunctionType = (srv: ACLService, injector: Injector) => Observable<ACLCanType>;
|
|
32
|
+
export type ACLGuardType = ACLCanType | Observable<ACLCanType> | ACLGuardFunctionType;
|
package/src/style/index.less
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* [ACL](https://ng.yunzainfo.com/acl/control) 使用 `display: none` 隐藏未授权元素
|
|
3
|
-
* [ACL](https://ng.yunzainfo.com/acl/control) Hides the unauthorized element with `display: none`
|
|
4
|
-
*/
|
|
5
|
-
.acl__hide {
|
|
6
|
-
display: none !important;
|
|
7
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* [ACL](https://ng.yunzainfo.com/acl/control) 使用 `display: none` 隐藏未授权元素
|
|
3
|
+
* [ACL](https://ng.yunzainfo.com/acl/control) Hides the unauthorized element with `display: none`
|
|
4
|
+
*/
|
|
5
|
+
.acl__hide {
|
|
6
|
+
display: none !important;
|
|
7
|
+
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Observable, of, map, tap } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./acl.service";
|
|
5
|
-
import * as i2 from "@angular/router";
|
|
6
|
-
/**
|
|
7
|
-
* Routing guard prevent unauthorized users visit the page, [ACL Document](https://ng.yunzainfo.com/acl).
|
|
8
|
-
*
|
|
9
|
-
* ```ts
|
|
10
|
-
* data: {
|
|
11
|
-
* path: 'home',
|
|
12
|
-
* canActivate: [ ACLGuard ],
|
|
13
|
-
* data: { guard: 'user1' }
|
|
14
|
-
* }
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
export class ACLGuard {
|
|
18
|
-
constructor(srv, router, injector) {
|
|
19
|
-
this.srv = srv;
|
|
20
|
-
this.router = router;
|
|
21
|
-
this.injector = injector;
|
|
22
|
-
}
|
|
23
|
-
process(data) {
|
|
24
|
-
data = {
|
|
25
|
-
guard: null,
|
|
26
|
-
guard_url: this.srv.guard_url,
|
|
27
|
-
...data
|
|
28
|
-
};
|
|
29
|
-
let guard = data.guard;
|
|
30
|
-
if (typeof guard === 'function')
|
|
31
|
-
guard = guard(this.srv, this.injector);
|
|
32
|
-
return (guard && guard instanceof Observable ? guard : of(guard != null ? guard : null)).pipe(map(v => this.srv.can(v)), tap(v => {
|
|
33
|
-
if (v)
|
|
34
|
-
return;
|
|
35
|
-
this.router.navigateByUrl(data.guard_url);
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
// lazy loading
|
|
39
|
-
canMatch(route) {
|
|
40
|
-
return this.process(route.data);
|
|
41
|
-
}
|
|
42
|
-
// all children route
|
|
43
|
-
canActivateChild(childRoute, state) {
|
|
44
|
-
return this.canActivate(childRoute, state);
|
|
45
|
-
}
|
|
46
|
-
// route
|
|
47
|
-
canActivate(route, _state) {
|
|
48
|
-
return this.process(route.data);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
ACLGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLGuard, deps: [{ token: i1.ACLService }, { token: i2.Router }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
52
|
-
ACLGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLGuard, providedIn: 'root' });
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLGuard, decorators: [{
|
|
54
|
-
type: Injectable,
|
|
55
|
-
args: [{ providedIn: 'root' }]
|
|
56
|
-
}], ctorParameters: function () { return [{ type: i1.ACLService }, { type: i2.Router }, { type: i0.Injector }]; } });
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLWd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYWNsL3NyYy9hY2wtZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQVdyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7O0FBS2hEOzs7Ozs7Ozs7O0dBVUc7QUFFSCxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUFvQixHQUFlLEVBQVUsTUFBYyxFQUFVLFFBQWtCO1FBQW5FLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUFHLENBQUM7SUFFbkYsT0FBTyxDQUFDLElBQVU7UUFDeEIsSUFBSSxHQUFHO1lBQ0wsS0FBSyxFQUFFLElBQUk7WUFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTO1lBQzdCLEdBQUcsSUFBSTtTQUNSLENBQUM7UUFDRixJQUFJLEtBQUssR0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVU7WUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUUsS0FBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzNHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNOLElBQUksQ0FBQztnQkFBRSxPQUFPO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZTtJQUNmLFFBQVEsQ0FBQyxLQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELHFCQUFxQjtJQUNyQixnQkFBZ0IsQ0FBQyxVQUFrQyxFQUFFLEtBQTBCO1FBQzdFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELFFBQVE7SUFDUixXQUFXLENBQUMsS0FBNkIsRUFBRSxNQUFrQztRQUMzRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O3FHQS9CVSxRQUFRO3lHQUFSLFFBQVEsY0FESyxNQUFNOzJGQUNuQixRQUFRO2tCQURwQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBDYW5BY3RpdmF0ZSxcbiAgQ2FuQWN0aXZhdGVDaGlsZCxcbiAgQ2FuTWF0Y2gsXG4gIERhdGEsXG4gIFJvdXRlLFxuICBSb3V0ZXIsXG4gIFJvdXRlclN0YXRlU25hcHNob3Rcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBQ0xTZXJ2aWNlIH0gZnJvbSAnLi9hY2wuc2VydmljZSc7XG5pbXBvcnQgeyBBQ0xDYW5UeXBlLCBBQ0xHdWFyZFR5cGUgfSBmcm9tICcuL2FjbC50eXBlJztcblxuLyoqXG4gKiBSb3V0aW5nIGd1YXJkIHByZXZlbnQgdW5hdXRob3JpemVkIHVzZXJzIHZpc2l0IHRoZSBwYWdlLCBbQUNMIERvY3VtZW50XShodHRwczovL25nLnl1bnphaW5mby5jb20vYWNsKS5cbiAqXG4gKiBgYGB0c1xuICogZGF0YToge1xuICogIHBhdGg6ICdob21lJyxcbiAqICBjYW5BY3RpdmF0ZTogWyBBQ0xHdWFyZCBdLFxuICogIGRhdGE6IHsgZ3VhcmQ6ICd1c2VyMScgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQUNMR3VhcmQgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCwgQ2FuTWF0Y2gge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNydjogQUNMU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzKGRhdGE6IERhdGEpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBkYXRhID0ge1xuICAgICAgZ3VhcmQ6IG51bGwsXG4gICAgICBndWFyZF91cmw6IHRoaXMuc3J2Lmd1YXJkX3VybCxcbiAgICAgIC4uLmRhdGFcbiAgICB9O1xuICAgIGxldCBndWFyZDogQUNMR3VhcmRUeXBlID0gZGF0YS5ndWFyZDtcbiAgICBpZiAodHlwZW9mIGd1YXJkID09PSAnZnVuY3Rpb24nKSBndWFyZCA9IGd1YXJkKHRoaXMuc3J2LCB0aGlzLmluamVjdG9yKTtcbiAgICByZXR1cm4gKGd1YXJkICYmIGd1YXJkIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IGd1YXJkIDogb2YoZ3VhcmQgIT0gbnVsbCA/IChndWFyZCBhcyBBQ0xDYW5UeXBlKSA6IG51bGwpKS5waXBlKFxuICAgICAgbWFwKHYgPT4gdGhpcy5zcnYuY2FuKHYpKSxcbiAgICAgIHRhcCh2ID0+IHtcbiAgICAgICAgaWYgKHYpIHJldHVybjtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChkYXRhLmd1YXJkX3VybCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBsYXp5IGxvYWRpbmdcbiAgY2FuTWF0Y2gocm91dGU6IFJvdXRlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzcyhyb3V0ZS5kYXRhISk7XG4gIH1cbiAgLy8gYWxsIGNoaWxkcmVuIHJvdXRlXG4gIGNhbkFjdGl2YXRlQ2hpbGQoY2hpbGRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jYW5BY3RpdmF0ZShjaGlsZFJvdXRlLCBzdGF0ZSk7XG4gIH1cbiAgLy8gcm91dGVcbiAgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIF9zdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCB8IG51bGwpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKHJvdXRlLmRhdGEpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { Directive, Input } from '@angular/core';
|
|
2
|
-
import { filter } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./acl.service";
|
|
5
|
-
export class ACLIfDirective {
|
|
6
|
-
constructor(templateRef, srv, _viewContainer) {
|
|
7
|
-
this.srv = srv;
|
|
8
|
-
this._viewContainer = _viewContainer;
|
|
9
|
-
this._thenTemplateRef = null;
|
|
10
|
-
this._elseTemplateRef = null;
|
|
11
|
-
this._thenViewRef = null;
|
|
12
|
-
this._elseViewRef = null;
|
|
13
|
-
this._except = false;
|
|
14
|
-
this._change$ = this.srv.change.pipe(filter(r => r != null)).subscribe(() => this._updateView());
|
|
15
|
-
this._thenTemplateRef = templateRef;
|
|
16
|
-
}
|
|
17
|
-
set aclIf(value) {
|
|
18
|
-
this._value = value;
|
|
19
|
-
this._updateView();
|
|
20
|
-
}
|
|
21
|
-
set aclIfThen(templateRef) {
|
|
22
|
-
this._thenTemplateRef = templateRef;
|
|
23
|
-
this._thenViewRef = null;
|
|
24
|
-
this._updateView();
|
|
25
|
-
}
|
|
26
|
-
set aclIfElse(templateRef) {
|
|
27
|
-
this._elseTemplateRef = templateRef;
|
|
28
|
-
this._elseViewRef = null;
|
|
29
|
-
this._updateView();
|
|
30
|
-
}
|
|
31
|
-
set except(value) {
|
|
32
|
-
this._except = value != null && `${value}` !== 'false';
|
|
33
|
-
}
|
|
34
|
-
get except() {
|
|
35
|
-
return this._except;
|
|
36
|
-
}
|
|
37
|
-
_updateView() {
|
|
38
|
-
const res = this.srv.can(this._value);
|
|
39
|
-
if ((res && !this.except) || (!res && this.except)) {
|
|
40
|
-
if (!this._thenViewRef) {
|
|
41
|
-
this._viewContainer.clear();
|
|
42
|
-
this._elseViewRef = null;
|
|
43
|
-
if (this._thenTemplateRef) {
|
|
44
|
-
this._thenViewRef = this._viewContainer.createEmbeddedView(this._thenTemplateRef);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
if (!this._elseViewRef) {
|
|
50
|
-
this._viewContainer.clear();
|
|
51
|
-
this._thenViewRef = null;
|
|
52
|
-
if (this._elseTemplateRef) {
|
|
53
|
-
this._elseViewRef = this._viewContainer.createEmbeddedView(this._elseTemplateRef);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
ngOnDestroy() {
|
|
59
|
-
this._change$.unsubscribe();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
ACLIfDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLIfDirective, deps: [{ token: i0.TemplateRef }, { token: i1.ACLService }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
63
|
-
ACLIfDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: ACLIfDirective, selector: "[aclIf]", inputs: { aclIf: "aclIf", aclIfThen: "aclIfThen", aclIfElse: "aclIfElse", except: "except" }, exportAs: ["aclIf"], ngImport: i0 });
|
|
64
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLIfDirective, decorators: [{
|
|
65
|
-
type: Directive,
|
|
66
|
-
args: [{
|
|
67
|
-
selector: '[aclIf]',
|
|
68
|
-
exportAs: 'aclIf'
|
|
69
|
-
}]
|
|
70
|
-
}], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i1.ACLService }, { type: i0.ViewContainerRef }]; }, propDecorators: { aclIf: [{
|
|
71
|
-
type: Input
|
|
72
|
-
}], aclIfThen: [{
|
|
73
|
-
type: Input
|
|
74
|
-
}], aclIfElse: [{
|
|
75
|
-
type: Input
|
|
76
|
-
}], except: [{
|
|
77
|
-
type: Input
|
|
78
|
-
}] } });
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLWlmLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FjbC9zcmMvYWNsLWlmLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFtQixLQUFLLEVBQTRDLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBZ0IsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFTNUMsTUFBTSxPQUFPLGNBQWM7SUFXekIsWUFBWSxXQUE4QixFQUFVLEdBQWUsRUFBVSxjQUFnQztRQUF6RCxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBTnJHLHFCQUFnQixHQUE2QixJQUFJLENBQUM7UUFDbEQscUJBQWdCLEdBQTZCLElBQUksQ0FBQztRQUNsRCxpQkFBWSxHQUFpQyxJQUFJLENBQUM7UUFDbEQsaUJBQVksR0FBaUMsSUFBSSxDQUFDO1FBQ2xELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFHdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQ0ksS0FBSyxDQUFDLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFDSSxTQUFTLENBQUMsV0FBcUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQ0ksU0FBUyxDQUFDLFdBQXFDO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUNJLE1BQU0sQ0FBQyxLQUFjO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxLQUFLLE9BQU8sQ0FBQztJQUN6RCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFUyxXQUFXO1FBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDbkY7YUFDRjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO29CQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7aUJBQ25GO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QixDQUFDOzsyR0FuRVUsY0FBYzsrRkFBZCxjQUFjOzJGQUFkLGNBQWM7a0JBSjFCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLFFBQVEsRUFBRSxPQUFPO2lCQUNsQjswSkFrQkssS0FBSztzQkFEUixLQUFLO2dCQU9GLFNBQVM7c0JBRFosS0FBSztnQkFRRixTQUFTO3NCQURaLEtBQUs7Z0JBUUYsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbWJlZGRlZFZpZXdSZWYsIElucHV0LCBPbkRlc3Ryb3ksIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZpbHRlciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBQ0xTZXJ2aWNlIH0gZnJvbSAnLi9hY2wuc2VydmljZSc7XG5pbXBvcnQgeyBBQ0xDYW5UeXBlIH0gZnJvbSAnLi9hY2wudHlwZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thY2xJZl0nLFxuICBleHBvcnRBczogJ2FjbElmJ1xufSlcbmV4cG9ydCBjbGFzcyBBQ0xJZkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9leGNlcHQ6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gIHByaXZhdGUgX3ZhbHVlITogQUNMQ2FuVHlwZTtcbiAgcHJpdmF0ZSBfY2hhbmdlJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF90aGVuVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2Vsc2VUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdGhlblZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9lbHNlVmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2V4Y2VwdCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx2b2lkPiwgcHJpdmF0ZSBzcnY6IEFDTFNlcnZpY2UsIHByaXZhdGUgX3ZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICB0aGlzLl9jaGFuZ2UkID0gdGhpcy5zcnYuY2hhbmdlLnBpcGUoZmlsdGVyKHIgPT4gciAhPSBudWxsKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3VwZGF0ZVZpZXcoKSk7XG4gICAgdGhpcy5fdGhlblRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYWNsSWYodmFsdWU6IEFDTENhblR5cGUpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBhY2xJZlRoZW4odGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgbnVsbCkge1xuICAgIHRoaXMuX3RoZW5UZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIHRoaXMuX3RoZW5WaWV3UmVmID0gbnVsbDtcbiAgICB0aGlzLl91cGRhdGVWaWV3KCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYWNsSWZFbHNlKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGwpIHtcbiAgICB0aGlzLl9lbHNlVGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAgICB0aGlzLl9lbHNlVmlld1JlZiA9IG51bGw7XG4gICAgdGhpcy5fdXBkYXRlVmlldygpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGV4Y2VwdCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2V4Y2VwdCA9IHZhbHVlICE9IG51bGwgJiYgYCR7dmFsdWV9YCAhPT0gJ2ZhbHNlJztcbiAgfVxuICBnZXQgZXhjZXB0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9leGNlcHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3VwZGF0ZVZpZXcoKTogdm9pZCB7XG4gICAgY29uc3QgcmVzID0gdGhpcy5zcnYuY2FuKHRoaXMuX3ZhbHVlKTtcbiAgICBpZiAoKHJlcyAmJiAhdGhpcy5leGNlcHQpIHx8ICghcmVzICYmIHRoaXMuZXhjZXB0KSkge1xuICAgICAgaWYgKCF0aGlzLl90aGVuVmlld1JlZikge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2Vsc2VWaWV3UmVmID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX3RoZW5UZW1wbGF0ZVJlZikge1xuICAgICAgICAgIHRoaXMuX3RoZW5WaWV3UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGhlblRlbXBsYXRlUmVmKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuX2Vsc2VWaWV3UmVmKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fdGhlblZpZXdSZWYgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fZWxzZVRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl9lbHNlVGVtcGxhdGVSZWYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhbmdlJC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Directive, Input } from '@angular/core';
|
|
2
|
-
import { filter } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./acl.service";
|
|
5
|
-
export class ACLDirective {
|
|
6
|
-
set acl(value) {
|
|
7
|
-
this.set(value);
|
|
8
|
-
}
|
|
9
|
-
set ability(value) {
|
|
10
|
-
this.set(this.srv.parseAbility(value));
|
|
11
|
-
}
|
|
12
|
-
set(value) {
|
|
13
|
-
this._value = value;
|
|
14
|
-
const CLS = 'acl__hide';
|
|
15
|
-
const el = this.el.nativeElement;
|
|
16
|
-
if (this.srv.can(this._value)) {
|
|
17
|
-
this.renderer.removeClass(el, CLS);
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
this.renderer.addClass(el, CLS);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
constructor(el, renderer, srv) {
|
|
24
|
-
this.el = el;
|
|
25
|
-
this.renderer = renderer;
|
|
26
|
-
this.srv = srv;
|
|
27
|
-
this.change$ = this.srv.change.pipe(filter(r => r != null)).subscribe(() => this.set(this._value));
|
|
28
|
-
}
|
|
29
|
-
ngOnDestroy() {
|
|
30
|
-
this.change$.unsubscribe();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
ACLDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.ACLService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
34
|
-
ACLDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: ACLDirective, selector: "[acl]", inputs: { acl: "acl", ability: ["acl-ability", "ability"] }, exportAs: ["acl"], ngImport: i0 });
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLDirective, decorators: [{
|
|
36
|
-
type: Directive,
|
|
37
|
-
args: [{
|
|
38
|
-
selector: '[acl]',
|
|
39
|
-
exportAs: 'acl'
|
|
40
|
-
}]
|
|
41
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ACLService }]; }, propDecorators: { acl: [{
|
|
42
|
-
type: Input,
|
|
43
|
-
args: ['acl']
|
|
44
|
-
}], ability: [{
|
|
45
|
-
type: Input,
|
|
46
|
-
args: ['acl-ability']
|
|
47
|
-
}] } });
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FjbC9zcmMvYWNsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFnQixNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQVM1QyxNQUFNLE9BQU8sWUFBWTtJQUl2QixJQUNJLEdBQUcsQ0FBQyxLQUFpQjtRQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUNJLE9BQU8sQ0FBQyxLQUFpQjtRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLEdBQUcsQ0FBQyxLQUFpQjtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUM7UUFDeEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3BDO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQsWUFBb0IsRUFBYyxFQUFVLFFBQW1CLEVBQVksR0FBZTtRQUF0RSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFZLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDeEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdCLENBQUM7O3lHQS9CVSxZQUFZOzZGQUFaLFlBQVk7MkZBQVosWUFBWTtrQkFKeEIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsT0FBTztvQkFDakIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2tKQU1LLEdBQUc7c0JBRE4sS0FBSzt1QkFBQyxLQUFLO2dCQU1SLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFDTFNlcnZpY2UgfSBmcm9tICcuL2FjbC5zZXJ2aWNlJztcbmltcG9ydCB7IEFDTENhblR5cGUgfSBmcm9tICcuL2FjbC50eXBlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2FjbF0nLFxuICBleHBvcnRBczogJ2FjbCdcbn0pXG5leHBvcnQgY2xhc3MgQUNMRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfdmFsdWUhOiBBQ0xDYW5UeXBlO1xuICBwcml2YXRlIGNoYW5nZSQ6IFN1YnNjcmlwdGlvbjtcblxuICBASW5wdXQoJ2FjbCcpXG4gIHNldCBhY2wodmFsdWU6IEFDTENhblR5cGUpIHtcbiAgICB0aGlzLnNldCh2YWx1ZSk7XG4gIH1cblxuICBASW5wdXQoJ2FjbC1hYmlsaXR5JylcbiAgc2V0IGFiaWxpdHkodmFsdWU6IEFDTENhblR5cGUpIHtcbiAgICB0aGlzLnNldCh0aGlzLnNydi5wYXJzZUFiaWxpdHkodmFsdWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0KHZhbHVlOiBBQ0xDYW5UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCBDTFMgPSAnYWNsX19oaWRlJztcbiAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5zcnYuY2FuKHRoaXMuX3ZhbHVlKSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgQ0xTKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbCwgQ0xTKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByb3RlY3RlZCBzcnY6IEFDTFNlcnZpY2UpIHtcbiAgICB0aGlzLmNoYW5nZSQgPSB0aGlzLnNydi5jaGFuZ2UucGlwZShmaWx0ZXIociA9PiByICE9IG51bGwpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXQodGhpcy5fdmFsdWUpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlJC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { NgModule } from '@angular/core';
|
|
3
|
-
import { ACLIfDirective } from './acl-if.directive';
|
|
4
|
-
import { ACLDirective } from './acl.directive';
|
|
5
|
-
import { ACLService } from './acl.service';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
const COMPONENTS = [ACLDirective, ACLIfDirective];
|
|
8
|
-
export class YelonACLModule {
|
|
9
|
-
static forRoot() {
|
|
10
|
-
return {
|
|
11
|
-
ngModule: YelonACLModule,
|
|
12
|
-
providers: [ACLService]
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
YelonACLModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: YelonACLModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
17
|
-
YelonACLModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: YelonACLModule, declarations: [ACLDirective, ACLIfDirective], imports: [CommonModule], exports: [ACLDirective, ACLIfDirective] });
|
|
18
|
-
YelonACLModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: YelonACLModule, imports: [CommonModule] });
|
|
19
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: YelonACLModule, decorators: [{
|
|
20
|
-
type: NgModule,
|
|
21
|
-
args: [{
|
|
22
|
-
imports: [CommonModule],
|
|
23
|
-
declarations: COMPONENTS,
|
|
24
|
-
exports: COMPONENTS
|
|
25
|
-
}]
|
|
26
|
-
}] });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FjbC9zcmMvYWNsLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztBQU9sRCxNQUFNLE9BQU8sY0FBYztJQUN6QixNQUFNLENBQUMsT0FBTztRQUNaLE9BQU87WUFDTCxRQUFRLEVBQUUsY0FBYztZQUN4QixTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUM7U0FDeEIsQ0FBQztJQUNKLENBQUM7OzJHQU5VLGNBQWM7NEdBQWQsY0FBYyxpQkFQUCxZQUFZLEVBQUUsY0FBYyxhQUdwQyxZQUFZLGFBSEosWUFBWSxFQUFFLGNBQWM7NEdBT25DLGNBQWMsWUFKZixZQUFZOzJGQUlYLGNBQWM7a0JBTDFCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixZQUFZLEVBQUUsVUFBVTtvQkFDeEIsT0FBTyxFQUFFLFVBQVU7aUJBQ3BCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFDTElmRGlyZWN0aXZlIH0gZnJvbSAnLi9hY2wtaWYuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFDTERpcmVjdGl2ZSB9IGZyb20gJy4vYWNsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBQ0xTZXJ2aWNlIH0gZnJvbSAnLi9hY2wuc2VydmljZSc7XG5cbmNvbnN0IENPTVBPTkVOVFMgPSBbQUNMRGlyZWN0aXZlLCBBQ0xJZkRpcmVjdGl2ZV07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IENPTVBPTkVOVFMsXG4gIGV4cG9ydHM6IENPTVBPTkVOVFNcbn0pXG5leHBvcnQgY2xhc3MgWWVsb25BQ0xNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFllbG9uQUNMTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBZZWxvbkFDTE1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW0FDTFNlcnZpY2VdXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { ACL_DEFAULT_CONFIG } from './acl.config';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@yelon/util/config";
|
|
6
|
-
/**
|
|
7
|
-
* ACL 控制服务,[在线文档](https://ng.yunzainfo.com/acl)
|
|
8
|
-
*
|
|
9
|
-
* 务必在根目录注册 `YelonACLModule.forRoot()` 才能使用服务
|
|
10
|
-
*/
|
|
11
|
-
export class ACLService {
|
|
12
|
-
/** ACL变更通知 */
|
|
13
|
-
get change() {
|
|
14
|
-
return this.aclChange.asObservable();
|
|
15
|
-
}
|
|
16
|
-
/** 获取所有数据 */
|
|
17
|
-
get data() {
|
|
18
|
-
return {
|
|
19
|
-
full: this.full,
|
|
20
|
-
roles: this.roles,
|
|
21
|
-
abilities: this.abilities
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
get guard_url() {
|
|
25
|
-
return this.options.guard_url;
|
|
26
|
-
}
|
|
27
|
-
constructor(configSrv) {
|
|
28
|
-
this.roles = [];
|
|
29
|
-
this.abilities = [];
|
|
30
|
-
this.full = false;
|
|
31
|
-
this.aclChange = new BehaviorSubject(null);
|
|
32
|
-
this.options = configSrv.merge('acl', ACL_DEFAULT_CONFIG);
|
|
33
|
-
}
|
|
34
|
-
parseACLType(val) {
|
|
35
|
-
let t;
|
|
36
|
-
if (typeof val === 'number') {
|
|
37
|
-
t = { ability: [val] };
|
|
38
|
-
}
|
|
39
|
-
else if (Array.isArray(val) && val.length > 0 && typeof val[0] === 'number') {
|
|
40
|
-
t = { ability: val };
|
|
41
|
-
}
|
|
42
|
-
else if (typeof val === 'object' && !Array.isArray(val)) {
|
|
43
|
-
t = { ...val };
|
|
44
|
-
}
|
|
45
|
-
else if (Array.isArray(val)) {
|
|
46
|
-
t = { role: val };
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
t = { role: val == null ? [] : [val] };
|
|
50
|
-
}
|
|
51
|
-
return { except: false, ...t };
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 设置当前用户角色或权限能力(会先清除所有)
|
|
55
|
-
*/
|
|
56
|
-
set(value) {
|
|
57
|
-
this.full = false;
|
|
58
|
-
this.abilities = [];
|
|
59
|
-
this.roles = [];
|
|
60
|
-
this.add(value);
|
|
61
|
-
this.aclChange.next(value);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* 标识当前用户为全量,即不受限
|
|
65
|
-
*/
|
|
66
|
-
setFull(val) {
|
|
67
|
-
this.full = val;
|
|
68
|
-
this.aclChange.next(val);
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* 设置当前用户权限能力(会先清除所有)
|
|
72
|
-
*/
|
|
73
|
-
setAbility(abilities) {
|
|
74
|
-
this.set({ ability: abilities });
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* 设置当前用户角色(会先清除所有)
|
|
78
|
-
*/
|
|
79
|
-
setRole(roles) {
|
|
80
|
-
this.set({ role: roles });
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 为当前用户增加角色或权限能力
|
|
84
|
-
*/
|
|
85
|
-
add(value) {
|
|
86
|
-
if (value.role && value.role.length > 0) {
|
|
87
|
-
this.roles.push(...value.role);
|
|
88
|
-
}
|
|
89
|
-
if (value.ability && value.ability.length > 0) {
|
|
90
|
-
this.abilities.push(...value.ability);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* 为当前用户附加角色
|
|
95
|
-
*/
|
|
96
|
-
attachRole(roles) {
|
|
97
|
-
for (const val of roles) {
|
|
98
|
-
if (!this.roles.includes(val)) {
|
|
99
|
-
this.roles.push(val);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
this.aclChange.next(this.data);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* 为当前用户附加权限
|
|
106
|
-
*/
|
|
107
|
-
attachAbility(abilities) {
|
|
108
|
-
for (const val of abilities) {
|
|
109
|
-
if (!this.abilities.includes(val)) {
|
|
110
|
-
this.abilities.push(val);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
this.aclChange.next(this.data);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* 为当前用户移除角色
|
|
117
|
-
*/
|
|
118
|
-
removeRole(roles) {
|
|
119
|
-
for (const val of roles) {
|
|
120
|
-
const idx = this.roles.indexOf(val);
|
|
121
|
-
if (idx !== -1) {
|
|
122
|
-
this.roles.splice(idx, 1);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
this.aclChange.next(this.data);
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* 为当前用户移除权限
|
|
129
|
-
*/
|
|
130
|
-
removeAbility(abilities) {
|
|
131
|
-
for (const val of abilities) {
|
|
132
|
-
const idx = this.abilities.indexOf(val);
|
|
133
|
-
if (idx !== -1) {
|
|
134
|
-
this.abilities.splice(idx, 1);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
this.aclChange.next(this.data);
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* 当前用户是否有对应角色,其实 `number` 表示Ability
|
|
141
|
-
*
|
|
142
|
-
* - 当 `full: true` 或参数 `null` 时返回 `true`
|
|
143
|
-
* - 若使用 `ACLType` 参数,可以指定 `mode` 校验模式
|
|
144
|
-
*/
|
|
145
|
-
can(roleOrAbility) {
|
|
146
|
-
const { preCan } = this.options;
|
|
147
|
-
if (preCan) {
|
|
148
|
-
roleOrAbility = preCan(roleOrAbility);
|
|
149
|
-
}
|
|
150
|
-
const t = this.parseACLType(roleOrAbility);
|
|
151
|
-
let result = false;
|
|
152
|
-
if (this.full === true || !roleOrAbility) {
|
|
153
|
-
result = true;
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
if (t.role && t.role.length > 0) {
|
|
157
|
-
if (t.mode === 'allOf') {
|
|
158
|
-
result = t.role.every(v => this.roles.includes(v));
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
result = t.role.some(v => this.roles.includes(v));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
if (t.ability && t.ability.length > 0) {
|
|
165
|
-
if (t.mode === 'allOf') {
|
|
166
|
-
result = t.ability.every(v => this.abilities.includes(v));
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
result = t.ability.some(v => this.abilities.includes(v));
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return t.except === true ? !result : result;
|
|
174
|
-
}
|
|
175
|
-
/** @inner */
|
|
176
|
-
parseAbility(value) {
|
|
177
|
-
if (typeof value === 'number' || typeof value === 'string' || Array.isArray(value)) {
|
|
178
|
-
value = { ability: Array.isArray(value) ? value : [value] };
|
|
179
|
-
}
|
|
180
|
-
delete value.role;
|
|
181
|
-
return value;
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* 当前用户是否有对应权限点
|
|
185
|
-
*/
|
|
186
|
-
canAbility(value) {
|
|
187
|
-
return this.can(this.parseAbility(value));
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
ACLService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLService, deps: [{ token: i1.YunzaiConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
191
|
-
ACLService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLService });
|
|
192
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ACLService, decorators: [{
|
|
193
|
-
type: Injectable
|
|
194
|
-
}], ctorParameters: function () { return [{ type: i1.YunzaiConfigService }]; } });
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hY2wvc3JjL2FjbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUluRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7OztBQUdsRDs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLFVBQVU7SUFPckIsY0FBYztJQUNkLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsYUFBYTtJQUNiLElBQUksSUFBSTtRQUNOLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWSxTQUE4QjtRQXZCbEMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixjQUFTLEdBQTJCLEVBQUUsQ0FBQztRQUN2QyxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsY0FBUyxHQUFHLElBQUksZUFBZSxDQUEyQixJQUFJLENBQUMsQ0FBQztRQXFCdEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBRSxDQUFDO0lBQzdELENBQUM7SUFFTyxZQUFZLENBQUMsR0FBMkQ7UUFDOUUsSUFBSSxDQUFVLENBQUM7UUFDZixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUMz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LENBQUMsQ0FBQztpQkFDdkY7cUJBQU07b0JBQ0wsTUFBTSxHQUFJLENBQUMsQ0FBQyxPQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3RGO2FBQ0Y7U0FDRjtRQUVELE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsQ0FBQztJQUVELGFBQWE7SUFDYixZQUFZLENBQUMsS0FBaUI7UUFDNUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEYsS0FBSyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBYSxDQUFDO1NBQ3hFO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLEtBQWlCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7dUdBL0xVLFVBQVU7MkdBQVYsVUFBVTsyRkFBVixVQUFVO2tCQUR0QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFl1bnphaUFDTENvbmZpZywgWXVuemFpQ29uZmlnU2VydmljZSB9IGZyb20gJ0B5ZWxvbi91dGlsL2NvbmZpZyc7XG5cbmltcG9ydCB7IEFDTF9ERUZBVUxUX0NPTkZJRyB9IGZyb20gJy4vYWNsLmNvbmZpZyc7XG5pbXBvcnQgeyBBQ0xDYW5UeXBlLCBBQ0xUeXBlIH0gZnJvbSAnLi9hY2wudHlwZSc7XG5cbi8qKlxuICogQUNMIOaOp+WItuacjeWKoe+8jFvlnKjnur/mlofmoaNdKGh0dHBzOi8vbmcueXVuemFpbmZvLmNvbS9hY2wpXG4gKlxuICog5Yqh5b+F5Zyo5qC555uu5b2V5rOo5YaMIGBZZWxvbkFDTE1vZHVsZS5mb3JSb290KClgIOaJjeiDveS9v+eUqOacjeWKoVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQUNMU2VydmljZSB7XG4gIHByaXZhdGUgb3B0aW9uczogWXVuemFpQUNMQ29uZmlnO1xuICBwcml2YXRlIHJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGFiaWxpdGllczogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPiA9IFtdO1xuICBwcml2YXRlIGZ1bGwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY2xDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFDTFR5cGUgfCBib29sZWFuIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIEFDTOWPmOabtOmAmuefpSAqL1xuICBnZXQgY2hhbmdlKCk6IE9ic2VydmFibGU8QUNMVHlwZSB8IGJvb2xlYW4gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuYWNsQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIOiOt+WPluaJgOacieaVsOaNriAqL1xuICBnZXQgZGF0YSgpOiB7IGZ1bGw6IGJvb2xlYW47IHJvbGVzOiBzdHJpbmdbXTsgYWJpbGl0aWVzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBmdWxsOiB0aGlzLmZ1bGwsXG4gICAgICByb2xlczogdGhpcy5yb2xlcyxcbiAgICAgIGFiaWxpdGllczogdGhpcy5hYmlsaXRpZXNcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGd1YXJkX3VybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VhcmRfdXJsITtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ1NydjogWXVuemFpQ29uZmlnU2VydmljZSkge1xuICAgIHRoaXMub3B0aW9ucyA9IGNvbmZpZ1Nydi5tZXJnZSgnYWNsJywgQUNMX0RFRkFVTFRfQ09ORklHKSE7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQUNMVHlwZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVtYmVyIHwgbnVtYmVyW10gfCBBQ0xUeXBlIHwgbnVsbCk6IEFDTFR5cGUge1xuICAgIGxldCB0OiBBQ0xUeXBlO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgdCA9IHsgYWJpbGl0eTogW3ZhbF0gfTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgdCA9IHsgYWJpbGl0eTogdmFsIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB0ID0geyAuLi52YWwgfTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdCA9IHsgcm9sZTogdmFsIGFzIHN0cmluZ1tdIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHQgPSB7IHJvbGU6IHZhbCA9PSBudWxsID8gW10gOiBbdmFsXSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGV4Y2VwdDogZmFsc2UsIC4uLnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7lvZPliY3nlKjmiLfop5LoibLmiJbmnYPpmZDog73lipvvvIjkvJrlhYjmuIXpmaTmiYDmnInvvIlcbiAgICovXG4gIHNldCh2YWx1ZTogQUNMVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuZnVsbCA9IGZhbHNlO1xuICAgIHRoaXMuYWJpbGl0aWVzID0gW107XG4gICAgdGhpcy5yb2xlcyA9IFtdO1xuICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICB0aGlzLmFjbENoYW5nZS5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoIfor4blvZPliY3nlKjmiLfkuLrlhajph4/vvIzljbPkuI3lj5fpmZBcbiAgICovXG4gIHNldEZ1bGwodmFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5mdWxsID0gdmFsO1xuICAgIHRoaXMuYWNsQ2hhbmdlLm5leHQodmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7lvZPliY3nlKjmiLfmnYPpmZDog73lipvvvIjkvJrlhYjmuIXpmaTmiYDmnInvvIlcbiAgICovXG4gIHNldEFiaWxpdHkoYWJpbGl0aWVzOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5zZXQoeyBhYmlsaXR5OiBhYmlsaXRpZXMgfSBhcyBBQ0xUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7lvZPliY3nlKjmiLfop5LoibLvvIjkvJrlhYjmuIXpmaTmiYDmnInvvIlcbiAgICovXG4gIHNldFJvbGUocm9sZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5zZXQoeyByb2xlOiByb2xlcyB9IGFzIEFDTFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS4uuW9k+WJjeeUqOaIt+WinuWKoOinkuiJsuaIluadg+mZkOiDveWKm1xuICAgKi9cbiAgYWRkKHZhbHVlOiBBQ0xUeXBlKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLnJvbGUgJiYgdmFsdWUucm9sZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvbGVzLnB1c2goLi4udmFsdWUucm9sZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5hYmlsaXR5ICYmIHZhbHVlLmFiaWxpdHkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hYmlsaXRpZXMucHVzaCguLi52YWx1ZS5hYmlsaXR5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Li65b2T5YmN55So5oi36ZmE5Yqg6KeS6ImyXG4gICAqL1xuICBhdHRhY2hSb2xlKHJvbGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHJvbGVzKSB7XG4gICAgICBpZiAoIXRoaXMucm9sZXMuaW5jbHVkZXModmFsKSkge1xuICAgICAgICB0aGlzLnJvbGVzLnB1c2godmFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hY2xDaGFuZ2UubmV4dCh0aGlzLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS4uuW9k+WJjeeUqOaIt+mZhOWKoOadg+mZkFxuICAgKi9cbiAgYXR0YWNoQWJpbGl0eShhYmlsaXRpZXM6IEFycmF5PG51bWJlciB8IHN0cmluZz4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBhYmlsaXRpZXMpIHtcbiAgICAgIGlmICghdGhpcy5hYmlsaXRpZXMuaW5jbHVkZXModmFsKSkge1xuICAgICAgICB0aGlzLmFiaWxpdGllcy5wdXNoKHZhbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWNsQ2hhbmdlLm5leHQodGhpcy5kYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkuLrlvZPliY3nlKjmiLfnp7vpmaTop5LoibJcbiAgICovXG4gIHJlbW92ZVJvbGUocm9sZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB2YWwgb2Ygcm9sZXMpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMucm9sZXMuaW5kZXhPZih2YWwpO1xuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5yb2xlcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hY2xDaGFuZ2UubmV4dCh0aGlzLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS4uuW9k+WJjeeUqOaIt+enu+mZpOadg+mZkFxuICAgKi9cbiAgcmVtb3ZlQWJpbGl0eShhYmlsaXRpZXM6IEFycmF5PG51bWJlciB8IHN0cmluZz4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBhYmlsaXRpZXMpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuYWJpbGl0aWVzLmluZGV4T2YodmFsKTtcbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuYWJpbGl0aWVzLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFjbENoYW5nZS5uZXh0KHRoaXMuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICog5b2T5YmN55So5oi35piv5ZCm5pyJ5a+55bqU6KeS6Imy77yM5YW25a6eIGBudW1iZXJgIOihqOekukFiaWxpdHlcbiAgICpcbiAgICogLSDlvZMgYGZ1bGw6IHRydWVgIOaIluWPguaVsCBgbnVsbGAg5pe26L+U5ZueIGB0cnVlYFxuICAgKiAtIOiLpeS9v+eUqCBgQUNMVHlwZWAg5Y+C5pWw77yM5Y+v5Lul5oyH5a6aIGBtb2RlYCDmoKHpqozmqKHlvI9cbiAgICovXG4gIGNhbihyb2xlT3JBYmlsaXR5OiBBQ0xDYW5UeXBlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgcHJlQ2FuIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHByZUNhbikge1xuICAgICAgcm9sZU9yQWJpbGl0eSA9IHByZUNhbihyb2xlT3JBYmlsaXR5ISk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IHRoaXMucGFyc2VBQ0xUeXBlKHJvbGVPckFiaWxpdHkpO1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5mdWxsID09PSB0cnVlIHx8ICFyb2xlT3JBYmlsaXR5KSB7XG4gICAgICByZXN1bHQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodC5yb2xlICYmIHQucm9sZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh0Lm1vZGUgPT09ICdhbGxPZicpIHtcbiAgICAgICAgICByZXN1bHQgPSB0LnJvbGUuZXZlcnkodiA9PiB0aGlzLnJvbGVzLmluY2x1ZGVzKHYpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB0LnJvbGUuc29tZSh2ID0+IHRoaXMucm9sZXMuaW5jbHVkZXModikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodC5hYmlsaXR5ICYmIHQuYWJpbGl0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh0Lm1vZGUgPT09ICdhbGxPZicpIHtcbiAgICAgICAgICByZXN1bHQgPSAodC5hYmlsaXR5IGFzIEFycmF5PG51bWJlciB8IHN0cmluZz4pLmV2ZXJ5KHYgPT4gdGhpcy5hYmlsaXRpZXMuaW5jbHVkZXModikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9ICh0LmFiaWxpdHkgYXMgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPikuc29tZSh2ID0+IHRoaXMuYWJpbGl0aWVzLmluY2x1ZGVzKHYpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0LmV4Y2VwdCA9PT0gdHJ1ZSA/ICFyZXN1bHQgOiByZXN1bHQ7XG4gIH1cblxuICAvKiogQGlubmVyICovXG4gIHBhcnNlQWJpbGl0eSh2YWx1ZTogQUNMQ2FuVHlwZSk6IEFDTENhblR5cGUge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0geyBhYmlsaXR5OiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSB9IGFzIEFDTFR5cGU7XG4gICAgfVxuICAgIGRlbGV0ZSB2YWx1ZS5yb2xlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvZPliY3nlKjmiLfmmK/lkKbmnInlr7nlupTmnYPpmZDngrlcbiAgICovXG4gIGNhbkFiaWxpdHkodmFsdWU6IEFDTENhblR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYW4odGhpcy5wYXJzZUFiaWxpdHkodmFsdWUpKTtcbiAgfVxufVxuIl19
|