diff --git a/src/common/decorators/core/bind.decorator.ts b/src/common/decorators/core/bind.decorator.ts index c550b52886a..c62dd84b470 100644 --- a/src/common/decorators/core/bind.decorator.ts +++ b/src/common/decorators/core/bind.decorator.ts @@ -3,7 +3,7 @@ * Useful when the language doesn't provide a 'Parameter Decorators' feature (vanilla JavaScript) * @param {} ...decorators */ -export function Bind(...decorators) { +export function Bind(...decorators: any[]) { return (target: object, key, descriptor) => { decorators.forEach((fn, index) => fn(target, key, index)); return descriptor; diff --git a/src/common/decorators/core/catch.decorator.ts b/src/common/decorators/core/catch.decorator.ts index 29cebfa24ea..675d1bdd96b 100644 --- a/src/common/decorators/core/catch.decorator.ts +++ b/src/common/decorators/core/catch.decorator.ts @@ -5,7 +5,7 @@ import { FILTER_CATCH_EXCEPTIONS } from '../../constants'; * Defines the Exceptions Filter. Takes set of exception types as an argument which has to be caught by this Filter. * The class should implement the `ExceptionFilter` interface. */ -export function Catch(...exceptions): ClassDecorator { +export function Catch(...exceptions: any[]): ClassDecorator { return (target: object) => { Reflect.defineMetadata(FILTER_CATCH_EXCEPTIONS, exceptions, target); }; diff --git a/src/common/decorators/core/dependencies.decorator.ts b/src/common/decorators/core/dependencies.decorator.ts index 5c702df837a..8a0473aa0b9 100644 --- a/src/common/decorators/core/dependencies.decorator.ts +++ b/src/common/decorators/core/dependencies.decorator.ts @@ -1,12 +1,12 @@ import 'reflect-metadata'; import { PARAMTYPES_METADATA } from '../../constants'; -export function flatten(arr) { +export function flatten(arr: any[]) { const flat = [].concat(...arr); return flat.some(Array.isArray) ? flatten(flat) : flat; }; -export const Dependencies = (...dependencies): ClassDecorator => { +export const Dependencies = (...dependencies: any[]): ClassDecorator => { const flattenDeps = flatten(dependencies); return (target: object) => { Reflect.defineMetadata(PARAMTYPES_METADATA, flattenDeps, target); diff --git a/src/common/decorators/core/exception-filters.decorator.ts b/src/common/decorators/core/exception-filters.decorator.ts index d5652ec2846..363e1c9b759 100644 --- a/src/common/decorators/core/exception-filters.decorator.ts +++ b/src/common/decorators/core/exception-filters.decorator.ts @@ -2,18 +2,19 @@ import 'reflect-metadata'; import { EXCEPTION_FILTERS_METADATA } from '../../constants'; import { Logger } from '@nestjs/common'; import { ExceptionFilter } from '../../index'; +import { extendArrayMetadata } from '../../utils/extend-metadata.util'; const defineFiltersMetadata = (...filters: ExceptionFilter[]) => { return (target: object, key?, descriptor?) => { if (descriptor) { - Reflect.defineMetadata( + extendArrayMetadata( EXCEPTION_FILTERS_METADATA, filters, descriptor.value, ); return descriptor; } - Reflect.defineMetadata(EXCEPTION_FILTERS_METADATA, filters, target); + extendArrayMetadata(EXCEPTION_FILTERS_METADATA, filters, target); return target; }; }; diff --git a/src/common/decorators/core/inject.decorator.ts b/src/common/decorators/core/inject.decorator.ts index 946433807d8..9e40dd5b428 100644 --- a/src/common/decorators/core/inject.decorator.ts +++ b/src/common/decorators/core/inject.decorator.ts @@ -6,7 +6,7 @@ import { isFunction } from '../../utils/shared.utils'; * Injects provider which has to be available in the current injector (module) scope. * Providers are recognized by types or tokens. */ -export function Inject(token): ParameterDecorator { +export function Inject(token: any): ParameterDecorator { return (target, key, index) => { const args = Reflect.getMetadata(SELF_DECLARED_DEPS_METADATA, target) || []; const type = isFunction(token) ? token.name : token; diff --git a/src/common/decorators/core/use-guards.decorator.ts b/src/common/decorators/core/use-guards.decorator.ts index fd2d9ad89ad..a7521774799 100644 --- a/src/common/decorators/core/use-guards.decorator.ts +++ b/src/common/decorators/core/use-guards.decorator.ts @@ -1,4 +1,5 @@ import { GUARDS_METADATA } from '../../constants'; +import { extendArrayMetadata } from '../../utils/extend-metadata.util'; /** * Binds guards to the particular context. @@ -10,13 +11,13 @@ import { GUARDS_METADATA } from '../../constants'; * * @param {} ...guards (types) */ -export function UseGuards(...guards) { +export function UseGuards(...guards: any[]) { return (target: object, key?, descriptor?) => { if (descriptor) { - Reflect.defineMetadata(GUARDS_METADATA, guards, descriptor.value); + extendArrayMetadata(GUARDS_METADATA, guards, descriptor.value); return descriptor; } - Reflect.defineMetadata(GUARDS_METADATA, guards, target); + extendArrayMetadata(GUARDS_METADATA, guards, target); return target; }; } diff --git a/src/common/decorators/core/use-interceptors.decorator.ts b/src/common/decorators/core/use-interceptors.decorator.ts index 963eee53069..0b160a55ed3 100644 --- a/src/common/decorators/core/use-interceptors.decorator.ts +++ b/src/common/decorators/core/use-interceptors.decorator.ts @@ -1,4 +1,5 @@ import { INTERCEPTORS_METADATA } from '../../constants'; +import { extendArrayMetadata } from '../../utils/extend-metadata.util'; /** * Binds interceptors to the particular context. @@ -10,17 +11,17 @@ import { INTERCEPTORS_METADATA } from '../../constants'; * * @param {} ...interceptors (types) */ -export function UseInterceptors(...interceptors) { +export function UseInterceptors(...interceptors: any[]) { return (target: object, key?, descriptor?) => { if (descriptor) { - Reflect.defineMetadata( + extendArrayMetadata( INTERCEPTORS_METADATA, interceptors, descriptor.value, ); return descriptor; } - Reflect.defineMetadata(INTERCEPTORS_METADATA, interceptors, target); + extendArrayMetadata(INTERCEPTORS_METADATA, interceptors, target); return target; }; } diff --git a/src/common/decorators/core/use-pipes.decorator.ts b/src/common/decorators/core/use-pipes.decorator.ts index 06ff8bb495e..17b41de1a8b 100644 --- a/src/common/decorators/core/use-pipes.decorator.ts +++ b/src/common/decorators/core/use-pipes.decorator.ts @@ -1,5 +1,6 @@ import { PipeTransform } from '../../interfaces/index'; import { PIPES_METADATA } from '../../constants'; +import { extendArrayMetadata } from '../../utils/extend-metadata.util'; /** * Binds pipes to the particular context. @@ -14,10 +15,10 @@ import { PIPES_METADATA } from '../../constants'; export function UsePipes(...pipes: PipeTransform[]) { return (target: object, key?, descriptor?) => { if (descriptor) { - Reflect.defineMetadata(PIPES_METADATA, pipes, descriptor.value); + extendArrayMetadata(PIPES_METADATA, pipes, descriptor.value); return descriptor; } - Reflect.defineMetadata(PIPES_METADATA, pipes, target); + extendArrayMetadata(PIPES_METADATA, pipes, target); return target; }; } diff --git a/src/common/interfaces/exceptions/exception-filter.interface.ts b/src/common/interfaces/exceptions/exception-filter.interface.ts index 8d37e3c8353..e83ee2e43ca 100644 --- a/src/common/interfaces/exceptions/exception-filter.interface.ts +++ b/src/common/interfaces/exceptions/exception-filter.interface.ts @@ -1,3 +1,3 @@ -export interface ExceptionFilter { - catch(exception, response); +export interface ExceptionFilter { + catch(exception: T, response: R); } diff --git a/src/common/interfaces/exceptions/rpc-exception-filter.interface.ts b/src/common/interfaces/exceptions/rpc-exception-filter.interface.ts index 22f79627302..b292036bb7c 100644 --- a/src/common/interfaces/exceptions/rpc-exception-filter.interface.ts +++ b/src/common/interfaces/exceptions/rpc-exception-filter.interface.ts @@ -1,5 +1,5 @@ import { Observable } from 'rxjs/Observable'; -export interface RpcExceptionFilter { - catch(exception): Observable; +export interface RpcExceptionFilter { + catch(exception: T): Observable; } diff --git a/src/common/interfaces/exceptions/ws-exception-filter.interface.ts b/src/common/interfaces/exceptions/ws-exception-filter.interface.ts index e13c3849981..9e7ff81556d 100644 --- a/src/common/interfaces/exceptions/ws-exception-filter.interface.ts +++ b/src/common/interfaces/exceptions/ws-exception-filter.interface.ts @@ -1,3 +1,3 @@ -export interface WsExceptionFilter { - catch(exception, client); +export interface WsExceptionFilter { + catch(exception: T, client: R); } diff --git a/src/common/interfaces/features/nest-interceptor.interface.ts b/src/common/interfaces/features/nest-interceptor.interface.ts index c44e99ac29f..e302a11b124 100644 --- a/src/common/interfaces/features/nest-interceptor.interface.ts +++ b/src/common/interfaces/features/nest-interceptor.interface.ts @@ -1,10 +1,10 @@ import { Observable } from 'rxjs/Observable'; import { ExecutionContext } from './execution-context.interface'; -export interface NestInterceptor { +export interface NestInterceptor { intercept( dataOrRequest, context: ExecutionContext, - stream$: Observable, - ): Observable | Promise>; + stream$: Observable, + ): Observable | Promise>; } diff --git a/src/common/interfaces/features/pipe-transform.interface.ts b/src/common/interfaces/features/pipe-transform.interface.ts index 721a632e738..51f87e6bb02 100644 --- a/src/common/interfaces/features/pipe-transform.interface.ts +++ b/src/common/interfaces/features/pipe-transform.interface.ts @@ -1,6 +1,6 @@ import { Paramtype } from './paramtype.interface'; -export type Transform = (value: T, metadata: ArgumentMetadata) => any; +export type Transform = (value: T, metadata: ArgumentMetadata) => any; export interface ArgumentMetadata { type: Paramtype; @@ -8,6 +8,6 @@ export interface ArgumentMetadata { data?: string; } -export interface PipeTransform { - transform(value: T, metadata: ArgumentMetadata): any; +export interface PipeTransform { + transform(value: T, metadata: ArgumentMetadata): R; } diff --git a/src/common/interfaces/middlewares/middleware-config-proxy.interface.ts b/src/common/interfaces/middlewares/middleware-config-proxy.interface.ts index 042f745085c..67c40651141 100644 --- a/src/common/interfaces/middlewares/middleware-config-proxy.interface.ts +++ b/src/common/interfaces/middlewares/middleware-config-proxy.interface.ts @@ -18,7 +18,7 @@ export interface MiddlewareConfigProxy { * method: RequestMethod; * ``` * - * When you passe Controller class, Nest will attach middleware to every HTTP route handler inside this controller. + * When you pass Controller class, Nest will attach middleware to every HTTP route handler inside this controller. * * @param {} ...routes * @returns MiddlewaresConsumer diff --git a/src/common/interfaces/websockets/web-socket-adapter.interface.ts b/src/common/interfaces/websockets/web-socket-adapter.interface.ts index 088c3bb5fb4..aded83655aa 100644 --- a/src/common/interfaces/websockets/web-socket-adapter.interface.ts +++ b/src/common/interfaces/websockets/web-socket-adapter.interface.ts @@ -1,7 +1,7 @@ import { Observable } from 'rxjs/Observable'; -export interface WebSocketAdapter { - create(port: number, options?: any & { namespace?: string; server?: any }); +export interface WebSocketAdapter { + create(port: number, options?: T); bindClientConnect(server, callback: (...args) => void); bindClientDisconnect?(client, callback: (...args) => void); bindMessageHandlers( diff --git a/src/common/test/decorators/use-guards.decorator.spec.ts b/src/common/test/decorators/use-guards.decorator.spec.ts index adeb814aefd..d7ae0e9289e 100644 --- a/src/common/test/decorators/use-guards.decorator.spec.ts +++ b/src/common/test/decorators/use-guards.decorator.spec.ts @@ -14,6 +14,12 @@ describe('@UseGuards', () => { public static test() {} } + class Test2 { + @UseGuards(...(guards as any)) + @UseGuards(...(guards as any)) + public static test() {} + } + it('should enhance class with expected guards array', () => { const metadata = Reflect.getMetadata(GUARDS_METADATA, Test); expect(metadata).to.be.eql(guards); @@ -23,4 +29,9 @@ describe('@UseGuards', () => { const metadata = Reflect.getMetadata(GUARDS_METADATA, TestWithMethod.test); expect(metadata).to.be.eql(guards); }); + + it('should enhance class with multiple guards array', () => { + const metadata = Reflect.getMetadata(GUARDS_METADATA, Test2.test); + expect(metadata).to.be.eql(guards.concat(guards)); + }); }); diff --git a/src/common/utils/extend-metadata.util.ts b/src/common/utils/extend-metadata.util.ts new file mode 100644 index 00000000000..49d27619ee1 --- /dev/null +++ b/src/common/utils/extend-metadata.util.ts @@ -0,0 +1,9 @@ +export function extendArrayMetadata>( + key: string, + metadata: T, + target, +) { + const previousValue = Reflect.getMetadata(key, target) || []; + const value = [...previousValue, ...metadata]; + Reflect.defineMetadata(key, value, target); +} diff --git a/src/microservices/interfaces/packet.interface.ts b/src/microservices/interfaces/packet.interface.ts index 8efb36d4daa..b82377f19dc 100644 --- a/src/microservices/interfaces/packet.interface.ts +++ b/src/microservices/interfaces/packet.interface.ts @@ -9,6 +9,6 @@ export interface ReadPacket { export interface WritePacket { err?: any; - response?: any; + response?: T; isDisposed?: boolean; } \ No newline at end of file diff --git a/src/microservices/utils/pattern.decorator.ts b/src/microservices/utils/pattern.decorator.ts index 1867ae0fd92..14b97722a19 100644 --- a/src/microservices/utils/pattern.decorator.ts +++ b/src/microservices/utils/pattern.decorator.ts @@ -5,8 +5,8 @@ import { PatternMetadata } from '../interfaces/pattern-metadata.interface'; /** * Subscribes to incoming messages which fulfils chosen pattern. */ -export const MessagePattern = ( - metadata?: PatternMetadata | string, +export const MessagePattern = ( + metadata?: T, ): MethodDecorator => { return (target, key, descriptor: PropertyDescriptor) => { Reflect.defineMetadata(PATTERN_METADATA, metadata, descriptor.value); diff --git a/src/websockets/interfaces/on-gateway-connection.interface.ts b/src/websockets/interfaces/on-gateway-connection.interface.ts index 324f7f6b754..da622ff74fe 100644 --- a/src/websockets/interfaces/on-gateway-connection.interface.ts +++ b/src/websockets/interfaces/on-gateway-connection.interface.ts @@ -1,3 +1,3 @@ -export interface OnGatewayConnection { - handleConnection(client: any); +export interface OnGatewayConnection { + handleConnection(client: T); } diff --git a/src/websockets/interfaces/on-gateway-disconnect.interface.ts b/src/websockets/interfaces/on-gateway-disconnect.interface.ts index 2c2cc9320c1..aa715e46688 100644 --- a/src/websockets/interfaces/on-gateway-disconnect.interface.ts +++ b/src/websockets/interfaces/on-gateway-disconnect.interface.ts @@ -1,3 +1,3 @@ -export interface OnGatewayDisconnect { - handleDisconnect(client: any); +export interface OnGatewayDisconnect { + handleDisconnect(client: T); } diff --git a/src/websockets/interfaces/on-gateway-init.interface.ts b/src/websockets/interfaces/on-gateway-init.interface.ts index d0e5d9be6ab..379f860f2c9 100644 --- a/src/websockets/interfaces/on-gateway-init.interface.ts +++ b/src/websockets/interfaces/on-gateway-init.interface.ts @@ -1,3 +1,3 @@ -export interface OnGatewayInit { - afterInit(server: any); +export interface OnGatewayInit { + afterInit(server: T); } diff --git a/src/websockets/interfaces/ws-response.interface.ts b/src/websockets/interfaces/ws-response.interface.ts index 2df913fbd9b..04e815cbf7f 100644 --- a/src/websockets/interfaces/ws-response.interface.ts +++ b/src/websockets/interfaces/ws-response.interface.ts @@ -1,4 +1,4 @@ -export interface WsResponse { +export interface WsResponse { event: string; data: T; } diff --git a/src/websockets/utils/gateway-server.decorator.ts b/src/websockets/utils/gateway-server.decorator.ts index 8bf273988c0..6a962595e1e 100644 --- a/src/websockets/utils/gateway-server.decorator.ts +++ b/src/websockets/utils/gateway-server.decorator.ts @@ -2,7 +2,7 @@ import 'reflect-metadata'; import { GATEWAY_SERVER_METADATA } from '../constants'; /** - * Attaches a native Web Socket Server to the given property. + * Attaches native Web Socket Server to a given property. */ export const WebSocketServer = (): PropertyDecorator => { return (target: object, propertyKey: string | symbol) => { diff --git a/src/websockets/utils/subscribe-message.decorator.ts b/src/websockets/utils/subscribe-message.decorator.ts index bd05424cfb4..859e57f8bdf 100644 --- a/src/websockets/utils/subscribe-message.decorator.ts +++ b/src/websockets/utils/subscribe-message.decorator.ts @@ -3,10 +3,10 @@ import { MESSAGE_MAPPING_METADATA, MESSAGE_METADATA } from '../constants'; import { isObject, isUndefined } from '@nestjs/common/utils/shared.utils'; /** - * Subscribes to messages which fulfils chosen pattern. + * Subscribes to messages that fulfils chosen pattern. */ -export const SubscribeMessage = ( - message: any, +export const SubscribeMessage = ( + message: T, ): MethodDecorator => { return (target, key, descriptor: PropertyDescriptor) => { Reflect.defineMetadata(MESSAGE_MAPPING_METADATA, true, descriptor.value);