From b58f4763995738cad11d08665b239443f9fb4499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ad=C3=A1mek?= Date: Sat, 3 Dec 2022 12:13:03 +0100 Subject: [PATCH] feat(core): remove static require calls (#3814) There were some places where we did a static `require()` call, e.g. when loading the driver implementation based on the `type` option. Those places were problematic for bundlers like webpack, as well as new school build systems like vite. Instead of specifying the `type` we now have several options: 1. use `defineConfig()` helper imported from the driver package to create your ORM config: ```ts title='mikro-orm.config.ts' import { defineConfig } from '@mikro-orm/mysql'; export default defineConfig({ ... }); ``` 3. use `MikroORM.init()` on class imported from the driver package: ```ts title='app.ts' import { MikroORM } from '@mikro-orm/mysql'; const orm = await MikroORM.init({ ... }); ``` 5. specify the `driver` option: ```ts title='mikro-orm.config.ts' import { MySqlDriver } from '@mikro-orm/mysql'; export default { driver: MySqlDriver, ... }; ``` > The `MIKRO_ORM_TYPE` is still supported, but no longer does a static require of the driver class. Its usage is rather discouraged and it might be removed in future versions too. Similarly, we had to get rid of the `require()` calls for extensions like `Migrator`, `EntityGenerator` and `Seeder`. Those need to be registered as extensions in your ORM config. `SchemaGenerator` extension is registered automatically. > This is required only for the shortcuts available on `MikroORM` object, e.g. `orm.migrator.up()`, alternatively you can instantiate the `Migrator` yourself explicitly. ```ts title='mikro-orm.config.ts' import { defineConfig } from '@mikro-orm/mysql'; import { Migrator } from '@mikro-orm/migrations'; import { EntityGenerator } from '@mikro-orm/entity-generator'; import { SeedManager } from '@mikro-orm/seeder'; export default defineConfig({ dbName: 'test', extensions: [Migrator, EntityGenerator, SeedManager], // those would have a static `register` method }); ``` Closes #3743 --- .github/workflows/tests.yml | 2 +- docs/docs/upgrading-v5-to-v6.md | 61 +++++++++ lerna.json | 1 - packages/better-sqlite/package.json | 16 +-- packages/cli/src/CLIHelper.ts | 2 +- .../src/commands/GenerateEntitiesCommand.ts | 10 +- .../src/commands/MigrationCommandFactory.ts | 11 +- packages/core/package.json | 44 ------- packages/core/src/MikroORM.ts | 29 ++--- packages/core/src/drivers/DatabaseDriver.ts | 4 - packages/core/src/drivers/IDatabaseDriver.ts | 2 - packages/core/src/index.ts | 3 +- packages/core/src/platforms/Platform.ts | 9 +- packages/core/src/typings.ts | 10 +- packages/core/src/utils/Configuration.ts | 52 +++----- .../core/src/utils/ConfigurationLoader.ts | 14 +- .../entity-generator/src/EntityGenerator.ts | 2 +- packages/knex/package.json | 36 +----- packages/knex/src/AbstractSqlPlatform.ts | 19 +-- packages/knex/src/schema/SchemaGenerator.ts | 6 +- packages/mariadb/package.json | 16 +-- packages/migrations-mongodb/src/Migrator.ts | 2 +- packages/migrations-mongodb/src/typings.ts | 7 +- packages/migrations/src/Migrator.ts | 2 +- packages/migrations/src/typings.ts | 7 +- packages/mongodb/package.json | 20 +-- packages/mongodb/src/MongoDriver.ts | 28 ---- packages/mongodb/src/MongoPlatform.ts | 9 +- packages/mongodb/src/MongoSchemaGenerator.ts | 2 +- packages/mysql/package.json | 16 +-- packages/postgresql/package.json | 16 +-- packages/seeder/src/SeedManager.ts | 2 +- packages/sqlite/package.json | 16 +-- tests/DatabaseDriver.test.ts | 2 - tests/EntityManager.mysql.test.ts | 1 - tests/MikroORM.test.ts | 10 +- tests/bootstrap.ts | 21 ++- tests/features/embeddables/GH3327.test.ts | 3 +- .../entity-generator/EntityGenerator.test.ts | 2 +- .../migrations/Migrator.mongo.test.ts | 7 +- .../migrations/Migrator.postgres.test.ts | 18 ++- .../migrations/Migrator.sqlite.test.ts | 1 + .../multiple-schemas.postgres.test.ts | 2 + .../SchemaGenerator.mongo.test.ts | 28 ---- tests/features/upsert/upsert.test.ts | 3 +- tests/issues/GH3738.test.ts | 3 +- yarn.lock | 120 ------------------ 47 files changed, 191 insertions(+), 506 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9d77aea0daac..535889b71f93 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -186,7 +186,7 @@ jobs: name: Publish if: github.ref == 'refs/heads/v6' && !contains(github.event.head_commit.message, '[skip ci]') runs-on: ubuntu-latest -# needs: [ test, build, lint ] + needs: [ test, build, lint ] steps: - name: Checkout Source code uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 diff --git a/docs/docs/upgrading-v5-to-v6.md b/docs/docs/upgrading-v5-to-v6.md index 7d75680eb1e3..a5b02c4c1a12 100644 --- a/docs/docs/upgrading-v5-to-v6.md +++ b/docs/docs/upgrading-v5-to-v6.md @@ -11,3 +11,64 @@ Support for older node versions was dropped. ## TypeScript 4.9+ required Support for older TypeScript versions was dropped. + +## Removal of static require calls + +There were some places where we did a static `require()` call, e.g. when loading the driver implementation based on the `type` option. Those places were problematic for bundlers like webpack, as well as new school build systems like vite. + +### The `type` option is removed in favour of driver exports + +Instead of specifying the `type` we now have several options: + +1. use `defineConfig()` helper imported from the driver package to create your ORM config: + ```ts title='mikro-orm.config.ts' + import { defineConfig } from '@mikro-orm/mysql'; + + export default defineConfig({ ... }); + ``` +2. use `MikroORM.init()` on class imported from the driver package: + ```ts title='app.ts' + import { MikroORM } from '@mikro-orm/mysql'; + + const orm = await MikroORM.init({ ... }); + ``` +3. specify the `driver` option: + ```ts title='mikro-orm.config.ts' + import { MySqlDriver } from '@mikro-orm/mysql'; + + export default { + driver: MySqlDriver, + ... + }; + ``` + +> The `MIKRO_ORM_TYPE` is still supported, but no longer does a static require of the driver class. Its usage is rather discouraged and it might be removed in future versions too. + +### ORM extensions + +Similarly, we had to get rid of the `require()` calls for extensions like `Migrator`, `EntityGenerator` and `Seeder`. Those need to be registered as extensions in your ORM config. `SchemaGenerator` extension is registered automatically. + +> This is required only for the shortcuts available on `MikroORM` object, e.g. `orm.migrator.up()`, alternatively you can instantiate the `Migrator` yourself explicitly. + +```ts title='mikro-orm.config.ts' +import { defineConfig } from '@mikro-orm/mysql'; +import { Migrator } from '@mikro-orm/migrations'; +import { EntityGenerator } from '@mikro-orm/entity-generator'; +import { SeedManager } from '@mikro-orm/seeder'; + +export default defineConfig({ + dbName: 'test', + extensions: [Migrator, EntityGenerator, SeedManager], // those would have a static `register` method +}); +``` + +## `MikroORM.init()` no longer accepts a `Configuration` instance + +The options always needs to be plain JS object now. This was always only an internal way, partially useful in tests, never meant to be a user API (while many people since the infamous Ben Awad video mistakenly complicated their typings with it). + +## Removed `MongoDriver` methods + +- `createCollections` in favour of `orm.schema.createSchema()` +- `dropCollections` in favour of `orm.schema.dropSchema()` +- `refreshCollections` in favour of `orm.schema.refreshDatabase()` +- `ensureIndexes` in favour of `orm.schema.ensureIndexes()` diff --git a/lerna.json b/lerna.json index a7402e0f1410..399d98614490 100644 --- a/lerna.json +++ b/lerna.json @@ -14,7 +14,6 @@ "**/tests/**", "**/*.md" ], - "useNx": false, "npmClient": "yarn", "useWorkspaces": true } diff --git a/packages/better-sqlite/package.json b/packages/better-sqlite/package.json index bb43928187fa..c6e4050000bf 100644 --- a/packages/better-sqlite/package.json +++ b/packages/better-sqlite/package.json @@ -67,20 +67,6 @@ "@mikro-orm/core": "^5.9.2" }, "peerDependencies": { - "@mikro-orm/core": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "@mikro-orm/seeder": "^5.0.0" - }, - "peerDependenciesMeta": { - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "@mikro-orm/seeder": { - "optional": true - } + "@mikro-orm/core": "^5.0.0" } } diff --git a/packages/cli/src/CLIHelper.ts b/packages/cli/src/CLIHelper.ts index fe4b6ebb882e..608ba4751bb2 100644 --- a/packages/cli/src/CLIHelper.ts +++ b/packages/cli/src/CLIHelper.ts @@ -32,7 +32,7 @@ export class CLIHelper { options.get('discovery').warnWhenNoEntities = warnWhenNoEntities; } - return MikroORM.init(options); + return MikroORM.init(options.getAll()); } static async isDBConnected(): Promise { diff --git a/packages/cli/src/commands/GenerateEntitiesCommand.ts b/packages/cli/src/commands/GenerateEntitiesCommand.ts index ba9080b54f40..4d803e601a06 100644 --- a/packages/cli/src/commands/GenerateEntitiesCommand.ts +++ b/packages/cli/src/commands/GenerateEntitiesCommand.ts @@ -1,6 +1,4 @@ import type { ArgumentsCamelCase, Argv, CommandModule } from 'yargs'; -import { Utils } from '@mikro-orm/core'; -import type { EntityManager } from '@mikro-orm/knex'; import { CLIHelper } from '../CLIHelper'; export type Options = { dump: boolean; save: boolean; path: string; schema: string }; @@ -46,9 +44,11 @@ export class GenerateEntitiesCommand implements Com } const orm = await CLIHelper.getORM(false); - const { EntityGenerator } = await Utils.dynamicImport('@mikro-orm/entity-generator'); - const generator = new EntityGenerator(orm.em as EntityManager); - const dump = await generator.generate({ save: args.save, baseDir: args.path, schema: args.schema }); + const dump = await orm.entityGenerator.generate({ + save: args.save, + baseDir: args.path, + schema: args.schema, + }); if (args.dump) { CLIHelper.dump(dump.join('\n\n')); diff --git a/packages/cli/src/commands/MigrationCommandFactory.ts b/packages/cli/src/commands/MigrationCommandFactory.ts index 97965fd5155a..fde849ddf7de 100644 --- a/packages/cli/src/commands/MigrationCommandFactory.ts +++ b/packages/cli/src/commands/MigrationCommandFactory.ts @@ -1,14 +1,5 @@ import type { ArgumentsCamelCase, Argv, CommandModule } from 'yargs'; -import { - Utils, - colors, - type Configuration, - type MikroORM, - type MikroORMOptions, - type IMigrator, - type Dictionary, -} from '@mikro-orm/core'; -import type { MigrateOptions } from '@mikro-orm/migrations'; +import { Utils, colors, type Configuration, type Dictionary, type MikroORM, type MikroORMOptions, type IMigrator, MigrateOptions } from '@mikro-orm/core'; import { CLIHelper } from '../CLIHelper'; export class MigrationCommandFactory { diff --git a/packages/core/package.json b/packages/core/package.json index 77e9baaf3930..6dcd4458f507 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -66,49 +66,5 @@ "globby": "11.1.0", "mikro-orm": "5.9.2", "reflect-metadata": "0.1.13" - }, - "peerDependencies": { - "@mikro-orm/better-sqlite": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/mariadb": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "@mikro-orm/migrations-mongodb": "^5.0.0", - "@mikro-orm/mongodb": "^5.0.0", - "@mikro-orm/mysql": "^5.0.0", - "@mikro-orm/postgresql": "^5.0.0", - "@mikro-orm/seeder": "^5.0.0", - "@mikro-orm/sqlite": "^5.0.0" - }, - "peerDependenciesMeta": { - "@mikro-orm/better-sqlite": { - "optional": true - }, - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/mariadb": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "@mikro-orm/migrations-mongodb": { - "optional": true - }, - "@mikro-orm/mongodb": { - "optional": true - }, - "@mikro-orm/mysql": { - "optional": true - }, - "@mikro-orm/postgresql": { - "optional": true - }, - "@mikro-orm/seeder": { - "optional": true - }, - "@mikro-orm/sqlite": { - "optional": true - } } } diff --git a/packages/core/src/MikroORM.ts b/packages/core/src/MikroORM.ts index 0fcef2510631..7c3900e20b0d 100644 --- a/packages/core/src/MikroORM.ts +++ b/packages/core/src/MikroORM.ts @@ -23,24 +23,23 @@ export class MikroORM { * Initialize the ORM, load entity metadata, create EntityManager and connect to the database. * If you omit the `options` parameter, your CLI config will be used. */ - static async init(options?: Options | Configuration, connect = true): Promise> { + static async init(options?: Options, connect = true): Promise> { ConfigurationLoader.registerDotenv(options); const coreVersion = await ConfigurationLoader.checkPackageVersion(); const env = ConfigurationLoader.loadEnvironmentVars(); if (!options) { - options = await ConfigurationLoader.getConfiguration(); + options = (await ConfigurationLoader.getConfiguration()).getAll(); } - let opts = options instanceof Configuration ? options.getAll() : options; - opts = Utils.mergeConfig(opts, env); - await ConfigurationLoader.commonJSCompat(opts as object); + options = Utils.mergeConfig(options, env); + await ConfigurationLoader.commonJSCompat(options!); - if ('DRIVER' in this && !opts.driver && !opts.type) { - (opts as Options).driver = (this as unknown as { DRIVER: Constructor }).DRIVER; + if ('DRIVER' in this && !options!.driver) { + (options as Options).driver = (this as unknown as { DRIVER: Constructor }).DRIVER; } - const orm = new MikroORM(opts); + const orm = new MikroORM(options!); orm.logger.log('info', `MikroORM version: ${colors.green(coreVersion)}`); // we need to allow global context here as we are not in a scope of requests yet @@ -191,9 +190,8 @@ export class MikroORM { return extension; } - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) /* istanbul ignore next */ - return this.driver.getPlatform().getSchemaGenerator(this.driver, this.em) as any; + throw new Error(`SchemaGenerator extension not registered.`); } /** @@ -206,8 +204,7 @@ export class MikroORM { return extension; } - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) - return this.driver.getPlatform().getEntityGenerator(this.em) as T; + throw new Error(`EntityGenerator extension not registered.`); } /** @@ -220,8 +217,7 @@ export class MikroORM { return extension; } - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) - return this.driver.getPlatform().getMigrator(this.em) as T; + throw new Error(`Migrator extension not registered.`); } /** @@ -234,10 +230,7 @@ export class MikroORM { return extension; } - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { SeedManager } = require('@mikro-orm/seeder'); - return this.config.getCachedService(SeedManager, this.em); + throw new Error(`SeedManager extension not registered.`); } /** diff --git a/packages/core/src/drivers/DatabaseDriver.ts b/packages/core/src/drivers/DatabaseDriver.ts index e4a99b62d750..540ff77e68b5 100644 --- a/packages/core/src/drivers/DatabaseDriver.ts +++ b/packages/core/src/drivers/DatabaseDriver.ts @@ -144,10 +144,6 @@ export abstract class DatabaseDriver implements IDatabaseD return this.dependencies; } - async ensureIndexes(): Promise { - throw new Error(`${this.constructor.name} does not use ensureIndexes`); - } - protected inlineEmbeddables(meta: EntityMetadata, data: T, where?: boolean): void { Object.keys(data as Dictionary).forEach(k => { if (Utils.isOperator(k)) { diff --git a/packages/core/src/drivers/IDatabaseDriver.ts b/packages/core/src/drivers/IDatabaseDriver.ts index 7496347ecef8..0b48615989ff 100644 --- a/packages/core/src/drivers/IDatabaseDriver.ts +++ b/packages/core/src/drivers/IDatabaseDriver.ts @@ -71,8 +71,6 @@ export interface IDatabaseDriver { getMetadata(): MetadataStorage; - ensureIndexes(): Promise; - /** * Returns name of the underlying database dependencies (e.g. `mongodb` or `mysql2`) * for SQL drivers it also returns `knex` in the array as connectors are not used directly there diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index ef74f4a7c8b9..afa93e8a24f0 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,7 +7,8 @@ export { Constructor, ConnectionType, Dictionary, PrimaryKeyType, PrimaryKeyProp, Primary, IPrimaryKey, ObjectQuery, FilterQuery, IWrappedEntity, EntityName, EntityData, Highlighter, AnyEntity, EntityClass, EntityProperty, EntityMetadata, QBFilterQuery, PopulateOptions, Populate, Loaded, New, LoadedReference, LoadedCollection, IMigrator, IMigrationGenerator, GetRepository, EntityRepositoryType, MigrationObject, DeepPartial, PrimaryProperty, Cast, IsUnknown, EntityDictionary, EntityDTO, MigrationDiff, GenerateOptions, - IEntityGenerator, ISeedManager, EntityClassGroup, OptionalProps, RequiredEntityData, CheckCallback, SimpleColumnMeta, Rel, Ref, + IEntityGenerator, ISeedManager, EntityClassGroup, OptionalProps, RequiredEntityData, CheckCallback, SimpleColumnMeta, Rel, Ref, ISchemaGenerator, + UmzugMigration, MigrateOptions, MigrationResult, MigrationRow, } from './typings'; export * from './enums'; export * from './errors'; diff --git a/packages/core/src/platforms/Platform.ts b/packages/core/src/platforms/Platform.ts index 048444461a3a..d7dee97bf00a 100644 --- a/packages/core/src/platforms/Platform.ts +++ b/packages/core/src/platforms/Platform.ts @@ -353,18 +353,11 @@ export abstract class Platform { // no extensions by default } + /* istanbul ignore next: kept for type inference only */ getSchemaGenerator(driver: IDatabaseDriver, em?: EntityManager): ISchemaGenerator { throw new Error(`${driver.constructor.name} does not support SchemaGenerator`); } - getEntityGenerator(em: EntityManager): IEntityGenerator { - throw new Error(`${this.constructor.name} does not support EntityGenerator`); - } - - getMigrator(em: EntityManager): IMigrator { - throw new Error(`${this.constructor.name} does not support Migrator`); - } - processDateProperty(value: unknown): string | number | Date { return value as string; } diff --git a/packages/core/src/typings.ts b/packages/core/src/typings.ts index 90267576ccfe..a6e56649f358 100644 --- a/packages/core/src/typings.ts +++ b/packages/core/src/typings.ts @@ -589,7 +589,7 @@ export interface ISchemaGenerator { dropDatabase(name?: string): Promise; execute(sql: string, options?: { wrap?: boolean }): Promise; ensureIndexes(): Promise; - refreshDatabase(): Promise; + refreshDatabase(options?: { ensureIndexes?: boolean }): Promise; clearDatabase(options?: { schema?: string }): Promise; } @@ -605,10 +605,10 @@ export interface IEntityGenerator { generate(options?: GenerateOptions): Promise; } -type UmzugMigration = { name: string; path?: string }; -type MigrateOptions = { from?: string | number; to?: string | number; migrations?: string[]; transaction?: Transaction }; -type MigrationResult = { fileName: string; code: string; diff: MigrationDiff }; -type MigrationRow = { name: string; executed_at: Date }; +export type UmzugMigration = { name: string; path?: string }; +export type MigrateOptions = { from?: string | number; to?: string | number; migrations?: string[]; transaction?: Transaction }; +export type MigrationResult = { fileName: string; code: string; diff: MigrationDiff }; +export type MigrationRow = { name: string; executed_at: Date }; /** * @internal diff --git a/packages/core/src/utils/Configuration.ts b/packages/core/src/utils/Configuration.ts index a0e384e7a109..664244f9b2f6 100644 --- a/packages/core/src/utils/Configuration.ts +++ b/packages/core/src/utils/Configuration.ts @@ -1,6 +1,4 @@ -import { inspect } from 'util'; import { pathExistsSync } from 'fs-extra'; - import type { NamingStrategy } from '../naming-strategy'; import { FileCacheAdapter, NullCacheAdapter, type CacheAdapter } from '../cache'; import type { EntityRepository } from '../entity/EntityRepository'; @@ -133,22 +131,12 @@ export class Configuration { dynamicImportProvider: /* istanbul ignore next */ (id: string) => import(id), }; - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) - static readonly PLATFORMS = { - 'mongo': { className: 'MongoDriver', module: () => require('@mikro-orm/mongodb') }, - 'mysql': { className: 'MySqlDriver', module: () => require('@mikro-orm/mysql') }, - 'mariadb': { className: 'MariaDbDriver', module: () => require('@mikro-orm/mariadb') }, - 'postgresql': { className: 'PostgreSqlDriver', module: () => require('@mikro-orm/postgresql') }, - 'sqlite': { className: 'SqliteDriver', module: () => require('@mikro-orm/sqlite') }, - 'better-sqlite': { className: 'BetterSqliteDriver', module: () => require('@mikro-orm/better-sqlite') }, - }; - private readonly options: MikroORMOptions; private readonly logger: Logger; private readonly driver: D; private readonly platform: Platform; private readonly cache = new Map(); - private readonly extensions = new Map(); + private readonly extensions = new Map unknown>(); constructor(options: Options, validate = true) { if (options.dynamicImportProvider) { @@ -169,7 +157,7 @@ export class Configuration { highlighter: this.options.highlighter, writer: this.options.logger, }); - this.driver = this.initDriver(); + this.driver = new this.options.driver!(this); this.platform = this.driver.getPlatform(); this.platform.setConfig(this); this.detectSourceFolder(options); @@ -230,12 +218,23 @@ export class Configuration { return this.driver; } - registerExtension(name: string, instance: unknown): void { - this.extensions.set(name, instance); + registerExtension(name: string, cb: () => unknown): void { + this.extensions.set(name, cb); } getExtension(name: string): T | undefined { - return this.extensions.get(name) as T; + if (this.cache.has(name)) { + return this.cache.get(name); + } + + const ext = this.extensions.get(name); + + if (ext) { + this.cache.set(name, ext()); + return this.cache.get(name); + } + + return undefined; } /** @@ -384,12 +383,12 @@ export class Configuration { } private validateOptions(): void { - if (!this.options.type && !this.options.driver) { - throw new Error('No platform type specified, please fill in `type` or provide custom driver class in `driver` option. Available platforms types: ' + inspect(Object.keys(Configuration.PLATFORMS))); + if ('type' in this.options) { + throw new Error('The `type` option has been removed in v6, please fill in the `driver` option instead or use `defineConfig` helper (to define your ORM config) or `MikroORM` class (to call the `init` method) exported from the driver package (e.g. `import { defineConfig } from \'@mikro-orm/mysql\'; export default defineConfig({ ... })`).'); } - if (this.options.type && !(this.options.type in Configuration.PLATFORMS)) { - throw new Error(`Invalid platform type specified: '${this.options.type}', please fill in valid \`type\` or provide custom driver class in \`driver\` option. Available platforms types: ${inspect(Object.keys(Configuration.PLATFORMS))}`); + if (!this.options.driver) { + throw new Error('No driver specified, please fill in the `driver` option or use `defineConfig` helper (to define your ORM config) or `MikroORM` class (to call the `init` method) exported from the driver package (e.g. `import { defineConfig } from \'@mikro-orm/mysql\'; export defineConfig({ ... })`).'); } if (!this.options.dbName && !this.options.clientUrl) { @@ -401,15 +400,6 @@ export class Configuration { } } - private initDriver(): D { - if (!this.options.driver) { - const { className, module } = Configuration.PLATFORMS[this.options.type!]; - this.options.driver = module()[className]; - } - - return new this.options.driver!(this); - } - } /** @@ -506,8 +496,6 @@ export interface MikroORMOptions ex getMappedType?: (type: string, platform: Platform) => Type | undefined; checkDuplicateEntities?: boolean; }; - /** @deprecated type option will be removed in v6, use `defineConfig` exported from the driver package to define your ORM config */ - type?: keyof typeof Configuration.PLATFORMS; driver?: { new(config: Configuration): D }; driverOptions: Dictionary; namingStrategy?: { new(): NamingStrategy }; diff --git a/packages/core/src/utils/ConfigurationLoader.ts b/packages/core/src/utils/ConfigurationLoader.ts index 87d972e964bc..0f7cb45cac93 100644 --- a/packages/core/src/utils/ConfigurationLoader.ts +++ b/packages/core/src/utils/ConfigurationLoader.ts @@ -158,9 +158,21 @@ export class ConfigurationLoader { static loadEnvironmentVars(): Partial> { const ret: Dictionary = {}; + + // only to keep some sort of back compatibility with those using env vars only, to support `MIKRO_ORM_TYPE` + const PLATFORMS = { + 'mongo': { className: 'MongoDriver', module: '@mikro-orm/mongodb' }, + 'mysql': { className: 'MySqlDriver', module: '@mikro-orm/mysql' }, + 'mariadb': { className: 'MariaDbDriver', module: '@mikro-orm/mariadb' }, + 'postgresql': { className: 'PostgreSqlDriver', module: '@mikro-orm/postgresql' }, + 'sqlite': { className: 'SqliteDriver', module: '@mikro-orm/sqlite' }, + 'better-sqlite': { className: 'BetterSqliteDriver', module: '@mikro-orm/better-sqlite' }, + }; + const array = (v: string) => v.split(',').map(vv => vv.trim()); const bool = (v: string) => ['true', 't', '1'].includes(v.toLowerCase()); const num = (v: string) => +v; + const driver = (v: string) => Utils.requireFrom(PLATFORMS[v].module)[PLATFORMS[v].className]; const read = (o: Dictionary, envKey: string, key: string, mapper: (v: string) => unknown = v => v) => { if (!(envKey in process.env)) { return; @@ -172,7 +184,7 @@ export class ConfigurationLoader { const cleanup = (o: Dictionary, k: string) => Utils.hasObjectKeys(o[k]) ? {} : delete o[k]; read(ret, 'MIKRO_ORM_BASE_DIR', 'baseDir'); - read(ret, 'MIKRO_ORM_TYPE', 'type'); + read(ret, 'MIKRO_ORM_TYPE', 'driver', driver); read(ret, 'MIKRO_ORM_ENTITIES', 'entities', array); read(ret, 'MIKRO_ORM_ENTITIES_TS', 'entitiesTs', array); read(ret, 'MIKRO_ORM_CLIENT_URL', 'clientUrl'); diff --git a/packages/entity-generator/src/EntityGenerator.ts b/packages/entity-generator/src/EntityGenerator.ts index 4b3b462a3985..2300c5cc0470 100644 --- a/packages/entity-generator/src/EntityGenerator.ts +++ b/packages/entity-generator/src/EntityGenerator.ts @@ -17,7 +17,7 @@ export class EntityGenerator { constructor(private readonly em: EntityManager) { } static register(orm: MikroORM): void { - orm.config.registerExtension('@mikro-orm/entity-generator', new EntityGenerator(orm.em as EntityManager)); + orm.config.registerExtension('@mikro-orm/entity-generator', () => new EntityGenerator(orm.em as EntityManager)); } async generate(options: GenerateOptions = {}): Promise { diff --git a/packages/knex/package.json b/packages/knex/package.json index 2863e3ef38c3..0878a3bb18b3 100644 --- a/packages/knex/package.json +++ b/packages/knex/package.json @@ -66,40 +66,6 @@ "@mikro-orm/core": "^5.9.2" }, "peerDependencies": { - "@mikro-orm/core": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "better-sqlite3": "*", - "mssql": "*", - "mysql": "*", - "mysql2": "*", - "pg": "*", - "sqlite3": "*" - }, - "peerDependenciesMeta": { - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "sqlite3": { - "optional": true - } + "@mikro-orm/core": "^5.0.0" } } diff --git a/packages/knex/src/AbstractSqlPlatform.ts b/packages/knex/src/AbstractSqlPlatform.ts index ea76da66cdf1..75880d91140a 100644 --- a/packages/knex/src/AbstractSqlPlatform.ts +++ b/packages/knex/src/AbstractSqlPlatform.ts @@ -28,24 +28,9 @@ export abstract class AbstractSqlPlatform extends Platform { SchemaGenerator.register(orm); } - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) + /* istanbul ignore next: kept for type inference only */ getSchemaGenerator(driver: IDatabaseDriver, em?: EntityManager): SchemaGenerator { - /* istanbul ignore next */ - return this.config.getCachedService(SchemaGenerator, em ?? driver as any); // cast as `any` to get around circular dependencies - } - - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) - getEntityGenerator(em: EntityManager) { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { EntityGenerator } = require('@mikro-orm/entity-generator'); - return this.config.getCachedService(EntityGenerator, em); - } - - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) - getMigrator(em: EntityManager) { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { Migrator } = require('@mikro-orm/migrations'); - return this.config.getCachedService(Migrator, em); + return new SchemaGenerator(em ?? driver as any); } quoteValue(value: any): string { diff --git a/packages/knex/src/schema/SchemaGenerator.ts b/packages/knex/src/schema/SchemaGenerator.ts index 7adb4a60d650..7c959fbbd01d 100644 --- a/packages/knex/src/schema/SchemaGenerator.ts +++ b/packages/knex/src/schema/SchemaGenerator.ts @@ -1,5 +1,5 @@ import type { Knex } from 'knex'; -import { AbstractSchemaGenerator, Utils, type Dictionary, type EntityMetadata, type MikroORM } from '@mikro-orm/core'; +import { AbstractSchemaGenerator, Utils, type Dictionary, type EntityMetadata, type MikroORM, ISchemaGenerator } from '@mikro-orm/core'; import type { Check, ForeignKey, Index, SchemaDifference, TableDifference } from '../typings'; import { DatabaseSchema } from './DatabaseSchema'; import type { DatabaseTable } from './DatabaseTable'; @@ -9,14 +9,14 @@ import { SchemaComparator } from './SchemaComparator'; /** * Should be renamed to `SqlSchemaGenerator` in v6 */ -export class SchemaGenerator extends AbstractSchemaGenerator { +export class SchemaGenerator extends AbstractSchemaGenerator implements ISchemaGenerator { private readonly helper = this.platform.getSchemaHelper()!; private readonly options = this.config.get('schemaGenerator'); protected lastEnsuredDatabase?: string; static register(orm: MikroORM): void { - orm.config.registerExtension('@mikro-orm/schema-generator', new SchemaGenerator(orm.em)); + orm.config.registerExtension('@mikro-orm/schema-generator', () => new SchemaGenerator(orm.em)); } /** @deprecated use `dropSchema` and `createSchema` commands respectively */ diff --git a/packages/mariadb/package.json b/packages/mariadb/package.json index 2c6e8649953c..3f4ddcc935dd 100644 --- a/packages/mariadb/package.json +++ b/packages/mariadb/package.json @@ -65,20 +65,6 @@ "@mikro-orm/core": "^5.9.2" }, "peerDependencies": { - "@mikro-orm/core": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "@mikro-orm/seeder": "^5.0.0" - }, - "peerDependenciesMeta": { - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "@mikro-orm/seeder": { - "optional": true - } + "@mikro-orm/core": "^5.0.0" } } diff --git a/packages/migrations-mongodb/src/Migrator.ts b/packages/migrations-mongodb/src/Migrator.ts index 6cbb301500bd..d7703ac0b765 100644 --- a/packages/migrations-mongodb/src/Migrator.ts +++ b/packages/migrations-mongodb/src/Migrator.ts @@ -29,7 +29,7 @@ export class Migrator implements IMigrator { } static register(orm: MikroORM): void { - orm.config.registerExtension('@mikro-orm/migrator', new Migrator(orm.em as EntityManager)); + orm.config.registerExtension('@mikro-orm/migrator', () => new Migrator(orm.em as EntityManager)); } /** diff --git a/packages/migrations-mongodb/src/typings.ts b/packages/migrations-mongodb/src/typings.ts index afa43d0f3e55..7ccefe6685fd 100644 --- a/packages/migrations-mongodb/src/typings.ts +++ b/packages/migrations-mongodb/src/typings.ts @@ -1,6 +1 @@ -import type { Transaction, MigrationDiff } from '@mikro-orm/core'; - -export type UmzugMigration = { name: string; path?: string }; -export type MigrateOptions = { from?: string | number; to?: string | number; migrations?: string[]; transaction?: Transaction }; -export type MigrationResult = { fileName: string; code: string; diff: MigrationDiff }; -export type MigrationRow = { name: string; executed_at: Date }; +export { UmzugMigration, MigrateOptions, MigrationResult, MigrationRow } from '@mikro-orm/core'; diff --git a/packages/migrations/src/Migrator.ts b/packages/migrations/src/Migrator.ts index 6e76a90640a6..f82171292a18 100644 --- a/packages/migrations/src/Migrator.ts +++ b/packages/migrations/src/Migrator.ts @@ -38,7 +38,7 @@ export class Migrator implements IMigrator { } static register(orm: MikroORM): void { - orm.config.registerExtension('@mikro-orm/migrator', new Migrator(orm.em as EntityManager)); + orm.config.registerExtension('@mikro-orm/migrator', () => new Migrator(orm.em as EntityManager)); } /** diff --git a/packages/migrations/src/typings.ts b/packages/migrations/src/typings.ts index afa43d0f3e55..7ccefe6685fd 100644 --- a/packages/migrations/src/typings.ts +++ b/packages/migrations/src/typings.ts @@ -1,6 +1 @@ -import type { Transaction, MigrationDiff } from '@mikro-orm/core'; - -export type UmzugMigration = { name: string; path?: string }; -export type MigrateOptions = { from?: string | number; to?: string | number; migrations?: string[]; transaction?: Transaction }; -export type MigrationResult = { fileName: string; code: string; diff: MigrationDiff }; -export type MigrationRow = { name: string; executed_at: Date }; +export { UmzugMigration, MigrateOptions, MigrationResult, MigrationRow } from '@mikro-orm/core'; diff --git a/packages/mongodb/package.json b/packages/mongodb/package.json index d8b5e19489ef..140004e95a9c 100644 --- a/packages/mongodb/package.json +++ b/packages/mongodb/package.json @@ -65,24 +65,6 @@ "@mikro-orm/core": "^5.9.2" }, "peerDependencies": { - "@mikro-orm/core": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "@mikro-orm/migrations-mongodb": "^5.0.0", - "@mikro-orm/seeder": "^5.0.0" - }, - "peerDependenciesMeta": { - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "@mikro-orm/migrations-mongodb": { - "optional": true - }, - "@mikro-orm/seeder": { - "optional": true - } + "@mikro-orm/core": "^5.0.0" } } diff --git a/packages/mongodb/src/MongoDriver.ts b/packages/mongodb/src/MongoDriver.ts index c2fed6c94271..b473ddcf7e3d 100644 --- a/packages/mongodb/src/MongoDriver.ts +++ b/packages/mongodb/src/MongoDriver.ts @@ -343,32 +343,4 @@ export class MongoDriver extends DatabaseDriver { return ret.length > 0 ? ret : undefined; } - /** - * @deprecated use `orm.getSchemaGenerator().createSchema()` instead - */ - async createCollections(): Promise { - await this.platform.getSchemaGenerator(this).createSchema(); - } - - /** - * @deprecated use `orm.getSchemaGenerator().dropSchema()` instead - */ - async dropCollections(): Promise { - await this.platform.getSchemaGenerator(this).dropSchema(); - } - - /** - * @deprecated use `orm.getSchemaGenerator().refreshDatabase()` instead - */ - async refreshCollections(options: CreateSchemaOptions = {}): Promise { - await this.platform.getSchemaGenerator(this).refreshDatabase(options); - } - - /** - * @deprecated use `orm.getSchemaGenerator().ensureIndexes()` instead - */ - async ensureIndexes(): Promise { - await this.platform.getSchemaGenerator(this).ensureIndexes(); - } - } diff --git a/packages/mongodb/src/MongoPlatform.ts b/packages/mongodb/src/MongoPlatform.ts index 1743e5e8e9e6..b73e83deee1d 100644 --- a/packages/mongodb/src/MongoPlatform.ts +++ b/packages/mongodb/src/MongoPlatform.ts @@ -29,18 +29,11 @@ export class MongoPlatform extends Platform { MongoSchemaGenerator.register(orm); } - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) + /* istanbul ignore next: kept for type inference only */ getSchemaGenerator(driver: IDatabaseDriver, em?: EntityManager): MongoSchemaGenerator { return new MongoSchemaGenerator(em ?? driver as any); } - // TODO remove in v6 (https://github.com/mikro-orm/mikro-orm/issues/3743) - getMigrator(em: EntityManager) { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { Migrator } = require('@mikro-orm/migrations-mongodb'); - return this.config.getCachedService(Migrator, em); - } - normalizePrimaryKey(data: Primary | IPrimaryKey | ObjectId): T { if (data instanceof ObjectId) { return data.toHexString() as T; diff --git a/packages/mongodb/src/MongoSchemaGenerator.ts b/packages/mongodb/src/MongoSchemaGenerator.ts index 0932e82702d7..8cd95ccb9eb6 100644 --- a/packages/mongodb/src/MongoSchemaGenerator.ts +++ b/packages/mongodb/src/MongoSchemaGenerator.ts @@ -4,7 +4,7 @@ import type { MongoDriver } from './MongoDriver'; export class MongoSchemaGenerator extends AbstractSchemaGenerator { static register(orm: MikroORM): void { - orm.config.registerExtension('@mikro-orm/schema-generator', new MongoSchemaGenerator(orm.em)); + orm.config.registerExtension('@mikro-orm/schema-generator', () => new MongoSchemaGenerator(orm.em)); } async createSchema(options: CreateSchemaOptions = {}): Promise { diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 58a7d0cd8bcc..948a42dccaba 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -65,20 +65,6 @@ "@mikro-orm/core": "^5.9.2" }, "peerDependencies": { - "@mikro-orm/core": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "@mikro-orm/seeder": "^5.0.0" - }, - "peerDependenciesMeta": { - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "@mikro-orm/seeder": { - "optional": true - } + "@mikro-orm/core": "^5.0.0" } } diff --git a/packages/postgresql/package.json b/packages/postgresql/package.json index f29947f02ad3..27c8ae0deb98 100644 --- a/packages/postgresql/package.json +++ b/packages/postgresql/package.json @@ -65,20 +65,6 @@ "@mikro-orm/core": "^5.9.2" }, "peerDependencies": { - "@mikro-orm/core": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "@mikro-orm/seeder": "^5.0.0" - }, - "peerDependenciesMeta": { - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "@mikro-orm/seeder": { - "optional": true - } + "@mikro-orm/core": "^5.0.0" } } diff --git a/packages/seeder/src/SeedManager.ts b/packages/seeder/src/SeedManager.ts index 5c985bc54444..9a46208958a5 100644 --- a/packages/seeder/src/SeedManager.ts +++ b/packages/seeder/src/SeedManager.ts @@ -18,7 +18,7 @@ export class SeedManager implements ISeedManager { } static register(orm: MikroORM): void { - orm.config.registerExtension('@mikro-orm/seeder', new SeedManager(orm.em)); + orm.config.registerExtension('@mikro-orm/seeder', () => new SeedManager(orm.em)); } async seed(...classNames: Constructor[]): Promise { diff --git a/packages/sqlite/package.json b/packages/sqlite/package.json index 654cb39981c0..50f46f9c70fd 100644 --- a/packages/sqlite/package.json +++ b/packages/sqlite/package.json @@ -67,20 +67,6 @@ "@mikro-orm/core": "^5.9.2" }, "peerDependencies": { - "@mikro-orm/core": "^5.0.0", - "@mikro-orm/entity-generator": "^5.0.0", - "@mikro-orm/migrations": "^5.0.0", - "@mikro-orm/seeder": "^5.0.0" - }, - "peerDependenciesMeta": { - "@mikro-orm/entity-generator": { - "optional": true - }, - "@mikro-orm/migrations": { - "optional": true - }, - "@mikro-orm/seeder": { - "optional": true - } + "@mikro-orm/core": "^5.0.0" } } diff --git a/tests/DatabaseDriver.test.ts b/tests/DatabaseDriver.test.ts index 6461fceb81dd..2d4cc9478aa7 100644 --- a/tests/DatabaseDriver.test.ts +++ b/tests/DatabaseDriver.test.ts @@ -79,11 +79,9 @@ describe('DatabaseDriver', () => { const e1 = driver.convertException(new Error('test')); const e2 = driver.convertException(e1); expect(e1).toBe(e2); - expect(() => driver.getPlatform().getSchemaGenerator(driver)).toThrowError('Driver does not support SchemaGenerator'); }); test('not supported', async () => { - expect(() => driver.getPlatform().getMigrator({} as any)).toThrowError('Platform1 does not support Migrator'); expect(() => driver.getPlatform().getFullTextWhereClause({} as any)).toThrowError('Full text searching is not supported by this driver.'); expect(() => driver.getPlatform().supportsCreatingFullTextIndex()).toThrowError('Full text searching is not supported by this driver.'); expect(() => driver.getPlatform().getFullTextIndexExpression({} as any, {} as any, {} as any, {} as any)).toThrowError('Full text searching is not supported by this driver.'); diff --git a/tests/EntityManager.mysql.test.ts b/tests/EntityManager.mysql.test.ts index 6f4f0d5d626b..426c9027f091 100644 --- a/tests/EntityManager.mysql.test.ts +++ b/tests/EntityManager.mysql.test.ts @@ -101,7 +101,6 @@ describe('EntityManagerMySql', () => { expect(driver.getPlatform().denormalizePrimaryKey('1')).toBe('1'); await expect(driver.find(BookTag2.name, { books: { $in: ['1'] } })).resolves.not.toBeNull(); await expect(driver.count(BookTag2.name, {})).resolves.toBe(1); - await expect(driver.ensureIndexes()).rejects.toThrowError('MySqlDriver does not use ensureIndexes'); const conn = driver.getConnection(); const tx = await conn.begin(); diff --git a/tests/MikroORM.test.ts b/tests/MikroORM.test.ts index 2073ff92cdf6..c1caeaba2b10 100644 --- a/tests/MikroORM.test.ts +++ b/tests/MikroORM.test.ts @@ -25,10 +25,8 @@ import { MongoDriver } from '@mikro-orm/mongodb'; describe('MikroORM', () => { test('should throw when not enough config provided', async () => { - const err = `No platform type specified, please fill in \`type\` or provide custom driver class in \`driver\` option. Available platforms types: [\n 'mongo',\n 'mysql',\n 'mariadb',\n 'postgresql',\n 'sqlite',\n 'better-sqlite'\n]`; + const err = `No driver specified, please fill in the \`driver\` option or use \`defineConfig\` helper (to define your ORM config) or \`MikroORM\` class (to call the \`init\` method) exported from the driver package (e.g. \`import { defineConfig } from '@mikro-orm/mysql'; export defineConfig({ ... })\`).`; expect(() => new MikroORM({ entities: ['entities'], clientUrl: '' })).toThrowError(err); - const err2 = `Invalid platform type specified: 'wut', please fill in valid \`type\` or provide custom driver class in \`driver\` option. Available platforms types: [\n 'mongo',\n 'mysql',\n 'mariadb',\n 'postgresql',\n 'sqlite',\n 'better-sqlite'\n]`; - expect(() => new MikroORM({ type: 'wut' as any, entities: ['entities'], clientUrl: '' })).toThrowError(err2); expect(() => new MikroORM({ driver: MongoDriver, entities: ['entities'], dbName: '' })).toThrowError('No database specified, please fill in `dbName` or `clientUrl` option'); expect(() => new MikroORM({ driver: MongoDriver, entities: [], dbName: 'test' })).toThrowError('No entities found, please use `entities` option'); expect(() => new MikroORM({ driver: MongoDriver, entities: ['entities/*.js'], dbName: 'test' })).not.toThrowError(); @@ -129,15 +127,15 @@ describe('MikroORM', () => { test('should prefer environment variables', async () => { process.env.MIKRO_ORM_ENV = __dirname + '/mikro-orm.env'; - const orm = await MikroORM.init({ type: 'mongo' }, false); + const orm = await MikroORM.init({ driver: SqliteDriver, host: '123.0.0.321' }, false); Object.keys(process.env).filter(k => k.startsWith('MIKRO_ORM_')).forEach(k => delete process.env[k]); expect(orm).toBeInstanceOf(MikroORM); expect(orm.em).toBeInstanceOf(EntityManager); expect(orm.config.getAll()).toMatchObject({ - type: 'sqlite', // env vars have preference + driver: SqliteDriver, entities: [ './entities-schema' ], - host: '123.0.0.4', + host: '123.0.0.4', // env vars have preference port: 1234, user: 'string', password: 'lol', diff --git a/tests/bootstrap.ts b/tests/bootstrap.ts index 400324af9f2e..ea821e0afec3 100644 --- a/tests/bootstrap.ts +++ b/tests/bootstrap.ts @@ -6,6 +6,10 @@ import type { AbstractSqlDriver } from '@mikro-orm/knex'; import { SqlEntityRepository } from '@mikro-orm/knex'; import { SqliteDriver } from '@mikro-orm/sqlite'; import { MongoDriver } from '@mikro-orm/mongodb'; +import { Migrator } from '@mikro-orm/migrations'; +import { Migrator as MongoMigrator } from '@mikro-orm/migrations-mongodb'; +import { SeedManager } from '@mikro-orm/seeder'; +import { EntityGenerator } from '@mikro-orm/entity-generator'; import { MySqlDriver } from '@mikro-orm/mysql'; import { MariaDbDriver } from '@mikro-orm/mariadb'; import { PostgreSqlDriver } from '@mikro-orm/postgresql'; @@ -24,6 +28,15 @@ import { Book5 } from './entities-5'; const { BaseEntity4, Author3, Book3, BookTag3, Publisher3, Test3 } = require('./entities-js/index'); +export const PLATFORMS = { + 'mongo': MongoDriver, + 'mysql': MySqlDriver, + 'mariadb': MariaDbDriver, + 'postgresql': PostgreSqlDriver, + 'sqlite': SqliteDriver, + 'better-sqlite': BetterSqliteDriver, +}; + let ensureIndexes = true; // ensuring indexes is slow, and it is enough to make it once const replicaSets: MongoMemoryReplSet[] = []; @@ -70,6 +83,7 @@ export async function initORMMongo(replicaSet = false) { pool: { min: 1, max: 3 }, migrations: { path: BASE_DIR + '/../temp/migrations-mongo' }, ignoreUndefinedInQuery: true, + extensions: [MongoMigrator, SeedManager, EntityGenerator], }); ensureIndexes = false; @@ -95,6 +109,7 @@ export async function initORMMySql i, cache: { pretty: true }, migrations: { path: BASE_DIR + '/../temp/migrations-2', snapshot: false }, + extensions: [Migrator, SeedManager, EntityGenerator], }); await orm.schema.refreshDatabase(); @@ -198,6 +216,7 @@ export async function initORMSqlite3() { logger: i => i, metadataProvider: ReflectMetadataProvider, cache: { enabled: true, pretty: true }, + extensions: [Migrator, SeedManager, EntityGenerator], }); const connection = orm.em.getConnection(); diff --git a/tests/features/embeddables/GH3327.test.ts b/tests/features/embeddables/GH3327.test.ts index f308bd2ebd7a..b4545a830481 100644 --- a/tests/features/embeddables/GH3327.test.ts +++ b/tests/features/embeddables/GH3327.test.ts @@ -1,4 +1,5 @@ import { Embeddable, Embedded, Entity, MikroORM, Options, PrimaryKey, Property, t } from '@mikro-orm/core'; +import { PLATFORMS } from '../../bootstrap'; @Embeddable() class FieldValue { @@ -45,7 +46,7 @@ describe.each(['sqlite', 'better-sqlite', 'mysql', 'postgresql', 'mongo'] as con orm = await MikroORM.init({ entities: [Field], dbName: type.includes('sqlite') ? ':memory:' : 'mikro_orm_3327', - type, + driver: PLATFORMS[type], ...options, }); await orm.schema.refreshDatabase(); diff --git a/tests/features/entity-generator/EntityGenerator.test.ts b/tests/features/entity-generator/EntityGenerator.test.ts index 662ac0236165..425e141f419d 100644 --- a/tests/features/entity-generator/EntityGenerator.test.ts +++ b/tests/features/entity-generator/EntityGenerator.test.ts @@ -170,7 +170,7 @@ describe('EntityGenerator', () => { test('not supported [mongodb]', async () => { const orm = await MikroORM.init({ driver: MongoDriver, dbName: 'mikro-orm-test', discovery: { warnWhenNoEntities: false } }, false); - expect(() => orm.entityGenerator).toThrowError('MongoPlatform does not support EntityGenerator'); + expect(() => orm.entityGenerator).toThrowError('EntityGenerator extension not registered.'); }); test('table name starting with number [mysql]', async () => { diff --git a/tests/features/migrations/Migrator.mongo.test.ts b/tests/features/migrations/Migrator.mongo.test.ts index bacf04d553ad..2a4f4362e815 100644 --- a/tests/features/migrations/Migrator.mongo.test.ts +++ b/tests/features/migrations/Migrator.mongo.test.ts @@ -34,9 +34,7 @@ describe('Migrator (mongo)', () => { beforeAll(async () => { orm = await initORMMongo(true); - - const schemaGenerator = orm.schema; - await schemaGenerator.refreshDatabase(); + await orm.schema.refreshDatabase(); await remove(process.cwd() + '/temp/migrations-mongo'); }); @@ -52,8 +50,7 @@ describe('Migrator (mongo)', () => { dateMock.mockReturnValue('2019-10-13T21:48:13.382Z'); const migrationsSettings = orm.config.get('migrations'); orm.config.set('migrations', { ...migrationsSettings, emit: 'js' }); // Set migration type to js - const migrator = orm.migrator; - const migration = await migrator.createMigration(); + const migration = await orm.migrator.createMigration(); expect(migration).toMatchSnapshot('migration-js-dump'); orm.config.set('migrations', migrationsSettings); // Revert migration config changes await remove(process.cwd() + '/temp/migrations-mongo/' + migration.fileName); diff --git a/tests/features/migrations/Migrator.postgres.test.ts b/tests/features/migrations/Migrator.postgres.test.ts index 3e20bd4e3054..3caa1a9c3ad3 100644 --- a/tests/features/migrations/Migrator.postgres.test.ts +++ b/tests/features/migrations/Migrator.postgres.test.ts @@ -5,7 +5,18 @@ import { Migration, MigrationStorage, Migrator, TSMigrationGenerator } from '@mi import type { DatabaseTable } from '@mikro-orm/postgresql'; import { DatabaseSchema, PostgreSqlDriver } from '@mikro-orm/postgresql'; import { remove } from 'fs-extra'; -import { Address2, Author2, Book2, BookTag2, Configuration2, FooBar2, FooBaz2, FooParam2, Publisher2, Test2 } from '../../entities-sql'; +import { + Address2, + Author2, + Book2, + BookTag2, + Configuration2, + FooBar2, + FooBaz2, + FooParam2, + Publisher2, + Test2, +} from '../../entities-sql'; import { BASE_DIR, mockLogger } from '../../bootstrap'; class MigrationTest1 extends Migration { @@ -47,6 +58,7 @@ describe('Migrator (postgres)', () => { schema: 'custom', logger: () => void 0, migrations: { path: BASE_DIR + '/../temp/migrations-456', snapshot: false }, + extensions: [Migrator], }); const schemaGenerator = orm.schema; @@ -64,8 +76,7 @@ describe('Migrator (postgres)', () => { dateMock.mockReturnValue('2019-10-13T21:48:13.382Z'); const migrationsSettings = orm.config.get('migrations'); orm.config.set('migrations', { ...migrationsSettings, emit: 'js' }); // Set migration type to js - const migrator = orm.migrator; - const migration = await migrator.createMigration(); + const migration = await orm.migrator.createMigration(); expect(migration).toMatchSnapshot('migration-js-dump'); orm.config.set('migrations', migrationsSettings); // Revert migration config changes await remove(process.cwd() + '/temp/migrations-456/' + migration.fileName); @@ -437,6 +448,7 @@ test('ensureTable when the schema does not exist', async () => { driver: PostgreSqlDriver, schema: 'custom2', migrations: { path: BASE_DIR + '/../temp/migrations-456', snapshot: false }, + extensions: [Migrator], }); await orm.schema.ensureDatabase(); await orm.schema.execute('drop schema if exists "custom2" cascade'); diff --git a/tests/features/migrations/Migrator.sqlite.test.ts b/tests/features/migrations/Migrator.sqlite.test.ts index d0fe03cc95eb..23c6a27466f4 100644 --- a/tests/features/migrations/Migrator.sqlite.test.ts +++ b/tests/features/migrations/Migrator.sqlite.test.ts @@ -310,6 +310,7 @@ describe('Migrator (sqlite)', () => { entities: [FooBar4, FooBaz4, BaseEntity5], dbName: TEMP_DIR + '/test.db', baseDir: TEMP_DIR, + extensions: [Migrator], }); await expect(orm.migrator.createMigration()).resolves.not.toThrow(); await orm.close(); diff --git a/tests/features/multiple-schemas/multiple-schemas.postgres.test.ts b/tests/features/multiple-schemas/multiple-schemas.postgres.test.ts index 47db98391830..dfcb74bc1610 100644 --- a/tests/features/multiple-schemas/multiple-schemas.postgres.test.ts +++ b/tests/features/multiple-schemas/multiple-schemas.postgres.test.ts @@ -1,6 +1,7 @@ import { BaseEntity, Cascade, Collection, Entity, LockMode, ManyToMany, ManyToOne, MikroORM, OneToMany, OneToOne, PrimaryKey, Property, wrap } from '@mikro-orm/core'; import { PostgreSqlDriver } from '@mikro-orm/postgresql'; import { mockLogger } from '../../helpers'; +import { EntityGenerator } from '@mikro-orm/entity-generator'; @Entity({ schema: 'n1' }) export class Author { @@ -59,6 +60,7 @@ describe('multiple connected schemas in postgres', () => { entities: [Author, Book, BookTag], dbName: `mikro_orm_test_multi_schemas`, driver: PostgreSqlDriver, + extensions: [EntityGenerator], }); await orm.schema.ensureDatabase(); diff --git a/tests/features/schema-generator/SchemaGenerator.mongo.test.ts b/tests/features/schema-generator/SchemaGenerator.mongo.test.ts index 5c4f60357eb8..f688bd617a02 100644 --- a/tests/features/schema-generator/SchemaGenerator.mongo.test.ts +++ b/tests/features/schema-generator/SchemaGenerator.mongo.test.ts @@ -76,32 +76,4 @@ describe('SchemaGenerator', () => { ensureIndexesSpy.mockRestore(); }); - test('deprecated driver methods that are now in MongoSchemaGenerator', async () => { - const driver = orm.em.getDriver(); - const createSchemaSpy = jest.spyOn(MongoSchemaGenerator.prototype, 'createSchema'); - const dropSchemaSpy = jest.spyOn(MongoSchemaGenerator.prototype, 'dropSchema'); - const refreshDatabaseSpy = jest.spyOn(MongoSchemaGenerator.prototype, 'refreshDatabase'); - const ensureIndexesSpy = jest.spyOn(MongoSchemaGenerator.prototype, 'ensureIndexes'); - createSchemaSpy.mockImplementation(); - dropSchemaSpy.mockImplementation(); - refreshDatabaseSpy.mockImplementation(); - - await driver.createCollections(); - expect(createSchemaSpy).toBeCalledTimes(1); - - await driver.dropCollections(); - expect(dropSchemaSpy).toBeCalledTimes(1); - - await driver.refreshCollections(); - expect(refreshDatabaseSpy).toBeCalledTimes(1); - - await driver.ensureIndexes(); - expect(ensureIndexesSpy).toBeCalledTimes(1); - - createSchemaSpy.mockRestore(); - dropSchemaSpy.mockRestore(); - refreshDatabaseSpy.mockRestore(); - ensureIndexesSpy.mockRestore(); - }); - }); diff --git a/tests/features/upsert/upsert.test.ts b/tests/features/upsert/upsert.test.ts index d95b899faab6..b5f3cf16ecbc 100644 --- a/tests/features/upsert/upsert.test.ts +++ b/tests/features/upsert/upsert.test.ts @@ -3,6 +3,7 @@ import { Unique, Ref, ref, EventSubscriber, EventArgs, OneToMany, Collection, Embeddable, Embedded, OptionalProps, } from '@mikro-orm/core'; import { mockLogger } from '../../helpers'; +import { PLATFORMS } from '../../bootstrap'; @Entity() export class Author { @@ -136,7 +137,7 @@ describe.each(Object.keys(options))('em.upsert [%s]', type => { beforeAll(async () => { orm = await MikroORM.init({ entities: [Author, Book, FooBar, FooBarWithEmbeddable], - type, + driver: PLATFORMS[type], loggerFactory: options => new SimpleLogger(options), subscribers: [new Subscriber()], ...options[type], diff --git a/tests/issues/GH3738.test.ts b/tests/issues/GH3738.test.ts index 5e33178e765c..1595c4efcc0e 100644 --- a/tests/issues/GH3738.test.ts +++ b/tests/issues/GH3738.test.ts @@ -7,7 +7,7 @@ import { PrimaryKey, Property, } from '@mikro-orm/core'; -import { MikroORM } from '@mikro-orm/postgresql'; +import { MikroORM } from '@mikro-orm/sqlite'; import { randomUUID } from 'crypto'; @Entity() @@ -54,7 +54,6 @@ describe('GH issue 3738', () => { orm = await MikroORM.init({ entities: [Answer, Question], dbName: ':memory:', - type: 'sqlite', loadStrategy: LoadStrategy.JOINED, }); await orm.schema.createSchema(); diff --git a/yarn.lock b/yarn.lock index 2ddc688f4ed9..1632306663fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1370,16 +1370,6 @@ __metadata: sqlstring-sqlite: 0.1.1 peerDependencies: "@mikro-orm/core": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - "@mikro-orm/seeder": ^5.0.0 - peerDependenciesMeta: - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/migrations": - optional: true - "@mikro-orm/seeder": - optional: true languageName: unknown linkType: soft @@ -1445,38 +1435,6 @@ __metadata: globby: 11.1.0 mikro-orm: 5.9.2 reflect-metadata: 0.1.13 - peerDependencies: - "@mikro-orm/better-sqlite": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/mariadb": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - "@mikro-orm/migrations-mongodb": ^5.0.0 - "@mikro-orm/mongodb": ^5.0.0 - "@mikro-orm/mysql": ^5.0.0 - "@mikro-orm/postgresql": ^5.0.0 - "@mikro-orm/seeder": ^5.0.0 - "@mikro-orm/sqlite": ^5.0.0 - peerDependenciesMeta: - "@mikro-orm/better-sqlite": - optional: true - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/mariadb": - optional: true - "@mikro-orm/migrations": - optional: true - "@mikro-orm/migrations-mongodb": - optional: true - "@mikro-orm/mongodb": - optional: true - "@mikro-orm/mysql": - optional: true - "@mikro-orm/postgresql": - optional: true - "@mikro-orm/seeder": - optional: true - "@mikro-orm/sqlite": - optional: true languageName: unknown linkType: soft @@ -1502,31 +1460,6 @@ __metadata: sqlstring: 2.3.3 peerDependencies: "@mikro-orm/core": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - better-sqlite3: "*" - mssql: "*" - mysql: "*" - mysql2: "*" - pg: "*" - sqlite3: "*" - peerDependenciesMeta: - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/migrations": - optional: true - better-sqlite3: - optional: true - mssql: - optional: true - mysql: - optional: true - mysql2: - optional: true - pg: - optional: true - sqlite3: - optional: true languageName: unknown linkType: soft @@ -1539,16 +1472,6 @@ __metadata: mariadb: 2.5.6 peerDependencies: "@mikro-orm/core": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - "@mikro-orm/seeder": ^5.0.0 - peerDependenciesMeta: - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/migrations": - optional: true - "@mikro-orm/seeder": - optional: true languageName: unknown linkType: soft @@ -1598,19 +1521,6 @@ __metadata: mongodb: 5.8.1 peerDependencies: "@mikro-orm/core": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - "@mikro-orm/migrations-mongodb": ^5.0.0 - "@mikro-orm/seeder": ^5.0.0 - peerDependenciesMeta: - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/migrations": - optional: true - "@mikro-orm/migrations-mongodb": - optional: true - "@mikro-orm/seeder": - optional: true languageName: unknown linkType: soft @@ -1623,16 +1533,6 @@ __metadata: mysql2: 3.6.2 peerDependencies: "@mikro-orm/core": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - "@mikro-orm/seeder": ^5.0.0 - peerDependenciesMeta: - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/migrations": - optional: true - "@mikro-orm/seeder": - optional: true languageName: unknown linkType: soft @@ -1645,16 +1545,6 @@ __metadata: pg: 8.11.3 peerDependencies: "@mikro-orm/core": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - "@mikro-orm/seeder": ^5.0.0 - peerDependenciesMeta: - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/migrations": - optional: true - "@mikro-orm/seeder": - optional: true languageName: unknown linkType: soft @@ -1743,16 +1633,6 @@ __metadata: sqlstring-sqlite: 0.1.1 peerDependencies: "@mikro-orm/core": ^5.0.0 - "@mikro-orm/entity-generator": ^5.0.0 - "@mikro-orm/migrations": ^5.0.0 - "@mikro-orm/seeder": ^5.0.0 - peerDependenciesMeta: - "@mikro-orm/entity-generator": - optional: true - "@mikro-orm/migrations": - optional: true - "@mikro-orm/seeder": - optional: true languageName: unknown linkType: soft