@casl/angular 8.2.8 → 9.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.
@@ -1,8 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, Inject, NgModule, Injectable } from '@angular/core';
2
+ import { Pipe, Inject, Injectable, signal, inject } from '@angular/core';
3
3
  import { PureAbility } from '@casl/ability';
4
4
  import { Observable } from 'rxjs';
5
5
 
6
+ /**
7
+ * @deprecated use AbilityService instead
8
+ */
6
9
  var AblePipe = /** @class */ (function () {
7
10
  function AblePipe(ability) {
8
11
  this._ability = ability;
@@ -16,21 +19,23 @@ var AblePipe = /** @class */ (function () {
16
19
  return (_a = this._ability).can.apply(_a, args);
17
20
  };
18
21
  AblePipe.ɵfac = function AblePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AblePipe)(i0.ɵɵdirectiveInject(PureAbility, 16)); };
19
- AblePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "able", type: AblePipe, pure: false });
22
+ AblePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "able", type: AblePipe, pure: false, standalone: true });
20
23
  return AblePipe;
21
24
  }());
22
25
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AblePipe, [{
23
26
  type: Pipe,
24
- args: [{ name: 'able', pure: false }]
27
+ args: [{ name: 'able', pure: false, standalone: true }]
25
28
  }], function () { return [{ type: undefined, decorators: [{
26
29
  type: Inject,
27
30
  args: [PureAbility]
28
31
  }] }]; }, null); })();
32
+ /**
33
+ * @deprecated use AbilityService instead
34
+ */
29
35
  var AblePurePipe = /** @class */ (function () {
30
36
  function AblePurePipe(ability) {
31
37
  this._ability = ability;
32
38
  }
33
- // TODO: use computed signals https://github.com/angular/angular/issues/47553
34
39
  AblePurePipe.prototype.transform = function () {
35
40
  var _this = this;
36
41
  var args = [];
@@ -47,60 +52,75 @@ var AblePurePipe = /** @class */ (function () {
47
52
  });
48
53
  };
49
54
  AblePurePipe.ɵfac = function AblePurePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AblePurePipe)(i0.ɵɵdirectiveInject(PureAbility, 16)); };
50
- AblePurePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "ablePure", type: AblePurePipe, pure: true });
55
+ AblePurePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "ablePure", type: AblePurePipe, pure: true, standalone: true });
51
56
  return AblePurePipe;
52
57
  }());
53
58
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AblePurePipe, [{
54
59
  type: Pipe,
55
- args: [{ name: 'ablePure' }]
60
+ args: [{ name: 'ablePure', standalone: true }]
56
61
  }], function () { return [{ type: undefined, decorators: [{
57
62
  type: Inject,
58
63
  args: [PureAbility]
59
64
  }] }]; }, null); })();
60
65
 
61
- var AbilityModule = /** @class */ (function () {
62
- function AbilityModule() {
63
- }
64
- AbilityModule.ɵfac = function AbilityModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityModule)(); };
65
- AbilityModule.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: AbilityModule });
66
- AbilityModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({});
67
- return AbilityModule;
68
- }());
69
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AbilityModule, [{
70
- type: NgModule,
71
- args: [{
72
- declarations: [
73
- AblePipe,
74
- AblePurePipe,
75
- ],
76
- exports: [
77
- AblePipe,
78
- AblePurePipe,
79
- ],
80
- }]
81
- }], null, null); })();
82
- (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(AbilityModule, { declarations: [AblePipe,
83
- AblePurePipe], exports: [AblePipe,
84
- AblePurePipe] }); })();
85
-
86
66
  var AbilityService = /** @class */ (function () {
87
67
  function AbilityService(ability) {
88
- // IGNORE: this comment. it's for release debugging
89
68
  this.ability$ = new Observable(function (observer) {
90
69
  observer.next(ability);
91
70
  return ability.on('updated', function () { return observer.next(ability); });
92
71
  });
93
72
  }
94
73
  AbilityService.ɵfac = function AbilityService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityService)(i0.ɵɵinject(PureAbility)); };
95
- AbilityService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AbilityService, factory: AbilityService.ɵfac });
74
+ AbilityService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AbilityService, factory: AbilityService.ɵfac, providedIn: 'root' });
96
75
  return AbilityService;
97
76
  }());
98
77
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AbilityService, [{
99
- type: Injectable
78
+ type: Injectable,
79
+ args: [{ providedIn: 'root' }]
100
80
  }], function () { return [{ type: undefined, decorators: [{
101
81
  type: Inject,
102
82
  args: [PureAbility]
103
83
  }] }]; }, null); })();
104
84
 
105
- export { AbilityModule, AbilityService, AblePipe, AblePurePipe };
85
+ var AbilityServiceSignal = /** @class */ (function () {
86
+ function AbilityServiceSignal() {
87
+ var _this = this;
88
+ this._rules = signal([]);
89
+ this._ability = inject(PureAbility);
90
+ this.can = function () {
91
+ var _a;
92
+ var args = [];
93
+ for (var _i = 0; _i < arguments.length; _i++) {
94
+ args[_i] = arguments[_i];
95
+ }
96
+ _this._rules(); // generate side effect for angular to track changes in this signal
97
+ return (_a = _this._ability).can.apply(_a, args);
98
+ };
99
+ this.cannot = function () {
100
+ var args = [];
101
+ for (var _i = 0; _i < arguments.length; _i++) {
102
+ args[_i] = arguments[_i];
103
+ }
104
+ return !_this.can.apply(_this, args);
105
+ };
106
+ this._disposeAbilitySubscription = this._ability.on('updated', function (event) {
107
+ _this._rules.set(event.rules);
108
+ });
109
+ }
110
+ AbilityServiceSignal.prototype.ngOnDestroy = function () {
111
+ this._disposeAbilitySubscription();
112
+ };
113
+ AbilityServiceSignal.prototype.update = function (rules) {
114
+ this._ability.update(rules);
115
+ };
116
+ AbilityServiceSignal.ɵfac = function AbilityServiceSignal_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityServiceSignal)(); };
117
+ AbilityServiceSignal.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AbilityServiceSignal, factory: AbilityServiceSignal.ɵfac, providedIn: 'root' });
118
+ return AbilityServiceSignal;
119
+ }());
120
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AbilityServiceSignal, [{
121
+ type: Injectable,
122
+ args: [{ providedIn: 'root' }]
123
+ }], function () { return []; }, null); })();
124
+
125
+ export { AbilityService, AbilityServiceSignal, AblePipe, AblePurePipe };
106
126
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/pipes.ts","../../src/AbilityModule.ts","../../src/AbilityService.ts"],"sourcesContent":["import { Pipe, Inject, PipeTransform } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Pipe({ name: 'able', pure: false })\nexport class AblePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): boolean {\n return this._ability.can(...args);\n }\n}\n\n@Pipe({ name: 'ablePure' })\nexport class AblePurePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n // TODO: use computed signals https://github.com/angular/angular/issues/47553\n transform(...args: Parameters<T['can']>): Observable<boolean> {\n return new Observable((s) => {\n const emit = () => s.next(this._ability.can(...args));\n emit();\n return this._ability.on('updated', emit);\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { AblePipe, AblePurePipe } from './pipes';\n\n@NgModule({\n declarations: [\n AblePipe,\n AblePurePipe,\n ],\n exports: [\n AblePipe,\n AblePurePipe,\n ],\n})\nexport class AbilityModule {\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class AbilityService<T extends AnyAbility> {\n readonly ability$: Observable<T>;\n\n constructor(@Inject(PureAbility) ability: T) {\n // IGNORE: this comment. it's for release debugging\n this.ability$ = new Observable((observer) => {\n observer.next(ability);\n return ability.on('updated', () => observer.next(ability));\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/pipes.ts","../../src/AbilityService.ts","../../src/AbilityServiceSignal.ts"],"sourcesContent":["import { Pipe, Inject, PipeTransform } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n/**\n * @deprecated use AbilityService instead\n */\n@Pipe({ name: 'able', pure: false, standalone: true })\nexport class AblePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): boolean {\n return this._ability.can(...args);\n }\n}\n\n/**\n * @deprecated use AbilityService instead\n */\n@Pipe({ name: 'ablePure', standalone: true })\nexport class AblePurePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): Observable<boolean> {\n return new Observable((s) => {\n const emit = () => s.next(this._ability.can(...args));\n emit();\n return this._ability.on('updated', emit);\n });\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { AnyAbility, PureAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class AbilityService<T extends AnyAbility> {\n readonly ability$: Observable<T>;\n\n constructor(@Inject(PureAbility) ability: T) {\n this.ability$ = new Observable((observer) => {\n observer.next(ability);\n return ability.on('updated', () => observer.next(ability));\n });\n }\n}\n","import { inject, Injectable, OnDestroy, signal } from \"@angular/core\";\nimport { AnyAbility, PureAbility, RawRuleOf } from \"@casl/ability\";\n\n@Injectable({ providedIn: 'root' })\nexport class AbilityServiceSignal<T extends AnyAbility> implements OnDestroy {\n private readonly _rules = signal<RawRuleOf<T>[]>([]);\n private readonly _ability = inject(PureAbility) as unknown as T;\n private readonly _disposeAbilitySubscription: () => void;\n\n constructor() {\n this._disposeAbilitySubscription = this._ability.on('updated', (event) => {\n this._rules.set(event.rules as any);\n });\n }\n\n ngOnDestroy(): void {\n this._disposeAbilitySubscription();\n }\n\n can = (...args: Parameters<T['can']>): boolean => {\n this._rules(); // generate side effect for angular to track changes in this signal\n return this._ability.can(...args);\n };\n\n cannot = (...args: Parameters<T['can']>): boolean => {\n return !this.can(...args);\n };\n\n update(rules: T['rules']): void {\n this._ability.update(rules);\n }\n}"],"names":[],"mappings":";;;;;AAIA;;AAEG;AACH,IAAA,QAAA,kBAAA,YAAA;AAIE,IAAA,SAAA,QAAA,CAAiC,OAAU,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;KACzB;AAED,IAAA,QAAA,CAAA,SAAA,CAAA,SAAS,GAAT,YAAA;;QAAU,IAA6B,IAAA,GAAA,EAAA,CAAA;aAA7B,IAA6B,EAAA,GAAA,CAAA,EAA7B,EAA6B,GAAA,SAAA,CAAA,MAAA,EAA7B,EAA6B,EAAA,EAAA;YAA7B,IAA6B,CAAA,EAAA,CAAA,GAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;QACrC,OAAO,CAAA,EAAA,GAAA,IAAI,CAAC,QAAQ,EAAC,GAAG,CAAI,KAAA,CAAA,EAAA,EAAA,IAAI,CAAE,CAAA;KACnC,CAAA;AATU,IAAA,QAAA,CAAA,IAAA,GAAA,SAAA,gBAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,KAAA,iBAAA,IAAA,QAAQ,uBAGC,WAAW,EAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA;yEAHpB,QAAQ,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,IAAA,EAAA,CAAA,CAAA;AARrB,IAAA,OAAA,QAAA,CAAA;AAkBC,CAXD,EAWC,EAAA;uFAVY,QAAQ,EAAA,CAAA;cADpB,IAAI;eAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;;sBAItC,MAAM;uBAAC,WAAW,CAAA;;AASjC;;AAEG;AACH,IAAA,YAAA,kBAAA,YAAA;AAIE,IAAA,SAAA,YAAA,CAAiC,OAAU,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;KACzB;AAED,IAAA,YAAA,CAAA,SAAA,CAAA,SAAS,GAAT,YAAA;QAAA,IAMC,KAAA,GAAA,IAAA,CAAA;QANS,IAA6B,IAAA,GAAA,EAAA,CAAA;aAA7B,IAA6B,EAAA,GAAA,CAAA,EAA7B,EAA6B,GAAA,SAAA,CAAA,MAAA,EAA7B,EAA6B,EAAA,EAAA;YAA7B,IAA6B,CAAA,EAAA,CAAA,GAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;AACrC,QAAA,OAAO,IAAI,UAAU,CAAC,UAAC,CAAC,EAAA;AACtB,YAAA,IAAM,IAAI,GAAG,YAAA;;AAAM,gBAAA,OAAA,CAAC,CAAC,IAAI,CAAC,CAAA,EAAA,GAAA,KAAI,CAAC,QAAQ,EAAC,GAAG,CAAA,KAAA,CAAA,EAAA,EAAI,IAAI,CAAE,CAAA,CAAA;AAAlC,aAAkC,CAAC;AACtD,YAAA,IAAI,EAAE,CAAC;YACP,OAAO,KAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC3C,SAAC,CAAC,CAAC;KACJ,CAAA;AAbU,IAAA,YAAA,CAAA,IAAA,GAAA,SAAA,oBAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,KAAA,iBAAA,IAAA,YAAY,uBAGH,WAAW,EAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA;iFAHpB,YAAY,EAAA,IAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,CAAA,CAAA;AAxBzB,IAAA,OAAA,YAAA,CAAA;AAsCC,CAfD,EAeC,EAAA;uFAdY,YAAY,EAAA,CAAA;cADxB,IAAI;AAAC,QAAA,IAAA,EAAA,CAAA,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;;sBAI7B,MAAM;uBAAC,WAAW,CAAA;;;ACvBjC,IAAA,cAAA,kBAAA,YAAA;AAIE,IAAA,SAAA,cAAA,CAAiC,OAAU,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,UAAU,CAAC,UAAC,QAAQ,EAAA;AACtC,YAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,YAAA,OAAO,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,YAAM,EAAA,OAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAtB,EAAsB,CAAC,CAAC;AAC7D,SAAC,CAAC,CAAC;KACJ;AARU,IAAA,cAAA,CAAA,IAAA,GAAA,SAAA,sBAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,KAAA,iBAAA,IAAA,cAAc,cAGL,WAAW,CAAA,CAAA,CAAA,EAAA,CAAA;wEAHpB,cAAc,EAAA,OAAA,EAAd,cAAc,CAAA,IAAA,EAAA,UAAA,EADD,MAAM,EAAA,CAAA,CAAA;AAJhC,IAAA,OAAA,cAAA,CAAA;AAcC,CAVD,EAUC,EAAA;uFATY,cAAc,EAAA,CAAA;cAD1B,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;sBAInB,MAAM;uBAAC,WAAW,CAAA;;;ACLjC,IAAA,oBAAA,kBAAA,YAAA;AAME,IAAA,SAAA,oBAAA,GAAA;QAAA,IAIC,KAAA,GAAA,IAAA,CAAA;AARgB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAiB,EAAE,CAAC,CAAC;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAiB,CAAC;AAahE,QAAA,IAAA,CAAA,GAAG,GAAG,YAAA;;YAAC,IAA6B,IAAA,GAAA,EAAA,CAAA;iBAA7B,IAA6B,EAAA,GAAA,CAAA,EAA7B,EAA6B,GAAA,SAAA,CAAA,MAAA,EAA7B,EAA6B,EAAA,EAAA;gBAA7B,IAA6B,CAAA,EAAA,CAAA,GAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;AAClC,YAAA,KAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,CAAA,EAAA,GAAA,KAAI,CAAC,QAAQ,EAAC,GAAG,CAAI,KAAA,CAAA,EAAA,EAAA,IAAI,CAAE,CAAA;AACpC,SAAC,CAAC;AAEF,QAAA,IAAA,CAAA,MAAM,GAAG,YAAA;YAAC,IAA6B,IAAA,GAAA,EAAA,CAAA;iBAA7B,IAA6B,EAAA,GAAA,CAAA,EAA7B,EAA6B,GAAA,SAAA,CAAA,MAAA,EAA7B,EAA6B,EAAA,EAAA;gBAA7B,IAA6B,CAAA,EAAA,CAAA,GAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;YACrC,OAAO,CAAC,KAAI,CAAC,GAAG,OAAR,KAAI,EAAQ,IAAI,CAAC,CAAC;AAC5B,SAAC,CAAC;AAhBA,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,UAAC,KAAK,EAAA;YACnE,KAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAY,CAAC,CAAC;AACtC,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,oBAAA,CAAA,SAAA,CAAA,WAAW,GAAX,YAAA;QACE,IAAI,CAAC,2BAA2B,EAAE,CAAC;KACpC,CAAA;IAWD,oBAAM,CAAA,SAAA,CAAA,MAAA,GAAN,UAAO,KAAiB,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC7B,CAAA;4HA1BU,oBAAoB,GAAA,CAAA,EAAA,CAAA;8EAApB,oBAAoB,EAAA,OAAA,EAApB,oBAAoB,CAAA,IAAA,EAAA,UAAA,EADP,MAAM,EAAA,CAAA,CAAA;AAHhC,IAAA,OAAA,oBAAA,CAAA;AA+BC,CA5BD,EA4BC,EAAA;uFA3BY,oBAAoB,EAAA,CAAA;cADhC,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;;;"}
@@ -1,8 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, Inject, NgModule, Injectable } from '@angular/core';
2
+ import { Pipe, Inject, Injectable, signal, inject } from '@angular/core';
3
3
  import { PureAbility } from '@casl/ability';
4
4
  import { Observable } from 'rxjs';
5
5
 
6
+ /**
7
+ * @deprecated use AbilityService instead
8
+ */
6
9
  class AblePipe {
7
10
  constructor(ability) {
8
11
  this._ability = ability;
@@ -12,19 +15,21 @@ class AblePipe {
12
15
  }
13
16
  }
14
17
  AblePipe.ɵfac = function AblePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AblePipe)(i0.ɵɵdirectiveInject(PureAbility, 16)); };
15
- AblePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "able", type: AblePipe, pure: false });
18
+ AblePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "able", type: AblePipe, pure: false, standalone: true });
16
19
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AblePipe, [{
17
20
  type: Pipe,
18
- args: [{ name: 'able', pure: false }]
21
+ args: [{ name: 'able', pure: false, standalone: true }]
19
22
  }], () => [{ type: undefined, decorators: [{
20
23
  type: Inject,
21
24
  args: [PureAbility]
22
25
  }] }], null); })();
26
+ /**
27
+ * @deprecated use AbilityService instead
28
+ */
23
29
  class AblePurePipe {
24
30
  constructor(ability) {
25
31
  this._ability = ability;
26
32
  }
27
- // TODO: use computed signals https://github.com/angular/angular/issues/47553
28
33
  transform(...args) {
29
34
  return new Observable((s) => {
30
35
  const emit = () => s.next(this._ability.can(...args));
@@ -34,40 +39,17 @@ class AblePurePipe {
34
39
  }
35
40
  }
36
41
  AblePurePipe.ɵfac = function AblePurePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AblePurePipe)(i0.ɵɵdirectiveInject(PureAbility, 16)); };
37
- AblePurePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "ablePure", type: AblePurePipe, pure: true });
42
+ AblePurePipe.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "ablePure", type: AblePurePipe, pure: true, standalone: true });
38
43
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AblePurePipe, [{
39
44
  type: Pipe,
40
- args: [{ name: 'ablePure' }]
45
+ args: [{ name: 'ablePure', standalone: true }]
41
46
  }], () => [{ type: undefined, decorators: [{
42
47
  type: Inject,
43
48
  args: [PureAbility]
44
49
  }] }], null); })();
45
50
 
46
- class AbilityModule {
47
- }
48
- AbilityModule.ɵfac = function AbilityModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityModule)(); };
49
- AbilityModule.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: AbilityModule });
50
- AbilityModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({});
51
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AbilityModule, [{
52
- type: NgModule,
53
- args: [{
54
- declarations: [
55
- AblePipe,
56
- AblePurePipe,
57
- ],
58
- exports: [
59
- AblePipe,
60
- AblePurePipe,
61
- ],
62
- }]
63
- }], null, null); })();
64
- (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(AbilityModule, { declarations: [AblePipe,
65
- AblePurePipe], exports: [AblePipe,
66
- AblePurePipe] }); })();
67
-
68
51
  class AbilityService {
69
52
  constructor(ability) {
70
- // IGNORE: this comment. it's for release debugging
71
53
  this.ability$ = new Observable((observer) => {
72
54
  observer.next(ability);
73
55
  return ability.on('updated', () => observer.next(ability));
@@ -75,13 +57,43 @@ class AbilityService {
75
57
  }
76
58
  }
77
59
  AbilityService.ɵfac = function AbilityService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityService)(i0.ɵɵinject(PureAbility)); };
78
- AbilityService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AbilityService, factory: AbilityService.ɵfac });
60
+ AbilityService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AbilityService, factory: AbilityService.ɵfac, providedIn: 'root' });
79
61
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AbilityService, [{
80
- type: Injectable
62
+ type: Injectable,
63
+ args: [{ providedIn: 'root' }]
81
64
  }], () => [{ type: undefined, decorators: [{
82
65
  type: Inject,
83
66
  args: [PureAbility]
84
67
  }] }], null); })();
85
68
 
86
- export { AbilityModule, AbilityService, AblePipe, AblePurePipe };
69
+ class AbilityServiceSignal {
70
+ constructor() {
71
+ this._rules = signal([]);
72
+ this._ability = inject(PureAbility);
73
+ this.can = (...args) => {
74
+ this._rules(); // generate side effect for angular to track changes in this signal
75
+ return this._ability.can(...args);
76
+ };
77
+ this.cannot = (...args) => {
78
+ return !this.can(...args);
79
+ };
80
+ this._disposeAbilitySubscription = this._ability.on('updated', (event) => {
81
+ this._rules.set(event.rules);
82
+ });
83
+ }
84
+ ngOnDestroy() {
85
+ this._disposeAbilitySubscription();
86
+ }
87
+ update(rules) {
88
+ this._ability.update(rules);
89
+ }
90
+ }
91
+ AbilityServiceSignal.ɵfac = function AbilityServiceSignal_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityServiceSignal)(); };
92
+ AbilityServiceSignal.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AbilityServiceSignal, factory: AbilityServiceSignal.ɵfac, providedIn: 'root' });
93
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AbilityServiceSignal, [{
94
+ type: Injectable,
95
+ args: [{ providedIn: 'root' }]
96
+ }], () => [], null); })();
97
+
98
+ export { AbilityService, AbilityServiceSignal, AblePipe, AblePurePipe };
87
99
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/pipes.ts","../../src/AbilityModule.ts","../../src/AbilityService.ts"],"sourcesContent":["import { Pipe, Inject, PipeTransform } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Pipe({ name: 'able', pure: false })\nexport class AblePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): boolean {\n return this._ability.can(...args);\n }\n}\n\n@Pipe({ name: 'ablePure' })\nexport class AblePurePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n // TODO: use computed signals https://github.com/angular/angular/issues/47553\n transform(...args: Parameters<T['can']>): Observable<boolean> {\n return new Observable((s) => {\n const emit = () => s.next(this._ability.can(...args));\n emit();\n return this._ability.on('updated', emit);\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { AblePipe, AblePurePipe } from './pipes';\n\n@NgModule({\n declarations: [\n AblePipe,\n AblePurePipe,\n ],\n exports: [\n AblePipe,\n AblePurePipe,\n ],\n})\nexport class AbilityModule {\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class AbilityService<T extends AnyAbility> {\n readonly ability$: Observable<T>;\n\n constructor(@Inject(PureAbility) ability: T) {\n // IGNORE: this comment. it's for release debugging\n this.ability$ = new Observable((observer) => {\n observer.next(ability);\n return ability.on('updated', () => observer.next(ability));\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/pipes.ts","../../src/AbilityService.ts","../../src/AbilityServiceSignal.ts"],"sourcesContent":["import { Pipe, Inject, PipeTransform } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n/**\n * @deprecated use AbilityService instead\n */\n@Pipe({ name: 'able', pure: false, standalone: true })\nexport class AblePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): boolean {\n return this._ability.can(...args);\n }\n}\n\n/**\n * @deprecated use AbilityService instead\n */\n@Pipe({ name: 'ablePure', standalone: true })\nexport class AblePurePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): Observable<boolean> {\n return new Observable((s) => {\n const emit = () => s.next(this._ability.can(...args));\n emit();\n return this._ability.on('updated', emit);\n });\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { AnyAbility, PureAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class AbilityService<T extends AnyAbility> {\n readonly ability$: Observable<T>;\n\n constructor(@Inject(PureAbility) ability: T) {\n this.ability$ = new Observable((observer) => {\n observer.next(ability);\n return ability.on('updated', () => observer.next(ability));\n });\n }\n}\n","import { inject, Injectable, OnDestroy, signal } from \"@angular/core\";\nimport { AnyAbility, PureAbility, RawRuleOf } from \"@casl/ability\";\n\n@Injectable({ providedIn: 'root' })\nexport class AbilityServiceSignal<T extends AnyAbility> implements OnDestroy {\n private readonly _rules = signal<RawRuleOf<T>[]>([]);\n private readonly _ability = inject(PureAbility) as unknown as T;\n private readonly _disposeAbilitySubscription: () => void;\n\n constructor() {\n this._disposeAbilitySubscription = this._ability.on('updated', (event) => {\n this._rules.set(event.rules as any);\n });\n }\n\n ngOnDestroy(): void {\n this._disposeAbilitySubscription();\n }\n\n can = (...args: Parameters<T['can']>): boolean => {\n this._rules(); // generate side effect for angular to track changes in this signal\n return this._ability.can(...args);\n };\n\n cannot = (...args: Parameters<T['can']>): boolean => {\n return !this.can(...args);\n };\n\n update(rules: T['rules']): void {\n this._ability.update(rules);\n }\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { OnDestroy } from "@angular/core";
2
+ import { AnyAbility } from "@casl/ability";
3
+ import * as i0 from "@angular/core";
4
+ export declare class AbilityServiceSignal<T extends AnyAbility> implements OnDestroy {
5
+ private readonly _rules;
6
+ private readonly _ability;
7
+ private readonly _disposeAbilitySubscription;
8
+ constructor();
9
+ ngOnDestroy(): void;
10
+ can: (...args: Parameters<T["can"]>) => boolean;
11
+ cannot: (...args: Parameters<T["can"]>) => boolean;
12
+ update(rules: T['rules']): void;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<AbilityServiceSignal<any>, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<AbilityServiceSignal<any>>;
15
+ }
@@ -2,17 +2,23 @@ import { PipeTransform } from '@angular/core';
2
2
  import { AnyAbility } from '@casl/ability';
3
3
  import { Observable } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
5
+ /**
6
+ * @deprecated use AbilityService instead
7
+ */
5
8
  export declare class AblePipe<T extends AnyAbility> implements PipeTransform {
6
9
  private _ability;
7
10
  constructor(ability: T);
8
11
  transform(...args: Parameters<T['can']>): boolean;
9
12
  static ɵfac: i0.ɵɵFactoryDeclaration<AblePipe<any>, never>;
10
- static ɵpipe: i0.ɵɵPipeDeclaration<AblePipe<any>, "able", false>;
13
+ static ɵpipe: i0.ɵɵPipeDeclaration<AblePipe<any>, "able", true>;
11
14
  }
15
+ /**
16
+ * @deprecated use AbilityService instead
17
+ */
12
18
  export declare class AblePurePipe<T extends AnyAbility> implements PipeTransform {
13
19
  private _ability;
14
20
  constructor(ability: T);
15
21
  transform(...args: Parameters<T['can']>): Observable<boolean>;
16
22
  static ɵfac: i0.ɵɵFactoryDeclaration<AblePurePipe<any>, never>;
17
- static ɵpipe: i0.ɵɵPipeDeclaration<AblePurePipe<any>, "ablePure", false>;
23
+ static ɵpipe: i0.ɵɵPipeDeclaration<AblePurePipe<any>, "ablePure", true>;
18
24
  }
@@ -1,3 +1,3 @@
1
1
  export * from './pipes';
2
- export * from './AbilityModule';
3
2
  export * from './AbilityService';
3
+ export * from './AbilityServiceSignal';
package/dist/umd/index.js CHANGED
@@ -23,6 +23,9 @@
23
23
 
24
24
  var i0__namespace = /*#__PURE__*/_interopNamespaceDefault(i0);
25
25
 
26
+ /**
27
+ * @deprecated use AbilityService instead
28
+ */
26
29
  var AblePipe = /** @class */ (function () {
27
30
  function AblePipe(ability) {
28
31
  this._ability = ability;
@@ -36,21 +39,23 @@
36
39
  return (_a = this._ability).can.apply(_a, args);
37
40
  };
38
41
  AblePipe.ɵfac = function AblePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AblePipe)(i0__namespace.ɵɵdirectiveInject(ability.PureAbility, 16)); };
39
- AblePipe.ɵpipe = /*@__PURE__*/ i0__namespace.ɵɵdefinePipe({ name: "able", type: AblePipe, pure: false });
42
+ AblePipe.ɵpipe = /*@__PURE__*/ i0__namespace.ɵɵdefinePipe({ name: "able", type: AblePipe, pure: false, standalone: true });
40
43
  return AblePipe;
41
44
  }());
42
45
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(AblePipe, [{
43
46
  type: i0.Pipe,
44
- args: [{ name: 'able', pure: false }]
47
+ args: [{ name: 'able', pure: false, standalone: true }]
45
48
  }], function () { return [{ type: undefined, decorators: [{
46
49
  type: i0.Inject,
47
50
  args: [ability.PureAbility]
48
51
  }] }]; }, null); })();
52
+ /**
53
+ * @deprecated use AbilityService instead
54
+ */
49
55
  var AblePurePipe = /** @class */ (function () {
50
56
  function AblePurePipe(ability) {
51
57
  this._ability = ability;
52
58
  }
53
- // TODO: use computed signals https://github.com/angular/angular/issues/47553
54
59
  AblePurePipe.prototype.transform = function () {
55
60
  var _this = this;
56
61
  var args = [];
@@ -67,63 +72,78 @@
67
72
  });
68
73
  };
69
74
  AblePurePipe.ɵfac = function AblePurePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AblePurePipe)(i0__namespace.ɵɵdirectiveInject(ability.PureAbility, 16)); };
70
- AblePurePipe.ɵpipe = /*@__PURE__*/ i0__namespace.ɵɵdefinePipe({ name: "ablePure", type: AblePurePipe, pure: true });
75
+ AblePurePipe.ɵpipe = /*@__PURE__*/ i0__namespace.ɵɵdefinePipe({ name: "ablePure", type: AblePurePipe, pure: true, standalone: true });
71
76
  return AblePurePipe;
72
77
  }());
73
78
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(AblePurePipe, [{
74
79
  type: i0.Pipe,
75
- args: [{ name: 'ablePure' }]
80
+ args: [{ name: 'ablePure', standalone: true }]
76
81
  }], function () { return [{ type: undefined, decorators: [{
77
82
  type: i0.Inject,
78
83
  args: [ability.PureAbility]
79
84
  }] }]; }, null); })();
80
85
 
81
- var AbilityModule = /** @class */ (function () {
82
- function AbilityModule() {
83
- }
84
- AbilityModule.ɵfac = function AbilityModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityModule)(); };
85
- AbilityModule.ɵmod = /*@__PURE__*/ i0__namespace.ɵɵdefineNgModule({ type: AbilityModule });
86
- AbilityModule.ɵinj = /*@__PURE__*/ i0__namespace.ɵɵdefineInjector({});
87
- return AbilityModule;
88
- }());
89
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(AbilityModule, [{
90
- type: i0.NgModule,
91
- args: [{
92
- declarations: [
93
- AblePipe,
94
- AblePurePipe,
95
- ],
96
- exports: [
97
- AblePipe,
98
- AblePurePipe,
99
- ],
100
- }]
101
- }], null, null); })();
102
- (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0__namespace.ɵɵsetNgModuleScope(AbilityModule, { declarations: [AblePipe,
103
- AblePurePipe], exports: [AblePipe,
104
- AblePurePipe] }); })();
105
-
106
86
  var AbilityService = /** @class */ (function () {
107
87
  function AbilityService(ability) {
108
- // IGNORE: this comment. it's for release debugging
109
88
  this.ability$ = new rxjs.Observable(function (observer) {
110
89
  observer.next(ability);
111
90
  return ability.on('updated', function () { return observer.next(ability); });
112
91
  });
113
92
  }
114
93
  AbilityService.ɵfac = function AbilityService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityService)(i0__namespace.ɵɵinject(ability.PureAbility)); };
115
- AbilityService.ɵprov = /*@__PURE__*/ i0__namespace.ɵɵdefineInjectable({ token: AbilityService, factory: AbilityService.ɵfac });
94
+ AbilityService.ɵprov = /*@__PURE__*/ i0__namespace.ɵɵdefineInjectable({ token: AbilityService, factory: AbilityService.ɵfac, providedIn: 'root' });
116
95
  return AbilityService;
117
96
  }());
118
97
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(AbilityService, [{
119
- type: i0.Injectable
98
+ type: i0.Injectable,
99
+ args: [{ providedIn: 'root' }]
120
100
  }], function () { return [{ type: undefined, decorators: [{
121
101
  type: i0.Inject,
122
102
  args: [ability.PureAbility]
123
103
  }] }]; }, null); })();
124
104
 
125
- exports.AbilityModule = AbilityModule;
105
+ var AbilityServiceSignal = /** @class */ (function () {
106
+ function AbilityServiceSignal() {
107
+ var _this = this;
108
+ this._rules = i0.signal([]);
109
+ this._ability = i0.inject(ability.PureAbility);
110
+ this.can = function () {
111
+ var _a;
112
+ var args = [];
113
+ for (var _i = 0; _i < arguments.length; _i++) {
114
+ args[_i] = arguments[_i];
115
+ }
116
+ _this._rules(); // generate side effect for angular to track changes in this signal
117
+ return (_a = _this._ability).can.apply(_a, args);
118
+ };
119
+ this.cannot = function () {
120
+ var args = [];
121
+ for (var _i = 0; _i < arguments.length; _i++) {
122
+ args[_i] = arguments[_i];
123
+ }
124
+ return !_this.can.apply(_this, args);
125
+ };
126
+ this._disposeAbilitySubscription = this._ability.on('updated', function (event) {
127
+ _this._rules.set(event.rules);
128
+ });
129
+ }
130
+ AbilityServiceSignal.prototype.ngOnDestroy = function () {
131
+ this._disposeAbilitySubscription();
132
+ };
133
+ AbilityServiceSignal.prototype.update = function (rules) {
134
+ this._ability.update(rules);
135
+ };
136
+ AbilityServiceSignal.ɵfac = function AbilityServiceSignal_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbilityServiceSignal)(); };
137
+ AbilityServiceSignal.ɵprov = /*@__PURE__*/ i0__namespace.ɵɵdefineInjectable({ token: AbilityServiceSignal, factory: AbilityServiceSignal.ɵfac, providedIn: 'root' });
138
+ return AbilityServiceSignal;
139
+ }());
140
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0__namespace.ɵsetClassMetadata(AbilityServiceSignal, [{
141
+ type: i0.Injectable,
142
+ args: [{ providedIn: 'root' }]
143
+ }], function () { return []; }, null); })();
144
+
126
145
  exports.AbilityService = AbilityService;
146
+ exports.AbilityServiceSignal = AbilityServiceSignal;
127
147
  exports.AblePipe = AblePipe;
128
148
  exports.AblePurePipe = AblePurePipe;
129
149
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/pipes.ts","../../src/AbilityModule.ts","../../src/AbilityService.ts"],"sourcesContent":["import { Pipe, Inject, PipeTransform } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Pipe({ name: 'able', pure: false })\nexport class AblePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): boolean {\n return this._ability.can(...args);\n }\n}\n\n@Pipe({ name: 'ablePure' })\nexport class AblePurePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n // TODO: use computed signals https://github.com/angular/angular/issues/47553\n transform(...args: Parameters<T['can']>): Observable<boolean> {\n return new Observable((s) => {\n const emit = () => s.next(this._ability.can(...args));\n emit();\n return this._ability.on('updated', emit);\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { AblePipe, AblePurePipe } from './pipes';\n\n@NgModule({\n declarations: [\n AblePipe,\n AblePurePipe,\n ],\n exports: [\n AblePipe,\n AblePurePipe,\n ],\n})\nexport class AbilityModule {\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class AbilityService<T extends AnyAbility> {\n readonly ability$: Observable<T>;\n\n constructor(@Inject(PureAbility) ability: T) {\n // IGNORE: this comment. it's for release debugging\n this.ability$ = new Observable((observer) => {\n observer.next(ability);\n return ability.on('updated', () => observer.next(ability));\n });\n }\n}\n"],"names":["PureAbility","Pipe","Inject","Observable","NgModule","i0","Injectable"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/pipes.ts","../../src/AbilityService.ts","../../src/AbilityServiceSignal.ts"],"sourcesContent":["import { Pipe, Inject, PipeTransform } from '@angular/core';\nimport { PureAbility, AnyAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n/**\n * @deprecated use AbilityService instead\n */\n@Pipe({ name: 'able', pure: false, standalone: true })\nexport class AblePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): boolean {\n return this._ability.can(...args);\n }\n}\n\n/**\n * @deprecated use AbilityService instead\n */\n@Pipe({ name: 'ablePure', standalone: true })\nexport class AblePurePipe<T extends AnyAbility> implements PipeTransform {\n private _ability: T;\n\n constructor(@Inject(PureAbility) ability: T) {\n this._ability = ability;\n }\n\n transform(...args: Parameters<T['can']>): Observable<boolean> {\n return new Observable((s) => {\n const emit = () => s.next(this._ability.can(...args));\n emit();\n return this._ability.on('updated', emit);\n });\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { AnyAbility, PureAbility } from '@casl/ability';\nimport { Observable } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class AbilityService<T extends AnyAbility> {\n readonly ability$: Observable<T>;\n\n constructor(@Inject(PureAbility) ability: T) {\n this.ability$ = new Observable((observer) => {\n observer.next(ability);\n return ability.on('updated', () => observer.next(ability));\n });\n }\n}\n","import { inject, Injectable, OnDestroy, signal } from \"@angular/core\";\nimport { AnyAbility, PureAbility, RawRuleOf } from \"@casl/ability\";\n\n@Injectable({ providedIn: 'root' })\nexport class AbilityServiceSignal<T extends AnyAbility> implements OnDestroy {\n private readonly _rules = signal<RawRuleOf<T>[]>([]);\n private readonly _ability = inject(PureAbility) as unknown as T;\n private readonly _disposeAbilitySubscription: () => void;\n\n constructor() {\n this._disposeAbilitySubscription = this._ability.on('updated', (event) => {\n this._rules.set(event.rules as any);\n });\n }\n\n ngOnDestroy(): void {\n this._disposeAbilitySubscription();\n }\n\n can = (...args: Parameters<T['can']>): boolean => {\n this._rules(); // generate side effect for angular to track changes in this signal\n return this._ability.can(...args);\n };\n\n cannot = (...args: Parameters<T['can']>): boolean => {\n return !this.can(...args);\n };\n\n update(rules: T['rules']): void {\n this._ability.update(rules);\n }\n}"],"names":["PureAbility","Pipe","Inject","Observable","Injectable","signal","inject"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@casl/angular",
3
- "version": "8.2.8",
3
+ "version": "9.0.0",
4
4
  "description": "Angular module for CASL which makes it easy to add permissions in any Angular app",
5
5
  "main": "dist/umd/index.js",
6
6
  "module": "dist/es5m/index.js",
@@ -47,8 +47,8 @@
47
47
  "author": "Sergii Stotskyi <sergiy.stotskiy@gmail.com>",
48
48
  "license": "MIT",
49
49
  "peerDependencies": {
50
- "@angular/core": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
51
- "@casl/ability": "^3.0.0 || ^4.0.0 || ^5.1.0 || ^6.0.0",
50
+ "@angular/core": "^16.0.0 || ^17.0.0 || ^18.0.0",
51
+ "@casl/ability": "^4.0.0 || ^5.1.0 || ^6.0.0",
52
52
  "rxjs": "^7.5.5",
53
53
  "tslib": "^2.0.0"
54
54
  },
@@ -1,7 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- import * as i1 from "./pipes";
3
- export declare class AbilityModule {
4
- static ɵfac: i0.ɵɵFactoryDeclaration<AbilityModule, never>;
5
- static ɵmod: i0.ɵɵNgModuleDeclaration<AbilityModule, [typeof i1.AblePipe, typeof i1.AblePurePipe], never, [typeof i1.AblePipe, typeof i1.AblePurePipe]>;
6
- static ɵinj: i0.ɵɵInjectorDeclaration<AbilityModule>;
7
- }