From ae6dbc06be06d8a431496aba2440993133d96575 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Mon, 24 Jun 2024 09:44:01 +0200 Subject: [PATCH] chore: Update module test runner to support DmlEntities when needed (#7799) * chore: Update module test runner to support DmlEntities when needed * update es version for core test utils * fix test * update swc config --- integration-tests/api/jest.config.js | 12 +++++- integration-tests/http/jest.config.js | 10 ++++- integration-tests/jest.config.js | 12 +++++- integration-tests/modules/jest.config.js | 10 ++++- integration-tests/tsconfig.json | 2 +- packages/core/core-flows/jest.config.js | 12 +++++- .../src/module-test-runner.ts | 3 +- packages/core/medusa-test-utils/tsconfig.json | 2 +- .../dml/helpers/create-mikro-orm-entity.ts | 22 +++++++++- packages/core/utils/src/modules-sdk/index.ts | 1 + .../src/modules-sdk/joiner-config-builder.ts | 36 +---------------- .../src/modules-sdk/loaders/load-models.ts | 40 +++++++++++++++++++ .../modules/cache-inmemory/jest.config.js | 10 ++++- packages/modules/cache-redis/jest.config.js | 12 +++++- .../modules/event-bus-local/jest.config.js | 10 ++++- .../modules/event-bus-redis/jest.config.js | 12 +++++- .../modules/providers/file-s3/jest.config.js | 12 +++++- .../fulfillment-manual/jest.config.js | 12 +++++- .../notification-sendgrid/jest.config.js | 12 +++++- .../providers/payment-stripe/jest.config.js | 12 +++++- 20 files changed, 202 insertions(+), 52 deletions(-) create mode 100644 packages/core/utils/src/modules-sdk/loaders/load-models.ts diff --git a/integration-tests/api/jest.config.js b/integration-tests/api/jest.config.js index 35d5d392c1..9fcdad908e 100644 --- a/integration-tests/api/jest.config.js +++ b/integration-tests/api/jest.config.js @@ -16,7 +16,17 @@ module.exports = { `.cache`, ], transformIgnorePatterns: ["/dist", "/node_modules/"], - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, setupFiles: ["../setup-env.js"], setupFilesAfterEnv: ["../setup.js"], globalSetup: "../globalSetup.js", diff --git a/integration-tests/http/jest.config.js b/integration-tests/http/jest.config.js index 4c4889bbdb..733b7a626e 100644 --- a/integration-tests/http/jest.config.js +++ b/integration-tests/http/jest.config.js @@ -5,7 +5,15 @@ module.exports = { rootDir: "./", transformIgnorePatterns: ["/dist", "/node_modules/"], transform: { - "^.+\\.[jt]s$": ["@swc/jest"], + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], }, setupFiles: ["../setup-env.js"], } diff --git a/integration-tests/jest.config.js b/integration-tests/jest.config.js index 385202898f..9c9e3ae80d 100644 --- a/integration-tests/jest.config.js +++ b/integration-tests/jest.config.js @@ -26,7 +26,17 @@ module.exports = { `__testfixtures__`, `.cache`, ], - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, setupFiles: ["/integration-tests/setup-env.js"], setupFilesAfterEnv: ["/integration-tests/setup.js"], } diff --git a/integration-tests/modules/jest.config.js b/integration-tests/modules/jest.config.js index db4bc54a0c..e8d2a012fa 100644 --- a/integration-tests/modules/jest.config.js +++ b/integration-tests/modules/jest.config.js @@ -15,7 +15,15 @@ module.exports = { ], transformIgnorePatterns: ["/dist", "/node_modules/"], transform: { - "^.+\\.[jt]s$": ["@swc/jest"], + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], }, setupFiles: ["../setup-env.js"], /*setupFilesAfterEnv: ["../setup.js"], diff --git a/integration-tests/tsconfig.json b/integration-tests/tsconfig.json index 941ab3c33f..0c4bddd0ac 100644 --- a/integration-tests/tsconfig.json +++ b/integration-tests/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "lib": ["es5", "es6", "es2019"], - "target": "es5", + "target": "es2022", "outDir": "./dist", "esModuleInterop": true, "declaration": true, diff --git a/packages/core/core-flows/jest.config.js b/packages/core/core-flows/jest.config.js index 933c0f394c..3671181174 100644 --- a/packages/core/core-flows/jest.config.js +++ b/packages/core/core-flows/jest.config.js @@ -1,5 +1,15 @@ module.exports = { - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, testEnvironment: `node`, moduleFileExtensions: [`js`, `ts`], } diff --git a/packages/core/medusa-test-utils/src/module-test-runner.ts b/packages/core/medusa-test-utils/src/module-test-runner.ts index 5649c48137..58c7b1a5ab 100644 --- a/packages/core/medusa-test-utils/src/module-test-runner.ts +++ b/packages/core/medusa-test-utils/src/module-test-runner.ts @@ -3,6 +3,7 @@ import { initModules, InitModulesOptions } from "./init-modules" import { ContainerRegistrationKeys, ModulesSdkUtils } from "@medusajs/utils" import { MockEventBusService } from "." +import { toMikroOrmEntities } from "@medusajs/utils/src" export interface SuiteOptions { MikroOrmWrapper: TestDatabase @@ -41,7 +42,7 @@ export function moduleIntegrationTestRunner({ process.env.LOG_LEVEL = "error" moduleModels ??= Object.values(require(`${process.cwd()}/src/models`)) - // migrationPath ??= process.cwd() + "/src/migrations/!(*.d).{js,ts,cjs}" + moduleModels = toMikroOrmEntities(moduleModels) const tempName = parseInt(process.env.JEST_WORKER_ID || "1") const dbName = `medusa-${moduleName.toLowerCase()}-integration-${tempName}` diff --git a/packages/core/medusa-test-utils/tsconfig.json b/packages/core/medusa-test-utils/tsconfig.json index 9e8f6020de..1b01970652 100644 --- a/packages/core/medusa-test-utils/tsconfig.json +++ b/packages/core/medusa-test-utils/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "lib": ["es5", "es6", "es2019"], - "target": "es5", + "target": "es2022", "outDir": "./dist", "esModuleInterop": true, "declaration": true, 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 286e1626ec..69582e2870 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 @@ -632,4 +632,24 @@ export function createMikrORMEntity() { } } -export const toMikroORMEntity = createMikrORMEntity() +/** + * Takes a DML entity and returns a Mikro ORM entity otherwise + * return the input idempotently + * @param entity + */ +export const toMikroORMEntity = (entity: any) => { + if (DmlEntity.isDmlEntity(entity)) { + return createMikrORMEntity()(entity) + } + + return entity +} + +/** + * Takes any DmlEntity or mikro orm entities and return mikro orm entities only. + * This action is idempotent if non of the entities are DmlEntity + * @param entities + */ +export const toMikroOrmEntities = function (entities: any[]) { + return entities.map(toMikroORMEntity) +} diff --git a/packages/core/utils/src/modules-sdk/index.ts b/packages/core/utils/src/modules-sdk/index.ts index 01c6796c75..9f535c83dc 100644 --- a/packages/core/utils/src/modules-sdk/index.ts +++ b/packages/core/utils/src/modules-sdk/index.ts @@ -11,3 +11,4 @@ export * from "./medusa-service" export * from "./definition" export * from "./event-builder-factory" export * from "./joiner-config-builder" +export * from "./loaders/load-models" diff --git a/packages/core/utils/src/modules-sdk/joiner-config-builder.ts b/packages/core/utils/src/modules-sdk/joiner-config-builder.ts index fce24aaf6f..456735ce89 100644 --- a/packages/core/utils/src/modules-sdk/joiner-config-builder.ts +++ b/packages/core/utils/src/modules-sdk/joiner-config-builder.ts @@ -8,7 +8,7 @@ import { upperCaseFirst, } from "../common" import { join } from "path" -import { readdirSync, statSync } from "fs" +import { loadModels } from "./loaders/load-models" /** * Define joiner config for a module based on the models (object representation or entities) present in the models directory. This action will be sync until @@ -111,37 +111,3 @@ export function buildEntitiesNameToLinkableKeysMap( return entityLinkableKeysMap } - -function loadModels(basePath: string) { - const excludedExtensions = [".ts.map", ".js.map", ".d.ts"] - - let modelsFiles: any[] = [] - try { - modelsFiles = readdirSync(basePath) - } catch (e) {} - - return modelsFiles - .flatMap((file) => { - if ( - file.startsWith("index.") || - excludedExtensions.some((ext) => file.endsWith(ext)) - ) { - return - } - - const filePath = join(basePath, file) - const stats = statSync(filePath) - - if (stats.isFile()) { - try { - const required = require(filePath) - return Object.values(required).filter( - (resource) => typeof resource === "function" && !!resource.name - ) - } catch (e) {} - } - - return - }) - .filter(Boolean) as { name: string }[] -} diff --git a/packages/core/utils/src/modules-sdk/loaders/load-models.ts b/packages/core/utils/src/modules-sdk/loaders/load-models.ts new file mode 100644 index 0000000000..60f60571b1 --- /dev/null +++ b/packages/core/utils/src/modules-sdk/loaders/load-models.ts @@ -0,0 +1,40 @@ +import { readdirSync, statSync } from "fs" +import { join } from "path" + +/** + * Load all the models from the given path + * @param basePath + */ +export function loadModels(basePath: string) { + const excludedExtensions = [".ts.map", ".js.map", ".d.ts"] + + let modelsFiles: any[] = [] + try { + modelsFiles = readdirSync(basePath) + } catch (e) {} + + return modelsFiles + .flatMap((file) => { + if ( + file.startsWith("index.") || + excludedExtensions.some((ext) => file.endsWith(ext)) + ) { + return + } + + const filePath = join(basePath, file) + const stats = statSync(filePath) + + if (stats.isFile()) { + try { + const required = require(filePath) + return Object.values(required).filter( + (resource) => typeof resource === "function" && !!resource.name + ) + } catch (e) {} + } + + return + }) + .filter(Boolean) as { name: string }[] +} diff --git a/packages/modules/cache-inmemory/jest.config.js b/packages/modules/cache-inmemory/jest.config.js index 96a56ea774..3671181174 100644 --- a/packages/modules/cache-inmemory/jest.config.js +++ b/packages/modules/cache-inmemory/jest.config.js @@ -1,6 +1,14 @@ module.exports = { transform: { - "^.+\\.[jt]s$": ["@swc/jest"], + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], }, testEnvironment: `node`, moduleFileExtensions: [`js`, `ts`], diff --git a/packages/modules/cache-redis/jest.config.js b/packages/modules/cache-redis/jest.config.js index 1768319b08..3671181174 100644 --- a/packages/modules/cache-redis/jest.config.js +++ b/packages/modules/cache-redis/jest.config.js @@ -1,5 +1,15 @@ module.exports = { - transform: { "^.+\\.[jt]s$": "@swc/jest" }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, testEnvironment: `node`, moduleFileExtensions: [`js`, `ts`], } diff --git a/packages/modules/event-bus-local/jest.config.js b/packages/modules/event-bus-local/jest.config.js index 96a56ea774..3671181174 100644 --- a/packages/modules/event-bus-local/jest.config.js +++ b/packages/modules/event-bus-local/jest.config.js @@ -1,6 +1,14 @@ module.exports = { transform: { - "^.+\\.[jt]s$": ["@swc/jest"], + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], }, testEnvironment: `node`, moduleFileExtensions: [`js`, `ts`], diff --git a/packages/modules/event-bus-redis/jest.config.js b/packages/modules/event-bus-redis/jest.config.js index 933c0f394c..3671181174 100644 --- a/packages/modules/event-bus-redis/jest.config.js +++ b/packages/modules/event-bus-redis/jest.config.js @@ -1,5 +1,15 @@ module.exports = { - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, testEnvironment: `node`, moduleFileExtensions: [`js`, `ts`], } diff --git a/packages/modules/providers/file-s3/jest.config.js b/packages/modules/providers/file-s3/jest.config.js index 9074b0d620..61fcbb7c82 100644 --- a/packages/modules/providers/file-s3/jest.config.js +++ b/packages/modules/providers/file-s3/jest.config.js @@ -1,5 +1,15 @@ module.exports = { - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, testEnvironment: `node`, moduleFileExtensions: [`js`, `jsx`, `ts`, `tsx`, `json`], } diff --git a/packages/modules/providers/fulfillment-manual/jest.config.js b/packages/modules/providers/fulfillment-manual/jest.config.js index 9074b0d620..61fcbb7c82 100644 --- a/packages/modules/providers/fulfillment-manual/jest.config.js +++ b/packages/modules/providers/fulfillment-manual/jest.config.js @@ -1,5 +1,15 @@ module.exports = { - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, testEnvironment: `node`, moduleFileExtensions: [`js`, `jsx`, `ts`, `tsx`, `json`], } diff --git a/packages/modules/providers/notification-sendgrid/jest.config.js b/packages/modules/providers/notification-sendgrid/jest.config.js index 9074b0d620..61fcbb7c82 100644 --- a/packages/modules/providers/notification-sendgrid/jest.config.js +++ b/packages/modules/providers/notification-sendgrid/jest.config.js @@ -1,5 +1,15 @@ module.exports = { - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, testEnvironment: `node`, moduleFileExtensions: [`js`, `jsx`, `ts`, `tsx`, `json`], } diff --git a/packages/modules/providers/payment-stripe/jest.config.js b/packages/modules/providers/payment-stripe/jest.config.js index 9074b0d620..61fcbb7c82 100644 --- a/packages/modules/providers/payment-stripe/jest.config.js +++ b/packages/modules/providers/payment-stripe/jest.config.js @@ -1,5 +1,15 @@ module.exports = { - transform: { "^.+\\.[jt]s$": ["@swc/jest"] }, + transform: { + "^.+\\.[jt]s$": [ + "@swc/jest", + { + jsc: { + parser: { syntax: "typescript", decorators: true }, + transform: { decoratorMetadata: true }, + }, + }, + ], + }, testEnvironment: `node`, moduleFileExtensions: [`js`, `jsx`, `ts`, `tsx`, `json`], }