@moostjs/arbac 0.5.33 → 0.6.1

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/README.md CHANGED
@@ -71,11 +71,11 @@ app.setReplaceRegistry(ArbacReplaceRegistry)
71
71
  ### Protect Routes with `@Authorized()`
72
72
 
73
73
  ```typescript
74
- import { Authorized, Public } from '@moostjs/arbac'
74
+ import { ArbacAuthorize, ArbacPublic } from '@moostjs/arbac'
75
75
  import { Controller, Get } from 'moost'
76
76
 
77
77
  @Controller('/data')
78
- @ArbacAuthorized()
78
+ @ArbacAuthorize()
79
79
  export class DataController {
80
80
  @Get()
81
81
  getProtectedData() {
@@ -100,7 +100,7 @@ Extends `@prostojs/arbac` and integrates with MoostJS DI.
100
100
 
101
101
  Abstract class for defining user-related access control logic.
102
102
 
103
- ### `@ArbacAuthorized()`
103
+ ### `@ArbacAuthorize()`
104
104
 
105
105
  Method decorator to enforce ARBAC checks.
106
106
 
package/dist/index.cjs CHANGED
@@ -6,11 +6,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
8
  var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
- key = keys[i];
11
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
- get: ((k) => from[k]).bind(null, key),
13
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key$1; i < n; i++) {
10
+ key$1 = keys[i];
11
+ if (!__hasOwnProp.call(to, key$1) && key$1 !== except) __defProp(to, key$1, {
12
+ get: ((k) => from[k]).bind(null, key$1),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key$1)) || desc.enumerable
14
14
  });
15
15
  }
16
16
  return to;
@@ -26,22 +26,22 @@ const __prostojs_arbac = __toESM(require("@prostojs/arbac"));
26
26
  const __wooksjs_event_http = __toESM(require("@wooksjs/event-http"));
27
27
 
28
28
  //#region packages/arbac/src/moost-arbac.ts
29
- function _ts_decorate$1(decorators, target, key, desc) {
30
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
31
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
32
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
33
- return c > 3 && r && Object.defineProperty(target, key, r), r;
29
+ function _ts_decorate$1(decorators, target, key$1, desc) {
30
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
31
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
32
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
33
+ return c > 3 && r && Object.defineProperty(target, key$1, r), r;
34
34
  }
35
35
  var MoostArbac = class extends __prostojs_arbac.Arbac {};
36
36
  MoostArbac = _ts_decorate$1([(0, moost.Injectable)()], MoostArbac);
37
37
 
38
38
  //#endregion
39
39
  //#region packages/arbac/src/user.provider.ts
40
- function _ts_decorate(decorators, target, key, desc) {
41
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
42
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
43
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
44
- return c > 3 && r && Object.defineProperty(target, key, r), r;
40
+ function _ts_decorate(decorators, target, key$1, desc) {
41
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
42
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
43
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
44
+ return c > 3 && r && Object.defineProperty(target, key$1, r), r;
45
45
  }
46
46
  var ArbacUserProvider = class {
47
47
  /**
@@ -79,11 +79,12 @@ ArbacUserProvider = _ts_decorate([(0, moost.Injectable)()], ArbacUserProvider);
79
79
  * Composable for ARBAC (Advanced Role-Based Access Control) utilities within MoostJS.
80
80
  *
81
81
  * @template TScope - Type representing the scope of access control.
82
- */ function useArbac() {
83
- const store = (0, moost.useAsyncEventContext)().store("arbac");
84
- const cc = (0, moost.useControllerContext)();
85
- const getScopes = () => store.get("scopes");
86
- const setScopes = (scope) => store.set("scopes", scope);
82
+ */ const arbacScopesKey = (0, moost.key)("arbac.scopes");
83
+ function useArbac(ctx) {
84
+ const _ctx = ctx || (0, moost.current)();
85
+ const cc = (0, moost.useControllerContext)(_ctx);
86
+ const getScopes = () => _ctx.has(arbacScopesKey) ? _ctx.get(arbacScopesKey) : void 0;
87
+ const setScopes = (scope) => _ctx.set(arbacScopesKey, scope);
87
88
  const evaluate = async (opts) => {
88
89
  const user = await cc.instantiate(ArbacUserProvider);
89
90
  const userId = await user.getUserId();
@@ -113,20 +114,22 @@ ArbacUserProvider = _ts_decorate([(0, moost.Injectable)()], ArbacUserProvider);
113
114
 
114
115
  //#endregion
115
116
  //#region packages/arbac/src/arbac.mate.ts
116
- function getArbacMate() {
117
+ /** Returns the shared `Mate` instance extended with ARBAC metadata fields. */ function getArbacMate() {
117
118
  return (0, moost.getMoostMate)();
118
119
  }
119
120
 
120
121
  //#endregion
121
122
  //#region packages/arbac/src/arbac.decorator.ts
122
123
  /**
123
- * Interceptor function that enforces authorization checks based on ARBAC rules.
124
+ * Interceptor that enforces authorization checks based on ARBAC rules.
124
125
  * It evaluates the user's permissions against the requested resource and action.
125
126
  *
126
127
  * @constant
127
- */ const arbackAuthorizeInterceptor = (0, moost.defineInterceptorFn)(async (before, after, onError) => {
128
- const logger = (0, moost.useEventLogger)("arbac");
129
- const { setScopes, evaluate, resource, action, isPublic } = useArbac();
128
+ */ const arbackAuthorizeInterceptor = (0, moost.defineBeforeInterceptor)(async () => {
129
+ const ctx = (0, moost.current)();
130
+ const l = (0, moost.useLogger)(ctx);
131
+ const logger = typeof l.topic === "function" ? l.topic("arbac") : l;
132
+ const { setScopes, evaluate, resource, action, isPublic } = useArbac(ctx);
130
133
  if (!action || !resource || isPublic) return;
131
134
  try {
132
135
  const { allowed, scopes, userId } = await evaluate({
@@ -138,7 +141,7 @@ function getArbacMate() {
138
141
  setScopes(scopes);
139
142
  } catch (error) {
140
143
  if (error instanceof __wooksjs_event_http.HttpError) throw error;
141
- logger.warn(error);
144
+ logger.warn(String(error));
142
145
  throw new __wooksjs_event_http.HttpError(401, `Authorization error`);
143
146
  }
144
147
  }, moost.TInterceptorPriority.GUARD);
package/dist/index.d.ts CHANGED
@@ -1,14 +1,10 @@
1
1
  import * as _prostojs_arbac from '@prostojs/arbac';
2
2
  import { Arbac } from '@prostojs/arbac';
3
+ import { EventContext } from '@wooksjs/event-core';
3
4
  import * as moost from 'moost';
4
5
  import { Mate, TMoostMetadata, TMateParamMeta } from 'moost';
5
6
 
6
- /**
7
- * Composable for ARBAC (Advanced Role-Based Access Control) utilities within MoostJS.
8
- *
9
- * @template TScope - Type representing the scope of access control.
10
- */
11
- declare function useArbac<TScope extends object>(): {
7
+ declare function useArbac<TScope extends object>(ctx?: EventContext): {
12
8
  /**
13
9
  * Get evaluated scopes
14
10
  */
@@ -16,7 +12,7 @@ declare function useArbac<TScope extends object>(): {
16
12
  /**
17
13
  * Set evaluated scopes
18
14
  */
19
- setScopes: (scope: TScope[] | undefined) => TScope[] | undefined;
15
+ setScopes: (scope: TScope[] | undefined) => void;
20
16
  /**
21
17
  * Evaluate access control for the given resource and action.
22
18
  */
@@ -41,12 +37,12 @@ declare function useArbac<TScope extends object>(): {
41
37
  };
42
38
 
43
39
  /**
44
- * Interceptor function that enforces authorization checks based on ARBAC rules.
40
+ * Interceptor that enforces authorization checks based on ARBAC rules.
45
41
  * It evaluates the user's permissions against the requested resource and action.
46
42
  *
47
43
  * @constant
48
44
  */
49
- declare const arbackAuthorizeInterceptor: moost.TInterceptorFn;
45
+ declare const arbackAuthorizeInterceptor: moost.TInterceptorDef;
50
46
  /**
51
47
  * Decorator that applies the `arbackAuthorizeInterceptor` to enforce authorization.
52
48
  *
@@ -80,15 +76,17 @@ declare const ArbacAction: (name: string) => MethodDecorator & ClassDecorator &
80
76
  */
81
77
  declare const ArbacPublic: () => MethodDecorator & ClassDecorator & ParameterDecorator & PropertyDecorator;
82
78
 
79
+ /** ARBAC metadata fields attached to classes and methods by ARBAC decorators. */
83
80
  interface TArbacMeta {
84
81
  arbacResourceId?: string;
85
82
  arbacActionId?: string;
86
83
  arbacPublic?: boolean;
87
84
  }
85
+ /** Returns the shared `Mate` instance extended with ARBAC metadata fields. */
88
86
  declare function getArbacMate(): Mate<TMoostMetadata & TArbacMeta & {
89
- params: Array<TMateParamMeta>;
87
+ params: TMateParamMeta[];
90
88
  }, TMoostMetadata & TArbacMeta & {
91
- params: Array<TMateParamMeta>;
89
+ params: TMateParamMeta[];
92
90
  }>;
93
91
 
94
92
  /**
package/dist/index.mjs CHANGED
@@ -1,24 +1,24 @@
1
- import { Injectable, Intercept, Resolve, TInterceptorPriority, defineInterceptorFn, getConstructor, getMoostMate, useAsyncEventContext, useControllerContext, useEventLogger } from "moost";
1
+ import { Injectable, Intercept, Resolve, TInterceptorPriority, current, defineBeforeInterceptor, getConstructor, getMoostMate, key, useControllerContext, useLogger } from "moost";
2
2
  import { Arbac } from "@prostojs/arbac";
3
3
  import { HttpError } from "@wooksjs/event-http";
4
4
 
5
5
  //#region packages/arbac/src/moost-arbac.ts
6
- function _ts_decorate$1(decorators, target, key, desc) {
7
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
10
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ function _ts_decorate$1(decorators, target, key$1, desc) {
7
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
8
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
9
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
10
+ return c > 3 && r && Object.defineProperty(target, key$1, r), r;
11
11
  }
12
12
  var MoostArbac = class extends Arbac {};
13
13
  MoostArbac = _ts_decorate$1([Injectable()], MoostArbac);
14
14
 
15
15
  //#endregion
16
16
  //#region packages/arbac/src/user.provider.ts
17
- function _ts_decorate(decorators, target, key, desc) {
18
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
21
- return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ function _ts_decorate(decorators, target, key$1, desc) {
18
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
19
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
20
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
21
+ return c > 3 && r && Object.defineProperty(target, key$1, r), r;
22
22
  }
23
23
  var ArbacUserProvider = class {
24
24
  /**
@@ -56,11 +56,12 @@ ArbacUserProvider = _ts_decorate([Injectable()], ArbacUserProvider);
56
56
  * Composable for ARBAC (Advanced Role-Based Access Control) utilities within MoostJS.
57
57
  *
58
58
  * @template TScope - Type representing the scope of access control.
59
- */ function useArbac() {
60
- const store = useAsyncEventContext().store("arbac");
61
- const cc = useControllerContext();
62
- const getScopes = () => store.get("scopes");
63
- const setScopes = (scope) => store.set("scopes", scope);
59
+ */ const arbacScopesKey = key("arbac.scopes");
60
+ function useArbac(ctx) {
61
+ const _ctx = ctx || current();
62
+ const cc = useControllerContext(_ctx);
63
+ const getScopes = () => _ctx.has(arbacScopesKey) ? _ctx.get(arbacScopesKey) : void 0;
64
+ const setScopes = (scope) => _ctx.set(arbacScopesKey, scope);
64
65
  const evaluate = async (opts) => {
65
66
  const user = await cc.instantiate(ArbacUserProvider);
66
67
  const userId = await user.getUserId();
@@ -90,20 +91,22 @@ ArbacUserProvider = _ts_decorate([Injectable()], ArbacUserProvider);
90
91
 
91
92
  //#endregion
92
93
  //#region packages/arbac/src/arbac.mate.ts
93
- function getArbacMate() {
94
+ /** Returns the shared `Mate` instance extended with ARBAC metadata fields. */ function getArbacMate() {
94
95
  return getMoostMate();
95
96
  }
96
97
 
97
98
  //#endregion
98
99
  //#region packages/arbac/src/arbac.decorator.ts
99
100
  /**
100
- * Interceptor function that enforces authorization checks based on ARBAC rules.
101
+ * Interceptor that enforces authorization checks based on ARBAC rules.
101
102
  * It evaluates the user's permissions against the requested resource and action.
102
103
  *
103
104
  * @constant
104
- */ const arbackAuthorizeInterceptor = defineInterceptorFn(async (before, after, onError) => {
105
- const logger = useEventLogger("arbac");
106
- const { setScopes, evaluate, resource, action, isPublic } = useArbac();
105
+ */ const arbackAuthorizeInterceptor = defineBeforeInterceptor(async () => {
106
+ const ctx = current();
107
+ const l = useLogger(ctx);
108
+ const logger = typeof l.topic === "function" ? l.topic("arbac") : l;
109
+ const { setScopes, evaluate, resource, action, isPublic } = useArbac(ctx);
107
110
  if (!action || !resource || isPublic) return;
108
111
  try {
109
112
  const { allowed, scopes, userId } = await evaluate({
@@ -115,7 +118,7 @@ function getArbacMate() {
115
118
  setScopes(scopes);
116
119
  } catch (error) {
117
120
  if (error instanceof HttpError) throw error;
118
- logger.warn(error);
121
+ logger.warn(String(error));
119
122
  throw new HttpError(401, `Authorization error`);
120
123
  }
121
124
  }, TInterceptorPriority.GUARD);
package/package.json CHANGED
@@ -1,11 +1,34 @@
1
1
  {
2
2
  "name": "@moostjs/arbac",
3
- "version": "0.5.33",
3
+ "version": "0.6.1",
4
4
  "description": "Access Control @prostojs/arbac",
5
+ "keywords": [
6
+ "abac",
7
+ "access control",
8
+ "arbac",
9
+ "moost",
10
+ "moostjs",
11
+ "rbac"
12
+ ],
13
+ "homepage": "https://github.com/moostjs/moostjs/tree/main/packages/arbac#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/moostjs/moostjs/issues"
16
+ },
17
+ "license": "MIT",
18
+ "author": "Artem Maltsev",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/moostjs/moostjs.git",
22
+ "directory": "packages/arbac"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "type": "module",
28
+ "sideEffects": false,
5
29
  "main": "dist/index.cjs",
6
30
  "module": "dist/index.mjs",
7
31
  "types": "dist/index.d.ts",
8
- "sideEffects": false,
9
32
  "exports": {
10
33
  "./package.json": "./package.json",
11
34
  ".": {
@@ -14,38 +37,17 @@
14
37
  "require": "./dist/index.cjs"
15
38
  }
16
39
  },
17
- "files": [
18
- "dist"
19
- ],
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/moostjs/moostjs.git",
23
- "directory": "packages/arbac"
24
- },
25
- "keywords": [
26
- "moost",
27
- "moostjs",
28
- "arbac",
29
- "rbac",
30
- "abac",
31
- "access control"
32
- ],
33
- "author": "Artem Maltsev",
34
- "license": "MIT",
35
- "bugs": {
36
- "url": "https://github.com/moostjs/moostjs/issues"
37
- },
38
- "homepage": "https://github.com/moostjs/moostjs/tree/main/packages/arbac#readme",
39
- "peerDependencies": {
40
- "@wooksjs/event-http": "^0.6.2",
41
- "moost": "^0.5.33"
42
- },
43
40
  "dependencies": {
44
41
  "@prostojs/arbac": "^0.0.2"
45
42
  },
46
43
  "devDependencies": {
47
44
  "vitest": "3.2.4"
48
45
  },
46
+ "peerDependencies": {
47
+ "@wooksjs/event-core": "^0.7.3",
48
+ "@wooksjs/event-http": "^0.7.3",
49
+ "moost": "^0.6.1"
50
+ },
49
51
  "scripts": {
50
52
  "pub": "pnpm publish --access public",
51
53
  "test": "vitest"