From 8fa43a6db37d690bfe7184afcf036034e283df05 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Mon, 24 Jun 2024 09:10:54 +0200 Subject: [PATCH] Feat/define mikro orm configuration dev (#7798) * chore: define mikro orm config for CLI * add tests * fix types * fix import --------- Co-authored-by: Riqwan Thamir --- .../dml/helpers/create-mikro-orm-entity.ts | 4 +- .../mikro-orm-cli-config-builder.spec.ts | 39 ++++++++++++ .../migration-scripts/migration-down.ts | 9 ++- .../migration-scripts/migration-up.ts | 9 ++- .../mikro-orm-cli-config-builder.ts | 60 +++++++++++++++++++ 5 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 packages/core/utils/src/modules-sdk/__tests__/mikro-orm-cli-config-builder.spec.ts create mode 100644 packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts diff --git a/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts b/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts index 3c13554dbb..286e1626ec 100644 --- a/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts +++ b/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts @@ -11,7 +11,6 @@ import { PrimaryKey, Property, } from "@mikro-orm/core" -import { DALUtils } from "../../bundles" import { camelToSnakeCase, createPsqlIndexStatementHelper, @@ -35,6 +34,7 @@ import type { RelationshipMetadata, RelationshipType, } from "@medusajs/types" +import { mikroOrmSoftDeletableFilterOptions } from "../../dal" /** * DML entity data types to PostgreSQL data types via @@ -627,7 +627,7 @@ export function createMikrORMEntity() { * Converting class to a MikroORM entity */ return Entity({ tableName })( - Filter(DALUtils.mikroOrmSoftDeletableFilterOptions)(MikroORMEntity) + Filter(mikroOrmSoftDeletableFilterOptions)(MikroORMEntity) ) as Infer } } diff --git a/packages/core/utils/src/modules-sdk/__tests__/mikro-orm-cli-config-builder.spec.ts b/packages/core/utils/src/modules-sdk/__tests__/mikro-orm-cli-config-builder.spec.ts new file mode 100644 index 0000000000..73383a8636 --- /dev/null +++ b/packages/core/utils/src/modules-sdk/__tests__/mikro-orm-cli-config-builder.spec.ts @@ -0,0 +1,39 @@ +import { defineMikroOrmCliConfig } from "../mikro-orm-cli-config-builder" + +describe("defineMikroOrmCliConfig", () => { + test(`should throw an error if entities is not provided`, () => { + const options = { + databaseName: "medusa-fulfillment", + } + + expect(() => defineMikroOrmCliConfig(options as any)).toThrow( + "defineMikroOrmCliConfig failed with: entities is required" + ) + }) + + test("should throw an error if databaseName is not provided", () => { + const options = { + entities: [{}], + } + + expect(() => defineMikroOrmCliConfig(options as any)).toThrow( + "defineMikroOrmCliConfig failed with: databaseName is required" + ) + }) + + test("should return the correct config", () => { + const config = defineMikroOrmCliConfig({ + entities: [{} as any], + databaseName: "medusa-fulfillment", + }) + + expect(config).toEqual({ + entities: [{}], + clientUrl: "postgres://postgres@localhost/medusa-fulfillment", + type: "postgresql", + migrations: { + generator: expect.any(Function), + }, + }) + }) +}) diff --git a/packages/core/utils/src/modules-sdk/migration-scripts/migration-down.ts b/packages/core/utils/src/modules-sdk/migration-scripts/migration-down.ts index c4ea90dd8d..74bde11512 100644 --- a/packages/core/utils/src/modules-sdk/migration-scripts/migration-down.ts +++ b/packages/core/utils/src/modules-sdk/migration-scripts/migration-down.ts @@ -4,6 +4,7 @@ import { EntitySchema } from "@mikro-orm/core" import { upperCaseFirst } from "../../common" import { loadDatabaseConfig } from "../load-module-database-config" import { mikroOrmCreateConnection } from "../../dal" +import { DmlEntity, toMikroORMEntity } from "../../dml" /** * Utility function to build a migration script that will revert the migrations. @@ -34,7 +35,13 @@ export function buildRevertMigrationScript({ logger ??= console as unknown as Logger const dbData = loadDatabaseConfig(moduleName, options)! - const entities = Object.values(models) as unknown as EntitySchema[] + const entities = Object.values(models).map((model) => { + if (DmlEntity.isDmlEntity(model)) { + return toMikroORMEntity(model) + } + + return model + }) as unknown as EntitySchema[] const orm = await mikroOrmCreateConnection( dbData, diff --git a/packages/core/utils/src/modules-sdk/migration-scripts/migration-up.ts b/packages/core/utils/src/modules-sdk/migration-scripts/migration-up.ts index 1e04c4c353..63e01b1442 100644 --- a/packages/core/utils/src/modules-sdk/migration-scripts/migration-up.ts +++ b/packages/core/utils/src/modules-sdk/migration-scripts/migration-up.ts @@ -3,6 +3,7 @@ import { EntitySchema } from "@mikro-orm/core" import { upperCaseFirst } from "../../common" import { loadDatabaseConfig } from "../load-module-database-config" import { mikroOrmCreateConnection } from "../../dal" +import { DmlEntity, toMikroORMEntity } from "../../dml" /** * Utility function to build a migration script that will run the migrations. @@ -29,7 +30,13 @@ export function buildMigrationScript({ moduleName, models, pathToMigrations }) { logger ??= console as unknown as Logger const dbData = loadDatabaseConfig(moduleName, options)! - const entities = Object.values(models) as unknown as EntitySchema[] + const entities = Object.values(models).map((model) => { + if (DmlEntity.isDmlEntity(model)) { + return toMikroORMEntity(model) + } + + return model + }) as unknown as EntitySchema[] const orm = await mikroOrmCreateConnection( dbData, diff --git a/packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts b/packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts new file mode 100644 index 0000000000..10642e1923 --- /dev/null +++ b/packages/core/utils/src/modules-sdk/mikro-orm-cli-config-builder.ts @@ -0,0 +1,60 @@ +import { MikroORMOptions } from "@mikro-orm/core/utils/Configuration" +import { IDmlEntity } from "@medusajs/types" +import { DmlEntity, toMikroORMEntity } from "../dml" +import { TSMigrationGenerator } from "../dal" + +type Options = Partial & { + entities: (MikroORMOptions["entities"] | IDmlEntity)[] + databaseName: string +} + +type ReturnedOptions = Partial & { + entities: MikroORMOptions["entities"] + clientUrl: string + type: MikroORMOptions["type"] + migrations: MikroORMOptions["migrations"] +} + +/** + * Defines a MikroORM CLI config based on the provided options. + * Convert any DML entities to MikroORM entities to be consumed + * by mikro orm cli. + * @param options + */ +export function defineMikroOrmCliConfig(options: Options): ReturnedOptions { + if (!options.entities?.length) { + throw new Error("defineMikroOrmCliConfig failed with: entities is required") + } + + const entities = options.entities.map((entity) => { + if (DmlEntity.isDmlEntity(entity)) { + return toMikroORMEntity(entity) + } + + return entity + }) + + if (!options.databaseName) { + throw new Error( + "defineMikroOrmCliConfig failed with: databaseName is required" + ) + } + + let databaseName + if (options.databaseName) { + databaseName = options.databaseName + // @ts-ignore + delete options.databaseName + } + + return { + clientUrl: `postgres://postgres@localhost/${databaseName}`, + type: "postgresql", + ...options, + entities, + migrations: { + generator: TSMigrationGenerator, + ...options.migrations, + }, + } +}