@dudousxd/nestjs-authz 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/dist/can-endpoint.controller.d.ts +35 -0
  3. package/dist/can-endpoint.controller.d.ts.map +1 -0
  4. package/dist/can-endpoint.controller.js +68 -0
  5. package/dist/can-endpoint.controller.js.map +1 -0
  6. package/dist/decorator/roles.decorator.d.ts +15 -0
  7. package/dist/decorator/roles.decorator.d.ts.map +1 -0
  8. package/dist/decorator/roles.decorator.js +19 -0
  9. package/dist/decorator/roles.decorator.js.map +1 -0
  10. package/dist/diagnostics.d.ts +42 -0
  11. package/dist/diagnostics.d.ts.map +1 -0
  12. package/dist/diagnostics.js +68 -0
  13. package/dist/diagnostics.js.map +1 -0
  14. package/dist/gate.d.ts +42 -1
  15. package/dist/gate.d.ts.map +1 -1
  16. package/dist/gate.js +116 -12
  17. package/dist/gate.js.map +1 -1
  18. package/dist/guard/roles.guard.d.ts +21 -0
  19. package/dist/guard/roles.guard.d.ts.map +1 -0
  20. package/dist/guard/roles.guard.js +50 -0
  21. package/dist/guard/roles.guard.js.map +1 -0
  22. package/dist/index.d.ts +9 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +6 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/module.d.ts +5 -0
  27. package/dist/module.d.ts.map +1 -1
  28. package/dist/module.js +27 -1
  29. package/dist/module.js.map +1 -1
  30. package/dist/permission-provider.d.ts +2 -0
  31. package/dist/permission-provider.d.ts.map +1 -1
  32. package/dist/policy-registry.d.ts +21 -0
  33. package/dist/policy-registry.d.ts.map +1 -1
  34. package/dist/policy-registry.js +42 -0
  35. package/dist/policy-registry.js.map +1 -1
  36. package/dist/role-provider.d.ts +40 -0
  37. package/dist/role-provider.d.ts.map +1 -0
  38. package/dist/role-provider.js +32 -0
  39. package/dist/role-provider.js.map +1 -0
  40. package/dist/tokens.d.ts +14 -0
  41. package/dist/tokens.d.ts.map +1 -1
  42. package/dist/tokens.js +14 -0
  43. package/dist/tokens.js.map +1 -1
  44. package/dist/types.d.ts +33 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"policy-registry.js","sourceRoot":"","sources":["../src/policy-registry.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAGrE;;;GAGG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAc;IACR,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEvE;;;OAGG;IACH,QAAQ,CAAC,MAAsB;QAC7B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,QAAQ,CAAC;YAClD,MAAM,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,wEAAwE;IACxE,WAAW,CAAC,QAAuB;QACjC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,+EAA+E;IAC/E,WAAW,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,WAA4B,CAAC,CAAC;IACpE,CAAC;IAED,+DAA+D;IAC/D,GAAG,CAAC,QAAuB;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,2DAA2D;IAC3D,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AAnCY,cAAc;IAD1B,UAAU,EAAE;GACA,cAAc,CAmC1B"}
1
+ {"version":3,"file":"policy-registry.js","sourceRoot":"","sources":["../src/policy-registry.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAGrE;;;GAGG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAc;IACR,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEvE;;;OAGG;IACH,QAAQ,CAAC,MAAsB;QAC7B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,QAAQ,CAAC;YAClD,MAAM,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,wEAAwE;IACxE,WAAW,CAAC,QAAuB;QACjC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,+EAA+E;IAC/E,WAAW,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,WAA4B,CAAC,CAAC;IACpE,CAAC;IAED,+DAA+D;IAC/D,GAAG,CAAC,QAAuB;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,2DAA2D;IAC3D,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,yDAAyD;IACzD,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,cAAc;QACZ,MAAM,GAAG,GAA4D,EAAE,CAAC;QACxE,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;YACpC,IAAI,KAAK,GAAkB,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrD,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,QAAQ;wBAAE,SAAS;oBAC1D,MAAM,MAAM,GAAI,MAAkC,CAAC,IAAI,CAAC,CAAC;oBACzD,qEAAqE;oBACrE,qEAAqE;oBACrE,4CAA4C;oBAC5C,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBACvD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;gBACD,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAA;AA9EY,cAAc;IAD1B,UAAU,EAAE;GACA,cAAc,CA8E1B"}
@@ -0,0 +1,40 @@
1
+ import type { User } from './types.js';
2
+ /**
3
+ * Optional seam that lets a persisted RBAC layer supply a user's roles.
4
+ *
5
+ * This mirrors {@link PermissionProvider} but for COARSE, role-based checks
6
+ * (`gate.hasRole('teacher')`, `@Roles('admin')`). The core does NOT implement
7
+ * this — `@dudousxd/nestjs-authz-typeorm` (and the other RBAC adapters) provide an
8
+ * implementation and register it under the shared {@link ROLE_PROVIDER} token.
9
+ * When no provider is registered the default {@link RoleResolver} (reading roles
10
+ * off the user object) is the only source.
11
+ *
12
+ * `user` is the current user (whatever the app's auth layer produced; `undefined`
13
+ * when anonymous). Return the role names the user holds — an empty array (or
14
+ * nullish) contributes no roles. When both this provider and the default resolver
15
+ * yield roles, the Gate takes their UNION.
16
+ */
17
+ export interface RoleProvider {
18
+ getRoles(user: User): string[] | undefined | Promise<string[] | undefined>;
19
+ }
20
+ /**
21
+ * Strategy that derives a user's roles from the user object itself, with ZERO RBAC
22
+ * tables. The {@link defaultRoleResolver} reads `user.roles` (`string[]`) OR
23
+ * `user.role` (`string | string[]`) and normalizes both to a `string[]`. Apps that
24
+ * already carry a role on the user thus get role-checks for free; an app that needs
25
+ * a different shape overrides it via `AuthzModule.forRoot({ resolveRoles })`.
26
+ */
27
+ export type RoleResolver = (user: User) => string[] | undefined | Promise<string[] | undefined>;
28
+ /**
29
+ * Default {@link RoleResolver}: read roles directly off the user object.
30
+ *
31
+ * - `user.roles` is a `string[]` → used as-is.
32
+ * - `user.role` is a `string` → wrapped to `[role]`.
33
+ * - `user.role` is a `string[]` → used as-is.
34
+ * - neither present (or anonymous) → `[]` (no roles).
35
+ *
36
+ * Non-string entries are filtered out so a malformed field can never leak a
37
+ * truthy match.
38
+ */
39
+ export declare function defaultRoleResolver(user: User): string[];
40
+ //# sourceMappingURL=role-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-provider.d.ts","sourceRoot":"","sources":["../src/role-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CAC5E;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAEhG;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAaxD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Default {@link RoleResolver}: read roles directly off the user object.
3
+ *
4
+ * - `user.roles` is a `string[]` → used as-is.
5
+ * - `user.role` is a `string` → wrapped to `[role]`.
6
+ * - `user.role` is a `string[]` → used as-is.
7
+ * - neither present (or anonymous) → `[]` (no roles).
8
+ *
9
+ * Non-string entries are filtered out so a malformed field can never leak a
10
+ * truthy match.
11
+ */
12
+ export function defaultRoleResolver(user) {
13
+ if (user == null || typeof user !== 'object')
14
+ return [];
15
+ const u = user;
16
+ const out = [];
17
+ if (Array.isArray(u.roles)) {
18
+ for (const r of u.roles)
19
+ if (typeof r === 'string')
20
+ out.push(r);
21
+ }
22
+ if (typeof u.role === 'string') {
23
+ out.push(u.role);
24
+ }
25
+ else if (Array.isArray(u.role)) {
26
+ for (const r of u.role)
27
+ if (typeof r === 'string')
28
+ out.push(r);
29
+ }
30
+ return out;
31
+ }
32
+ //# sourceMappingURL=role-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-provider.js","sourceRoot":"","sources":["../src/role-provider.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACxD,MAAM,CAAC,GAAG,IAA2C,CAAC;IACtD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;YAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI;YAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/tokens.d.ts CHANGED
@@ -6,6 +6,8 @@ export declare const RESOURCE_RESOLVER: unique symbol;
6
6
  export declare const POLICY_RESOURCE_METADATA = "nestjs-authz:policy-resource";
7
7
  /** Metadata key for `@Can(ability, Resource?)` — stores the ability descriptor on a route. */
8
8
  export declare const CAN_METADATA = "nestjs-authz:can";
9
+ /** Metadata key for `@Roles(...roles)` — stores the allowed role names on a route. */
10
+ export declare const ROLES_METADATA = "nestjs-authz:roles";
9
11
  /**
10
12
  * Cross-lib injection token for an optional {@link PermissionProvider} — the seam the
11
13
  * RBAC adapter (`@dudousxd/nestjs-authz-typeorm`) registers so that a model-less,
@@ -18,6 +20,18 @@ export declare const CAN_METADATA = "nestjs-authz:can";
18
20
  * as before (backward-compatible: unknown abilities still throw).
19
21
  */
20
22
  export declare const PERMISSION_PROVIDER: unique symbol;
23
+ /**
24
+ * Cross-lib injection token for an optional {@link RoleProvider} — the seam an RBAC
25
+ * adapter (`@dudousxd/nestjs-authz-typeorm`) registers so coarse role-checks
26
+ * (`gate.hasRole('teacher')`, `@Roles('admin')`) consult a persisted role store.
27
+ *
28
+ * Like {@link PERMISSION_PROVIDER}, it shares the global symbol registry via
29
+ * `Symbol.for(key)` so an RBAC package registering this same key resolves to the
30
+ * SAME symbol instance without importing core internals. Consulted with
31
+ * `@Optional()`: when absent, only the default {@link RoleResolver} (roles read off
32
+ * the user object) supplies roles. When BOTH yield roles, the Gate unions them.
33
+ */
34
+ export declare const ROLE_PROVIDER: unique symbol;
21
35
  /**
22
36
  * Cross-lib injection token for the current-request context accessor, owned by
23
37
  * `@dudousxd/nestjs-context`. We do NOT import nestjs-context — instead we share
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,eAA+C,CAAC;AAEjF,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,eAAyD,CAAC;AAExF,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AAEvE,8FAA8F;AAC9F,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,eAA2D,CAAC;AAE5F;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,eAAkD,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,eAA+C,CAAC;AAEjF,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,eAAyD,CAAC;AAExF,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AAEvE,8FAA8F;AAC9F,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,sFAAsF;AACtF,eAAO,MAAM,cAAc,uBAAuB,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,eAA2D,CAAC;AAE5F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,eAAqD,CAAC;AAEhF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,eAAkD,CAAC"}
package/dist/tokens.js CHANGED
@@ -6,6 +6,8 @@ export const RESOURCE_RESOLVER = Symbol.for('@dudousxd/nestjs-authz:resource-res
6
6
  export const POLICY_RESOURCE_METADATA = 'nestjs-authz:policy-resource';
7
7
  /** Metadata key for `@Can(ability, Resource?)` — stores the ability descriptor on a route. */
8
8
  export const CAN_METADATA = 'nestjs-authz:can';
9
+ /** Metadata key for `@Roles(...roles)` — stores the allowed role names on a route. */
10
+ export const ROLES_METADATA = 'nestjs-authz:roles';
9
11
  /**
10
12
  * Cross-lib injection token for an optional {@link PermissionProvider} — the seam the
11
13
  * RBAC adapter (`@dudousxd/nestjs-authz-typeorm`) registers so that a model-less,
@@ -18,6 +20,18 @@ export const CAN_METADATA = 'nestjs-authz:can';
18
20
  * as before (backward-compatible: unknown abilities still throw).
19
21
  */
20
22
  export const PERMISSION_PROVIDER = Symbol.for('@dudousxd/nestjs-authz:permission-provider');
23
+ /**
24
+ * Cross-lib injection token for an optional {@link RoleProvider} — the seam an RBAC
25
+ * adapter (`@dudousxd/nestjs-authz-typeorm`) registers so coarse role-checks
26
+ * (`gate.hasRole('teacher')`, `@Roles('admin')`) consult a persisted role store.
27
+ *
28
+ * Like {@link PERMISSION_PROVIDER}, it shares the global symbol registry via
29
+ * `Symbol.for(key)` so an RBAC package registering this same key resolves to the
30
+ * SAME symbol instance without importing core internals. Consulted with
31
+ * `@Optional()`: when absent, only the default {@link RoleResolver} (roles read off
32
+ * the user object) supplies roles. When BOTH yield roles, the Gate unions them.
33
+ */
34
+ export const ROLE_PROVIDER = Symbol.for('@dudousxd/nestjs-authz:role-provider');
21
35
  /**
22
36
  * Cross-lib injection token for the current-request context accessor, owned by
23
37
  * `@dudousxd/nestjs-context`. We do NOT import nestjs-context — instead we share
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAEjF,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;AAExF,sFAAsF;AACtF,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,CAAC;AAEvE,8FAA8F;AAC9F,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAE5F;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAEjF,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;AAExF,sFAAsF;AACtF,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,CAAC;AAEvE,8FAA8F;AAC9F,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAE5F;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AAEhF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC"}
package/dist/types.d.ts CHANGED
@@ -69,6 +69,19 @@ export interface AuthzModuleOptions {
69
69
  * you pass directly and never invokes this hook.
70
70
  */
71
71
  resolveUser?: (ref: UserRef) => User | undefined | Promise<User | undefined>;
72
+ /**
73
+ * Override the default {@link RoleResolver} used by coarse role-checks
74
+ * (`gate.hasRole('teacher')`, `@Roles('admin')`). The default reads `user.roles`
75
+ * (`string[]`) OR `user.role` (`string | string[]`) off the user object, so
76
+ * role-checks work with ZERO RBAC tables. Provide this to derive roles from a
77
+ * different shape. When the optional `ROLE_PROVIDER` seam is ALSO registered, the
78
+ * Gate unions both sources' roles.
79
+ *
80
+ * On the context path the resolver receives whatever the context produced (the
81
+ * raw {@link UserRef} unless `resolveUser` hydrated the entity); on the explicit
82
+ * `gate.forUser(entity)` path it receives exactly what you passed.
83
+ */
84
+ resolveRoles?: (user: User) => string[] | undefined | Promise<string[] | undefined>;
72
85
  /**
73
86
  * Override the default {@link ResourceResolver} used to load an instance for
74
87
  * `@Can(ability, Resource)` routes. Defaults to {@link IdParamResourceResolver}
@@ -83,6 +96,20 @@ export interface AuthzModuleOptions {
83
96
  * is supplied.
84
97
  */
85
98
  idParam?: string;
99
+ /**
100
+ * Opt-in `POST /authz/can` fallback endpoint. **Off by default.** When enabled,
101
+ * registers a controller that runs `gate.allows(ability, resource?)` for the
102
+ * current (context) user and returns `{ allowed: boolean }`. This is the
103
+ * last-resort path the codegen-emitted `can()` helper targets.
104
+ *
105
+ * - `true` → mount at the default path `authz/can`.
106
+ * - `string` → mount at that path (e.g. `'api/authz/can'`).
107
+ * - `false`/omitted → no endpoint is registered.
108
+ *
109
+ * Prefer the no-request paths (shared Inertia props, per-resource `can` maps)
110
+ * — this endpoint exists only for abilities not already hydrated on the client.
111
+ */
112
+ canEndpoint?: boolean | string;
86
113
  }
87
114
  export interface AuthzModuleOptionsFactory {
88
115
  createAuthzOptions(): Promise<AuthzModuleOptions> | AuthzModuleOptions;
@@ -93,5 +120,11 @@ export interface AuthzModuleAsyncOptions {
93
120
  useClass?: Type<AuthzModuleOptionsFactory>;
94
121
  useFactory?: (...args: unknown[]) => Promise<AuthzModuleOptions> | AuthzModuleOptions;
95
122
  inject?: unknown[];
123
+ /**
124
+ * Opt-in `POST /authz/can` fallback endpoint (see {@link AuthzModuleOptions.canEndpoint}).
125
+ * Declared statically here because controllers are registered at module-definition
126
+ * time, before the async options factory resolves. Off by default.
127
+ */
128
+ canEndpoint?: boolean | string;
96
129
  }
97
130
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE3F;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,KACZ,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AAExD,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrD,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAErF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,KACZ,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACvC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;IAC7E;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;CACxE;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;IACtF,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE3F;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,KACZ,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AAExD,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrD,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAErF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,KACZ,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACvC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;IAC7E;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACpF;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;CACxE;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;IACtF,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-authz",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "NestJS authorization — Laravel-style Gates & Policies, @Can guard, resource resolver (zero DB).",
5
5
  "license": "MIT",
6
6
  "repository": {