From 952613ff15f38fa8265d1c02e9d9f9547cfff048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ad=C3=A1mek?= Date: Tue, 28 Jan 2025 18:46:39 +0100 Subject: [PATCH] feat: allow passing an array of options into `forRoot` Since MikroORM v6.4, you can also define [multiple configurations](https://mikro-orm.io/docs/quick-start#configuration-file-structure) as part of a single ORM config. If you want to use such a combined config file, you need to destructure the result, since it will be also an array: ```typescript @Module({ imports: [ // `config` exports an array of configs ...MikroOrmModule.forRoot(config), MikroOrmModule.forMiddleware() ], controllers: [AppController], providers: [AppService], }) export class AppModule {} ``` Closes #202 --- README.md | 15 +++++++++++++++ src/mikro-orm.module.ts | 17 +++++++++++++++-- src/typings.ts | 2 ++ tests/mikro-orm.module.test.ts | 2 +- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a0d3d63..d6b5a47 100644 --- a/README.md +++ b/README.md @@ -365,6 +365,21 @@ You can define multiple database connections by registering multiple `MikroOrmMo export class AppModule {} ``` +Since MikroORM v6.4, you can also define [multiple configurations](https://mikro-orm.io/docs/quick-start#configuration-file-structure) as part of a single ORM config. If you want to use such a combined config file, you need to destructure the result, since it will be also an array: + +```typescript +@Module({ + imports: [ + // `config` exports an array of configs + ...MikroOrmModule.forRoot(config), + MikroOrmModule.forMiddleware() + ], + controllers: [AppController], + providers: [AppService], +}) +export class AppModule {} +``` + To access different `MikroORM`/`EntityManager` connections you have to use the new injection tokens `@InjectMikroORM()`/`@InjectEntityManager()` where you are required to pass the `contextName` in: ```ts diff --git a/src/mikro-orm.module.ts b/src/mikro-orm.module.ts index ef8607c..bf4883d 100644 --- a/src/mikro-orm.module.ts +++ b/src/mikro-orm.module.ts @@ -10,6 +10,7 @@ import { MikroOrmModuleFeatureOptions, MikroOrmModuleSyncOptions, MikroOrmMiddlewareModuleOptions, + MaybePromise, } from './typings'; @Module({}) @@ -23,11 +24,23 @@ export class MikroOrmModule { MikroOrmEntitiesStorage.clear(contextName); } - static forRoot(options?: MikroOrmModuleSyncOptions): DynamicModule | Promise { + static forRoot(options?: MikroOrmModuleSyncOptions): MaybePromise; + static forRoot(options?: MikroOrmModuleSyncOptions[]): MaybePromise[]; + static forRoot(options?: MikroOrmModuleSyncOptions | MikroOrmModuleSyncOptions[]): MaybePromise | MaybePromise[] { + if (Array.isArray(options)) { + return options.map(o => MikroOrmCoreModule.forRoot(o)); + } + return MikroOrmCoreModule.forRoot(options); } - static forRootAsync(options: MikroOrmModuleAsyncOptions): DynamicModule | Promise { + static forRootAsync(options: MikroOrmModuleAsyncOptions): MaybePromise; + static forRootAsync(options: MikroOrmModuleAsyncOptions[]): MaybePromise[]; + static forRootAsync(options: MikroOrmModuleAsyncOptions | MikroOrmModuleAsyncOptions[]): MaybePromise | MaybePromise[] { + if (Array.isArray(options)) { + return options.map(o => MikroOrmCoreModule.forRoot(o)); + } + return MikroOrmCoreModule.forRootAsync(options); } diff --git a/src/typings.ts b/src/typings.ts index ccfc6e0..e3a351b 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -2,6 +2,8 @@ import type { AnyEntity, EntityName as CoreEntityName, EntitySchema, ForkOptions import type { MiddlewareConsumer, ModuleMetadata, Scope, Type } from '@nestjs/common'; import type { AbstractHttpAdapter } from '@nestjs/core'; +export type MaybePromise = T | Promise; + export interface NestMiddlewareConsumer extends MiddlewareConsumer { httpAdapter: AbstractHttpAdapter; } diff --git a/tests/mikro-orm.module.test.ts b/tests/mikro-orm.module.test.ts index c4fb4f4..c17b0e9 100644 --- a/tests/mikro-orm.module.test.ts +++ b/tests/mikro-orm.module.test.ts @@ -214,7 +214,7 @@ describe('MikroORM Module', () => { it('forFeature should return repository', async () => { const module = await Test.createTestingModule({ imports: [ - MikroOrmModule.forRoot(testOptions), + ...MikroOrmModule.forRoot([testOptions]), MikroOrmModule.forFeature([Foo]), ], }).compile();