Skip to content

Commit

Permalink
feat: register driver specific MikroORM provider (#176)
Browse files Browse the repository at this point in the history
Closes #123
  • Loading branch information
B4nan committed May 19, 2024
1 parent f74c2c9 commit d65b268
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 4 deletions.
67 changes: 65 additions & 2 deletions src/mikro-orm-core.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,18 @@ async function tryRequire(name: string): Promise<Dictionary | undefined> {
}
}

// TODO: provide the package name via some platform method, prefer that over the static map when available
const PACKAGES = {
MongoDriver: '@mikro-orm/mongo',
MySqlDriver: '@mikro-orm/mysql',
MsSqlDriver: '@mikro-orm/mssql',
MariaDbDriver: '@mikro-orm/mariadb',
PostgreSqlDriver: '@mikro-orm/postgresql',
SqliteDriver: '@mikro-orm/sqlite',
LibSqlDriver: '@mikro-orm/libsql',
BetterSqliteDriver: '@mikro-orm/better-sqlite',
} as const;

@Global()
@Module({})
export class MikroOrmCoreModule implements OnApplicationShutdown {
Expand All @@ -34,11 +46,36 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
const mongo = await tryRequire('@mikro-orm/mongodb');
const em = await this.createEntityManager(options);

if (em && !contextName) {
const packageName = PACKAGES[em.getDriver().constructor.name as keyof typeof PACKAGES];
const driverPackage = await tryRequire(packageName);

if (driverPackage) {
return {
module: MikroOrmCoreModule,
providers: [
{ provide: MIKRO_ORM_MODULE_OPTIONS, useValue: options || {} },
createMikroOrmProvider(contextName),
createMikroOrmProvider(contextName, driverPackage.MikroORM),
createEntityManagerProvider(options?.scope, EntityManager),
createEntityManagerProvider(options?.scope, driverPackage.EntityManager),
],
exports: [
MikroORM,
EntityManager,
driverPackage.EntityManager,
driverPackage.MikroORM,
],
};
}
}

return {
module: MikroOrmCoreModule,
providers: [
{ provide: MIKRO_ORM_MODULE_OPTIONS, useValue: options || {} },
createMikroOrmProvider(contextName),
...(mongo ? [createMikroOrmProvider(contextName, mongo.MikroORM)] : []),
createEntityManagerProvider(options?.scope, EntityManager, contextName),
...(em ? [createEntityManagerProvider(options?.scope, em.constructor as Type, contextName)] : []),
...(knex ? [createEntityManagerProvider(options?.scope, knex.EntityManager, contextName)] : []),
Expand All @@ -49,7 +86,7 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
contextName ? getEntityManagerToken(contextName) : EntityManager,
...(em && !contextName ? [em.constructor] : []),
...(knex && !contextName ? [knex.EntityManager] : []),
...(mongo && !contextName ? [mongo.EntityManager] : []),
...(mongo && !contextName ? [mongo.EntityManager, mongo.MikroORM] : []),
],
};
}
Expand All @@ -60,6 +97,32 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
const mongo = await tryRequire('@mikro-orm/mongodb');
const em = await this.createEntityManager(options);

if (em && !contextName) {
const packageName = PACKAGES[em.getDriver().constructor.name as keyof typeof PACKAGES];
const driverPackage = await tryRequire(packageName);

if (driverPackage) {
return {
module: MikroOrmCoreModule,
imports: options.imports || [],
providers: [
...(options.providers || []),
...createAsyncProviders({ ...options, contextName: options.contextName }),
createMikroOrmProvider(contextName),
createMikroOrmProvider(contextName, driverPackage.MikroORM),
createEntityManagerProvider(options?.scope, EntityManager),
createEntityManagerProvider(options?.scope, driverPackage.EntityManager),
],
exports: [
MikroORM,
EntityManager,
driverPackage.EntityManager,
driverPackage.MikroORM,
],
};
}
}

return {
module: MikroOrmCoreModule,
imports: options.imports || [],
Expand All @@ -77,7 +140,7 @@ export class MikroOrmCoreModule implements OnApplicationShutdown {
contextName ? getEntityManagerToken(contextName) : EntityManager,
...(em && !contextName ? [em.constructor] : []),
...(knex && !contextName ? [knex.EntityManager] : []),
...(mongo && !contextName ? [mongo.EntityManager] : []),
...(mongo && !contextName ? [mongo.EntityManager, mongo.MikroORM] : []),
],
};
}
Expand Down
7 changes: 5 additions & 2 deletions src/mikro-orm.providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ import type { InjectionToken, Provider, Type } from '@nestjs/common';
import { Scope } from '@nestjs/common';
import { MikroOrmEntitiesStorage } from './mikro-orm.entities.storage';

export function createMikroOrmProvider(contextName?: string): Provider {
export function createMikroOrmProvider(
contextName?: string,
type: Type = MikroORM,
): Provider {
return {
provide: contextName ? getMikroORMToken(contextName) : MikroORM,
provide: contextName ? getMikroORMToken(contextName) : type,
useFactory: async (options?: MikroOrmModuleOptions) => {
options = { ...options };

Expand Down

0 comments on commit d65b268

Please sign in to comment.