diff --git a/.changeset/polite-planes-invite.md b/.changeset/polite-planes-invite.md new file mode 100644 index 0000000..3dd8d7f --- /dev/null +++ b/.changeset/polite-planes-invite.md @@ -0,0 +1,6 @@ +--- +'@nest-lab/or-guard': patch +--- + +Use `{strict: false}` when calling modRef.get() to ensure guards can come from +other modules diff --git a/packages/or-guard/src/lib/and.guard.ts b/packages/or-guard/src/lib/and.guard.ts index c1cc699..3d04ae1 100644 --- a/packages/or-guard/src/lib/and.guard.ts +++ b/packages/or-guard/src/lib/and.guard.ts @@ -24,16 +24,18 @@ interface AndGuardOptions { export function AndGuard( guards: Array<Type<CanActivate> | InjectionToken>, - orGuardOptions?: AndGuardOptions + andGuardOptions?: AndGuardOptions ) { class AndMixinGuard implements CanActivate { private guards: CanActivate[] = []; constructor(@Inject(ModuleRef) private readonly modRef: ModuleRef) {} canActivate(context: ExecutionContext): Observable<boolean> { - this.guards = guards.map((guard) => this.modRef.get(guard)); + this.guards = guards.map((guard) => + this.modRef.get(guard, { strict: false }) + ); const canActivateReturns: Array<() => Observable<boolean>> = this.guards.map((guard) => () => this.deferGuard(guard, context)); - const mapOperator = orGuardOptions?.sequential ? concatMap : mergeMap; + const mapOperator = andGuardOptions?.sequential ? concatMap : mergeMap; return from(canActivateReturns).pipe( mapOperator((obs) => { return obs().pipe(this.handleError()); @@ -61,7 +63,7 @@ export function AndGuard( private handleError(): OperatorFunction<boolean, boolean> { return catchError((err) => { - if (orGuardOptions?.throwOnFirstError) { + if (andGuardOptions?.throwOnFirstError) { return throwError(() => err); } return of(false); diff --git a/packages/or-guard/src/lib/or.guard.ts b/packages/or-guard/src/lib/or.guard.ts index 7f984c2..17fedf7 100644 --- a/packages/or-guard/src/lib/or.guard.ts +++ b/packages/or-guard/src/lib/or.guard.ts @@ -29,7 +29,9 @@ export function OrGuard( private guards: CanActivate[] = []; constructor(@Inject(ModuleRef) private readonly modRef: ModuleRef) {} canActivate(context: ExecutionContext): Observable<boolean> { - this.guards = guards.map((guard) => this.modRef.get(guard)); + this.guards = guards.map((guard) => + this.modRef.get(guard, { strict: false }) + ); const canActivateReturns: Array<Observable<boolean>> = this.guards.map( (guard) => this.deferGuard(guard, context) );