Skip to content

Commit

Permalink
feature: generalise interfaces, improve decorators
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilmysliwiec committed Mar 22, 2018
1 parent 11b397a commit 84f531c
Show file tree
Hide file tree
Showing 25 changed files with 68 additions and 44 deletions.
2 changes: 1 addition & 1 deletion src/common/decorators/core/bind.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/common/decorators/core/catch.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};
Expand Down
4 changes: 2 additions & 2 deletions src/common/decorators/core/dependencies.decorator.ts
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
5 changes: 3 additions & 2 deletions src/common/decorators/core/exception-filters.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
};
Expand Down
2 changes: 1 addition & 1 deletion src/common/decorators/core/inject.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
7 changes: 4 additions & 3 deletions src/common/decorators/core/use-guards.decorator.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { GUARDS_METADATA } from '../../constants';
import { extendArrayMetadata } from '../../utils/extend-metadata.util';

/**
* Binds guards to the particular context.
Expand All @@ -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;
};
}
7 changes: 4 additions & 3 deletions src/common/decorators/core/use-interceptors.decorator.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { INTERCEPTORS_METADATA } from '../../constants';
import { extendArrayMetadata } from '../../utils/extend-metadata.util';

/**
* Binds interceptors to the particular context.
Expand All @@ -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;
};
}
5 changes: 3 additions & 2 deletions src/common/decorators/core/use-pipes.decorator.ts
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -14,10 +15,10 @@ import { PIPES_METADATA } from '../../constants';
export function UsePipes(...pipes: PipeTransform<any>[]) {
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;
};
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export interface ExceptionFilter {
catch(exception, response);
export interface ExceptionFilter<T = any, R = any> {
catch(exception: T, response: R);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Observable } from 'rxjs/Observable';

export interface RpcExceptionFilter {
catch(exception): Observable<any>;
export interface RpcExceptionFilter<T = any, R = any> {
catch(exception: T): Observable<R>;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export interface WsExceptionFilter {
catch(exception, client);
export interface WsExceptionFilter<T = any, R = any> {
catch(exception: T, client: R);
}
6 changes: 3 additions & 3 deletions src/common/interfaces/features/nest-interceptor.interface.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Observable } from 'rxjs/Observable';
import { ExecutionContext } from './execution-context.interface';

export interface NestInterceptor {
export interface NestInterceptor<T = any, R = any> {
intercept(
dataOrRequest,
context: ExecutionContext,
stream$: Observable<any>,
): Observable<any> | Promise<Observable<any>>;
stream$: Observable<T>,
): Observable<R> | Promise<Observable<R>>;
}
6 changes: 3 additions & 3 deletions src/common/interfaces/features/pipe-transform.interface.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { Paramtype } from './paramtype.interface';

export type Transform<T> = (value: T, metadata: ArgumentMetadata) => any;
export type Transform<T = any> = (value: T, metadata: ArgumentMetadata) => any;

export interface ArgumentMetadata {
type: Paramtype;
metatype?: new (...args) => any;
data?: string;
}

export interface PipeTransform<T> {
transform(value: T, metadata: ArgumentMetadata): any;
export interface PipeTransform<T = any, R = any> {
transform(value: T, metadata: ArgumentMetadata): R;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Observable } from 'rxjs/Observable';

export interface WebSocketAdapter {
create(port: number, options?: any & { namespace?: string; server?: any });
export interface WebSocketAdapter<T = any> {
create(port: number, options?: T);
bindClientConnect(server, callback: (...args) => void);
bindClientDisconnect?(client, callback: (...args) => void);
bindMessageHandlers(
Expand Down
11 changes: 11 additions & 0 deletions src/common/test/decorators/use-guards.decorator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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));
});
});
9 changes: 9 additions & 0 deletions src/common/utils/extend-metadata.util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export function extendArrayMetadata<T extends Array<any>>(
key: string,
metadata: T,
target,
) {
const previousValue = Reflect.getMetadata(key, target) || [];
const value = [...previousValue, ...metadata];
Reflect.defineMetadata(key, value, target);
}
2 changes: 1 addition & 1 deletion src/microservices/interfaces/packet.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ export interface ReadPacket<T = any> {

export interface WritePacket<T = any> {
err?: any;
response?: any;
response?: T;
isDisposed?: boolean;
}
4 changes: 2 additions & 2 deletions src/microservices/utils/pattern.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = <T = PatternMetadata | string>(
metadata?: T,
): MethodDecorator => {
return (target, key, descriptor: PropertyDescriptor) => {
Reflect.defineMetadata(PATTERN_METADATA, metadata, descriptor.value);
Expand Down
4 changes: 2 additions & 2 deletions src/websockets/interfaces/on-gateway-connection.interface.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export interface OnGatewayConnection {
handleConnection(client: any);
export interface OnGatewayConnection<T = any> {
handleConnection(client: T);
}
4 changes: 2 additions & 2 deletions src/websockets/interfaces/on-gateway-disconnect.interface.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export interface OnGatewayDisconnect {
handleDisconnect(client: any);
export interface OnGatewayDisconnect<T = any> {
handleDisconnect(client: T);
}
4 changes: 2 additions & 2 deletions src/websockets/interfaces/on-gateway-init.interface.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export interface OnGatewayInit {
afterInit(server: any);
export interface OnGatewayInit<T = any> {
afterInit(server: T);
}
2 changes: 1 addition & 1 deletion src/websockets/interfaces/ws-response.interface.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export interface WsResponse<T> {
export interface WsResponse<T = any> {
event: string;
data: T;
}
2 changes: 1 addition & 1 deletion src/websockets/utils/gateway-server.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
6 changes: 3 additions & 3 deletions src/websockets/utils/subscribe-message.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = <T = any>(
message: T,
): MethodDecorator => {
return (target, key, descriptor: PropertyDescriptor) => {
Reflect.defineMetadata(MESSAGE_MAPPING_METADATA, true, descriptor.value);
Expand Down

0 comments on commit 84f531c

Please sign in to comment.