From 42b2f3493dd371a34466f6404a5ee4ecc117f489 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Sat, 28 Mar 2020 14:05:31 -0400 Subject: [PATCH] feat(common): injectable decorator factory fix #120 --- README.md | 2 +- packages/common/README.md | 7 +++++++ packages/common/src/index.ts | 1 + packages/common/src/injectDecoratorFactory.ts | 14 ++++++++++++++ packages/hasura/package.json | 1 + packages/hasura/src/hasura.decorators.ts | 5 ++++- packages/hasura/src/hasura.event-handler.guard.ts | 11 +++-------- packages/hasura/src/hasura.module.ts | 4 ++-- packages/hasura/src/tests/hasura.module.spec.ts | 2 +- packages/rabbitmq/package.json | 1 + packages/rabbitmq/src/rabbitmq.decorators.ts | 7 ++++++- 11 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 packages/common/src/injectDecoratorFactory.ts diff --git a/README.md b/README.md index 59b76749e..613574baf 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ A collection of Badass modules and utilities to help you level up your NestJS ap -| Project | Description | Version | Changelog | +| Package | Description | Version | Changelog | | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | | [`@golevelup/nestjs-common`](./packages/common) | Common types, mixins | [![version](https://img.shields.io/npm/v/@golevelup/nestjs-common.svg)](https://www.npmjs.com/package/@golevelup/nestjs-common) | [changelog](./packages/common/CHANGELOG.md) | | [`@golevelup/nestjs-discovery`](./packages/discovery) | `DiscoveryModule` for finding providers, controllers and method handlers from your NestJS app that have certain metadata | [![version](https://img.shields.io/npm/v/@golevelup/nestjs-discovery.svg)](https://www.npmjs.com/package/@golevelup/nestjs-discovery) | [changelog](./packages/discovery/CHANGELOG.md) | diff --git a/packages/common/README.md b/packages/common/README.md index 7687a141d..d197d21f6 100644 --- a/packages/common/README.md +++ b/packages/common/README.md @@ -8,6 +8,13 @@ Utility functions and low level reusable modules that provide building blocks for the @levelup-nestjs and @nestjs ecosystem. +## Inject Decorator Factory (makeInjectableDecorator) + +Creates a decorator that can be used as a convenience to inject a specific token + +Instead of using `@Inject(SOME_THING_TOKEN)` this can be used to create a new named Decorator such as `@InjectSomeThing()` which will hide the token details from users making APIs easier +to consume + ## Mixins The mixin pattern is particularly useful with NestJS components like `Interceptors` as a mechanism to provide both configuration while still allowing the component to participate with Nest's `Dependency Injection`. diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 026d66a56..b7ec8f13c 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,2 +1,3 @@ +export * from './injectDecoratorFactory'; export * from './mixins'; export * from './options'; diff --git a/packages/common/src/injectDecoratorFactory.ts b/packages/common/src/injectDecoratorFactory.ts new file mode 100644 index 000000000..919c0fff1 --- /dev/null +++ b/packages/common/src/injectDecoratorFactory.ts @@ -0,0 +1,14 @@ +import { Inject } from '@nestjs/common'; + +/** + * Creates a decorator that can be used as a convenience to inject a specific token + * + * Instead of using @Inject(SOME_THING_TOKEN) this can be used to create a new named Decorator + * such as @InjectSomeThing() which will hide the token details from users making APIs easier + * to consume + * @param token + */ +export const makeInjectableDecorator = ( + token: string | symbol +): (() => ParameterDecorator) => () => (target, key, descriptor) => + Inject(token)(target, key, descriptor); diff --git a/packages/hasura/package.json b/packages/hasura/package.json index 8696d502d..70ea60e9b 100644 --- a/packages/hasura/package.json +++ b/packages/hasura/package.json @@ -36,6 +36,7 @@ "access": "public" }, "dependencies": { + "@golevelup/nestjs-common": "^1.3.1", "@golevelup/nestjs-discovery": "^2.3.0", "@golevelup/nestjs-modules": "^0.4.0" }, diff --git a/packages/hasura/src/hasura.decorators.ts b/packages/hasura/src/hasura.decorators.ts index ee2c7db12..15e5e59f7 100644 --- a/packages/hasura/src/hasura.decorators.ts +++ b/packages/hasura/src/hasura.decorators.ts @@ -1,5 +1,6 @@ +import { makeInjectableDecorator } from '@golevelup/nestjs-common'; import { SetMetadata } from '@nestjs/common'; -import { HASURA_EVENT_HANDLER } from './hasura.constants'; +import { HASURA_EVENT_HANDLER, HASURA_MODULE_CONFIG } from './hasura.constants'; import { HasuraEventHandlerConfig } from './hasura.interfaces'; export const HasuraEventHandler = (config: HasuraEventHandlerConfig) => ( @@ -7,3 +8,5 @@ export const HasuraEventHandler = (config: HasuraEventHandlerConfig) => ( key, descriptor ) => SetMetadata(HASURA_EVENT_HANDLER, config)(target, key, descriptor); + +export const InjectHasuraConfig = makeInjectableDecorator(HASURA_MODULE_CONFIG); diff --git a/packages/hasura/src/hasura.event-handler.guard.ts b/packages/hasura/src/hasura.event-handler.guard.ts index 4c06a894f..dc3a0ef55 100644 --- a/packages/hasura/src/hasura.event-handler.guard.ts +++ b/packages/hasura/src/hasura.event-handler.guard.ts @@ -1,19 +1,14 @@ -import { - CanActivate, - ExecutionContext, - Inject, - Injectable, -} from '@nestjs/common'; +import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { Request } from 'express'; import { Observable } from 'rxjs'; -import { HASURA_MODULE_CONFIG } from './hasura.constants'; +import { InjectHasuraConfig } from './hasura.decorators'; import { HasuraModuleConfig } from './hasura.interfaces'; @Injectable() export class HasuraEventHandlerHeaderGuard implements CanActivate { private readonly apiSecret: string; constructor( - @Inject(HASURA_MODULE_CONFIG) + @InjectHasuraConfig() private readonly hasuraConfig: HasuraModuleConfig ) { this.apiSecret = diff --git a/packages/hasura/src/hasura.module.ts b/packages/hasura/src/hasura.module.ts index d10090f8e..6fb301921 100644 --- a/packages/hasura/src/hasura.module.ts +++ b/packages/hasura/src/hasura.module.ts @@ -2,7 +2,6 @@ import { DiscoveryModule, DiscoveryService } from '@golevelup/nestjs-discovery'; import { createConfigurableDynamicRootModule } from '@golevelup/nestjs-modules'; import { BadRequestException, - Inject, Logger, Module, OnModuleInit, @@ -10,6 +9,7 @@ import { import { ExternalContextCreator } from '@nestjs/core/helpers/external-context-creator'; import { flatten, groupBy } from 'lodash'; import { HASURA_EVENT_HANDLER, HASURA_MODULE_CONFIG } from './hasura.constants'; +import { InjectHasuraConfig } from './hasura.decorators'; import { EventHandlerController } from './hasura.event-handler.controller'; import { HasuraEventHandlerHeaderGuard } from './hasura.event-handler.guard'; import { EventHandlerService } from './hasura.event-handler.service'; @@ -36,7 +36,7 @@ export class HasuraModule constructor( private readonly discover: DiscoveryService, private readonly externalContextCreator: ExternalContextCreator, - @Inject(HASURA_MODULE_CONFIG) + @InjectHasuraConfig() private readonly hasuraModuleConfig: HasuraModuleConfig ) { super(); diff --git a/packages/hasura/src/tests/hasura.module.spec.ts b/packages/hasura/src/tests/hasura.module.spec.ts index 414a127b9..294058e24 100644 --- a/packages/hasura/src/tests/hasura.module.spec.ts +++ b/packages/hasura/src/tests/hasura.module.spec.ts @@ -85,6 +85,6 @@ describe('Hasura Module (e2e)', () => { .set(secretHeader, secret) .send(eventPayload) .expect(202) - .then((x) => expect(eventHandlerFn).toHaveBeenCalledTimes(1)); + .then(() => expect(eventHandlerFn).toHaveBeenCalledTimes(1)); }); }); diff --git a/packages/rabbitmq/package.json b/packages/rabbitmq/package.json index 60e053acf..09179520c 100644 --- a/packages/rabbitmq/package.json +++ b/packages/rabbitmq/package.json @@ -34,6 +34,7 @@ "url": "https://github.com/golevelup/nestjs/issues" }, "dependencies": { + "@golevelup/nestjs-common": "^1.3.1", "@golevelup/nestjs-discovery": "^2.3.0", "@golevelup/nestjs-modules": "^0.4.0", "amqp-connection-manager": "^3.0.0", diff --git a/packages/rabbitmq/src/rabbitmq.decorators.ts b/packages/rabbitmq/src/rabbitmq.decorators.ts index 4b407b4ef..1216a5a1b 100644 --- a/packages/rabbitmq/src/rabbitmq.decorators.ts +++ b/packages/rabbitmq/src/rabbitmq.decorators.ts @@ -1,5 +1,6 @@ +import { makeInjectableDecorator } from '@golevelup/nestjs-common'; import { SetMetadata } from '@nestjs/common'; -import { RABBIT_HANDLER } from './rabbitmq.constants'; +import { RABBIT_CONFIG_TOKEN, RABBIT_HANDLER } from './rabbitmq.constants'; import { RabbitHandlerConfig } from './rabbitmq.interfaces'; export const makeRabbitDecorator = >( @@ -18,3 +19,7 @@ export const RabbitHandler = (config: RabbitHandlerConfig) => ( export const RabbitSubscribe = makeRabbitDecorator({ type: 'subscribe' }); export const RabbitRPC = makeRabbitDecorator({ type: 'rpc' }); + +export const InjectRabbitMQConfig = makeInjectableDecorator( + RABBIT_CONFIG_TOKEN +);