Skip to content

Commit

Permalink
feat(core): refactor internal dependencies to support Yarn PnP (#645)
Browse files Browse the repository at this point in the history
* fix(sqlite): add missing dependency fs-extra

* fix(mariadb): add missing dependency @mikro-orm/core

* fix(mariadb): add missing dependency @mikro-orm/knex

* fix(core): add missing dependency @mikro-orm/entity-generator

* fix(core): add missing dependency @mikro-orm/knex

* fix(core): add missing dependency @mikro-orm/migrations

* feat(knex): export knex

* feat(knex): add requireModule helper

* fix(sqlite): get knex from @mikro-orm/knex

* fix(postgresql): get knex from @mikro-orm/knex

* fix(mysql-base): get knex from @mikro-orm/knex

* fix(mariadb): get knex from @mikro-orm/knex

* chore: change root package name to avoid conflict

* fix(cli): node_modules isn't guaranteed to exist

* fix(core): add missing dependency tsconfig-paths

* fix(core): add missing optional peer dependency ts-node

* fix(core): require on behalf of the user

* fix(core): get the schema generator from the driver

* fix(core): require ts-node as config

* fix(core): require tsconfig-paths from config

* chore: update ignore comments

* style(core): add spacing

Co-authored-by: Martin Adámek <banan23@gmail.com>

* refactor: add requireFrom helper

* refactor: make core a peer dependency

* docs(core): document requireFrom

* refactor: move getSchemaGenerator to platform

* fix(core): ensure absolute paths

* refactor(mariadb): use knex from mysql-base

* style: spaces not tabs

Co-authored-by: Martin Adámek <banan23@gmail.com>

* refactor(core): use path.resolve

* test: fix cli helper tests

* fix(core): handle folders in requireFrom

* test: update getModuleVersion

* test: mongodb throws on getSchemaGenerator

Co-authored-by: Martin Adámek <banan23@gmail.com>
  • Loading branch information
merceyz and B4nan committed Aug 9, 2020
1 parent b903fa1 commit 7e21bb8
Show file tree
Hide file tree
Showing 28 changed files with 428 additions and 387 deletions.
2 changes: 1 addition & 1 deletion package.json
@@ -1,5 +1,5 @@
{
"name": "mikro-orm",
"name": "mikro-orm-root",
"private": true,
"workspaces": [
"packages/*"
Expand Down
11 changes: 4 additions & 7 deletions packages/cli/src/CLIHelper.ts
Expand Up @@ -124,15 +124,12 @@ export class CLIHelper {
}

static async getModuleVersion(name: string): Promise<string> {
const path = process.cwd() + '/node_modules/' + name + '/package.json';

if (await pathExists(path)) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const pkg = require(path);
try {
const pkg = Utils.requireFrom(`${name}/package.json`, process.cwd());
return chalk.green(pkg.version);
} catch {
return chalk.red('not-found');
}

return chalk.red('not-found');
}

static dumpTable(options: { columns: string[]; rows: string[][]; empty: string }): void {
Expand Down
12 changes: 4 additions & 8 deletions packages/core/src/MikroORM.ts
Expand Up @@ -2,7 +2,7 @@ import chalk from 'chalk';

import { EntityManagerType, IDatabaseDriver } from './drivers';
import { MetadataDiscovery, MetadataStorage, ReflectMetadataProvider } from './metadata';
import { Configuration, ConfigurationLoader, Logger, Options } from './utils';
import { Configuration, ConfigurationLoader, Logger, Options, Utils } from './utils';
import { NullCacheAdapter } from './cache';
import { EntityManager } from './EntityManager';
import { IEntityGenerator, IMigrator, ISchemaGenerator } from './typings';
Expand Down Expand Up @@ -106,26 +106,22 @@ export class MikroORM<D extends IDatabaseDriver = IDatabaseDriver> {
* Gets the SchemaGenerator.
*/
getSchemaGenerator<T extends ISchemaGenerator = ISchemaGenerator>(): T {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const SchemaGenerator = require('@mikro-orm/knex').SchemaGenerator;
return new SchemaGenerator(this.em);
return this.driver.getPlatform().getSchemaGenerator(this.em) as T;
}

/**
* Gets the EntityGenerator.
*/
getEntityGenerator<T extends IEntityGenerator = IEntityGenerator>(): T {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const EntityGenerator = require('@mikro-orm/entity-generator').EntityGenerator;
const { EntityGenerator } = Utils.requireFrom('@mikro-orm/entity-generator', this.config.get('baseDir'));
return new EntityGenerator(this.em);
}

/**
* Gets the Migrator.
*/
getMigrator<T extends IMigrator = IMigrator>(): T {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const Migrator = require('@mikro-orm/migrations').Migrator;
const { Migrator } = Utils.requireFrom('@mikro-orm/migrations', this.config.get('baseDir'));
return new Migrator(this.em);
}

Expand Down
7 changes: 6 additions & 1 deletion packages/core/src/platforms/Platform.ts
@@ -1,7 +1,8 @@
import { EntityRepository } from '../entity';
import { NamingStrategy, UnderscoreNamingStrategy } from '../naming-strategy';
import { Constructor, Dictionary, EntityProperty, IPrimaryKey, Primary } from '../typings';
import { Constructor, Dictionary, EntityProperty, IPrimaryKey, Primary, ISchemaGenerator } from '../typings';
import { ExceptionConverter } from './ExceptionConverter';
import { EntityManager } from '../EntityManager';

export abstract class Platform {

Expand Down Expand Up @@ -127,4 +128,8 @@ export abstract class Platform {
return this.exceptionConverter;
}

getSchemaGenerator(em: EntityManager): ISchemaGenerator {
throw new Error(`${this.constructor.name} does not use a schema generator`);
}

}
3 changes: 1 addition & 2 deletions packages/core/src/utils/Configuration.ts
Expand Up @@ -230,8 +230,7 @@ export class Configuration<D extends IDatabaseDriver = IDatabaseDriver> {
private initDriver(): D {
if (!this.options.driver) {
const driver = Configuration.PLATFORMS[this.options.type!];
// eslint-disable-next-line @typescript-eslint/no-var-requires
this.options.driver = require(driver[1])[driver[0]];
this.options.driver = Utils.requireFrom(driver[1], this.options.baseDir)[driver[0]];
}

return new this.options.driver!(this);
Expand Down
6 changes: 2 additions & 4 deletions packages/core/src/utils/ConfigurationLoader.ts
Expand Up @@ -60,8 +60,7 @@ export class ConfigurationLoader {
static async registerTsNode(configPath = 'tsconfig.json') {
const tsConfigPath = path.join(process.cwd(), configPath);

// eslint-disable-next-line @typescript-eslint/no-var-requires
require('ts-node').register({
Utils.requireFrom('ts-node', tsConfigPath).register({
project: tsConfigPath,
transpileOnly: true,
});
Expand All @@ -73,8 +72,7 @@ export class ConfigurationLoader {
const paths = tsConfig.compilerOptions?.paths;

if (paths) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
require('tsconfig-paths').register({
Utils.requireFrom('tsconfig-paths', tsConfigPath).register({
baseUrl: tsConfig.compilerOptions.baseUrl,
paths: tsConfig.compilerOptions.paths,
});
Expand Down
17 changes: 16 additions & 1 deletion packages/core/src/utils/Utils.ts
@@ -1,7 +1,8 @@
import fastEqual from 'fast-deep-equal';
import { createRequire, createRequireFromPath } from 'module';
import clone from 'clone';
import globby, { GlobbyOptions } from 'globby';
import { isAbsolute, normalize, relative } from 'path';
import { isAbsolute, normalize, relative, resolve, extname, join } from 'path';
import { pathExists } from 'fs-extra';
import { createHash } from 'crypto';
// @ts-ignore
Expand Down Expand Up @@ -624,4 +625,18 @@ export class Utils {
return global[key];
}

/**
* Require a module from a specific location
* @param id The module to require
* @param from Location to start the node resolution
*/
static requireFrom(id: string, from: string) {
if (!extname(from)) {
from = join(from, '__fake.js');
}

/* istanbul ignore next */
return (createRequire || createRequireFromPath)(resolve(from))(id);
}

}
7 changes: 6 additions & 1 deletion packages/entity-generator/package.json
Expand Up @@ -47,9 +47,14 @@
"access": "public"
},
"dependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4",
"@mikro-orm/knex": "^4.0.0-alpha.4",
"fs-extra": "^9.0.1",
"ts-morph": "^7.1.2"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
7 changes: 6 additions & 1 deletion packages/knex/package.json
Expand Up @@ -47,8 +47,13 @@
"access": "public"
},
"dependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4",
"fs-extra": "^9.0.1",
"knex": "^0.21.1"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
7 changes: 6 additions & 1 deletion packages/knex/src/AbstractSqlPlatform.ts
@@ -1,6 +1,7 @@
import { Constructor, Platform } from '@mikro-orm/core';
import { SqlEntityRepository } from './SqlEntityRepository';
import { SchemaHelper } from './schema';
import { SchemaHelper, SchemaGenerator } from './schema';
import { SqlEntityManager } from './SqlEntityManager';

export abstract class AbstractSqlPlatform extends Platform {

Expand All @@ -18,4 +19,8 @@ export abstract class AbstractSqlPlatform extends Platform {
return this.schemaHelper;
}

getSchemaGenerator(em: SqlEntityManager): SchemaGenerator {
return new SchemaGenerator(em);
}

}
3 changes: 3 additions & 0 deletions packages/knex/src/index.ts
Expand Up @@ -8,3 +8,6 @@ export * from './query';
export * from './schema';
export { SqlEntityManager as EntityManager } from './SqlEntityManager';
export { SqlEntityRepository as EntityRepository } from './SqlEntityRepository';

import * as Knex from 'knex';
export { Knex };
6 changes: 6 additions & 0 deletions packages/mariadb/package.json
Expand Up @@ -49,5 +49,11 @@
"dependencies": {
"@mikro-orm/mysql-base": "^4.0.0-alpha.4",
"mariadb": "^2.4.0"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
12 changes: 7 additions & 5 deletions packages/mariadb/src/MariaDbConnection.ts
@@ -1,17 +1,19 @@
import { Connection } from 'mariadb';
import { MySqlConnectionConfig } from 'knex';
import { MySqlConnection } from '@mikro-orm/mysql-base';
import { MySqlConnection, Knex } from '@mikro-orm/mysql-base';
import { Utils } from '@mikro-orm/core';

// @ts-ignore
import Dialect from 'knex/lib/dialects/mysql/index.js';
const Dialect = Utils.requireFrom(
'knex/lib/dialects/mysql/index.js',
require.resolve('@mikro-orm/knex', { paths: [require.resolve('@mikro-orm/mysql-base')] })
);

export class MariaDbConnection extends MySqlConnection {

async connect(): Promise<void> {
this.client = this.createKnexClient(this.getPatchedDialect());
}

getConnectionOptions(): MySqlConnectionConfig {
getConnectionOptions(): Knex.MySqlConnectionConfig {
const ret = super.getConnectionOptions();
ret.bigNumberStrings = true;

Expand Down
2 changes: 1 addition & 1 deletion packages/mariadb/src/index.ts
@@ -1,3 +1,3 @@
export * from '@mikro-orm/knex';
export * from '@mikro-orm/mysql-base';
export * from './MariaDbConnection';
export * from './MariaDbDriver';
7 changes: 6 additions & 1 deletion packages/migrations/package.json
Expand Up @@ -47,10 +47,15 @@
"access": "public"
},
"dependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4",
"@mikro-orm/knex": "^4.0.0-alpha.4",
"fs-extra": "^9.0.1",
"ts-morph": "^7.1.2",
"umzug": "^2.3.0"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
7 changes: 6 additions & 1 deletion packages/mongodb/package.json
Expand Up @@ -47,7 +47,12 @@
"access": "public"
},
"dependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4",
"mongodb": "^3.5.9"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
7 changes: 6 additions & 1 deletion packages/mysql-base/package.json
Expand Up @@ -47,7 +47,12 @@
"access": "public"
},
"dependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4",
"@mikro-orm/knex": "^4.0.0-alpha.4"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
7 changes: 3 additions & 4 deletions packages/mysql-base/src/MySqlConnection.ts
@@ -1,5 +1,4 @@
import { MySqlConnectionConfig } from 'knex';
import { AbstractSqlConnection } from '@mikro-orm/knex';
import { AbstractSqlConnection, Knex } from '@mikro-orm/knex';

export class MySqlConnection extends AbstractSqlConnection {

Expand All @@ -11,8 +10,8 @@ export class MySqlConnection extends AbstractSqlConnection {
return 'mysql://root@127.0.0.1:3306';
}

getConnectionOptions(): MySqlConnectionConfig {
const ret: MySqlConnectionConfig = super.getConnectionOptions();
getConnectionOptions(): Knex.MySqlConnectionConfig {
const ret: Knex.MySqlConnectionConfig = super.getConnectionOptions();

if (this.config.get('multipleStatements')) {
ret.multipleStatements = this.config.get('multipleStatements');
Expand Down
5 changes: 2 additions & 3 deletions packages/mysql-base/src/MySqlSchemaHelper.ts
@@ -1,5 +1,4 @@
import { CreateTableBuilder } from 'knex';
import { AbstractSqlConnection, SchemaHelper, Column, Index, IsSame } from '@mikro-orm/knex';
import { AbstractSqlConnection, SchemaHelper, Column, Index, IsSame, Knex } from '@mikro-orm/knex';
import { Dictionary, EntityProperty } from '@mikro-orm/core';

export class MySqlSchemaHelper extends SchemaHelper {
Expand Down Expand Up @@ -40,7 +39,7 @@ export class MySqlSchemaHelper extends SchemaHelper {
return 'set foreign_key_checks = 1;\n';
}

finalizeTable(table: CreateTableBuilder, charset: string): void {
finalizeTable(table: Knex.CreateTableBuilder, charset: string): void {
table.engine('InnoDB');
table.charset(charset);
}
Expand Down
6 changes: 6 additions & 0 deletions packages/mysql/package.json
Expand Up @@ -49,5 +49,11 @@
"dependencies": {
"@mikro-orm/mysql-base": "^4.0.0-alpha.4",
"mysql2": "^2.1.0"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
7 changes: 6 additions & 1 deletion packages/postgresql/package.json
Expand Up @@ -47,8 +47,13 @@
"access": "public"
},
"dependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4",
"@mikro-orm/knex": "^4.0.0-alpha.4",
"pg": "^8.2.1"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}
16 changes: 7 additions & 9 deletions packages/postgresql/src/PostgreSqlConnection.ts
@@ -1,12 +1,10 @@
import { types, defaults } from 'pg';
import { PgConnectionConfig } from 'knex';
// @ts-ignore
import TableCompiler_PG from 'knex/lib/dialects/postgres/schema/tablecompiler.js';
// @ts-ignore
import TableCompiler from 'knex/lib/schema/tablecompiler.js';
import { Dictionary, Utils } from '@mikro-orm/core';
import { AbstractSqlConnection, Knex } from '@mikro-orm/knex';

import { Dictionary } from '@mikro-orm/core';
import { AbstractSqlConnection } from '@mikro-orm/knex';
// eslint-disable-next-line @typescript-eslint/naming-convention
const TableCompiler_PG = Utils.requireFrom('knex/lib/dialects/postgres/schema/tablecompiler.js', require.resolve('@mikro-orm/knex'));
const TableCompiler = Utils.requireFrom('knex/lib/schema/tablecompiler.js', require.resolve('@mikro-orm/knex'));

export class PostgreSqlConnection extends AbstractSqlConnection {

Expand All @@ -19,8 +17,8 @@ export class PostgreSqlConnection extends AbstractSqlConnection {
return 'postgresql://postgres@127.0.0.1:5432';
}

getConnectionOptions(): PgConnectionConfig {
const ret: PgConnectionConfig = super.getConnectionOptions();
getConnectionOptions(): Knex.PgConnectionConfig {
const ret: Knex.PgConnectionConfig = super.getConnectionOptions();

if (this.config.get('forceUtcTimezone')) {
[1082, 1083, 1114].forEach(oid => types.setTypeParser(oid, str => new Date(str + 'Z'))); // date, time, timestamp types
Expand Down
7 changes: 6 additions & 1 deletion packages/reflection/package.json
Expand Up @@ -47,8 +47,13 @@
"access": "public"
},
"dependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4",
"globby": "^11.0.1",
"ts-morph": "^7.1.2"
},
"devDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
},
"peerDependencies": {
"@mikro-orm/core": "^4.0.0-alpha.4"
}
}

0 comments on commit 7e21bb8

Please sign in to comment.