Skip to content

Commit

Permalink
feat: support fastify
Browse files Browse the repository at this point in the history
Fastify requires different path syntax - `(.*)` instead of just `*` - due to updated path-to-regexp dependency. 

This change tries to detect fastify and use the right syntax.
  • Loading branch information
quinnturner authored Aug 19, 2020
1 parent fbc9662 commit 5365e26
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 16 deletions.
19 changes: 16 additions & 3 deletions src/mikro-orm-core.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import { DynamicModule, Global, Inject, MiddlewareConsumer, Module, OnApplicatio
import { ModuleRef } from '@nestjs/core';

import { MIKRO_ORM_MODULE_OPTIONS } from './mikro-orm.common';
import { MikroOrmModuleAsyncOptions, MikroOrmModuleOptions } from './typings';
import { createAsyncProviders, createMikroOrmEntityManagerProvider, createMikroOrmProvider } from './mikro-orm.providers';
import { MikroOrmMiddleware } from './mikro-orm.middleware';
import { createAsyncProviders, createMikroOrmEntityManagerProvider, createMikroOrmProvider } from './mikro-orm.providers';
import { MikroOrmModuleAsyncOptions, MikroOrmModuleOptions, NestMiddlewareConsumer } from './typings';

@Global()
@Module({})
Expand Down Expand Up @@ -58,9 +58,22 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
return;
}


const isNestMiddleware = (
consumer: MiddlewareConsumer
): consumer is NestMiddlewareConsumer =>
typeof (consumer as any).httpAdapter === 'object';

const usingFastify = (consumer: NestMiddlewareConsumer) =>
consumer.httpAdapter.constructor.name.toLowerCase().startsWith('fastify');

const forRoutesPath =
this.options.forRoutesPath ??
(isNestMiddleware(consumer) && usingFastify(consumer) ? '(.*)' : '*');

consumer
.apply(MikroOrmMiddleware) // register request context automatically
.forRoutes({ path: '*', method: RequestMethod.ALL });
.forRoutes({ path: forRoutesPath, method: RequestMethod.ALL });
}

}
6 changes: 3 additions & 3 deletions src/mikro-orm.module.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { AnyEntity, EntityName, Options } from '@mikro-orm/core';
import { AnyEntity, EntityName } from '@mikro-orm/core';
import { DynamicModule, Module } from '@nestjs/common';

import { createMikroOrmRepositoryProviders } from './mikro-orm.providers';
import { MikroOrmCoreModule } from './mikro-orm-core.module';
import { MikroOrmModuleAsyncOptions } from './typings';
import { MikroOrmModuleAsyncOptions, MikroOrmModuleOptions } from './typings';

@Module({})
export class MikroOrmModule {

static forRoot(options?: Options): DynamicModule {
static forRoot(options?: MikroOrmModuleOptions): DynamicModule {
return {
module: MikroOrmModule,
imports: [MikroOrmCoreModule.forRoot(options)],
Expand Down
33 changes: 23 additions & 10 deletions src/typings.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,30 @@
import { Options } from '@mikro-orm/core';
import { ModuleMetadata, Type } from '@nestjs/common';
import { IDatabaseDriver, Options } from '@mikro-orm/core';
import { MiddlewareConsumer, ModuleMetadata, Type } from '@nestjs/common';
import { AbstractHttpAdapter } from '@nestjs/core';

export type MikroOrmModuleOptions = {
export interface NestMiddlewareConsumer extends MiddlewareConsumer {
httpAdapter: AbstractHttpAdapter;
}

export type MikroOrmModuleOptions<D extends IDatabaseDriver = IDatabaseDriver> = {
registerRequestContext?: boolean;
} & Options;
/**
* Routes to apply the middleware.
*
* For Fastify, the middleware applies to all routes using `(.*)`.
*
* For all other frameworks including Express, the middleware applies to all routes using `*`.
*/
forRoutesPath?: string;
} & Options<D>;

export interface MikroOrmOptionsFactory {
createMikroOrmOptions(): Promise<MikroOrmModuleOptions> | MikroOrmModuleOptions;
export interface MikroOrmOptionsFactory<D extends IDatabaseDriver = IDatabaseDriver> {
createMikroOrmOptions(): Promise<MikroOrmModuleOptions<D>> | MikroOrmModuleOptions<D>;
}

export interface MikroOrmModuleAsyncOptions extends Pick<ModuleMetadata, 'imports' | 'providers'> {
useExisting?: Type<MikroOrmOptionsFactory>;
useClass?: Type<MikroOrmOptionsFactory>;
useFactory?: (...args: any[]) => Promise<MikroOrmModuleOptions> | MikroOrmModuleOptions;
export interface MikroOrmModuleAsyncOptions<D extends IDatabaseDriver = IDatabaseDriver> extends Pick<ModuleMetadata, 'imports' | 'providers'> {
useExisting?: Type<MikroOrmOptionsFactory<D>>;
useClass?: Type<MikroOrmOptionsFactory<D>>;
useFactory?: (...args: any[]) => Promise<MikroOrmModuleOptions<D>> | MikroOrmModuleOptions<D>;
inject?: any[];
}

0 comments on commit 5365e26

Please sign in to comment.