@application-kit/authorization 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 (39) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +5 -1
  3. package/dist/cjs/nest/current-actor.decorator.d.ts +1 -0
  4. package/dist/cjs/nest/current-actor.decorator.js +7 -0
  5. package/dist/cjs/nest/index.d.ts +3 -0
  6. package/dist/cjs/nest/index.js +3 -0
  7. package/dist/cjs/nest/internal/index.d.ts +3 -0
  8. package/dist/cjs/nest/internal/index.js +19 -0
  9. package/dist/cjs/nest/internal/is-graphql-context.d.ts +2 -0
  10. package/dist/cjs/nest/internal/is-graphql-context.js +9 -0
  11. package/dist/cjs/nest/internal/is-public-handler.d.ts +3 -0
  12. package/dist/cjs/nest/internal/is-public-handler.js +9 -0
  13. package/dist/cjs/nest/internal/resolve-execution-actor.d.ts +3 -0
  14. package/dist/cjs/nest/internal/resolve-execution-actor.js +9 -0
  15. package/dist/cjs/nest/policies.guard.d.ts +0 -1
  16. package/dist/cjs/nest/policies.guard.js +7 -18
  17. package/dist/cjs/nest/resolve-execution-request.d.ts +2 -0
  18. package/dist/cjs/nest/resolve-execution-request.js +9 -0
  19. package/dist/cjs/nest/with-public-routes.d.ts +2 -0
  20. package/dist/cjs/nest/with-public-routes.js +36 -0
  21. package/dist/esm/nest/current-actor.decorator.d.ts +1 -0
  22. package/dist/esm/nest/current-actor.decorator.js +4 -0
  23. package/dist/esm/nest/index.d.ts +3 -0
  24. package/dist/esm/nest/index.js +3 -0
  25. package/dist/esm/nest/internal/index.d.ts +3 -0
  26. package/dist/esm/nest/internal/index.js +3 -0
  27. package/dist/esm/nest/internal/is-graphql-context.d.ts +2 -0
  28. package/dist/esm/nest/internal/is-graphql-context.js +5 -0
  29. package/dist/esm/nest/internal/is-public-handler.d.ts +3 -0
  30. package/dist/esm/nest/internal/is-public-handler.js +5 -0
  31. package/dist/esm/nest/internal/resolve-execution-actor.d.ts +3 -0
  32. package/dist/esm/nest/internal/resolve-execution-actor.js +5 -0
  33. package/dist/esm/nest/policies.guard.d.ts +0 -1
  34. package/dist/esm/nest/policies.guard.js +7 -18
  35. package/dist/esm/nest/resolve-execution-request.d.ts +2 -0
  36. package/dist/esm/nest/resolve-execution-request.js +5 -0
  37. package/dist/esm/nest/with-public-routes.d.ts +2 -0
  38. package/dist/esm/nest/with-public-routes.js +32 -0
  39. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @application-kit/authorization
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ef902ec: Вход `/nest`: `CurrentActor()` — актор параметром обработчика, `withPublicRoutes(AuthGuard('jwt'))` — guard аутентификации с учётом `@Public()`, `resolveExecutionRequest` — чтение запроса без развилки HTTP/GraphQL. Новых зависимостей нет: `@nestjs/graphql` и `@nestjs/passport` пакету не нужны.
8
+
3
9
  ## 0.2.0
4
10
 
5
11
  ### Minor Changes
package/README.md CHANGED
@@ -52,7 +52,11 @@ const ability = buildAbilityFor({ role: 'EDITOR' }, grants)
52
52
  проверяется конъюнкцией политик над ability актора из `request.user`. GraphQL-резолвер без обоих декораторов
53
53
  запрещён (fail-closed) с предупреждением в лог, REST-обработчик — пропускается: его авторизация на маршруте.
54
54
  - `CheckPolicies(...handlers)`, `PolicyHandler`, `permitAuthenticated` — политики обработчика.
55
- - `Public()`, `IS_PUBLIC_KEY` — открытый обработчик; ключ читает и guard аутентификации приложения.
55
+ - `Public()`, `IS_PUBLIC_KEY` — открытый обработчик.
56
+ - `withPublicRoutes(AuthGuard('jwt'))` — guard аутентификации приложения поверх его базы: открытый обработчик пропускает
57
+ мимо базы, а запрос ей отдаёт и на HTTP, и в GraphQL. `@nestjs/passport` пакету не нужен.
58
+ - `CurrentActor()` — параметр обработчика с `request.user`; на открытом обработчике актора может не быть.
59
+ - `resolveExecutionRequest(context)` — запрос без развилки транспорта. `@nestjs/graphql` пакету не нужен.
56
60
  - `AbilityFactory` — ability актора по карте грантов.
57
61
 
58
62
  Собирает механизм `AuthorizationModule.forRoot({ grants })`: фабрика ability, логгер и глобальный guard (`APP_GUARD`)
@@ -0,0 +1 @@
1
+ export declare const CurrentActor: (...dataOrPipes: unknown[]) => ParameterDecorator;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CurrentActor = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const resolve_execution_actor_js_1 = require("./internal/resolve-execution-actor.js");
6
+ const currentActorFactory = (_, context) => (0, resolve_execution_actor_js_1.resolveExecutionActor)(context);
7
+ exports.CurrentActor = (0, common_1.createParamDecorator)(currentActorFactory);
@@ -4,6 +4,9 @@ export * from './authorization-logger.interface.js';
4
4
  export * from './authorization.module.js';
5
5
  export * from './check-policies.decorator.js';
6
6
  export * from './constants.js';
7
+ export * from './current-actor.decorator.js';
7
8
  export * from './policies.guard.js';
8
9
  export * from './policy-handlers.js';
9
10
  export * from './public.decorator.js';
11
+ export * from './resolve-execution-request.js';
12
+ export * from './with-public-routes.js';
@@ -20,6 +20,9 @@ __exportStar(require("./authorization-logger.interface.js"), exports);
20
20
  __exportStar(require("./authorization.module.js"), exports);
21
21
  __exportStar(require("./check-policies.decorator.js"), exports);
22
22
  __exportStar(require("./constants.js"), exports);
23
+ __exportStar(require("./current-actor.decorator.js"), exports);
23
24
  __exportStar(require("./policies.guard.js"), exports);
24
25
  __exportStar(require("./policy-handlers.js"), exports);
25
26
  __exportStar(require("./public.decorator.js"), exports);
27
+ __exportStar(require("./resolve-execution-request.js"), exports);
28
+ __exportStar(require("./with-public-routes.js"), exports);
@@ -0,0 +1,3 @@
1
+ export * from './is-graphql-context.js';
2
+ export * from './is-public-handler.js';
3
+ export * from './resolve-execution-actor.js';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./is-graphql-context.js"), exports);
18
+ __exportStar(require("./is-public-handler.js"), exports);
19
+ __exportStar(require("./resolve-execution-actor.js"), exports);
@@ -0,0 +1,2 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ export declare const isGraphqlContext: (context: ExecutionContext) => boolean;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isGraphqlContext = void 0;
4
+ const GRAPHQL_CONTEXT_TYPE = 'graphql';
5
+ const isGraphqlContext = (context) => {
6
+ const transport = context.getType();
7
+ return transport === GRAPHQL_CONTEXT_TYPE;
8
+ };
9
+ exports.isGraphqlContext = isGraphqlContext;
@@ -0,0 +1,3 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ import type { Reflector } from '@nestjs/core';
3
+ export declare const isPublicHandler: (reflector: Reflector, context: ExecutionContext) => boolean;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPublicHandler = void 0;
4
+ const public_decorator_js_1 = require("../public.decorator.js");
5
+ const isPublicHandler = (reflector, context) => {
6
+ const targets = [context.getHandler(), context.getClass()];
7
+ return reflector.getAllAndOverride(public_decorator_js_1.IS_PUBLIC_KEY, targets) === true;
8
+ };
9
+ exports.isPublicHandler = isPublicHandler;
@@ -0,0 +1,3 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ import type { AbilityActorInterface } from '../../build-ability.js';
3
+ export declare const resolveExecutionActor: (context: ExecutionContext) => AbilityActorInterface | undefined;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveExecutionActor = void 0;
4
+ const resolve_execution_request_js_1 = require("../resolve-execution-request.js");
5
+ const resolveExecutionActor = (context) => {
6
+ const request = (0, resolve_execution_request_js_1.resolveExecutionRequest)(context);
7
+ return request?.user;
8
+ };
9
+ exports.resolveExecutionActor = resolveExecutionActor;
@@ -10,5 +10,4 @@ export declare class PoliciesGuard implements CanActivate {
10
10
  canActivate(context: ExecutionContext): boolean;
11
11
  private allowWithoutPolicies;
12
12
  private enforcePolicies;
13
- private extractActor;
14
13
  }
@@ -17,10 +17,9 @@ const common_1 = require("@nestjs/common");
17
17
  const core_1 = require("@nestjs/core");
18
18
  const check_policies_decorator_js_1 = require("./check-policies.decorator.js");
19
19
  const constants_js_1 = require("./constants.js");
20
- const public_decorator_js_1 = require("./public.decorator.js");
21
- const GRAPHQL_CONTEXT_TYPE = 'graphql';
22
- const GRAPHQL_CONTEXT_ARGUMENT_INDEX = 2;
23
- const isGraphql = (context) => context.getType() === GRAPHQL_CONTEXT_TYPE;
20
+ const is_graphql_context_js_1 = require("./internal/is-graphql-context.js");
21
+ const is_public_handler_js_1 = require("./internal/is-public-handler.js");
22
+ const resolve_execution_actor_js_1 = require("./internal/resolve-execution-actor.js");
24
23
  let PoliciesGuard = class PoliciesGuard {
25
24
  reflector;
26
25
  abilityFactory;
@@ -31,26 +30,22 @@ let PoliciesGuard = class PoliciesGuard {
31
30
  this.logger = logger;
32
31
  }
33
32
  canActivate(context) {
34
- const isPublic = this.reflector.getAllAndOverride(public_decorator_js_1.IS_PUBLIC_KEY, [
35
- context.getHandler(),
36
- context.getClass(),
37
- ]);
38
- if (isPublic === true) {
33
+ if ((0, is_public_handler_js_1.isPublicHandler)(this.reflector, context)) {
39
34
  return true;
40
35
  }
41
36
  const handlers = this.reflector.getAllAndOverride(check_policies_decorator_js_1.CHECK_POLICIES_KEY, [context.getHandler(), context.getClass()]) ?? [];
42
37
  return handlers.length === 0 ? this.allowWithoutPolicies(context) : this.enforcePolicies({ context, handlers });
43
38
  }
44
39
  allowWithoutPolicies(context) {
45
- if (isGraphql(context)) {
40
+ if ((0, is_graphql_context_js_1.isGraphqlContext)(context)) {
46
41
  this.logger.warn({ class: context.getClass().name, handler: context.getHandler().name }, 'PoliciesGuard deny-by-default — GraphQL resolver missing @Public/@CheckPolicies');
47
42
  throw new common_1.ForbiddenException('Forbidden by policy');
48
43
  }
49
44
  return true;
50
45
  }
51
46
  enforcePolicies(parameters) {
52
- const actor = this.extractActor(parameters.context);
53
- if (actor === null) {
47
+ const actor = (0, resolve_execution_actor_js_1.resolveExecutionActor)(parameters.context);
48
+ if (actor === undefined) {
54
49
  throw new common_1.ForbiddenException('No authenticated user');
55
50
  }
56
51
  const ability = this.abilityFactory.createForActor({
@@ -62,12 +57,6 @@ let PoliciesGuard = class PoliciesGuard {
62
57
  }
63
58
  return true;
64
59
  }
65
- extractActor(context) {
66
- const request = isGraphql(context)
67
- ? context.getArgByIndex(GRAPHQL_CONTEXT_ARGUMENT_INDEX).req
68
- : context.switchToHttp().getRequest();
69
- return request?.user ?? null;
70
- }
71
60
  };
72
61
  exports.PoliciesGuard = PoliciesGuard;
73
62
  exports.PoliciesGuard = PoliciesGuard = __decorate([
@@ -0,0 +1,2 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ export declare const resolveExecutionRequest: <TRequest>(context: ExecutionContext) => TRequest | undefined;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveExecutionRequest = void 0;
4
+ const is_graphql_context_js_1 = require("./internal/is-graphql-context.js");
5
+ const GRAPHQL_CONTEXT_ARGUMENT_INDEX = 2;
6
+ const resolveExecutionRequest = (context) => ((0, is_graphql_context_js_1.isGraphqlContext)(context)
7
+ ? context.getArgByIndex(GRAPHQL_CONTEXT_ARGUMENT_INDEX).req
8
+ : context.switchToHttp().getRequest());
9
+ exports.resolveExecutionRequest = resolveExecutionRequest;
@@ -0,0 +1,2 @@
1
+ import type { CanActivate, Type } from '@nestjs/common';
2
+ export declare const withPublicRoutes: <TGuard extends Type<CanActivate>>(base: TGuard) => TGuard;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.withPublicRoutes = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const is_public_handler_js_1 = require("./internal/is-public-handler.js");
16
+ const resolve_execution_request_js_1 = require("./resolve-execution-request.js");
17
+ const withPublicRoutes = (base) => {
18
+ let PublicRoutesGuard = class PublicRoutesGuard extends base {
19
+ reflector;
20
+ canActivate(context) {
21
+ return (0, is_public_handler_js_1.isPublicHandler)(this.reflector, context) || super.canActivate(context);
22
+ }
23
+ getRequest(context) {
24
+ return (0, resolve_execution_request_js_1.resolveExecutionRequest)(context);
25
+ }
26
+ };
27
+ __decorate([
28
+ (0, common_1.Inject)(core_1.Reflector),
29
+ __metadata("design:type", core_1.Reflector)
30
+ ], PublicRoutesGuard.prototype, "reflector", void 0);
31
+ PublicRoutesGuard = __decorate([
32
+ (0, common_1.Injectable)()
33
+ ], PublicRoutesGuard);
34
+ return PublicRoutesGuard;
35
+ };
36
+ exports.withPublicRoutes = withPublicRoutes;
@@ -0,0 +1 @@
1
+ export declare const CurrentActor: (...dataOrPipes: unknown[]) => ParameterDecorator;
@@ -0,0 +1,4 @@
1
+ import { createParamDecorator } from '@nestjs/common';
2
+ import { resolveExecutionActor } from './internal/resolve-execution-actor.js';
3
+ const currentActorFactory = (_, context) => resolveExecutionActor(context);
4
+ export const CurrentActor = createParamDecorator(currentActorFactory);
@@ -4,6 +4,9 @@ export * from './authorization-logger.interface.js';
4
4
  export * from './authorization.module.js';
5
5
  export * from './check-policies.decorator.js';
6
6
  export * from './constants.js';
7
+ export * from './current-actor.decorator.js';
7
8
  export * from './policies.guard.js';
8
9
  export * from './policy-handlers.js';
9
10
  export * from './public.decorator.js';
11
+ export * from './resolve-execution-request.js';
12
+ export * from './with-public-routes.js';
@@ -4,6 +4,9 @@ export * from './authorization-logger.interface.js';
4
4
  export * from './authorization.module.js';
5
5
  export * from './check-policies.decorator.js';
6
6
  export * from './constants.js';
7
+ export * from './current-actor.decorator.js';
7
8
  export * from './policies.guard.js';
8
9
  export * from './policy-handlers.js';
9
10
  export * from './public.decorator.js';
11
+ export * from './resolve-execution-request.js';
12
+ export * from './with-public-routes.js';
@@ -0,0 +1,3 @@
1
+ export * from './is-graphql-context.js';
2
+ export * from './is-public-handler.js';
3
+ export * from './resolve-execution-actor.js';
@@ -0,0 +1,3 @@
1
+ export * from './is-graphql-context.js';
2
+ export * from './is-public-handler.js';
3
+ export * from './resolve-execution-actor.js';
@@ -0,0 +1,2 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ export declare const isGraphqlContext: (context: ExecutionContext) => boolean;
@@ -0,0 +1,5 @@
1
+ const GRAPHQL_CONTEXT_TYPE = 'graphql';
2
+ export const isGraphqlContext = (context) => {
3
+ const transport = context.getType();
4
+ return transport === GRAPHQL_CONTEXT_TYPE;
5
+ };
@@ -0,0 +1,3 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ import type { Reflector } from '@nestjs/core';
3
+ export declare const isPublicHandler: (reflector: Reflector, context: ExecutionContext) => boolean;
@@ -0,0 +1,5 @@
1
+ import { IS_PUBLIC_KEY } from '../public.decorator.js';
2
+ export const isPublicHandler = (reflector, context) => {
3
+ const targets = [context.getHandler(), context.getClass()];
4
+ return reflector.getAllAndOverride(IS_PUBLIC_KEY, targets) === true;
5
+ };
@@ -0,0 +1,3 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ import type { AbilityActorInterface } from '../../build-ability.js';
3
+ export declare const resolveExecutionActor: (context: ExecutionContext) => AbilityActorInterface | undefined;
@@ -0,0 +1,5 @@
1
+ import { resolveExecutionRequest } from '../resolve-execution-request.js';
2
+ export const resolveExecutionActor = (context) => {
3
+ const request = resolveExecutionRequest(context);
4
+ return request?.user;
5
+ };
@@ -10,5 +10,4 @@ export declare class PoliciesGuard implements CanActivate {
10
10
  canActivate(context: ExecutionContext): boolean;
11
11
  private allowWithoutPolicies;
12
12
  private enforcePolicies;
13
- private extractActor;
14
13
  }
@@ -14,10 +14,9 @@ import { ForbiddenException, Inject, Injectable, } from '@nestjs/common';
14
14
  import { Reflector } from '@nestjs/core';
15
15
  import { CHECK_POLICIES_KEY } from './check-policies.decorator.js';
16
16
  import { ABILITY_FACTORY, AUTHORIZATION_LOGGER } from './constants.js';
17
- import { IS_PUBLIC_KEY } from './public.decorator.js';
18
- const GRAPHQL_CONTEXT_TYPE = 'graphql';
19
- const GRAPHQL_CONTEXT_ARGUMENT_INDEX = 2;
20
- const isGraphql = (context) => context.getType() === GRAPHQL_CONTEXT_TYPE;
17
+ import { isGraphqlContext } from './internal/is-graphql-context.js';
18
+ import { isPublicHandler } from './internal/is-public-handler.js';
19
+ import { resolveExecutionActor } from './internal/resolve-execution-actor.js';
21
20
  let PoliciesGuard = class PoliciesGuard {
22
21
  reflector;
23
22
  abilityFactory;
@@ -28,26 +27,22 @@ let PoliciesGuard = class PoliciesGuard {
28
27
  this.logger = logger;
29
28
  }
30
29
  canActivate(context) {
31
- const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [
32
- context.getHandler(),
33
- context.getClass(),
34
- ]);
35
- if (isPublic === true) {
30
+ if (isPublicHandler(this.reflector, context)) {
36
31
  return true;
37
32
  }
38
33
  const handlers = this.reflector.getAllAndOverride(CHECK_POLICIES_KEY, [context.getHandler(), context.getClass()]) ?? [];
39
34
  return handlers.length === 0 ? this.allowWithoutPolicies(context) : this.enforcePolicies({ context, handlers });
40
35
  }
41
36
  allowWithoutPolicies(context) {
42
- if (isGraphql(context)) {
37
+ if (isGraphqlContext(context)) {
43
38
  this.logger.warn({ class: context.getClass().name, handler: context.getHandler().name }, 'PoliciesGuard deny-by-default — GraphQL resolver missing @Public/@CheckPolicies');
44
39
  throw new ForbiddenException('Forbidden by policy');
45
40
  }
46
41
  return true;
47
42
  }
48
43
  enforcePolicies(parameters) {
49
- const actor = this.extractActor(parameters.context);
50
- if (actor === null) {
44
+ const actor = resolveExecutionActor(parameters.context);
45
+ if (actor === undefined) {
51
46
  throw new ForbiddenException('No authenticated user');
52
47
  }
53
48
  const ability = this.abilityFactory.createForActor({
@@ -59,12 +54,6 @@ let PoliciesGuard = class PoliciesGuard {
59
54
  }
60
55
  return true;
61
56
  }
62
- extractActor(context) {
63
- const request = isGraphql(context)
64
- ? context.getArgByIndex(GRAPHQL_CONTEXT_ARGUMENT_INDEX).req
65
- : context.switchToHttp().getRequest();
66
- return request?.user ?? null;
67
- }
68
57
  };
69
58
  PoliciesGuard = __decorate([
70
59
  Injectable(),
@@ -0,0 +1,2 @@
1
+ import type { ExecutionContext } from '@nestjs/common';
2
+ export declare const resolveExecutionRequest: <TRequest>(context: ExecutionContext) => TRequest | undefined;
@@ -0,0 +1,5 @@
1
+ import { isGraphqlContext } from './internal/is-graphql-context.js';
2
+ const GRAPHQL_CONTEXT_ARGUMENT_INDEX = 2;
3
+ export const resolveExecutionRequest = (context) => (isGraphqlContext(context)
4
+ ? context.getArgByIndex(GRAPHQL_CONTEXT_ARGUMENT_INDEX).req
5
+ : context.switchToHttp().getRequest());
@@ -0,0 +1,2 @@
1
+ import type { CanActivate, Type } from '@nestjs/common';
2
+ export declare const withPublicRoutes: <TGuard extends Type<CanActivate>>(base: TGuard) => TGuard;
@@ -0,0 +1,32 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Inject, Injectable } from '@nestjs/common';
11
+ import { Reflector } from '@nestjs/core';
12
+ import { isPublicHandler } from './internal/is-public-handler.js';
13
+ import { resolveExecutionRequest } from './resolve-execution-request.js';
14
+ export const withPublicRoutes = (base) => {
15
+ let PublicRoutesGuard = class PublicRoutesGuard extends base {
16
+ reflector;
17
+ canActivate(context) {
18
+ return isPublicHandler(this.reflector, context) || super.canActivate(context);
19
+ }
20
+ getRequest(context) {
21
+ return resolveExecutionRequest(context);
22
+ }
23
+ };
24
+ __decorate([
25
+ Inject(Reflector),
26
+ __metadata("design:type", Reflector)
27
+ ], PublicRoutesGuard.prototype, "reflector", void 0);
28
+ PublicRoutesGuard = __decorate([
29
+ Injectable()
30
+ ], PublicRoutesGuard);
31
+ return PublicRoutesGuard;
32
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@application-kit/authorization",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Авторизация на CASL для NestJS и браузера: реестры subject'ов и ролей, ability из грантов модулей, глобальный guard политик",
5
5
  "keywords": [
6
6
  "authorization",
@@ -51,7 +51,7 @@
51
51
  "dist"
52
52
  ],
53
53
  "scripts": {
54
- "build": "rm -rf ./dist && node ../../scripts/barrels.mjs create ./src --entry-only=nest && tsc --project tsconfig.build.json && tsc --project tsconfig.build.cjs.json && node ../../scripts/barrels.mjs clean ./src && node ../../scripts/mark-cjs.mjs ./dist/cjs",
54
+ "build": "rm -rf ./dist && node ../../scripts/barrels.mjs create ./src --entry-only=nest,internal && tsc --project tsconfig.build.json && tsc --project tsconfig.build.cjs.json && node ../../scripts/barrels.mjs clean ./src && node ../../scripts/mark-cjs.mjs ./dist/cjs",
55
55
  "lint:tsc": "tsc --noEmit --pretty --project .",
56
56
  "test:mutation": "stryker run",
57
57
  "test:unit": "vitest run"