Skip to content

Commit d65b268

Browse files
authored
feat: register driver specific MikroORM provider (#176)
Closes #123
1 parent f74c2c9 commit d65b268

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

src/mikro-orm-core.module.ts

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ async function tryRequire(name: string): Promise<Dictionary | undefined> {
2020
}
2121
}
2222

23+
// TODO: provide the package name via some platform method, prefer that over the static map when available
24+
const PACKAGES = {
25+
MongoDriver: '@mikro-orm/mongo',
26+
MySqlDriver: '@mikro-orm/mysql',
27+
MsSqlDriver: '@mikro-orm/mssql',
28+
MariaDbDriver: '@mikro-orm/mariadb',
29+
PostgreSqlDriver: '@mikro-orm/postgresql',
30+
SqliteDriver: '@mikro-orm/sqlite',
31+
LibSqlDriver: '@mikro-orm/libsql',
32+
BetterSqliteDriver: '@mikro-orm/better-sqlite',
33+
} as const;
34+
2335
@Global()
2436
@Module({})
2537
export class MikroOrmCoreModule implements OnApplicationShutdown {
@@ -34,11 +46,36 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
3446
const mongo = await tryRequire('@mikro-orm/mongodb');
3547
const em = await this.createEntityManager(options);
3648

49+
if (em && !contextName) {
50+
const packageName = PACKAGES[em.getDriver().constructor.name as keyof typeof PACKAGES];
51+
const driverPackage = await tryRequire(packageName);
52+
53+
if (driverPackage) {
54+
return {
55+
module: MikroOrmCoreModule,
56+
providers: [
57+
{ provide: MIKRO_ORM_MODULE_OPTIONS, useValue: options || {} },
58+
createMikroOrmProvider(contextName),
59+
createMikroOrmProvider(contextName, driverPackage.MikroORM),
60+
createEntityManagerProvider(options?.scope, EntityManager),
61+
createEntityManagerProvider(options?.scope, driverPackage.EntityManager),
62+
],
63+
exports: [
64+
MikroORM,
65+
EntityManager,
66+
driverPackage.EntityManager,
67+
driverPackage.MikroORM,
68+
],
69+
};
70+
}
71+
}
72+
3773
return {
3874
module: MikroOrmCoreModule,
3975
providers: [
4076
{ provide: MIKRO_ORM_MODULE_OPTIONS, useValue: options || {} },
4177
createMikroOrmProvider(contextName),
78+
...(mongo ? [createMikroOrmProvider(contextName, mongo.MikroORM)] : []),
4279
createEntityManagerProvider(options?.scope, EntityManager, contextName),
4380
...(em ? [createEntityManagerProvider(options?.scope, em.constructor as Type, contextName)] : []),
4481
...(knex ? [createEntityManagerProvider(options?.scope, knex.EntityManager, contextName)] : []),
@@ -49,7 +86,7 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
4986
contextName ? getEntityManagerToken(contextName) : EntityManager,
5087
...(em && !contextName ? [em.constructor] : []),
5188
...(knex && !contextName ? [knex.EntityManager] : []),
52-
...(mongo && !contextName ? [mongo.EntityManager] : []),
89+
...(mongo && !contextName ? [mongo.EntityManager, mongo.MikroORM] : []),
5390
],
5491
};
5592
}
@@ -60,6 +97,32 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
6097
const mongo = await tryRequire('@mikro-orm/mongodb');
6198
const em = await this.createEntityManager(options);
6299

100+
if (em && !contextName) {
101+
const packageName = PACKAGES[em.getDriver().constructor.name as keyof typeof PACKAGES];
102+
const driverPackage = await tryRequire(packageName);
103+
104+
if (driverPackage) {
105+
return {
106+
module: MikroOrmCoreModule,
107+
imports: options.imports || [],
108+
providers: [
109+
...(options.providers || []),
110+
...createAsyncProviders({ ...options, contextName: options.contextName }),
111+
createMikroOrmProvider(contextName),
112+
createMikroOrmProvider(contextName, driverPackage.MikroORM),
113+
createEntityManagerProvider(options?.scope, EntityManager),
114+
createEntityManagerProvider(options?.scope, driverPackage.EntityManager),
115+
],
116+
exports: [
117+
MikroORM,
118+
EntityManager,
119+
driverPackage.EntityManager,
120+
driverPackage.MikroORM,
121+
],
122+
};
123+
}
124+
}
125+
63126
return {
64127
module: MikroOrmCoreModule,
65128
imports: options.imports || [],
@@ -77,7 +140,7 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
77140
contextName ? getEntityManagerToken(contextName) : EntityManager,
78141
...(em && !contextName ? [em.constructor] : []),
79142
...(knex && !contextName ? [knex.EntityManager] : []),
80-
...(mongo && !contextName ? [mongo.EntityManager] : []),
143+
...(mongo && !contextName ? [mongo.EntityManager, mongo.MikroORM] : []),
81144
],
82145
};
83146
}

src/mikro-orm.providers.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import type { InjectionToken, Provider, Type } from '@nestjs/common';
77
import { Scope } from '@nestjs/common';
88
import { MikroOrmEntitiesStorage } from './mikro-orm.entities.storage';
99

10-
export function createMikroOrmProvider(contextName?: string): Provider {
10+
export function createMikroOrmProvider(
11+
contextName?: string,
12+
type: Type = MikroORM,
13+
): Provider {
1114
return {
12-
provide: contextName ? getMikroORMToken(contextName) : MikroORM,
15+
provide: contextName ? getMikroORMToken(contextName) : type,
1316
useFactory: async (options?: MikroOrmModuleOptions) => {
1417
options = { ...options };
1518

0 commit comments

Comments
 (0)