Skip to content

Commit 02e78b3

Browse files
committed
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
1 parent 98171c4 commit 02e78b3

File tree

4 files changed

+40
-6
lines changed

4 files changed

+40
-6
lines changed

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,21 @@ You can define multiple database connections by registering multiple `MikroOrmMo
365365
export class AppModule {}
366366
```
367367

368+
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:
369+
370+
```typescript
371+
@Module({
372+
imports: [
373+
// `config` exports an array of configs
374+
...MikroOrmModule.forRoot(config),
375+
MikroOrmModule.forMiddleware()
376+
],
377+
controllers: [AppController],
378+
providers: [AppService],
379+
})
380+
export class AppModule {}
381+
```
382+
368383
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:
369384

370385
```ts

src/mikro-orm-core.module.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,13 @@ export class MikroOrmCoreModule implements NestModule, OnApplicationShutdown {
4747
private readonly options: MikroOrmModuleOptions,
4848
private readonly moduleRef: ModuleRef) { }
4949

50-
static async forRoot(options?: MikroOrmModuleSyncOptions): Promise<DynamicModule> {
50+
static async forRoot(options?: MikroOrmModuleSyncOptions): Promise<DynamicModule>;
51+
static async forRoot(options?: MikroOrmModuleSyncOptions[]): Promise<DynamicModule[]>;
52+
static async forRoot(options?: MikroOrmModuleSyncOptions | MikroOrmModuleSyncOptions[]): Promise<DynamicModule | DynamicModule[]> {
53+
if (Array.isArray(options)) {
54+
return Promise.all(options.map(o => this.forRoot(o)));
55+
}
56+
5157
const contextName = this.setContextName(options?.contextName);
5258
const knex = await tryRequire('@mikro-orm/knex');
5359
const mongo = await tryRequire('@mikro-orm/mongodb');
@@ -98,7 +104,13 @@ export class MikroOrmCoreModule implements NestModule, OnApplicationShutdown {
98104
};
99105
}
100106

101-
static async forRootAsync(options: MikroOrmModuleAsyncOptions): Promise<DynamicModule> {
107+
static async forRootAsync(options: MikroOrmModuleAsyncOptions): Promise<DynamicModule>;
108+
static async forRootAsync(options: MikroOrmModuleAsyncOptions[]): Promise<DynamicModule[]>;
109+
static async forRootAsync(options: MikroOrmModuleAsyncOptions | MikroOrmModuleAsyncOptions[]): Promise<DynamicModule | DynamicModule[]> {
110+
if (Array.isArray(options)) {
111+
return Promise.all(options.map(o => this.forRootAsync(o)));
112+
}
113+
102114
const contextName = this.setContextName(options?.contextName);
103115
const knex = await tryRequire('@mikro-orm/knex');
104116
const mongo = await tryRequire('@mikro-orm/mongodb');

src/mikro-orm.module.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
MikroOrmModuleFeatureOptions,
1111
MikroOrmModuleSyncOptions,
1212
MikroOrmMiddlewareModuleOptions,
13+
MaybePromise,
1314
} from './typings';
1415

1516
@Module({})
@@ -23,12 +24,16 @@ export class MikroOrmModule {
2324
MikroOrmEntitiesStorage.clear(contextName);
2425
}
2526

26-
static forRoot(options?: MikroOrmModuleSyncOptions): DynamicModule | Promise<DynamicModule> {
27-
return MikroOrmCoreModule.forRoot(options);
27+
static forRoot(options?: MikroOrmModuleSyncOptions): MaybePromise<DynamicModule>;
28+
static forRoot(options?: MikroOrmModuleSyncOptions[]): MaybePromise<DynamicModule[]>;
29+
static forRoot(options?: MikroOrmModuleSyncOptions | MikroOrmModuleSyncOptions[]): MaybePromise<DynamicModule | DynamicModule[]> {
30+
return MikroOrmCoreModule.forRoot(options as MikroOrmModuleSyncOptions);
2831
}
2932

30-
static forRootAsync(options: MikroOrmModuleAsyncOptions): DynamicModule | Promise<DynamicModule> {
31-
return MikroOrmCoreModule.forRootAsync(options);
33+
static forRootAsync(options: MikroOrmModuleAsyncOptions): MaybePromise<DynamicModule>;
34+
static forRootAsync(options: MikroOrmModuleAsyncOptions[]): MaybePromise<DynamicModule[]>;
35+
static forRootAsync(options: MikroOrmModuleAsyncOptions | MikroOrmModuleAsyncOptions[]): MaybePromise<DynamicModule | DynamicModule[]> {
36+
return MikroOrmCoreModule.forRootAsync(options as MikroOrmModuleAsyncOptions);
3237
}
3338

3439
static forFeature(options: EntityName<AnyEntity>[] | MikroOrmModuleFeatureOptions, contextName?: string): DynamicModule {

src/typings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import type { AnyEntity, EntityName as CoreEntityName, EntitySchema, ForkOptions
22
import type { MiddlewareConsumer, ModuleMetadata, Scope, Type } from '@nestjs/common';
33
import type { AbstractHttpAdapter } from '@nestjs/core';
44

5+
export type MaybePromise<T> = T | Promise<T>;
6+
57
export interface NestMiddlewareConsumer extends MiddlewareConsumer {
68
httpAdapter: AbstractHttpAdapter;
79
}

0 commit comments

Comments
 (0)