diff --git a/.changeset/dry-geckos-act.md b/.changeset/dry-geckos-act.md new file mode 100644 index 0000000000..5b252b2ce5 --- /dev/null +++ b/.changeset/dry-geckos-act.md @@ -0,0 +1,12 @@ +--- +"@medusajs/modules-sdk": patch +"@medusajs/framework": patch +"@medusajs/types": patch +"@medusajs/utils": patch +"@medusajs/medusa": patch +"@medusajs/test-utils": patch +"@medusajs/workflows-sdk": patch +"@medusajs/cli": patch +--- + +feat: define file config and improved feature flag support diff --git a/integration-tests/http/__fixtures__/feature-flag/medusa-config.ts b/integration-tests/http/__fixtures__/feature-flag/medusa-config.ts new file mode 100644 index 0000000000..800e7a7828 --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/medusa-config.ts @@ -0,0 +1,26 @@ +const { defineConfig } = require("@medusajs/framework/utils") + +const DB_HOST = process.env.DB_HOST +const DB_USERNAME = process.env.DB_USERNAME +const DB_PASSWORD = process.env.DB_PASSWORD +const DB_NAME = process.env.DB_TEMP_NAME +const DB_URL = `postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}` + +process.env.DATABASE_URL = DB_URL + +module.exports = defineConfig({ + admin: { + disable: true, + }, + projectConfig: { + http: { + jwtSecret: "secret", + }, + }, + modules: [ + { + key: "custom", + resolve: "src/modules/custom", + }, + ], +}) diff --git a/integration-tests/http/__fixtures__/feature-flag/src/api/custom/route.ts b/integration-tests/http/__fixtures__/feature-flag/src/api/custom/route.ts new file mode 100644 index 0000000000..757aad658d --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/api/custom/route.ts @@ -0,0 +1,10 @@ +import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" +import { defineFileConfig, FeatureFlag } from "@medusajs/utils" + +defineFileConfig({ + isDisabled: () => !FeatureFlag.isFeatureEnabled("custom_ff"), +}) + +export const GET = async (req: MedusaRequest, res: MedusaResponse) => { + res.json({ message: "Custom GET" }) +} diff --git a/integration-tests/http/__fixtures__/feature-flag/src/feature-flags/custom-ff.ts b/integration-tests/http/__fixtures__/feature-flag/src/feature-flags/custom-ff.ts new file mode 100644 index 0000000000..f4871cc510 --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/feature-flags/custom-ff.ts @@ -0,0 +1,8 @@ +import { FlagSettings } from "@medusajs/framework/feature-flags" + +export const CustomFeatureFlag: FlagSettings = { + key: "custom_ff", + default_val: false, + env_key: "CUSTOM_FF", + description: "Custom feature flag", +} diff --git a/integration-tests/http/__fixtures__/feature-flag/src/jobs/test-job.ts b/integration-tests/http/__fixtures__/feature-flag/src/jobs/test-job.ts new file mode 100644 index 0000000000..3de945a135 --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/jobs/test-job.ts @@ -0,0 +1,18 @@ +import { MedusaContainer } from "@medusajs/framework/types" +import { defineFileConfig, FeatureFlag } from "@medusajs/framework/utils" + +export const testJobHandler = jest.fn() + +export default async function greetingJob(container: MedusaContainer) { + testJobHandler() +} + +export const config = { + name: "greeting-every-second", + numberOfExecutions: 1, + schedule: "* * * * * *", +} + +defineFileConfig({ + isDisabled: () => !FeatureFlag.isFeatureEnabled("custom_ff"), +}) diff --git a/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/index.ts b/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/index.ts new file mode 100644 index 0000000000..50e02bcce1 --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/index.ts @@ -0,0 +1,8 @@ +import { ModuleExports } from "@medusajs/types" +import { ModuleService } from "./services/module-service" + +const moduleExports: ModuleExports = { + service: ModuleService, +} + +export default moduleExports diff --git a/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/migrations/MigrationTest.ts b/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/migrations/MigrationTest.ts new file mode 100644 index 0000000000..ddd8e9dab6 --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/migrations/MigrationTest.ts @@ -0,0 +1,12 @@ +import { FeatureFlag, defineFileConfig } from "@medusajs/framework/utils" +import { Migration } from "@mikro-orm/migrations" + +defineFileConfig({ + isDisabled: () => !FeatureFlag.isFeatureEnabled("custom_ff"), +}) + +export class MigrationTest extends Migration { + override async up(): Promise {} + + override async down(): Promise {} +} diff --git a/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/services/module-service.ts b/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/services/module-service.ts new file mode 100644 index 0000000000..7f608188a6 --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/modules/custom/services/module-service.ts @@ -0,0 +1,12 @@ +import { IModuleService } from "@medusajs/types" +import { MedusaContext } from "@medusajs/utils" + +// @ts-expect-error +export class ModuleService implements IModuleService { + public property = "value" + + constructor() {} + async methodName(input, @MedusaContext() context) { + return input + " called" + } +} diff --git a/integration-tests/http/__fixtures__/feature-flag/src/subscribers/test-event-payload.ts b/integration-tests/http/__fixtures__/feature-flag/src/subscribers/test-event-payload.ts new file mode 100644 index 0000000000..bf2175cfde --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/subscribers/test-event-payload.ts @@ -0,0 +1,13 @@ +import { defineFileConfig, FeatureFlag } from "@medusajs/framework/utils" + +const testProductCreatedHandlerMock = jest.fn() + +export default testProductCreatedHandlerMock + +export const config = { + event: "event.test", +} + +defineFileConfig({ + isDisabled: () => !FeatureFlag.isFeatureEnabled("custom_ff"), +}) diff --git a/integration-tests/http/__fixtures__/feature-flag/src/workflows/test-workflow.ts b/integration-tests/http/__fixtures__/feature-flag/src/workflows/test-workflow.ts new file mode 100644 index 0000000000..d5c2d56328 --- /dev/null +++ b/integration-tests/http/__fixtures__/feature-flag/src/workflows/test-workflow.ts @@ -0,0 +1,14 @@ +import { defineFileConfig, FeatureFlag } from "@medusajs/framework/utils" +import { createStep, createWorkflow } from "@medusajs/framework/workflows-sdk" + +const testWorkflowHandler = jest.fn() + +const step1 = createStep("step1", () => testWorkflowHandler()) + +export const testWorkflow = createWorkflow("test-workflow", () => { + step1() +}) + +defineFileConfig({ + isDisabled: () => !FeatureFlag.isFeatureEnabled("custom_ff"), +}) diff --git a/integration-tests/http/__tests__/auth/admin/auth-asymetric.spec.ts b/integration-tests/http/__tests__/auth/admin/auth-asymetric.spec.ts index 8e8fb0c7f0..08ca498798 100644 --- a/integration-tests/http/__tests__/auth/admin/auth-asymetric.spec.ts +++ b/integration-tests/http/__tests__/auth/admin/auth-asymetric.spec.ts @@ -1,12 +1,12 @@ import { generateResetPasswordTokenWorkflow } from "@medusajs/core-flows" import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import { ContainerRegistrationKeys } from "@medusajs/utils" import jwt from "jsonwebtoken" +import path from "path" import { adminHeaders, createAdminUser, } from "../../../../helpers/create-admin-user" -import path from "path" -import { ContainerRegistrationKeys } from "@medusajs/utils" jest.setTimeout(100000) diff --git a/integration-tests/http/__tests__/campaigns/admin/campaigns.spec.ts b/integration-tests/http/__tests__/campaigns/admin/campaigns.spec.ts index 3403efbbe8..b37fde5f74 100644 --- a/integration-tests/http/__tests__/campaigns/admin/campaigns.spec.ts +++ b/integration-tests/http/__tests__/campaigns/admin/campaigns.spec.ts @@ -76,7 +76,7 @@ const promotionData = { ], } -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/http/__tests__/cart/store/cart.spec.ts b/integration-tests/http/__tests__/cart/store/cart.spec.ts index aa87dd4dd5..bc883b10c1 100644 --- a/integration-tests/http/__tests__/cart/store/cart.spec.ts +++ b/integration-tests/http/__tests__/cart/store/cart.spec.ts @@ -20,7 +20,7 @@ import { medusaTshirtProduct } from "../../../__fixtures__/product" jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" } } const shippingAddressData = { diff --git a/integration-tests/http/__tests__/feature-flags/admin/feature-flags.spec.ts b/integration-tests/http/__tests__/feature-flag/admin/feature-flags.spec.ts similarity index 100% rename from integration-tests/http/__tests__/feature-flags/admin/feature-flags.spec.ts rename to integration-tests/http/__tests__/feature-flag/admin/feature-flags.spec.ts diff --git a/integration-tests/http/__tests__/feature-flag/resources-with-flags.spec.ts b/integration-tests/http/__tests__/feature-flag/resources-with-flags.spec.ts new file mode 100644 index 0000000000..ec3d60a765 --- /dev/null +++ b/integration-tests/http/__tests__/feature-flag/resources-with-flags.spec.ts @@ -0,0 +1,49 @@ +import { MedusaWorkflow } from "@medusajs/framework/workflows-sdk" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import path from "path" +import { setTimeout as setTimeoutPromise } from "timers/promises" +import { testJobHandler } from "../../__fixtures__/feature-flag/src/jobs/test-job" + +jest.setTimeout(100000) + +medusaIntegrationTestRunner({ + cwd: path.join(__dirname, "../../__fixtures__/feature-flag"), + env: { + CUSTOM_FF: true, + }, + testSuite: ({ api, dbConnection }) => { + describe("Resources loaded with feature flags", () => { + it("should load migration when feature flag is enabled and run job", async () => { + const migrationNotExecuted = await dbConnection.raw( + `SELECT name FROM "mikro_orm_migrations" WHERE name = 'Noop'` + ) + expect(migrationNotExecuted.rows).toHaveLength(0) + + const migrationExecuted = await dbConnection.raw( + `SELECT name FROM "mikro_orm_migrations" WHERE name = 'MigrationTest'` + ) + + expect(migrationExecuted.rows).toHaveLength(1) + expect(migrationExecuted.rows[0].name).toBe("MigrationTest") + + await setTimeoutPromise(1000) + + expect(testJobHandler).toHaveBeenCalledTimes(1) + }) + + it("should load workflow when feature flag is enabled", async () => { + expect(MedusaWorkflow.getWorkflow("test-workflow")).toBeDefined() + }) + + it("should load scheduled job when feature flag is enabled", async () => { + expect( + MedusaWorkflow.getWorkflow("job-greeting-every-second") + ).toBeDefined() + }) + + it("should load endpoint when feature flag is enabled", async () => { + expect((await api.get("/custom")).status).toBe(200) + }) + }) + }, +}) diff --git a/integration-tests/http/__tests__/feature-flag/resources-without-flags.spec.ts b/integration-tests/http/__tests__/feature-flag/resources-without-flags.spec.ts new file mode 100644 index 0000000000..48e16592fa --- /dev/null +++ b/integration-tests/http/__tests__/feature-flag/resources-without-flags.spec.ts @@ -0,0 +1,46 @@ +import { MedusaWorkflow } from "@medusajs/framework/workflows-sdk" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import path from "path" +import { setTimeout as setTimeoutPromise } from "timers/promises" +import { testJobHandler } from "../../__fixtures__/feature-flag/src/jobs/test-job" + +jest.setTimeout(100000) + +medusaIntegrationTestRunner({ + cwd: path.join(__dirname, "../../__fixtures__/feature-flag"), + testSuite: ({ api, dbConnection }) => { + describe("Resources loaded without feature flags", () => { + it("should not load migration when feature flag is disabled and not run job", async () => { + const migrationNotExecuted = await dbConnection.raw( + `SELECT name FROM "mikro_orm_migrations" WHERE name = 'MigrationTest'` + ) + expect(migrationNotExecuted.rows).toHaveLength(0) + + const migrationExecuted = await dbConnection.raw( + `SELECT name FROM "mikro_orm_migrations" WHERE name = 'Noop'` + ) + + expect(migrationExecuted.rows).toHaveLength(1) + expect(migrationExecuted.rows[0].name).toBe("Noop") + + await setTimeoutPromise(1000) + + expect(testJobHandler).toHaveBeenCalledTimes(0) + }) + + it("should not load workflow when feature flag is disabled", async () => { + expect(MedusaWorkflow.getWorkflow("test-workflow")).toBeUndefined() + }) + + it("should not load scheduled job when feature flag is disabled", async () => { + expect( + MedusaWorkflow.getWorkflow("job-greeting-every-second") + ).toBeUndefined() + }) + + it("should not load endpoint when feature flag is disabled", async () => { + expect(api.get("/custom")).rejects.toThrow() + }) + }) + }, +}) diff --git a/integration-tests/http/__tests__/shipping-option/store/shipping-option-calculated.spec.ts b/integration-tests/http/__tests__/shipping-option/store/shipping-option-calculated.spec.ts index 464365515a..61ffbc46f3 100644 --- a/integration-tests/http/__tests__/shipping-option/store/shipping-option-calculated.spec.ts +++ b/integration-tests/http/__tests__/shipping-option/store/shipping-option-calculated.spec.ts @@ -7,7 +7,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" } } medusaIntegrationTestRunner({ diff --git a/integration-tests/http/__tests__/shipping-option/store/shipping-option.spec.ts b/integration-tests/http/__tests__/shipping-option/store/shipping-option.spec.ts index 8cebfe629d..0fb0631483 100644 --- a/integration-tests/http/__tests__/shipping-option/store/shipping-option.spec.ts +++ b/integration-tests/http/__tests__/shipping-option/store/shipping-option.spec.ts @@ -7,7 +7,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" } } medusaIntegrationTestRunner({ diff --git a/integration-tests/http/__tests__/tax-region/admin/tax-region.spec.ts b/integration-tests/http/__tests__/tax-region/admin/tax-region.spec.ts index 492227f942..1aa7735ade 100644 --- a/integration-tests/http/__tests__/tax-region/admin/tax-region.spec.ts +++ b/integration-tests/http/__tests__/tax-region/admin/tax-region.spec.ts @@ -3,7 +3,7 @@ import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/http/__tests__/view-configurations.spec.ts b/integration-tests/http/__tests__/view-configurations.spec.ts index 0b2f2e2583..06b5081587 100644 --- a/integration-tests/http/__tests__/view-configurations.spec.ts +++ b/integration-tests/http/__tests__/view-configurations.spec.ts @@ -1,10 +1,9 @@ import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { adminHeaders, createAdminUser } from "../../helpers/create-admin-user" -import { Modules, ContainerRegistrationKeys } from "@medusajs/framework/utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true, MEDUSA_FF_VIEW_CONFIGURATIONS: true } +const env = { MEDUSA_FF_VIEW_CONFIGURATIONS: true } medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/auth/admin/email-password-provider.spec.ts b/integration-tests/modules/__tests__/auth/admin/email-password-provider.spec.ts index 61fdb1636d..a7d779aeb1 100644 --- a/integration-tests/modules/__tests__/auth/admin/email-password-provider.spec.ts +++ b/integration-tests/modules/__tests__/auth/admin/email-password-provider.spec.ts @@ -1,6 +1,6 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IAuthModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import Scrypt from "scrypt-kdf" import { adminHeaders, @@ -9,7 +9,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/cart/store/add-promotions-to-cart.spec.ts b/integration-tests/modules/__tests__/cart/store/add-promotions-to-cart.spec.ts index b8be186cf7..ac3181dc68 100644 --- a/integration-tests/modules/__tests__/cart/store/add-promotions-to-cart.spec.ts +++ b/integration-tests/modules/__tests__/cart/store/add-promotions-to-cart.spec.ts @@ -16,7 +16,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/cart/store/cart.completion.ts b/integration-tests/modules/__tests__/cart/store/cart.completion.ts index 00ea50e1e1..33f1c67cb9 100644 --- a/integration-tests/modules/__tests__/cart/store/cart.completion.ts +++ b/integration-tests/modules/__tests__/cart/store/cart.completion.ts @@ -39,7 +39,7 @@ import { createAuthenticatedCustomer } from "../../../helpers/create-authenticat jest.setTimeout(200000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts b/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts index df95f9ca2a..29fd59d264 100644 --- a/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts +++ b/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts @@ -49,7 +49,7 @@ import { createAuthenticatedCustomer } from "../../../helpers/create-authenticat jest.setTimeout(200000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/cart/store/carts.spec.ts b/integration-tests/modules/__tests__/cart/store/carts.spec.ts index 2fd4aa6b2c..2a3d21ad28 100644 --- a/integration-tests/modules/__tests__/cart/store/carts.spec.ts +++ b/integration-tests/modules/__tests__/cart/store/carts.spec.ts @@ -33,7 +33,7 @@ import { setupTaxStructure } from "../../fixtures" jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" } } medusaIntegrationTestRunner({ diff --git a/integration-tests/modules/__tests__/cart/store/remove-promotions-from-cart.spec.ts b/integration-tests/modules/__tests__/cart/store/remove-promotions-from-cart.spec.ts index 7d64b7aefd..06e597adf4 100644 --- a/integration-tests/modules/__tests__/cart/store/remove-promotions-from-cart.spec.ts +++ b/integration-tests/modules/__tests__/cart/store/remove-promotions-from-cart.spec.ts @@ -16,7 +16,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/currency/admin/currency.spec.ts b/integration-tests/modules/__tests__/currency/admin/currency.spec.ts index 027ce1d8d2..b9fda3cbc2 100644 --- a/integration-tests/modules/__tests__/currency/admin/currency.spec.ts +++ b/integration-tests/modules/__tests__/currency/admin/currency.spec.ts @@ -3,7 +3,7 @@ import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/currency/store/currency.spec.ts b/integration-tests/modules/__tests__/currency/store/currency.spec.ts index 2cdda6742e..b43a12beee 100644 --- a/integration-tests/modules/__tests__/currency/store/currency.spec.ts +++ b/integration-tests/modules/__tests__/currency/store/currency.spec.ts @@ -6,7 +6,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/customer-group/admin/batch-add-customers.ts b/integration-tests/modules/__tests__/customer-group/admin/batch-add-customers.ts index bca739b0b4..d2d33282dc 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/batch-add-customers.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/batch-add-customers.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer-group/admin/batch-remove-customers.ts b/integration-tests/modules/__tests__/customer-group/admin/batch-remove-customers.ts index c2cbf915ce..3445661602 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/batch-remove-customers.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/batch-remove-customers.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer-group/admin/create-customer-group.ts b/integration-tests/modules/__tests__/customer-group/admin/create-customer-group.ts index 494e4aff45..50038fce1e 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/create-customer-group.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/create-customer-group.ts @@ -1,9 +1,9 @@ -import { createAdminUser } from "../../../../helpers/create-admin-user" import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer-group/admin/delete-customer-group.ts b/integration-tests/modules/__tests__/customer-group/admin/delete-customer-group.ts index ccfc1b72bb..6e741f574b 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/delete-customer-group.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/delete-customer-group.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer-group/admin/list-customer-group-customers.ts b/integration-tests/modules/__tests__/customer-group/admin/list-customer-group-customers.ts index 30abe4d7d0..bb0370c49a 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/list-customer-group-customers.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/list-customer-group-customers.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer-group/admin/list-customer-groups.spec.ts b/integration-tests/modules/__tests__/customer-group/admin/list-customer-groups.spec.ts index 4ce32af16a..d7af5eaa09 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/list-customer-groups.spec.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/list-customer-groups.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer-group/admin/retrieve-customer-group.ts b/integration-tests/modules/__tests__/customer-group/admin/retrieve-customer-group.ts index 6d7e094e49..d8bb70b400 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/retrieve-customer-group.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/retrieve-customer-group.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer-group/admin/update-customer-group.ts b/integration-tests/modules/__tests__/customer-group/admin/update-customer-group.ts index 94f09759dc..7558304fc8 100644 --- a/integration-tests/modules/__tests__/customer-group/admin/update-customer-group.ts +++ b/integration-tests/modules/__tests__/customer-group/admin/update-customer-group.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/admin/create-customer-addresses.ts b/integration-tests/modules/__tests__/customer/admin/create-customer-addresses.ts index 393b68cb06..1265eb6778 100644 --- a/integration-tests/modules/__tests__/customer/admin/create-customer-addresses.ts +++ b/integration-tests/modules/__tests__/customer/admin/create-customer-addresses.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/admin/create-customer.ts b/integration-tests/modules/__tests__/customer/admin/create-customer.ts index eccacf3d0b..cbcc5583b0 100644 --- a/integration-tests/modules/__tests__/customer/admin/create-customer.ts +++ b/integration-tests/modules/__tests__/customer/admin/create-customer.ts @@ -1,9 +1,9 @@ -import { createAdminUser } from "../../../../helpers/create-admin-user" import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/admin/delete-customer-address.spec.ts b/integration-tests/modules/__tests__/customer/admin/delete-customer-address.spec.ts index 4cb1d9c7c5..fce252c25b 100644 --- a/integration-tests/modules/__tests__/customer/admin/delete-customer-address.spec.ts +++ b/integration-tests/modules/__tests__/customer/admin/delete-customer-address.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/admin/delete-customer.ts b/integration-tests/modules/__tests__/customer/admin/delete-customer.ts index 3917f69e65..8f6b311588 100644 --- a/integration-tests/modules/__tests__/customer/admin/delete-customer.ts +++ b/integration-tests/modules/__tests__/customer/admin/delete-customer.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/admin/list-customer-addresses.ts b/integration-tests/modules/__tests__/customer/admin/list-customer-addresses.ts index 6a91a25fcd..ef7004d693 100644 --- a/integration-tests/modules/__tests__/customer/admin/list-customer-addresses.ts +++ b/integration-tests/modules/__tests__/customer/admin/list-customer-addresses.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/admin/list-customers.spec.ts b/integration-tests/modules/__tests__/customer/admin/list-customers.spec.ts index 0a21b2e321..86acc56b85 100644 --- a/integration-tests/modules/__tests__/customer/admin/list-customers.spec.ts +++ b/integration-tests/modules/__tests__/customer/admin/list-customers.spec.ts @@ -11,9 +11,7 @@ const { medusaIntegrationTestRunner } = require("@medusajs/test-utils") jest.setTimeout(50000) medusaIntegrationTestRunner({ - env: { - MEDUSA_FF_MEDUSA_V2: true, - }, + env: {}, testSuite: ({ dbConnection, getContainer, api }) => { describe("GET /admin/customers", () => { let appContainer diff --git a/integration-tests/modules/__tests__/customer/admin/update-customer-address.spec.ts b/integration-tests/modules/__tests__/customer/admin/update-customer-address.spec.ts index 8af02234bb..04505252b3 100644 --- a/integration-tests/modules/__tests__/customer/admin/update-customer-address.spec.ts +++ b/integration-tests/modules/__tests__/customer/admin/update-customer-address.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/admin/update-customer.ts b/integration-tests/modules/__tests__/customer/admin/update-customer.ts index ebe6ef63d6..a4df69abae 100644 --- a/integration-tests/modules/__tests__/customer/admin/update-customer.ts +++ b/integration-tests/modules/__tests__/customer/admin/update-customer.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICustomerModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/customer/store/create-customer-addresses.ts b/integration-tests/modules/__tests__/customer/store/create-customer-addresses.ts index a212d9caaa..f0a13d0b40 100644 --- a/integration-tests/modules/__tests__/customer/store/create-customer-addresses.ts +++ b/integration-tests/modules/__tests__/customer/store/create-customer-addresses.ts @@ -9,7 +9,7 @@ import { createAuthenticatedCustomer } from "../../../helpers/create-authenticat jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/customer/store/create-customer.spec.ts b/integration-tests/modules/__tests__/customer/store/create-customer.spec.ts index 63100e80a8..4aafa3435d 100644 --- a/integration-tests/modules/__tests__/customer/store/create-customer.spec.ts +++ b/integration-tests/modules/__tests__/customer/store/create-customer.spec.ts @@ -1,8 +1,8 @@ import { IAuthModuleService } from "@medusajs/types" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ContainerRegistrationKeys, Modules } from "@medusajs/utils" import jwt from "jsonwebtoken" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { adminHeaders, createAdminUser, @@ -12,7 +12,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/customer/store/delete-customer-address.spec.ts b/integration-tests/modules/__tests__/customer/store/delete-customer-address.spec.ts index d9825f26e4..4846bde611 100644 --- a/integration-tests/modules/__tests__/customer/store/delete-customer-address.spec.ts +++ b/integration-tests/modules/__tests__/customer/store/delete-customer-address.spec.ts @@ -7,7 +7,7 @@ import { } from "../../../../helpers/create-admin-user" import { createAuthenticatedCustomer } from "../../../helpers/create-authenticated-customer" -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} jest.setTimeout(50000) diff --git a/integration-tests/modules/__tests__/customer/store/get-me.spec.ts b/integration-tests/modules/__tests__/customer/store/get-me.spec.ts index 19069cf9c5..ed8a32cd12 100644 --- a/integration-tests/modules/__tests__/customer/store/get-me.spec.ts +++ b/integration-tests/modules/__tests__/customer/store/get-me.spec.ts @@ -7,7 +7,7 @@ import { createAuthenticatedCustomer } from "../../../helpers/create-authenticat jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/customer/store/list-customer-addresses.ts b/integration-tests/modules/__tests__/customer/store/list-customer-addresses.ts index 991a9d7348..f84ea66bae 100644 --- a/integration-tests/modules/__tests__/customer/store/list-customer-addresses.ts +++ b/integration-tests/modules/__tests__/customer/store/list-customer-addresses.ts @@ -7,7 +7,7 @@ import { } from "../../../../helpers/create-admin-user" import { createAuthenticatedCustomer } from "../../../helpers/create-authenticated-customer" -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} jest.setTimeout(100000) diff --git a/integration-tests/modules/__tests__/customer/store/update-customer-address.spec.ts b/integration-tests/modules/__tests__/customer/store/update-customer-address.spec.ts index 1e422fda8b..88c6cfccc7 100644 --- a/integration-tests/modules/__tests__/customer/store/update-customer-address.spec.ts +++ b/integration-tests/modules/__tests__/customer/store/update-customer-address.spec.ts @@ -9,7 +9,7 @@ import { createAuthenticatedCustomer } from "../../../helpers/create-authenticat jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/fulfillment-providers/index.spec.ts b/integration-tests/modules/__tests__/fulfillment-providers/index.spec.ts index 5e581778c2..9b66fe9439 100644 --- a/integration-tests/modules/__tests__/fulfillment-providers/index.spec.ts +++ b/integration-tests/modules/__tests__/fulfillment-providers/index.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/fulfillment/fulfillment.workflows.spec.ts b/integration-tests/modules/__tests__/fulfillment/fulfillment.workflows.spec.ts index e7913c69fd..81a0dd7b82 100644 --- a/integration-tests/modules/__tests__/fulfillment/fulfillment.workflows.spec.ts +++ b/integration-tests/modules/__tests__/fulfillment/fulfillment.workflows.spec.ts @@ -6,13 +6,13 @@ import { updateFulfillmentWorkflow, updateFulfillmentWorkflowId, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, MedusaContainer, StockLocationDTO, } from "@medusajs/types" import { ContainerRegistrationKeys, Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { generateCreateFulfillmentData, generateCreateShippingOptionsData, @@ -23,7 +23,7 @@ jest.setTimeout(50000) const providerId = "manual_test-provider" medusaIntegrationTestRunner({ - env: { MEDUSA_FF_MEDUSA_V2: true }, + env: {}, testSuite: ({ getContainer }) => { describe("Workflows: Fulfillment", () => { let location: StockLocationDTO diff --git a/integration-tests/modules/__tests__/fulfillment/index.spec.ts b/integration-tests/modules/__tests__/fulfillment/index.spec.ts index be8b056273..b6c474c043 100644 --- a/integration-tests/modules/__tests__/fulfillment/index.spec.ts +++ b/integration-tests/modules/__tests__/fulfillment/index.spec.ts @@ -1,6 +1,6 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, StockLocationDTO } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" import { generateCreateFulfillmentData, @@ -10,7 +10,7 @@ import { jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/invites/accept-invite.spec.ts b/integration-tests/modules/__tests__/invites/accept-invite.spec.ts index 2cdf167d81..8fe781ce85 100644 --- a/integration-tests/modules/__tests__/invites/accept-invite.spec.ts +++ b/integration-tests/modules/__tests__/invites/accept-invite.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IUserModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/invites/create-invite.spec.ts b/integration-tests/modules/__tests__/invites/create-invite.spec.ts index 5a5cf2e02c..186c36fc31 100644 --- a/integration-tests/modules/__tests__/invites/create-invite.spec.ts +++ b/integration-tests/modules/__tests__/invites/create-invite.spec.ts @@ -1,9 +1,9 @@ -import { createAdminUser } from "../../../helpers/create-admin-user" import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/invites/delete-invite.spec.ts b/integration-tests/modules/__tests__/invites/delete-invite.spec.ts index 2a5509b4ad..b6c78f8a24 100644 --- a/integration-tests/modules/__tests__/invites/delete-invite.spec.ts +++ b/integration-tests/modules/__tests__/invites/delete-invite.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IUserModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/invites/list-invites.spec.ts b/integration-tests/modules/__tests__/invites/list-invites.spec.ts index 7f5ee96079..c011f1175d 100644 --- a/integration-tests/modules/__tests__/invites/list-invites.spec.ts +++ b/integration-tests/modules/__tests__/invites/list-invites.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IUserModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/invites/resend-invite.spec.ts b/integration-tests/modules/__tests__/invites/resend-invite.spec.ts index 57a8b03da5..aeeee7f991 100644 --- a/integration-tests/modules/__tests__/invites/resend-invite.spec.ts +++ b/integration-tests/modules/__tests__/invites/resend-invite.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IUserModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/invites/retrieve-invite.spec.ts b/integration-tests/modules/__tests__/invites/retrieve-invite.spec.ts index d0366e7052..ed52afd472 100644 --- a/integration-tests/modules/__tests__/invites/retrieve-invite.spec.ts +++ b/integration-tests/modules/__tests__/invites/retrieve-invite.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IUserModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/link-modules/cart-links.spec.ts b/integration-tests/modules/__tests__/link-modules/cart-links.spec.ts index 448c0fd5f5..08eb9316a9 100644 --- a/integration-tests/modules/__tests__/link-modules/cart-links.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/cart-links.spec.ts @@ -1,3 +1,4 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICartModuleService, ICustomerModuleService, @@ -6,11 +7,10 @@ import { ISalesChannelModuleService, } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/cart-region.spec.ts b/integration-tests/modules/__tests__/link-modules/cart-region.spec.ts index ed5742ffe5..1f62c714da 100644 --- a/integration-tests/modules/__tests__/link-modules/cart-region.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/cart-region.spec.ts @@ -1,10 +1,10 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICartModuleService, IRegionModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/fulfillment-set-location.spec.ts b/integration-tests/modules/__tests__/link-modules/fulfillment-set-location.spec.ts index 0427f00878..49fd6ff8b3 100644 --- a/integration-tests/modules/__tests__/link-modules/fulfillment-set-location.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/fulfillment-set-location.spec.ts @@ -1,3 +1,4 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, IStockLocationService, @@ -7,11 +8,10 @@ import { Modules, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/product-variant-price-set.spec.ts b/integration-tests/modules/__tests__/link-modules/product-variant-price-set.spec.ts index 648143e2d0..e0ae89d385 100644 --- a/integration-tests/modules/__tests__/link-modules/product-variant-price-set.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/product-variant-price-set.spec.ts @@ -8,7 +8,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/publishable-key-sales-channel.spec.ts b/integration-tests/modules/__tests__/link-modules/publishable-key-sales-channel.spec.ts index c8808cf8a8..4b290b99d4 100644 --- a/integration-tests/modules/__tests__/link-modules/publishable-key-sales-channel.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/publishable-key-sales-channel.spec.ts @@ -1,13 +1,13 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IApiKeyModuleService, ISalesChannelModuleService, } from "@medusajs/types" import { Modules, remoteQueryObjectFromString } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/region-payment-provider.spec.ts b/integration-tests/modules/__tests__/link-modules/region-payment-provider.spec.ts index 698600013f..07c3d5edae 100644 --- a/integration-tests/modules/__tests__/link-modules/region-payment-provider.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/region-payment-provider.spec.ts @@ -1,10 +1,10 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IRegionModuleService } from "@medusajs/types" import { ContainerRegistrationKeys, Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/sales-channel-location.spec.ts b/integration-tests/modules/__tests__/link-modules/sales-channel-location.spec.ts index d57091d133..20a89c5317 100644 --- a/integration-tests/modules/__tests__/link-modules/sales-channel-location.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/sales-channel-location.spec.ts @@ -1,13 +1,13 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ISalesChannelModuleService, IStockLocationService, } from "@medusajs/types" import { Modules, remoteQueryObjectFromString } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/shipping-option-price-set.spec.ts b/integration-tests/modules/__tests__/link-modules/shipping-option-price-set.spec.ts index 9411ad6ef4..f6952d82f3 100644 --- a/integration-tests/modules/__tests__/link-modules/shipping-option-price-set.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/shipping-option-price-set.spec.ts @@ -1,9 +1,9 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, IPricingModuleService, } from "@medusajs/types" import { ContainerRegistrationKeys, Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { adminHeaders, createAdminUser, @@ -11,7 +11,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/link-modules/store-currency.spec.ts b/integration-tests/modules/__tests__/link-modules/store-currency.spec.ts index fdc1df8727..aa97683c68 100644 --- a/integration-tests/modules/__tests__/link-modules/store-currency.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/store-currency.spec.ts @@ -1,10 +1,10 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { ICurrencyModuleService, IStoreModuleService } from "@medusajs/types" import { Modules, remoteQueryObjectFromString } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/modules/load-standalone.ts b/integration-tests/modules/__tests__/modules/load-standalone.ts index 4b69425b5d..d7b26d6b30 100644 --- a/integration-tests/modules/__tests__/modules/load-standalone.ts +++ b/integration-tests/modules/__tests__/modules/load-standalone.ts @@ -1,5 +1,5 @@ -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { MedusaApp } from "@medusajs/modules-sdk" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IProductModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" diff --git a/integration-tests/modules/__tests__/modules/remote-query.spec.ts b/integration-tests/modules/__tests__/modules/remote-query.spec.ts index fcd7fc0e2e..2c32cf747c 100644 --- a/integration-tests/modules/__tests__/modules/remote-query.spec.ts +++ b/integration-tests/modules/__tests__/modules/remote-query.spec.ts @@ -14,7 +14,7 @@ import { adminHeaders } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/order/draft-order.spec.ts b/integration-tests/modules/__tests__/order/draft-order.spec.ts index a238736e65..a4a0c7d081 100644 --- a/integration-tests/modules/__tests__/order/draft-order.spec.ts +++ b/integration-tests/modules/__tests__/order/draft-order.spec.ts @@ -1,7 +1,5 @@ import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { - ICartModuleService, - IFulfillmentModuleService, IInventoryServiceNext, IPricingModuleService, IProductModuleService, @@ -24,7 +22,7 @@ import { setupTaxStructure } from "../fixtures" jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/order/order.spec.ts b/integration-tests/modules/__tests__/order/order.spec.ts index b848390b7d..384d4c1d01 100644 --- a/integration-tests/modules/__tests__/order/order.spec.ts +++ b/integration-tests/modules/__tests__/order/order.spec.ts @@ -16,7 +16,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/order/workflows/begin-order-claim.spec.ts b/integration-tests/modules/__tests__/order/workflows/begin-order-claim.spec.ts index 98e45ab9c5..54f1650490 100644 --- a/integration-tests/modules/__tests__/order/workflows/begin-order-claim.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/begin-order-claim.spec.ts @@ -23,7 +23,7 @@ import { jest.setTimeout(500000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const providerId = "manual_test-provider" async function prepareDataFixtures({ container }) { diff --git a/integration-tests/modules/__tests__/order/workflows/begin-order-exchange.spec.ts b/integration-tests/modules/__tests__/order/workflows/begin-order-exchange.spec.ts index 9ae2091252..e4568afa40 100644 --- a/integration-tests/modules/__tests__/order/workflows/begin-order-exchange.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/begin-order-exchange.spec.ts @@ -25,7 +25,7 @@ import { jest.setTimeout(500000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const providerId = "manual_test-provider" async function prepareDataFixtures({ container }) { diff --git a/integration-tests/modules/__tests__/order/workflows/begin-order-return.spec.ts b/integration-tests/modules/__tests__/order/workflows/begin-order-return.spec.ts index 9e91d5b3df..225d0eb938 100644 --- a/integration-tests/modules/__tests__/order/workflows/begin-order-return.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/begin-order-return.spec.ts @@ -21,7 +21,7 @@ import { jest.setTimeout(500000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const providerId = "manual_test-provider" async function prepareDataFixtures({ container }) { diff --git a/integration-tests/modules/__tests__/order/workflows/cancel-order.spec.ts b/integration-tests/modules/__tests__/order/workflows/cancel-order.spec.ts index 144f5d29f6..cde3bdd9e4 100644 --- a/integration-tests/modules/__tests__/order/workflows/cancel-order.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/cancel-order.spec.ts @@ -3,6 +3,7 @@ import { cancelOrderWorkflow, createOrderFulfillmentWorkflow, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IOrderModuleService, InventoryItemDTO, @@ -17,12 +18,11 @@ import { Modules, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createOrderFixture, prepareDataFixtures } from "./__fixtures__" jest.setTimeout(500000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/order/workflows/claim/claim-shipping.spec.ts b/integration-tests/modules/__tests__/order/workflows/claim/claim-shipping.spec.ts index 94a11870f6..de756c9498 100644 --- a/integration-tests/modules/__tests__/order/workflows/claim/claim-shipping.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/claim/claim-shipping.spec.ts @@ -6,18 +6,18 @@ import { orderClaimRequestItemReturnWorkflow, updateClaimAddItemWorkflow, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, OrderDTO } from "@medusajs/types" import { ContainerRegistrationKeys, Modules, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createOrderFixture, prepareDataFixtures } from "../__fixtures__" jest.setTimeout(50000) medusaIntegrationTestRunner({ - env: { MEDUSA_FF_MEDUSA_V2: true }, + env: {}, testSuite: ({ getContainer }) => { let container diff --git a/integration-tests/modules/__tests__/order/workflows/create-complete-return.spec.ts b/integration-tests/modules/__tests__/order/workflows/create-complete-return.spec.ts index 95da82bff2..c83cd485fb 100644 --- a/integration-tests/modules/__tests__/order/workflows/create-complete-return.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/create-complete-return.spec.ts @@ -25,7 +25,7 @@ import { jest.setTimeout(500000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const providerId = "manual_test-provider" async function prepareDataFixtures({ container }) { diff --git a/integration-tests/modules/__tests__/order/workflows/create-fulfillment.spec.ts b/integration-tests/modules/__tests__/order/workflows/create-fulfillment.spec.ts index e84dbb4a79..2f00faffc3 100644 --- a/integration-tests/modules/__tests__/order/workflows/create-fulfillment.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/create-fulfillment.spec.ts @@ -24,7 +24,7 @@ import { jest.setTimeout(500000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const providerId = "manual_test-provider" const variantSkuWithInventory = "test-variant" let inventoryItem diff --git a/integration-tests/modules/__tests__/order/workflows/create-shipment.spec.ts b/integration-tests/modules/__tests__/order/workflows/create-shipment.spec.ts index 477bc76d75..592e180950 100644 --- a/integration-tests/modules/__tests__/order/workflows/create-shipment.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/create-shipment.spec.ts @@ -24,7 +24,7 @@ import { jest.setTimeout(500000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const providerId = "manual_test-provider" let inventoryItem diff --git a/integration-tests/modules/__tests__/order/workflows/exchange/exchange-shipping.spec.ts b/integration-tests/modules/__tests__/order/workflows/exchange/exchange-shipping.spec.ts index b91900d67b..fddcaa300d 100644 --- a/integration-tests/modules/__tests__/order/workflows/exchange/exchange-shipping.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/exchange/exchange-shipping.spec.ts @@ -6,18 +6,18 @@ import { orderExchangeRequestItemReturnWorkflow, updateExchangeAddItemWorkflow, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, OrderDTO } from "@medusajs/types" import { ContainerRegistrationKeys, Modules, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createOrderFixture, prepareDataFixtures } from "../__fixtures__" jest.setTimeout(50000) medusaIntegrationTestRunner({ - env: { MEDUSA_FF_MEDUSA_V2: true }, + env: {}, testSuite: ({ getContainer }) => { let container diff --git a/integration-tests/modules/__tests__/order/workflows/order-change-actions.ts b/integration-tests/modules/__tests__/order/workflows/order-change-actions.ts index 7139ae0c42..e4b7e955a1 100644 --- a/integration-tests/modules/__tests__/order/workflows/order-change-actions.ts +++ b/integration-tests/modules/__tests__/order/workflows/order-change-actions.ts @@ -7,6 +7,7 @@ import { updateOrderChangeActionsWorkflow, updateOrderChangeActionsWorkflowId, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IOrderModuleService, OrderChangeActionDTO, @@ -14,13 +15,12 @@ import { OrderDTO, } from "@medusajs/types" import { ChangeActionType, Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createOrderFixture, prepareDataFixtures } from "./__fixtures__" jest.setTimeout(50000) medusaIntegrationTestRunner({ - env: { MEDUSA_FF_MEDUSA_V2: true }, + env: {}, testSuite: ({ getContainer }) => { let container diff --git a/integration-tests/modules/__tests__/order/workflows/order-change.spec.ts b/integration-tests/modules/__tests__/order/workflows/order-change.spec.ts index 524e98f944..ad8ec5a729 100644 --- a/integration-tests/modules/__tests__/order/workflows/order-change.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/order-change.spec.ts @@ -7,15 +7,15 @@ import { deleteOrderChangeWorkflow, deleteOrderChangeWorkflowId, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IOrderModuleService, OrderChangeDTO, OrderDTO } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createOrderFixture, prepareDataFixtures } from "./__fixtures__" jest.setTimeout(50000) medusaIntegrationTestRunner({ - env: { MEDUSA_FF_MEDUSA_V2: true }, + env: {}, testSuite: ({ getContainer }) => { let container diff --git a/integration-tests/modules/__tests__/order/workflows/return/create-return-shipping.spec.ts b/integration-tests/modules/__tests__/order/workflows/return/create-return-shipping.spec.ts index 7ace4ba1fc..5db55e8983 100644 --- a/integration-tests/modules/__tests__/order/workflows/return/create-return-shipping.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/return/create-return-shipping.spec.ts @@ -5,18 +5,18 @@ import { requestItemReturnWorkflow, updateRequestItemReturnWorkflow, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, OrderDTO, ReturnDTO } from "@medusajs/types" import { ContainerRegistrationKeys, Modules, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createOrderFixture, prepareDataFixtures } from "../__fixtures__" jest.setTimeout(50000) medusaIntegrationTestRunner({ - env: { MEDUSA_FF_MEDUSA_V2: true }, + env: {}, testSuite: ({ getContainer }) => { let container diff --git a/integration-tests/modules/__tests__/order/workflows/return/items.spec.ts b/integration-tests/modules/__tests__/order/workflows/return/items.spec.ts index 6bc8c8de0a..48ce3825d1 100644 --- a/integration-tests/modules/__tests__/order/workflows/return/items.spec.ts +++ b/integration-tests/modules/__tests__/order/workflows/return/items.spec.ts @@ -3,19 +3,19 @@ import { createOrderFulfillmentWorkflow, requestItemReturnWorkflow, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IOrderModuleService, OrderDTO, ReturnDTO } from "@medusajs/types" import { ContainerRegistrationKeys, Modules, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createOrderFixture, prepareDataFixtures } from "../__fixtures__" jest.setTimeout(50000) medusaIntegrationTestRunner({ - env: { MEDUSA_FF_MEDUSA_V2: true }, + env: {}, testSuite: ({ getContainer }) => { let container diff --git a/integration-tests/modules/__tests__/payment/payment-providers.spec.ts b/integration-tests/modules/__tests__/payment/payment-providers.spec.ts index 6e0f33f59b..82a953c3cd 100644 --- a/integration-tests/modules/__tests__/payment/payment-providers.spec.ts +++ b/integration-tests/modules/__tests__/payment/payment-providers.spec.ts @@ -6,7 +6,7 @@ import { jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/payment/payment-session.workflows.spec.ts b/integration-tests/modules/__tests__/payment/payment-session.workflows.spec.ts index 6b60773b11..eb55e5cd9f 100644 --- a/integration-tests/modules/__tests__/payment/payment-session.workflows.spec.ts +++ b/integration-tests/modules/__tests__/payment/payment-session.workflows.spec.ts @@ -12,7 +12,7 @@ import { ContainerRegistrationKeys, Modules } from "@medusajs/utils" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/price-lists/admin/price-lists.spec.ts b/integration-tests/modules/__tests__/price-lists/admin/price-lists.spec.ts index 98f6608eaf..645f1e88ff 100644 --- a/integration-tests/modules/__tests__/price-lists/admin/price-lists.spec.ts +++ b/integration-tests/modules/__tests__/price-lists/admin/price-lists.spec.ts @@ -11,7 +11,7 @@ import { createVariantPriceSet } from "../../../helpers/create-variant-price-set jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/price-lists/store/get-product.ts b/integration-tests/modules/__tests__/price-lists/store/get-product.ts index 2b8f6e6e9c..2e417463b5 100644 --- a/integration-tests/modules/__tests__/price-lists/store/get-product.ts +++ b/integration-tests/modules/__tests__/price-lists/store/get-product.ts @@ -1,5 +1,5 @@ -import { PriceListStatus, PriceListType } from "@medusajs/utils" import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import { PriceListStatus, PriceListType } from "@medusajs/utils" import { createAdminUser, generatePublishableKey, @@ -15,9 +15,7 @@ const adminHeaders = { }, } -const env = { - MEDUSA_FF_MEDUSA_V2: true, -} +const env = {} medusaIntegrationTestRunner({ env, diff --git a/integration-tests/modules/__tests__/product/admin/products.spec.ts b/integration-tests/modules/__tests__/product/admin/products.spec.ts index 1cea774496..250e91d3c9 100644 --- a/integration-tests/modules/__tests__/product/admin/products.spec.ts +++ b/integration-tests/modules/__tests__/product/admin/products.spec.ts @@ -1,3 +1,4 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { CreateProductDTO, IPricingModuleService, @@ -6,13 +7,12 @@ import { ProductVariantDTO, } from "@medusajs/types" import { Modules, PriceListStatus, PriceListType } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" import { createVariantPriceSet } from "../../../helpers/create-variant-price-set" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" } } async function createProductsWithVariants( diff --git a/integration-tests/modules/__tests__/regions/admin/regions.spec.ts b/integration-tests/modules/__tests__/regions/admin/regions.spec.ts index 410ec601c0..e5af7c3353 100644 --- a/integration-tests/modules/__tests__/regions/admin/regions.spec.ts +++ b/integration-tests/modules/__tests__/regions/admin/regions.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IRegionModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/regions/workflows/create-region.spec.ts b/integration-tests/modules/__tests__/regions/workflows/create-region.spec.ts index 505a6775a0..4d90cb0712 100644 --- a/integration-tests/modules/__tests__/regions/workflows/create-region.spec.ts +++ b/integration-tests/modules/__tests__/regions/workflows/create-region.spec.ts @@ -1,15 +1,15 @@ -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createRegionsWorkflow } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { MedusaContainer, RegionDTO } from "@medusajs/types" -import { createAdminUser } from "../../../../helpers/create-admin-user" import { ContainerRegistrationKeys, remoteQueryObjectFromString, } from "@medusajs/utils" +import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(200000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/regions/workflows/update-region.spec.ts b/integration-tests/modules/__tests__/regions/workflows/update-region.spec.ts index 65228e6543..b2d0674b6f 100644 --- a/integration-tests/modules/__tests__/regions/workflows/update-region.spec.ts +++ b/integration-tests/modules/__tests__/regions/workflows/update-region.spec.ts @@ -1,11 +1,11 @@ -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { updateRegionsWorkflow } from "@medusajs/core-flows" -import { ContainerLike, MedusaContainer, RegionDTO } from "@medusajs/types" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import { MedusaContainer, RegionDTO } from "@medusajs/types" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(200000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/shipping-options/workflows/batch-shipping-options-rules.ts b/integration-tests/modules/__tests__/shipping-options/workflows/batch-shipping-options-rules.ts index 46e3e5c884..7b39395cc2 100644 --- a/integration-tests/modules/__tests__/shipping-options/workflows/batch-shipping-options-rules.ts +++ b/integration-tests/modules/__tests__/shipping-options/workflows/batch-shipping-options-rules.ts @@ -23,7 +23,7 @@ import { jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const provider_id = "manual_test-provider" async function createShippingOptionFixture({ diff --git a/integration-tests/modules/__tests__/shipping-options/workflows/create-shipping-options.ts b/integration-tests/modules/__tests__/shipping-options/workflows/create-shipping-options.ts index 33851ab62f..245c938a20 100644 --- a/integration-tests/modules/__tests__/shipping-options/workflows/create-shipping-options.ts +++ b/integration-tests/modules/__tests__/shipping-options/workflows/create-shipping-options.ts @@ -1,4 +1,5 @@ import { createShippingOptionsWorkflow } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { FulfillmentSetDTO, FulfillmentWorkflow, @@ -13,11 +14,10 @@ import { RuleOperator, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const provider_id = "manual_test-provider" medusaIntegrationTestRunner({ diff --git a/integration-tests/modules/__tests__/shipping-options/workflows/delete-shipping-options.ts b/integration-tests/modules/__tests__/shipping-options/workflows/delete-shipping-options.ts index b246a10232..7b95df7fdd 100644 --- a/integration-tests/modules/__tests__/shipping-options/workflows/delete-shipping-options.ts +++ b/integration-tests/modules/__tests__/shipping-options/workflows/delete-shipping-options.ts @@ -2,6 +2,7 @@ import { createShippingOptionsWorkflow, deleteShippingOptionsWorkflow, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { FulfillmentSetDTO, FulfillmentWorkflow, @@ -16,11 +17,10 @@ import { RuleOperator, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const provider_id = "manual_test-provider" medusaIntegrationTestRunner({ diff --git a/integration-tests/modules/__tests__/shipping-options/workflows/update-shipping-options.ts b/integration-tests/modules/__tests__/shipping-options/workflows/update-shipping-options.ts index c19bb2debd..77dc312deb 100644 --- a/integration-tests/modules/__tests__/shipping-options/workflows/update-shipping-options.ts +++ b/integration-tests/modules/__tests__/shipping-options/workflows/update-shipping-options.ts @@ -2,6 +2,7 @@ import { createShippingOptionsWorkflow, updateShippingOptionsWorkflow, } from "@medusajs/core-flows" +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { FulfillmentSetDTO, FulfillmentWorkflow, @@ -17,11 +18,10 @@ import { RuleOperator, remoteQueryObjectFromString, } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" jest.setTimeout(100000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const provider_id = "manual_test-provider" medusaIntegrationTestRunner({ diff --git a/integration-tests/modules/__tests__/store/admin/store.spec.ts b/integration-tests/modules/__tests__/store/admin/store.spec.ts index 4f3624e40f..dc74917c5e 100644 --- a/integration-tests/modules/__tests__/store/admin/store.spec.ts +++ b/integration-tests/modules/__tests__/store/admin/store.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IStoreModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/tax/admin/tax.spec.ts b/integration-tests/modules/__tests__/tax/admin/tax.spec.ts index d9d5e85508..868eedf628 100644 --- a/integration-tests/modules/__tests__/tax/admin/tax.spec.ts +++ b/integration-tests/modules/__tests__/tax/admin/tax.spec.ts @@ -5,7 +5,7 @@ import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/tax/workflow/tax.spec.ts b/integration-tests/modules/__tests__/tax/workflow/tax.spec.ts index 4250dc6856..c9c728b5d6 100644 --- a/integration-tests/modules/__tests__/tax/workflow/tax.spec.ts +++ b/integration-tests/modules/__tests__/tax/workflow/tax.spec.ts @@ -4,13 +4,13 @@ import { createTaxRateRulesStepId, updateTaxRatesWorkflow, } from "@medusajs/core-flows" -import { Modules } from "@medusajs/utils" import { medusaIntegrationTestRunner } from "@medusajs/test-utils" +import { Modules } from "@medusajs/utils" import { createAdminUser } from "../../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/users/get-me.spec.ts b/integration-tests/modules/__tests__/users/get-me.spec.ts index b6c3071b1c..a2bf2bf302 100644 --- a/integration-tests/modules/__tests__/users/get-me.spec.ts +++ b/integration-tests/modules/__tests__/users/get-me.spec.ts @@ -3,7 +3,7 @@ import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/users/update-user.spec.ts b/integration-tests/modules/__tests__/users/update-user.spec.ts index 16ce480082..01267be8e5 100644 --- a/integration-tests/modules/__tests__/users/update-user.spec.ts +++ b/integration-tests/modules/__tests__/users/update-user.spec.ts @@ -1,11 +1,11 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IUserModuleService } from "@medusajs/types" import { Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser } from "../../../helpers/create-admin-user" jest.setTimeout(50000) -const env = { MEDUSA_FF_MEDUSA_V2: true } +const env = {} const adminHeaders = { headers: { "x-medusa-access-token": "test_token" }, } diff --git a/integration-tests/modules/__tests__/workflow-engine/api_v2.ts b/integration-tests/modules/__tests__/workflow-engine/api_v2.ts index 0422b215e2..49ac9b3df0 100644 --- a/integration-tests/modules/__tests__/workflow-engine/api_v2.ts +++ b/integration-tests/modules/__tests__/workflow-engine/api_v2.ts @@ -2,8 +2,6 @@ import { workflowEngineTestSuite } from "./tests" jest.setTimeout(5000000) -const env = { - MEDUSA_FF_MEDUSA_V2: true, -} +const env = {} workflowEngineTestSuite(env) diff --git a/integration-tests/modules/medusa-config.ts b/integration-tests/modules/medusa-config.ts index 17a34203f5..f59386da32 100644 --- a/integration-tests/modules/medusa-config.ts +++ b/integration-tests/modules/medusa-config.ts @@ -10,8 +10,6 @@ const DB_URL = `postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}` process.env.POSTGRES_URL = DB_URL process.env.LOG_LEVEL = "error" -const enableMedusaV2 = process.env.MEDUSA_FF_MEDUSA_V2 == "true" - const customTaxProviderRegistration = { resolve: { services: [require("@medusajs/tax/dist/providers/system").default], @@ -50,9 +48,7 @@ module.exports = defineConfig({ cookieSecret: "test", }, }, - featureFlags: { - medusa_v2: enableMedusaV2, - }, + featureFlags: {}, modules: [ { key: "testingModule", diff --git a/packages/cli/medusa-cli/src/reporter/index.ts b/packages/cli/medusa-cli/src/reporter/index.ts index a582545e3c..212805391a 100644 --- a/packages/cli/medusa-cli/src/reporter/index.ts +++ b/packages/cli/medusa-cli/src/reporter/index.ts @@ -1,9 +1,9 @@ -import ora from "ora" -import { ulid } from "ulid" -import winston from "winston" -import { inspect } from "util" -import stackTrace from "stack-trace" import { track } from "@medusajs/telemetry" +import ora from "ora" +import stackTrace from "stack-trace" +import { ulid } from "ulid" +import { inspect } from "util" +import winston from "winston" import { panicHandler } from "./panic-handler" const LOG_LEVEL = process.env.LOG_LEVEL || "http" @@ -201,8 +201,9 @@ export class Reporter { * string values. Hence we will have to self convert * the error cause to a string */ - if ("cause" in errorAsObject) { - toLog["cause"] = inspect(errorAsObject.cause) + const cause = (errorAsObject as any)?.cause + if (cause) { + toLog["cause"] = inspect(cause) } } diff --git a/packages/core/framework/src/feature-flags/__tests__/feature-flags.spec.ts b/packages/core/framework/src/feature-flags/__tests__/feature-flags.spec.ts index 080d9a4ee3..e05fac4bbe 100644 --- a/packages/core/framework/src/feature-flags/__tests__/feature-flags.spec.ts +++ b/packages/core/framework/src/feature-flags/__tests__/feature-flags.spec.ts @@ -1,7 +1,7 @@ import { FileSystem } from "@medusajs/utils" import { join } from "path" -import { featureFlagsLoader } from "../feature-flag-loader" import { configManager } from "../../config" +import { featureFlagsLoader } from "../feature-flag-loader" const filesystem = new FileSystem(join(__dirname, "__ff-test__")) @@ -48,9 +48,12 @@ describe("feature flags", () => { baseDir: filesystem.basePath, }) - await filesystem.create("flags/flag-1.js", buildFeatureFlag("flag-1", true)) + await filesystem.create( + "feature-flags/flag-1.js", + buildFeatureFlag("flag-1", true) + ) - const flags = await featureFlagsLoader(join(filesystem.basePath, "flags")) + const flags = await featureFlagsLoader(join(filesystem.basePath)) expect(flags.isFeatureEnabled("flag_1")).toEqual(false) }) @@ -63,13 +66,16 @@ describe("feature flags", () => { baseDir: filesystem.basePath, }) - await filesystem.create("flags/test.js", buildFeatureFlag("test", false)) await filesystem.create( - "flags/simpletest.js", + "feature-flags/test.js", + buildFeatureFlag("test", false) + ) + await filesystem.create( + "feature-flags/simpletest.js", buildFeatureFlag("simpletest", false) ) - const flags = await featureFlagsLoader(join(filesystem.basePath, "flags")) + const flags = await featureFlagsLoader(join(filesystem.basePath)) expect(flags.isFeatureEnabled({ test: "nested" })).toEqual(true) expect(flags.isFeatureEnabled("simpletest")).toEqual(true) @@ -77,11 +83,11 @@ describe("feature flags", () => { it("should load the default feature flags", async () => { await filesystem.create( - "flags/flag-1.js", + "feature-flags/flag-1.js", buildFeatureFlag("flag-1", false) ) - const flags = await featureFlagsLoader(join(filesystem.basePath, "flags")) + const flags = await featureFlagsLoader(join(filesystem.basePath)) expect(flags.isFeatureEnabled("flag_1")).toEqual(false) }) @@ -90,10 +96,10 @@ describe("feature flags", () => { process.env.MEDUSA_FF_FLAG_1 = "false" await filesystem.create( - "flags/flag-1.js", + "feature-flags/flag-1.js", buildFeatureFlag("flag-1", false) ) - const flags = await featureFlagsLoader(join(filesystem.basePath, "flags")) + const flags = await featureFlagsLoader(join(filesystem.basePath)) expect(flags.isFeatureEnabled("flag_1")).toEqual(false) }) @@ -106,19 +112,19 @@ describe("feature flags", () => { process.env.MEDUSA_FF_FLAG_3 = "true" await filesystem.create( - "flags/flag-1.js", + "feature-flags/flag-1.js", buildFeatureFlag("flag-1", false) ) await filesystem.create( - "flags/flag-2.js", + "feature-flags/flag-2.js", buildFeatureFlag("flag-2", false) ) await filesystem.create( - "flags/flag-3.js", + "feature-flags/flag-3.js", buildFeatureFlag("flag-3", false) ) - const flags = await featureFlagsLoader(join(filesystem.basePath, "flags")) + const flags = await featureFlagsLoader(join(filesystem.basePath)) expect(flags.isFeatureEnabled("flag_1")).toEqual(false) expect(flags.isFeatureEnabled("flag_2")).toEqual(false) diff --git a/packages/core/framework/src/feature-flags/feature-flag-loader.ts b/packages/core/framework/src/feature-flags/feature-flag-loader.ts index aa27dd1eb6..420e5faf3f 100644 --- a/packages/core/framework/src/feature-flags/feature-flag-loader.ts +++ b/packages/core/framework/src/feature-flags/feature-flag-loader.ts @@ -1,85 +1,23 @@ import { trackFeatureFlag } from "@medusajs/telemetry" import { ContainerRegistrationKeys, - dynamicImport, + discoverFeatureFlagsFromDir, + FeatureFlag, FlagRouter, - isDefined, - isObject, - isString, - isTruthy, - objectFromStringPath, - readDirRecursive, + registerFeatureFlag, } from "@medusajs/utils" import { asFunction } from "awilix" -import { join, normalize } from "path" +import { normalize } from "path" import { configManager } from "../config" import { container } from "../container" import { logger } from "../logger" import { FlagSettings } from "./types" -export const featureFlagRouter = new FlagRouter({}) - container.register( ContainerRegistrationKeys.FEATURE_FLAG_ROUTER, - asFunction(() => featureFlagRouter) + asFunction(() => FeatureFlag) ) -const excludedFiles = ["index.js", "index.ts"] -const excludedExtensions = [".d.ts", ".d.ts.map", ".js.map"] -const flagConfig: Record> = {} - -function registerFlag( - flag: FlagSettings, - projectConfigFlags: Record> -) { - flagConfig[flag.key] = isTruthy(flag.default_val) - - let from - if (isDefined(process.env[flag.env_key])) { - from = "environment" - const envVal = process.env[flag.env_key] - - // MEDUSA_FF_ANALYTICS="true" - flagConfig[flag.key] = isTruthy(process.env[flag.env_key]) - - const parsedFromEnv = isString(envVal) ? envVal.split(",") : [] - - // MEDUSA_FF_WORKFLOWS=createProducts,deleteProducts - if (parsedFromEnv.length > 1) { - flagConfig[flag.key] = objectFromStringPath(parsedFromEnv) - } - } else if (isDefined(projectConfigFlags[flag.key])) { - from = "project config" - - // featureFlags: { analytics: "true" | true } - flagConfig[flag.key] = isTruthy( - projectConfigFlags[flag.key] as string | boolean - ) - - // featureFlags: { workflows: { createProducts: true } } - if (isObject(projectConfigFlags[flag.key])) { - flagConfig[flag.key] = projectConfigFlags[flag.key] as Record< - string, - boolean - > - } - } - - if (logger && from) { - logger.info( - `Using flag ${flag.env_key} from ${from} with value ${ - flagConfig[flag.key] - }` - ) - } - - if (flagConfig[flag.key]) { - trackFeatureFlag(flag.key) - } - - featureFlagRouter.setFlag(flag.key, flagConfig[flag.key]) -} - /** * Load feature flags from a directory and from the already loaded config under the hood * @param sourcePath @@ -90,39 +28,21 @@ export async function featureFlagsLoader( const { featureFlags: projectConfigFlags = {} } = configManager.config if (!sourcePath) { - return featureFlagRouter + return FeatureFlag } const flagDir = normalize(sourcePath) - await readDirRecursive(flagDir).then(async (files) => { - if (!files?.length) { - return - } - - files.map(async (file) => { - if (file.isDirectory()) { - return await featureFlagsLoader(join(flagDir, file.name)) - } - - if ( - excludedExtensions.some((ext) => file.name.endsWith(ext)) || - excludedFiles.includes(file.name) - ) { - return - } - - const fileExports = await dynamicImport(join(flagDir, file.name)) - const featureFlag = fileExports.default - - if (!featureFlag) { - return - } - - registerFlag(featureFlag, projectConfigFlags) - return + const discovered = await discoverFeatureFlagsFromDir(flagDir) + for (const def of discovered) { + registerFeatureFlag({ + flag: def as FlagSettings, + projectConfigFlags, + router: FeatureFlag, + logger, + track: (key) => trackFeatureFlag(key), }) - }) + } - return featureFlagRouter + return FeatureFlag } diff --git a/packages/core/framework/src/http/__fixtures__/server/index.ts b/packages/core/framework/src/http/__fixtures__/server/index.ts index 368151468f..5c1f93cd11 100644 --- a/packages/core/framework/src/http/__fixtures__/server/index.ts +++ b/packages/core/framework/src/http/__fixtures__/server/index.ts @@ -35,12 +35,12 @@ export const createServer = async (rootDir) => { const moduleResolutions = {} Object.entries(ModulesDefinition).forEach(([moduleKey, module]) => { - moduleResolutions[moduleKey] = registerMedusaModule( + moduleResolutions[moduleKey] = registerMedusaModule({ moduleKey, - module.defaultModuleDeclaration, - undefined, - module - )[moduleKey] + moduleDeclaration: module.defaultModuleDeclaration, + moduleExports: undefined, + definition: module, + })[moduleKey] }) configManager.loadConfig({ diff --git a/packages/core/framework/src/http/middleware-file-loader.ts b/packages/core/framework/src/http/middleware-file-loader.ts index 18ba764b60..be39abc340 100644 --- a/packages/core/framework/src/http/middleware-file-loader.ts +++ b/packages/core/framework/src/http/middleware-file-loader.ts @@ -1,15 +1,15 @@ -import zod from "zod" +import { dynamicImport, FileSystem, isFileSkipped } from "@medusajs/utils" import { join } from "path" -import { dynamicImport, FileSystem } from "@medusajs/utils" +import zod from "zod" import { logger } from "../logger" import { - type MiddlewaresConfig, - type BodyParserConfigRoute, - type MiddlewareDescriptor, - type MedusaErrorHandlerFunction, type AdditionalDataValidatorRoute, + type BodyParserConfigRoute, HTTP_METHODS, + type MedusaErrorHandlerFunction, + type MiddlewareDescriptor, + type MiddlewaresConfig, } from "./types" /** @@ -51,6 +51,10 @@ export class MiddlewareFileLoader { async #processMiddlewareFile(absolutePath: string): Promise { const middlewareExports = await dynamicImport(absolutePath) + if (isFileSkipped(middlewareExports)) { + return + } + const middlewareConfig = middlewareExports.default if (!middlewareConfig) { logger.warn( diff --git a/packages/core/framework/src/http/routes-loader.ts b/packages/core/framework/src/http/routes-loader.ts index c9a05bd3c6..bbc072f256 100644 --- a/packages/core/framework/src/http/routes-loader.ts +++ b/packages/core/framework/src/http/routes-loader.ts @@ -1,4 +1,4 @@ -import { dynamicImport, readDirRecursive } from "@medusajs/utils" +import { dynamicImport, isFileSkipped, readDirRecursive } from "@medusajs/utils" import { join, parse, sep } from "path" import { logger } from "../logger" import { HTTP_METHODS, type RouteDescriptor, type RouteVerb } from "./types" @@ -92,6 +92,10 @@ export class RoutesLoader { ): Promise { const routeExports = await dynamicImport(absolutePath) + if (isFileSkipped(routeExports)) { + return [] + } + /** * Find the route type based upon its prefix. */ diff --git a/packages/core/framework/src/jobs/job-loader.ts b/packages/core/framework/src/jobs/job-loader.ts index 77fdedd536..228a7b4141 100644 --- a/packages/core/framework/src/jobs/job-loader.ts +++ b/packages/core/framework/src/jobs/job-loader.ts @@ -1,6 +1,6 @@ import type { SchedulerOptions } from "@medusajs/orchestration" import { MedusaContainer } from "@medusajs/types" -import { isObject, MedusaError } from "@medusajs/utils" +import { isFileSkipped, isObject, MedusaError } from "@medusajs/utils" import { createStep, createWorkflow, @@ -31,6 +31,10 @@ export class JobLoader extends ResourceLoader { config: CronJobConfig } ) { + if (isFileSkipped(fileExports)) { + return + } + this.validateConfig(fileExports.config) logger.debug(`Registering job from ${path}.`) this.register({ diff --git a/packages/core/framework/src/medusa-app-loader.ts b/packages/core/framework/src/medusa-app-loader.ts index f074f01a1d..4cfdea0477 100644 --- a/packages/core/framework/src/medusa-app-loader.ts +++ b/packages/core/framework/src/medusa-app-loader.ts @@ -49,20 +49,29 @@ export class MedusaAppLoader { | RegisterModuleJoinerConfig | RegisterModuleJoinerConfig[] + readonly #medusaConfigPath?: string + readonly #cwd?: string + // TODO: Adjust all loaders to accept an optional container such that in test env it is possible if needed to provide a specific container otherwise use the main container // Maybe also adjust the different places to resolve the config from the container instead of the configManager for the same reason // To be discussed constructor({ container, customLinksModules, + medusaConfigPath, + cwd, }: { container?: MedusaContainer customLinksModules?: | RegisterModuleJoinerConfig | RegisterModuleJoinerConfig[] + medusaConfigPath?: string + cwd?: string } = {}) { this.#container = container ?? mainContainer this.#customLinksModules = customLinksModules ?? [] + this.#medusaConfigPath = medusaConfigPath + this.#cwd = cwd } protected mergeDefaultModules( @@ -172,6 +181,8 @@ export class MedusaAppLoader { linkModules: this.#customLinksModules, sharedResourcesConfig, injectedDependencies, + medusaConfigPath: this.#medusaConfigPath, + cwd: this.#cwd, } if (action === "revert") { @@ -197,6 +208,8 @@ export class MedusaAppLoader { linkModules: this.#customLinksModules, sharedResourcesConfig, injectedDependencies, + medusaConfigPath: this.#medusaConfigPath, + cwd: this.#cwd, } return await MedusaAppGetLinksExecutionPlanner(migrationOptions) @@ -217,6 +230,8 @@ export class MedusaAppLoader { sharedResourcesConfig, injectedDependencies, loaderOnly: true, + medusaConfigPath: this.#medusaConfigPath, + cwd: this.#cwd, }) } @@ -255,6 +270,8 @@ export class MedusaAppLoader { linkModules: this.#customLinksModules, sharedResourcesConfig, injectedDependencies, + medusaConfigPath: this.#medusaConfigPath, + cwd: this.#cwd, }) if (!config.registerInContainer) { diff --git a/packages/core/framework/src/migrations/run-migration-scripts.ts b/packages/core/framework/src/migrations/run-migration-scripts.ts index 12bac7bc21..7be05851c9 100644 --- a/packages/core/framework/src/migrations/run-migration-scripts.ts +++ b/packages/core/framework/src/migrations/run-migration-scripts.ts @@ -1,5 +1,5 @@ import { MedusaContainer } from "@medusajs/types" -import { dynamicImport, Modules } from "@medusajs/utils" +import { dynamicImport, isFileSkipped, Modules } from "@medusajs/utils" import { basename } from "path" import { logger } from "../logger" import { Migrator } from "./migrator" @@ -28,6 +28,10 @@ export class MigrationScriptsMigrator extends Migrator { for (const script of scriptPaths) { const scriptFn = await dynamicImport(script) + if (isFileSkipped(scriptFn)) { + continue + } + if (!scriptFn.default) { throw new Error( `Failed to load migration script ${script}. No default export found.` diff --git a/packages/core/framework/src/subscribers/subscriber-loader.ts b/packages/core/framework/src/subscribers/subscriber-loader.ts index ebe6551c6c..75cce22c9b 100644 --- a/packages/core/framework/src/subscribers/subscriber-loader.ts +++ b/packages/core/framework/src/subscribers/subscriber-loader.ts @@ -1,12 +1,12 @@ import { Event, IEventBusModuleService, Subscriber } from "@medusajs/types" -import { kebabCase, Modules } from "@medusajs/utils" +import { isFileSkipped, kebabCase, Modules } from "@medusajs/utils" import { parse } from "path" import { configManager } from "../config" import { container } from "../container" import { logger } from "../logger" -import { SubscriberArgs, SubscriberConfig } from "./types" import { ResourceLoader } from "../utils/resource-loader" +import { SubscriberArgs, SubscriberConfig } from "./types" type SubscriberHandler = (args: SubscriberArgs) => Promise @@ -42,6 +42,10 @@ export class SubscriberLoader extends ResourceLoader { path: string, fileExports: Record ) { + if (isFileSkipped(fileExports)) { + return + } + const isValid = this.validateSubscriber(fileExports, path) logger.debug(`Registering subscribers from ${path}.`) diff --git a/packages/core/framework/src/utils/resource-loader.ts b/packages/core/framework/src/utils/resource-loader.ts index d2c2f62c15..57ca74f837 100644 --- a/packages/core/framework/src/utils/resource-loader.ts +++ b/packages/core/framework/src/utils/resource-loader.ts @@ -86,7 +86,7 @@ export abstract class ResourceLoader { }) const resources = await promiseAll(promises) - return resources.flat() + return resources.flat().filter(Boolean) } /** diff --git a/packages/core/framework/src/workflows/workflow-loader.ts b/packages/core/framework/src/workflows/workflow-loader.ts index 47d19f009f..99962839af 100644 --- a/packages/core/framework/src/workflows/workflow-loader.ts +++ b/packages/core/framework/src/workflows/workflow-loader.ts @@ -1,3 +1,5 @@ +import { isFileSkipped } from "@medusajs/utils" +import { MedusaWorkflow } from "@medusajs/workflows-sdk" import { logger } from "../logger" import { ResourceLoader } from "../utils/resource-loader" @@ -12,6 +14,17 @@ export class WorkflowLoader extends ResourceLoader { path: string, fileExports: Record ) { + if (isFileSkipped(fileExports)) { + const exportedFns = Object.keys(fileExports) + for (const exportedFn of exportedFns) { + const fn = fileExports[exportedFn] as any + if (fn?.getName?.()) { + MedusaWorkflow.unregisterWorkflow(fn.getName()) + } + } + return + } + logger.debug(`Registering workflows from ${path}.`) } diff --git a/packages/core/modules-sdk/src/index.ts b/packages/core/modules-sdk/src/index.ts index 48652b9385..a4653d51f8 100644 --- a/packages/core/modules-sdk/src/index.ts +++ b/packages/core/modules-sdk/src/index.ts @@ -1,8 +1,8 @@ export * from "./definitions" +export * from "./link" export * from "./loaders" export * from "./medusa-app" export * from "./medusa-module" -export * from "./link" export * from "./remote-query" export * from "./types" export * from "./utils" diff --git a/packages/core/modules-sdk/src/loaders/__tests__/register-modules.ts b/packages/core/modules-sdk/src/loaders/__tests__/register-modules.ts index 2b0f586ec0..a9098e164b 100644 --- a/packages/core/modules-sdk/src/loaders/__tests__/register-modules.ts +++ b/packages/core/modules-sdk/src/loaders/__tests__/register-modules.ts @@ -1,4 +1,4 @@ -import { InternalModuleDeclaration, ModuleDefinition } from "@medusajs/types" +import { ModuleDefinition } from "@medusajs/types" import { ModulesDefinition } from "../../definitions" import { MODULE_SCOPE } from "../../types" import { registerMedusaModule } from "../register-modules" @@ -35,7 +35,9 @@ describe("module definitions loader", () => { [defaultDefinition.key]: defaultDefinition, }) - const res = registerMedusaModule(defaultDefinition.key) + const res = registerMedusaModule({ + moduleKey: defaultDefinition.key, + }) expect(res[defaultDefinition.key]).toEqual( expect.objectContaining({ @@ -50,10 +52,13 @@ describe("module definitions loader", () => { }) it("Resolves a custom module without pre-defined definition", () => { - const res = registerMedusaModule("customModulesABC", { - resolve: testServiceResolved, - options: { - test: 123, + const res = registerMedusaModule({ + moduleKey: "customModulesABC", + moduleDeclaration: { + resolve: testServiceResolved, + options: { + test: 123, + }, }, }) @@ -80,7 +85,10 @@ describe("module definitions loader", () => { [defaultDefinition.key]: defaultDefinition, }) - const res = registerMedusaModule(defaultDefinition.key, false) + const res = registerMedusaModule({ + moduleKey: defaultDefinition.key, + moduleDeclaration: false, + }) expect(res[defaultDefinition.key]).toEqual( expect.objectContaining({ @@ -98,7 +106,10 @@ describe("module definitions loader", () => { }) try { - registerMedusaModule(defaultDefinition.key, false) + registerMedusaModule({ + moduleKey: defaultDefinition.key, + moduleDeclaration: false, + }) } catch (err) { expect(err.message).toEqual( `Module: ${defaultDefinition.label} is required` @@ -118,7 +129,9 @@ describe("module definitions loader", () => { [defaultDefinition.key]: definition, }) - const res = registerMedusaModule(defaultDefinition.key) + const res = registerMedusaModule({ + moduleKey: defaultDefinition.key, + }) expect(res[defaultDefinition.key]).toEqual( expect.objectContaining({ @@ -138,10 +151,10 @@ describe("module definitions loader", () => { [defaultDefinition.key]: defaultDefinition, }) - const res = registerMedusaModule( - defaultDefinition.key, - defaultDefinition.defaultPackage - ) + const res = registerMedusaModule({ + moduleKey: defaultDefinition.key, + moduleDeclaration: defaultDefinition.defaultPackage, + }) expect(res[defaultDefinition.key]).toEqual( expect.objectContaining({ @@ -162,10 +175,13 @@ describe("module definitions loader", () => { [defaultDefinition.key]: defaultDefinition, }) - const res = registerMedusaModule(defaultDefinition.key, { - scope: MODULE_SCOPE.INTERNAL, - resolve: defaultDefinition.defaultPackage, - } as InternalModuleDeclaration) + const res = registerMedusaModule({ + moduleKey: defaultDefinition.key, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resolve: defaultDefinition.defaultPackage as string, + }, + }) expect(res[defaultDefinition.key]).toEqual( expect.objectContaining({ @@ -186,9 +202,12 @@ describe("module definitions loader", () => { [defaultDefinition.key]: defaultDefinition, }) - const res = registerMedusaModule(defaultDefinition.key, { - options: { test: 123 }, - } as any) + const res = registerMedusaModule({ + moduleKey: defaultDefinition.key, + moduleDeclaration: { + options: { test: 123 }, + }, + }) expect(res[defaultDefinition.key]).toEqual( expect.objectContaining({ @@ -209,11 +228,14 @@ describe("module definitions loader", () => { [defaultDefinition.key]: defaultDefinition, }) - const res = registerMedusaModule(defaultDefinition.key, { - resolve: defaultDefinition.defaultPackage, - options: { test: 123 }, - scope: "internal", - } as any) + const res = registerMedusaModule({ + moduleKey: defaultDefinition.key, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resolve: defaultDefinition.defaultPackage as string, + options: { test: 123 }, + }, + }) expect(res[defaultDefinition.key]).toEqual( expect.objectContaining({ diff --git a/packages/core/modules-sdk/src/loaders/module-provider-loader.ts b/packages/core/modules-sdk/src/loaders/module-provider-loader.ts index a3e27f1eeb..f167e5f85a 100644 --- a/packages/core/modules-sdk/src/loaders/module-provider-loader.ts +++ b/packages/core/modules-sdk/src/loaders/module-provider-loader.ts @@ -1,6 +1,7 @@ import { MedusaContainer, ModuleProvider } from "@medusajs/types" import { dynamicImport, + isFileSkipped, isString, lowerCaseFirst, normalizeImportPathWithSource, @@ -53,6 +54,10 @@ export async function loadModuleProvider( ) } + if (isFileSkipped(loadedProvider)) { + return + } + loadedProvider = (loadedProvider as any).default ?? loadedProvider if (!loadedProvider?.services?.length) { diff --git a/packages/core/modules-sdk/src/loaders/register-modules.ts b/packages/core/modules-sdk/src/loaders/register-modules.ts index 3cc95283cb..65bed8a818 100644 --- a/packages/core/modules-sdk/src/loaders/register-modules.ts +++ b/packages/core/modules-sdk/src/loaders/register-modules.ts @@ -14,15 +14,22 @@ import { import { ModulesDefinition } from "../definitions" import { MODULE_SCOPE } from "../types" -export const registerMedusaModule = ( - moduleKey: string, +export const registerMedusaModule = ({ + moduleKey, + moduleDeclaration, + moduleExports, + definition, + cwd, +}: { + moduleKey: string moduleDeclaration?: | Partial | string - | false, - moduleExports?: ModuleExports, + | false + moduleExports?: ModuleExports definition?: ModuleDefinition -): Record => { + cwd?: string +}): Record => { const moduleResolutions = {} as Record const modDefinition = definition ?? ModulesDefinition[moduleKey] @@ -46,7 +53,8 @@ export const registerMedusaModule = ( if (modDefinition === undefined) { moduleResolutions[moduleKey] = getCustomModuleResolution( moduleKey, - moduleDeclaration as InternalModuleDeclaration + moduleDeclaration as InternalModuleDeclaration, + cwd ) return moduleResolutions } @@ -54,7 +62,8 @@ export const registerMedusaModule = ( moduleResolutions[moduleKey] = getInternalModuleResolution( modDefinition, moduleDeclaration as InternalModuleDeclaration, - moduleExports + moduleExports, + cwd ) return moduleResolutions @@ -62,13 +71,15 @@ export const registerMedusaModule = ( function getCustomModuleResolution( key: string, - moduleConfig: InternalModuleDeclaration | string + moduleConfig: InternalModuleDeclaration | string, + cwd: string = process.cwd() ): ModuleResolution { const originalPath = normalizeImportPathWithSource( - (isString(moduleConfig) ? moduleConfig : moduleConfig.resolve) as string + (isString(moduleConfig) ? moduleConfig : moduleConfig.resolve) as string, + cwd ) const resolutionPath = require.resolve(originalPath, { - paths: [process.cwd()], + paths: [cwd], }) const conf = isObject(moduleConfig) @@ -100,14 +111,16 @@ function getCustomModuleResolution( export const registerMedusaLinkModule = ( definition: ModuleDefinition, moduleDeclaration: Partial, - moduleExports?: ModuleExports + moduleExports?: ModuleExports, + cwd: string = process.cwd() ): Record => { const moduleResolutions = {} as Record moduleResolutions[definition.key] = getInternalModuleResolution( definition, moduleDeclaration as InternalModuleDeclaration, - moduleExports + moduleExports, + cwd ) return moduleResolutions @@ -116,7 +129,8 @@ export const registerMedusaLinkModule = ( function getInternalModuleResolution( definition: ModuleDefinition, moduleConfig: InternalModuleDeclaration | string | false, - moduleExports?: ModuleExports + moduleExports?: ModuleExports, + cwd: string = process.cwd() ): ModuleResolution { if (typeof moduleConfig === "boolean") { if (!moduleConfig && definition.isRequired) { @@ -140,10 +154,11 @@ function getInternalModuleResolution( const isStr = isString(moduleConfig) if (isStr || (isObj && moduleConfig.resolve)) { const originalPath = normalizeImportPathWithSource( - (isString(moduleConfig) ? moduleConfig : moduleConfig.resolve) as string + (isString(moduleConfig) ? moduleConfig : moduleConfig.resolve) as string, + cwd ) resolutionPath = require.resolve(originalPath, { - paths: [process.cwd()], + paths: [cwd], }) } diff --git a/packages/core/modules-sdk/src/loaders/utils/__tests__/load-internal.spec.ts b/packages/core/modules-sdk/src/loaders/utils/__tests__/load-internal.spec.ts index f28a7fd2f9..e6474149f9 100644 --- a/packages/core/modules-sdk/src/loaders/utils/__tests__/load-internal.spec.ts +++ b/packages/core/modules-sdk/src/loaders/utils/__tests__/load-internal.spec.ts @@ -16,6 +16,7 @@ import { ModuleProviderService as ModuleServiceWithProviderProvider1 } from "../ import { ModuleProvider2Service as ModuleServiceWithProviderProvider2 } from "../__fixtures__/module-with-providers/provider-2" import { loadInternalModule, loadResources } from "../load-internal" +const container = createMedusaContainer() describe("load internal", () => { describe("loadResources", () => { describe("when loading the module resources from a path", () => { @@ -43,6 +44,7 @@ describe("load internal", () => { ).toBeUndefined() const resources = await loadResources({ + container, moduleResolution, discoveryPath: moduleResolution.resolutionPath as string, }) @@ -125,6 +127,7 @@ describe("load internal", () => { ).toBeUndefined() const resources = await loadResources({ + container, moduleResolution, discoveryPath: moduleResolution.resolutionPath as string, }) @@ -207,6 +210,7 @@ describe("load internal", () => { ).toBeUndefined() const resources = await loadResources({ + container, moduleResolution, discoveryPath: moduleResolution.resolutionPath as string, }) @@ -288,6 +292,7 @@ describe("load internal", () => { ).toBeDefined() const resources = await loadResources({ + container, moduleResolution, discoveryPath: moduleResolution.resolutionPath as string, }) diff --git a/packages/core/modules-sdk/src/loaders/utils/load-internal.ts b/packages/core/modules-sdk/src/loaders/utils/load-internal.ts index 0b01b2a26f..04c4d62a12 100644 --- a/packages/core/modules-sdk/src/loaders/utils/load-internal.ts +++ b/packages/core/modules-sdk/src/loaders/utils/load-internal.ts @@ -1,4 +1,5 @@ import { + ConfigModule, Constructor, IModuleService, InternalModuleDeclaration, @@ -16,14 +17,18 @@ import { ContainerRegistrationKeys, createMedusaContainer, defineJoinerConfig, + discoverFeatureFlagsFromDir, DmlEntity, dynamicImport, + FeatureFlag, getProviderRegistrationKey, + isFileSkipped, isString, MedusaModuleProviderType, MedusaModuleType, Modules, ModulesSdkUtils, + registerFeatureFlag, stringifyCircular, toMikroOrmEntities, } from "@medusajs/utils" @@ -193,6 +198,7 @@ export async function loadInternalModule(args: { if (loadedModule.discoveryPath) { moduleResources = await loadResources({ + container, moduleResolution: resolution, discoveryPath: loadedModule.discoveryPath, logger, @@ -379,6 +385,7 @@ export async function loadInternalModule(args: { } export async function loadModuleMigrations( + container: MedusaContainer, resolution: ModuleResolution, moduleExports?: ModuleExports ): Promise<{ @@ -449,6 +456,7 @@ export async function loadModuleMigrations( if (!runMigrationsCustom || !revertMigrationCustom) { const moduleResources = await loadResources({ + container, moduleResolution: resolution, discoveryPath: loadedModule.discoveryPath, loadedModuleLoaders: loadedModule?.loaders, @@ -536,17 +544,21 @@ async function importAllFromDir(path: string) { return ( await Promise.all(filesToLoad.map((filePath) => dynamicImport(filePath))) - ).flatMap((value) => { - return Object.values(value) - }) + ) + .filter((value) => !isFileSkipped(value)) + .flatMap((value) => { + return Object.values(value) + }) } export async function loadResources({ + container, moduleResolution, discoveryPath, logger, loadedModuleLoaders, }: { + container: MedusaContainer moduleResolution: ModuleResolution discoveryPath: string logger?: Logger @@ -566,8 +578,31 @@ export async function loadResources({ return [] } + const flagDir = resolve(normalizedPath) + const discovered = await discoverFeatureFlagsFromDir(flagDir, 1) + + const configModule = container.resolve( + ContainerRegistrationKeys.CONFIG_MODULE, + { + allowUnregistered: true, + } + ) as ConfigModule + + for (const def of discovered) { + registerFeatureFlag({ + flag: def, + projectConfigFlags: configModule?.featureFlags ?? {}, + router: FeatureFlag, + logger, + }) + } + const [moduleService, services, models, repositories] = await Promise.all([ dynamicImport(modulePath).then((moduleExports) => { + if (isFileSkipped(moduleExports)) { + return + } + const mod = moduleExports.default ?? moduleExports return mod.service }), diff --git a/packages/core/modules-sdk/src/medusa-app.ts b/packages/core/modules-sdk/src/medusa-app.ts index 77131903d6..68366e2388 100644 --- a/packages/core/modules-sdk/src/medusa-app.ts +++ b/packages/core/modules-sdk/src/medusa-app.ts @@ -1,10 +1,13 @@ import { RemoteFetchDataCallback } from "@medusajs/orchestration" import { + ConfigModule, ExternalModuleDeclaration, + FlagSettings, IIndexService, ILinkMigrationsPlanner, InternalModuleDeclaration, LoadedModule, + Logger, MedusaContainer, ModuleBootstrapDeclaration, ModuleDefinition, @@ -16,7 +19,9 @@ import { import { ContainerRegistrationKeys, createMedusaContainer, + discoverFeatureFlagsFromDir, dynamicImport, + FeatureFlag, GraphQLUtils, isObject, isSharedConnectionSymbol, @@ -26,6 +31,7 @@ import { Modules, ModulesSdkUtils, promiseAll, + registerFeatureFlag, } from "@medusajs/utils" import { asValue } from "awilix" import { Link } from "./link" @@ -79,6 +85,7 @@ export async function loadModules(args: { migrationOnly?: boolean loaderOnly?: boolean workerMode?: "shared" | "worker" | "server" + cwd?: string }) { const { modulesConfig, @@ -87,6 +94,7 @@ export async function loadModules(args: { migrationOnly = false, loaderOnly = false, workerMode = "shared" as ModuleBootstrapOptions["workerMode"], + cwd, } = args const allModules = {} as any @@ -155,6 +163,7 @@ export async function loadModules(args: { migrationOnly, loaderOnly, workerMode, + cwd, })) as LoadedModule[] if (loaderOnly) { @@ -285,7 +294,7 @@ export type MedusaAppOptions = { sharedResourcesConfig?: SharedResources loadedModules?: LoadedModule[] servicesConfig?: ModuleJoinerConfig[] - modulesConfigPath?: string + medusaConfigPath?: string modulesConfigFileName?: string modulesConfig?: MedusaModuleConfig linkModules?: RegisterModuleJoinerConfig | RegisterModuleJoinerConfig[] @@ -296,13 +305,14 @@ export type MedusaAppOptions = { * Forces the modules bootstrapper to only run the modules loaders and return prematurely */ loaderOnly?: boolean + cwd?: string } async function MedusaApp_({ sharedContainer, sharedResourcesConfig, servicesConfig, - modulesConfigPath, + medusaConfigPath, modulesConfigFileName, modulesConfig, linkModules, @@ -311,11 +321,32 @@ async function MedusaApp_({ migrationOnly = false, loaderOnly = false, workerMode = "shared", + cwd = process.cwd(), }: MedusaAppOptions & { migrationOnly?: boolean } = {}): Promise { const sharedContainer_ = createMedusaContainer({}, sharedContainer) + const config = sharedContainer_.resolve( + ContainerRegistrationKeys.CONFIG_MODULE, + { + allowUnregistered: true, + } + ) as ConfigModule + const logger = sharedContainer_.resolve(ContainerRegistrationKeys.LOGGER, { + allowUnregistered: true, + }) as Logger + + const discovered = await discoverFeatureFlagsFromDir(cwd) + for (const def of discovered) { + registerFeatureFlag({ + flag: def as FlagSettings, + projectConfigFlags: config?.featureFlags ?? {}, + router: FeatureFlag, + logger, + }) + } + const onApplicationShutdown = async () => { await promiseAll([ MedusaModule.onApplicationShutdown(), @@ -335,8 +366,7 @@ async function MedusaApp_({ modulesConfig ?? ( await dynamicImport( - modulesConfigPath ?? - process.cwd() + (modulesConfigFileName ?? "/modules-config") + medusaConfigPath ?? cwd + (modulesConfigFileName ?? "/modules-config") ) ).default @@ -391,6 +421,7 @@ async function MedusaApp_({ migrationOnly, loaderOnly, workerMode, + cwd, }) if (loaderOnly) { @@ -512,6 +543,7 @@ async function MedusaApp_({ container: sharedContainer, options: moduleResolution.options, moduleExports: moduleResolution.moduleExports as ModuleExports, + cwd, } if (action === "revert") { diff --git a/packages/core/modules-sdk/src/medusa-module.ts b/packages/core/modules-sdk/src/medusa-module.ts index d51fe4fac4..aea24637cc 100644 --- a/packages/core/modules-sdk/src/medusa-module.ts +++ b/packages/core/modules-sdk/src/medusa-module.ts @@ -58,6 +58,7 @@ export type MigrationOptions = { container?: MedusaContainer options?: Record moduleExports?: ModuleExports + cwd?: string } export type ModuleBootstrapOptions = { @@ -80,6 +81,7 @@ export type ModuleBootstrapOptions = { */ loaderOnly?: boolean workerMode?: "shared" | "worker" | "server" + cwd?: string } export type LinkModuleBootstrapOptions = { @@ -87,6 +89,7 @@ export type LinkModuleBootstrapOptions = { declaration?: InternalModuleDeclaration moduleExports?: ModuleExports injectedDependencies?: Record + cwd?: string } export type RegisterModuleJoinerConfig = @@ -289,10 +292,12 @@ class MedusaModule { migrationOnly, loaderOnly, workerMode, + cwd, }: { migrationOnly?: boolean loaderOnly?: boolean workerMode?: ModuleBootstrapOptions["workerMode"] + cwd?: string } ): Promise< { @@ -303,6 +308,7 @@ class MedusaModule { migrationOnly, loaderOnly, workerMode, + cwd, }) } @@ -330,6 +336,7 @@ class MedusaModule { migrationOnly, loaderOnly, workerMode, + cwd, }: ModuleBootstrapOptions): Promise<{ [key: string]: T }> { @@ -349,6 +356,7 @@ class MedusaModule { migrationOnly, loaderOnly, workerMode, + cwd, } ) @@ -369,16 +377,18 @@ class MedusaModule { protected static async bootstrap_( modulesOptions: Omit< ModuleBootstrapOptions, - "migrationOnly" | "loaderOnly" | "workerMode" + "migrationOnly" | "loaderOnly" | "workerMode" | "cwd" >[], { migrationOnly, loaderOnly, workerMode, + cwd = process.cwd(), }: { migrationOnly?: boolean loaderOnly?: boolean workerMode?: "shared" | "worker" | "server" + cwd?: string } ): Promise< { @@ -464,12 +474,13 @@ class MedusaModule { } } - const moduleResolutions = registerMedusaModule( + const moduleResolutions = registerMedusaModule({ moduleKey, - modDeclaration!, + moduleDeclaration: modDeclaration!, moduleExports, - moduleDefinition - ) + definition: moduleDefinition, + cwd, + }) const logger_ = container.resolve(ContainerRegistrationKeys.LOGGER, { @@ -617,6 +628,7 @@ class MedusaModule { declaration, moduleExports, injectedDependencies, + cwd, }: LinkModuleBootstrapOptions): Promise<{ [key: string]: unknown }> { @@ -672,7 +684,8 @@ class MedusaModule { const moduleResolutions = registerMedusaLinkModule( moduleDefinition, modDeclaration as InternalModuleDeclaration, - moduleExports + moduleExports, + cwd ) const logger_ = @@ -749,11 +762,16 @@ class MedusaModule { moduleExports, moduleKey, modulePath, + cwd, }: MigrationOptions): Promise { - const moduleResolutions = registerMedusaModule(moduleKey, { - scope: MODULE_SCOPE.INTERNAL, - resolve: modulePath, - options, + const moduleResolutions = registerMedusaModule({ + moduleKey, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resolve: modulePath, + options, + }, + cwd, }) const logger_ = @@ -765,6 +783,7 @@ class MedusaModule { for (const mod in moduleResolutions) { const { generateMigration } = await loadModuleMigrations( + container, moduleResolutions[mod], moduleExports ) @@ -785,11 +804,16 @@ class MedusaModule { moduleExports, moduleKey, modulePath, + cwd, }: MigrationOptions): Promise { - const moduleResolutions = registerMedusaModule(moduleKey, { - scope: MODULE_SCOPE.INTERNAL, - resolve: modulePath, - options, + const moduleResolutions = registerMedusaModule({ + moduleKey, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resolve: modulePath, + options, + }, + cwd, }) const logger_ = @@ -801,6 +825,7 @@ class MedusaModule { for (const mod in moduleResolutions) { const { runMigrations } = await loadModuleMigrations( + container, moduleResolutions[mod], moduleExports ) @@ -821,11 +846,16 @@ class MedusaModule { moduleExports, moduleKey, modulePath, + cwd, }: MigrationOptions): Promise { - const moduleResolutions = registerMedusaModule(moduleKey, { - scope: MODULE_SCOPE.INTERNAL, - resolve: modulePath, - options, + const moduleResolutions = registerMedusaModule({ + moduleKey, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resolve: modulePath, + options, + }, + cwd, }) const logger_ = @@ -837,6 +867,7 @@ class MedusaModule { for (const mod in moduleResolutions) { const { revertMigration } = await loadModuleMigrations( + container, moduleResolutions[mod], moduleExports ) diff --git a/packages/core/types/src/common/config-file.ts b/packages/core/types/src/common/config-file.ts new file mode 100644 index 0000000000..dfe8794ca8 --- /dev/null +++ b/packages/core/types/src/common/config-file.ts @@ -0,0 +1,7 @@ +/** + * The configuration accepted by the "defineFileConfig" helper + */ +export type InputFileConfig = { + path?: string + isDisabled(): boolean +} diff --git a/packages/core/types/src/common/config-module.ts b/packages/core/types/src/common/config-module.ts index 7f5e14c18f..69f9a79eca 100644 --- a/packages/core/types/src/common/config-module.ts +++ b/packages/core/types/src/common/config-module.ts @@ -1,8 +1,8 @@ +import type { Secret, SignOptions, VerifyOptions } from "jsonwebtoken" import { ExternalModuleDeclaration, InternalModuleDeclaration, } from "../modules-sdk" -import type { SignOptions, Secret, VerifyOptions } from "jsonwebtoken" import type { RedisOptions } from "ioredis" import { ConnectionOptions } from "node:tls" @@ -1027,7 +1027,7 @@ export type ConfigModule = { * * The `featureFlags`'s value is an object. Its properties are the names of the feature flags, and their value is a boolean indicating whether the feature flag is enabled. * - * You can find available feature flags and their key name [here](https://github.com/medusajs/medusa/tree/develop/packages/medusa/src/loaders/feature-flags). + * You can find available feature flags and their key name [here](https://github.com/medusajs/medusa/tree/develop/packages/medusa/src/feature-flags). * * @example * ```ts title="medusa-config.ts" diff --git a/packages/core/types/src/common/index.ts b/packages/core/types/src/common/index.ts index 521bab841f..2a41deb628 100644 --- a/packages/core/types/src/common/index.ts +++ b/packages/core/types/src/common/index.ts @@ -1,6 +1,7 @@ export * from "./batch" export * from "./camel-case" export * from "./common" +export * from "./config-file" export * from "./config-module" export * from "./medusa-cli" export * from "./medusa-container" diff --git a/packages/core/utils/src/common/__tests__/flatten-object-to-key-value-pairs.spec.ts b/packages/core/utils/src/common/__tests__/flatten-object-to-key-value-pairs.spec.ts index 6f88850841..c594e25d7e 100644 --- a/packages/core/utils/src/common/__tests__/flatten-object-to-key-value-pairs.spec.ts +++ b/packages/core/utils/src/common/__tests__/flatten-object-to-key-value-pairs.spec.ts @@ -167,7 +167,6 @@ describe("flattenObjectToKeyValuePairs", function () { } const keyValueParis = flattenObjectToKeyValuePairs(cart) - console.log(JSON.stringify(keyValueParis, null, 2)) expect(keyValueParis).toEqual({ id: "cart_01JRDH08QD8CZ0KJDVE410KM1J", currency_code: "usd", diff --git a/packages/core/utils/src/common/define-file-config.ts b/packages/core/utils/src/common/define-file-config.ts new file mode 100644 index 0000000000..7ac1d217ed --- /dev/null +++ b/packages/core/utils/src/common/define-file-config.ts @@ -0,0 +1,28 @@ +import { InputFileConfig } from "@medusajs/types" +import { getCallerFilePath } from "./get-caller-file-path" + +export const MEDUSA_SKIP_FILE = Symbol.for("__MEDUSA_SKIP_FILE__") +/** + * The "defineFileConfig" helper can be used to define the configuration + * of any file auto-loaded by Medusa. + * + * It is used to avoid loading files that are not required. Like a feature flag + * that is disabled. + */ +const FILE_CONFIGS = new Map() +export function defineFileConfig(config?: InputFileConfig) { + const filePath = config?.path ?? getCallerFilePath() + FILE_CONFIGS.set(filePath, config) +} + +export function getDefinedFileConfig(path?: string) { + return FILE_CONFIGS.get(path) +} + +export function isFileDisabled(path?: string) { + return !!getDefinedFileConfig(path)?.isDisabled?.() +} + +export function isFileSkipped(exported: unknown) { + return !!exported?.[MEDUSA_SKIP_FILE] +} diff --git a/packages/core/utils/src/common/dynamic-import.ts b/packages/core/utils/src/common/dynamic-import.ts index 48c6c9bc24..b53c276ab2 100644 --- a/packages/core/utils/src/common/dynamic-import.ts +++ b/packages/core/utils/src/common/dynamic-import.ts @@ -1,3 +1,4 @@ +import { isFileDisabled, MEDUSA_SKIP_FILE } from "./define-file-config" import { resolveExports } from "./resolve-exports" /** @@ -13,5 +14,12 @@ import { resolveExports } from "./resolve-exports" */ export async function dynamicImport(path: string): Promise { const module = require(path) - return resolveExports(module) + + const exported = resolveExports(module) + + if (isFileDisabled(path)) { + exported[MEDUSA_SKIP_FILE] = true + } + + return exported } diff --git a/packages/core/utils/src/common/index.ts b/packages/core/utils/src/common/index.ts index c593b83634..67cfaad8ab 100644 --- a/packages/core/utils/src/common/index.ts +++ b/packages/core/utils/src/common/index.ts @@ -15,6 +15,7 @@ export * from "./deep-equal-obj" export * from "./deep-flat-map" export * from "./deep-merge" export * from "./define-config" +export * from "./define-file-config" export * from "./dynamic-import" export * from "./env-editor" export * from "./errors" @@ -50,6 +51,7 @@ export * from "./map-object-to" export * from "./medusa-container" export * from "./merge-metadata" export * from "./merge-plugin-modules" +export * from "./normalize-csv-value" export * from "./normalize-import-path-with-source" export * from "./object-from-string-path" export * from "./object-to-string-path" @@ -69,6 +71,7 @@ export * from "./remove-nullisih" export * from "./remove-undefined" export * from "./remove-undefined-properties" export * from "./resolve-exports" +export * from "./retry-execution" export * from "./rules" export * from "./selector-constraints-to-string" export * from "./serialize-error" @@ -88,5 +91,3 @@ export * from "./upper-case-first" export * from "./validate-handle" export * from "./validate-module-name" export * from "./wrap-handler" -export * from "./normalize-csv-value" -export * from "./retry-execution" diff --git a/packages/core/utils/src/common/normalize-import-path-with-source.ts b/packages/core/utils/src/common/normalize-import-path-with-source.ts index a295570371..6ebd439d6b 100644 --- a/packages/core/utils/src/common/normalize-import-path-with-source.ts +++ b/packages/core/utils/src/common/normalize-import-path-with-source.ts @@ -5,7 +5,8 @@ import { join } from "path" * @param path */ export function normalizeImportPathWithSource( - path: string | undefined + path: string | undefined, + cwd: string = process.cwd() ): string { let normalizePath = path @@ -19,7 +20,7 @@ export function normalizeImportPathWithSource( * "./src" directory inside it. */ let sourceDir = normalizePath.startsWith("./src") ? "./" : "./src" - normalizePath = join(process.cwd(), sourceDir, normalizePath) + normalizePath = join(cwd, sourceDir, normalizePath) } return normalizePath ?? "" diff --git a/packages/core/utils/src/common/read-dir-recursive.ts b/packages/core/utils/src/common/read-dir-recursive.ts index bc5c175c37..9b1b4600e7 100644 --- a/packages/core/utils/src/common/read-dir-recursive.ts +++ b/packages/core/utils/src/common/read-dir-recursive.ts @@ -25,10 +25,12 @@ export async function readDirRecursive( dir: string, options?: { ignoreMissing?: boolean + maxDepth?: number } ): Promise { let allEntries: Dirent[] = [] - const readRecursive = async (dir: string) => { + const readRecursive = async (dir: string, depth: number = 1) => { + const maxDepth = options?.maxDepth ?? Infinity try { const entries = await readdir(dir, { withFileTypes: true }) for (const entry of entries) { @@ -38,14 +40,15 @@ export async function readDirRecursive( }) allEntries.push(entry) - if (entry.isDirectory()) { - await readRecursive(fullPath) + if (entry.isDirectory() && depth < maxDepth) { + await readRecursive(fullPath, depth + 1) } } } catch (error) { if (options?.ignoreMissing && error.code === "ENOENT") { return } + throw error } } diff --git a/packages/core/utils/src/dal/index.ts b/packages/core/utils/src/dal/index.ts index 43f10afd5c..0a6cb6b23c 100644 --- a/packages/core/utils/src/dal/index.ts +++ b/packages/core/utils/src/dal/index.ts @@ -1,10 +1,11 @@ +export * from "./mikro-orm/base-entity" export * from "./mikro-orm/big-number-field" +export * from "./mikro-orm/custom-db-migrator" +export * from "./mikro-orm/decorators/searchable" export * from "./mikro-orm/mikro-orm-create-connection" export * from "./mikro-orm/mikro-orm-free-text-search-filter" export * from "./mikro-orm/mikro-orm-repository" -export * from "./mikro-orm/mikro-orm-soft-deletable-filter" export * from "./mikro-orm/mikro-orm-serializer" -export * from "./mikro-orm/base-entity" +export * from "./mikro-orm/mikro-orm-soft-deletable-filter" export * from "./mikro-orm/utils" -export * from "./mikro-orm/decorators/searchable" export * from "./utils" diff --git a/packages/core/utils/src/dal/mikro-orm/custom-db-migrator.ts b/packages/core/utils/src/dal/mikro-orm/custom-db-migrator.ts new file mode 100644 index 0000000000..fed9108a1f --- /dev/null +++ b/packages/core/utils/src/dal/mikro-orm/custom-db-migrator.ts @@ -0,0 +1,59 @@ +import { Constructor } from "@medusajs/types" +import { MikroORM, Utils } from "@mikro-orm/core" +import { + Migrator as BaseMigrator, + Migration, + UmzugMigration, +} from "@mikro-orm/migrations" +import { isFileDisabled, isFileSkipped } from "../../common/define-file-config" +import { dynamicImport } from "../../common/dynamic-import" + +export class CustomDBMigrator extends BaseMigrator { + static register(orm: MikroORM): void { + orm.config.registerExtension( + "@mikro-orm/migrator", + () => new CustomDBMigrator(orm.em as any) + ) + } + + resolve(params) { + require(params.path) + if (isFileDisabled(params.path)) { + return { + name: "Noop", + up: () => {}, + down: () => {}, + } as any + } + + const $this = this as any + const createMigrationHandler = async (method) => { + const migration = await Utils.dynamicImport(params.path) + const MigrationClass = Object.values( + migration + )[0] as Constructor + const instance = new MigrationClass($this.driver, $this.config) + await $this.runner.run(instance, method) + } + + return { + name: $this.storage.getMigrationName(params.name), + up: () => createMigrationHandler("up"), + down: () => createMigrationHandler("down"), + } + } + + async getPendingMigrations(): Promise { + const pending = await super.getPendingMigrations() + + // Filter out migrations that are disabled by file config + return pending.filter(async (pendingFile: UmzugMigration) => { + const migration = await dynamicImport(pendingFile.path!) + if (isFileSkipped(migration)) { + return false + } + + return true + }) + } +} diff --git a/packages/core/utils/src/dal/mikro-orm/mikro-orm-create-connection.ts b/packages/core/utils/src/dal/mikro-orm/mikro-orm-create-connection.ts index c0caf6f99b..11736dcf66 100644 --- a/packages/core/utils/src/dal/mikro-orm/mikro-orm-create-connection.ts +++ b/packages/core/utils/src/dal/mikro-orm/mikro-orm-create-connection.ts @@ -3,6 +3,7 @@ import { Filter as MikroORMFilter } from "@mikro-orm/core" import { TSMigrationGenerator } from "@mikro-orm/migrations" import { isString, retryExecution, stringifyCircular } from "../../common" import { normalizeMigrationSQL } from "../utils" +import { CustomDBMigrator } from "./custom-db-migrator" type FilterDef = Parameters[0] @@ -107,6 +108,7 @@ export async function mikroOrmCreateConnection( false ), }, + extensions: [CustomDBMigrator], // We don't want to do any DB checks when establishing the connection. This happens once when creating the pg_connection, and it can happen again explicitly if necessary. connect: false, ensureDatabase: false, diff --git a/packages/core/utils/src/feature-flags/analytics.ts b/packages/core/utils/src/feature-flags/analytics.ts deleted file mode 100644 index 46923095fd..0000000000 --- a/packages/core/utils/src/feature-flags/analytics.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const AnalyticsFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "analytics", - default_val: true, - env_key: "MEDUSA_FF_ANALYTICS", - description: - "Enable Medusa to collect data on usage, errors and performance for the purpose of improving the product", -} diff --git a/packages/core/utils/src/feature-flags/discover-feature-flags.ts b/packages/core/utils/src/feature-flags/discover-feature-flags.ts new file mode 100644 index 0000000000..522198fdb8 --- /dev/null +++ b/packages/core/utils/src/feature-flags/discover-feature-flags.ts @@ -0,0 +1,70 @@ +import { FlagSettings } from "@medusajs/types" +import { readdir } from "fs/promises" +import { join, normalize } from "path" +import { dynamicImport, isString, readDirRecursive } from "../common" + +const excludedFiles = ["index.js", "index.ts"] +const excludedExtensions = [".d.ts", ".d.ts.map", ".js.map"] + +function isFeatureFlag(flag: unknown): flag is FlagSettings { + const f = flag as any + return !!f && isString(f.key) && isString(f.env_key) +} + +/** + * Discover feature flag definitions from a directory and subdirectories + */ +export async function discoverFeatureFlagsFromDir( + sourcePath?: string, + maxDepth: number = 2 +): Promise { + if (!sourcePath) { + return [] + } + + const root = normalize(sourcePath) + const discovered: FlagSettings[] = [] + + const allEntries = await readDirRecursive(root, { + ignoreMissing: true, + maxDepth, + }) + + const featureFlagDirs = allEntries + .filter((e) => e.isDirectory() && e.name === "feature-flags") + .map((e) => join((e as any).path as string, e.name)) + + if (!featureFlagDirs.length) { + return discovered + } + + await Promise.all( + featureFlagDirs.map(async (scanDir) => { + const entries = await readdir(scanDir, { withFileTypes: true }) + await Promise.all( + entries.map(async (entry) => { + if (entry.isDirectory()) { + return + } + + if ( + excludedExtensions.some((ext) => entry.name.endsWith(ext)) || + excludedFiles.includes(entry.name) + ) { + return + } + + const fileExports = await dynamicImport(join(scanDir, entry.name)) + const values = Object.values(fileExports) + for (const value of values) { + if (isFeatureFlag(value)) { + discovered.push(value) + } + } + }) + ) + }) + ) + + return discovered +} diff --git a/packages/core/utils/src/feature-flags/utils/flag-router.ts b/packages/core/utils/src/feature-flags/flag-router.ts similarity index 96% rename from packages/core/utils/src/feature-flags/utils/flag-router.ts rename to packages/core/utils/src/feature-flags/flag-router.ts index 5879b3aac3..3b321fe993 100644 --- a/packages/core/utils/src/feature-flags/utils/flag-router.ts +++ b/packages/core/utils/src/feature-flags/flag-router.ts @@ -1,5 +1,5 @@ import { FeatureFlagTypes } from "@medusajs/types" -import { isObject, isString } from "../../common" +import { isObject, isString } from "../common" export class FlagRouter implements FeatureFlagTypes.IFlagRouter { private readonly flags: Record> = {} @@ -75,3 +75,5 @@ export class FlagRouter implements FeatureFlagTypes.IFlagRouter { })) } } + +export const FeatureFlag = new FlagRouter({}) diff --git a/packages/core/utils/src/feature-flags/index.ts b/packages/core/utils/src/feature-flags/index.ts index 1842f1ecec..41e69eddfc 100644 --- a/packages/core/utils/src/feature-flags/index.ts +++ b/packages/core/utils/src/feature-flags/index.ts @@ -1,10 +1,3 @@ -export * from "./analytics" -export * from "./many-to-many-inventory" -export * from "./medusa-v2" -export * from "./order-editing" -export * from "./product-categories" -export * from "./publishable-api-keys" -export * from "./sales-channels" -export * from "./tax-inclusive-pricing" -export * from "./utils" -export * from "./workflows" +export * from "./discover-feature-flags" +export * from "./flag-router" +export * from "./register-flag" diff --git a/packages/core/utils/src/feature-flags/many-to-many-inventory.ts b/packages/core/utils/src/feature-flags/many-to-many-inventory.ts deleted file mode 100644 index c2bd4fb6bd..0000000000 --- a/packages/core/utils/src/feature-flags/many-to-many-inventory.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const ManyToManyInventoryFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "many_to_many_inventory", - default_val: false, - env_key: "MEDUSA_FF_MANY_TO_MANY_INVENTORY", - description: - "Enable capability to have many to many relationship between inventory items and variants", -} diff --git a/packages/core/utils/src/feature-flags/medusa-v2.ts b/packages/core/utils/src/feature-flags/medusa-v2.ts deleted file mode 100644 index 3658593673..0000000000 --- a/packages/core/utils/src/feature-flags/medusa-v2.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const MedusaV2Flag: FeatureFlagTypes.FlagSettings = { - key: "medusa_v2", - default_val: false, - env_key: "MEDUSA_FF_MEDUSA_V2", - description: "[WIP] Enable Medusa V2", -} diff --git a/packages/core/utils/src/feature-flags/order-editing.ts b/packages/core/utils/src/feature-flags/order-editing.ts deleted file mode 100644 index 4c697e0f72..0000000000 --- a/packages/core/utils/src/feature-flags/order-editing.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const OrderEditingFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "order_editing", - default_val: true, - env_key: "MEDUSA_FF_ORDER_EDITING", - description: "[WIP] Enable the order editing feature", -} diff --git a/packages/core/utils/src/feature-flags/product-categories.ts b/packages/core/utils/src/feature-flags/product-categories.ts deleted file mode 100644 index 99222691c8..0000000000 --- a/packages/core/utils/src/feature-flags/product-categories.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const ProductCategoryFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "product_categories", - default_val: false, - env_key: "MEDUSA_FF_PRODUCT_CATEGORIES", - description: "[WIP] Enable the product categories feature", -} diff --git a/packages/core/utils/src/feature-flags/publishable-api-keys.ts b/packages/core/utils/src/feature-flags/publishable-api-keys.ts deleted file mode 100644 index ef4135465f..0000000000 --- a/packages/core/utils/src/feature-flags/publishable-api-keys.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const PublishableAPIKeysFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "publishable_api_keys", - default_val: true, - env_key: "MEDUSA_FF_PUBLISHABLE_API_KEYS", - description: "[WIP] Enable the publishable API keys feature", -} diff --git a/packages/core/utils/src/feature-flags/register-flag.ts b/packages/core/utils/src/feature-flags/register-flag.ts new file mode 100644 index 0000000000..cc56bcc466 --- /dev/null +++ b/packages/core/utils/src/feature-flags/register-flag.ts @@ -0,0 +1,66 @@ +import { FlagSettings, Logger } from "@medusajs/types" +import { + isDefined, + isObject, + isString, + isTruthy, + objectFromStringPath, +} from "../common" +import { FlagRouter } from "./flag-router" + +export type RegisterFeatureFlagOptions = { + flag: FlagSettings + projectConfigFlags: Record> + router: FlagRouter + logger?: Logger + track?: (key: string) => void +} + +/** + * Registers a feature flag on the provided router. + * Resolving precedence: + * - env overrides + * - project config overrides + * - default value + */ +export function registerFeatureFlag(options: RegisterFeatureFlagOptions) { + const { flag, projectConfigFlags, router, logger, track } = options + + let value: boolean | Record = isTruthy(flag.default_val) + let from: string | undefined + + if (isDefined(process.env[flag.env_key])) { + from = "environment" + const envVal = process.env[flag.env_key] + + value = isTruthy(envVal) + + const parsedFromEnv = isString(envVal) ? envVal.split(",") : [] + if (parsedFromEnv.length > 1) { + value = objectFromStringPath(parsedFromEnv) + } + } else if (isDefined(projectConfigFlags[flag.key])) { + from = "project config" + + const pc = projectConfigFlags[flag.key] as string | boolean + value = isTruthy(pc) + + if (isObject(projectConfigFlags[flag.key])) { + value = projectConfigFlags[flag.key] as Record + } + } + + if (logger && from) { + logger.info( + `Using flag ${flag.env_key} from ${from} with value ${JSON.stringify( + value + )}` + ) + } + + if (track && value === true) { + track(flag.key) + } + + router.setFlag(flag.key, value) +} diff --git a/packages/core/utils/src/feature-flags/sales-channels.ts b/packages/core/utils/src/feature-flags/sales-channels.ts deleted file mode 100644 index d4421d65c7..0000000000 --- a/packages/core/utils/src/feature-flags/sales-channels.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const SalesChannelFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "sales_channels", - default_val: true, - env_key: "MEDUSA_FF_SALES_CHANNELS", - description: "[WIP] Enable the sales channels feature", -} diff --git a/packages/core/utils/src/feature-flags/tax-inclusive-pricing.ts b/packages/core/utils/src/feature-flags/tax-inclusive-pricing.ts deleted file mode 100644 index 13e6a84baa..0000000000 --- a/packages/core/utils/src/feature-flags/tax-inclusive-pricing.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const TaxInclusivePricingFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "tax_inclusive_pricing", - default_val: false, - env_key: "MEDUSA_FF_TAX_INCLUSIVE_PRICING", - description: "[WIP] Enable tax inclusive pricing", -} diff --git a/packages/core/utils/src/feature-flags/utils/index.ts b/packages/core/utils/src/feature-flags/utils/index.ts deleted file mode 100644 index a24fa54af5..0000000000 --- a/packages/core/utils/src/feature-flags/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./flag-router" diff --git a/packages/core/utils/src/feature-flags/workflows.ts b/packages/core/utils/src/feature-flags/workflows.ts deleted file mode 100644 index 6e17448090..0000000000 --- a/packages/core/utils/src/feature-flags/workflows.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FeatureFlagTypes } from "@medusajs/types" - -export const WorkflowsFeatureFlag: FeatureFlagTypes.FlagSettings = { - key: "workflows", - default_val: false, - env_key: "MEDUSA_FF_WORKFLOWS", - description: "[WIP] Enable workflows", -} diff --git a/packages/core/utils/src/migrations/index.ts b/packages/core/utils/src/migrations/index.ts index 236edd535d..4ee283d243 100644 --- a/packages/core/utils/src/migrations/index.ts +++ b/packages/core/utils/src/migrations/index.ts @@ -9,6 +9,7 @@ import { EventEmitter } from "events" import { access, mkdir, rename, writeFile } from "fs/promises" import { dirname, join } from "path" import { readDir } from "../common" +import { CustomDBMigrator } from "../dal/mikro-orm/custom-db-migrator" /** * Events emitted by the migrations class @@ -50,6 +51,7 @@ export class Migrations extends EventEmitter { ...this.#configOrConnection.migrations, silent: true, }, + extensions: [CustomDBMigrator], }) ) } 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 index 998ed3faea..34c658f2b3 100644 --- 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 @@ -1,3 +1,4 @@ +import { CustomDBMigrator } from "../../dal/mikro-orm/custom-db-migrator" import { defineMikroOrmCliConfig } from "../mikro-orm-cli-config-builder" const moduleName = "myTestService" @@ -28,6 +29,7 @@ describe("defineMikroOrmCliConfig", () => { generator: expect.any(Function), snapshotName: ".snapshot-medusa-my-test", }, + extensions: [CustomDBMigrator], }) }) @@ -47,6 +49,7 @@ describe("defineMikroOrmCliConfig", () => { generator: expect.any(Function), snapshotName: ".snapshot-medusa-my-test", }, + extensions: [CustomDBMigrator], }) }) }) diff --git a/packages/core/utils/src/modules-sdk/migration-scripts/seed.ts b/packages/core/utils/src/modules-sdk/migration-scripts/seed.ts index 9c8724177b..f42a8d34c3 100644 --- a/packages/core/utils/src/modules-sdk/migration-scripts/seed.ts +++ b/packages/core/utils/src/modules-sdk/migration-scripts/seed.ts @@ -2,9 +2,9 @@ import { LoaderOptions, Logger, ModulesSdkTypes } from "@medusajs/types" import { EntitySchema } from "@mikro-orm/core" import { EOL } from "os" import { resolve } from "path" +import { dynamicImport, isFileSkipped } from "../../common" import { mikroOrmCreateConnection } from "../../dal" import { loadDatabaseConfig } from "../load-module-database-config" -import { dynamicImport } from "../../common" /** * Utility function to build a seed script that will insert the seed data. @@ -52,6 +52,10 @@ export function buildSeedScript({ } ) + if (isFileSkipped(dataSeed)) { + return + } + const dbData = loadDatabaseConfig(moduleName, options)! const entities = Object.values(models) as unknown as EntitySchema[] 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 index f5e41e46e7..02574d111a 100644 --- 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 @@ -7,7 +7,7 @@ import type { } from "@mikro-orm/core" import { defineConfig } from "@mikro-orm/postgresql" import { kebabCase } from "../common" -import { CustomTsMigrationGenerator } from "../dal" +import { CustomDBMigrator, CustomTsMigrationGenerator } from "../dal" import { DmlEntity, toMikroOrmEntities } from "../dml" type Options = Partial> & { @@ -65,5 +65,6 @@ export function defineMikroOrmCliConfig( generator: CustomTsMigrationGenerator, ...options.migrations, }, + extensions: [CustomDBMigrator], }) as ReturnedOptions } diff --git a/packages/core/workflows-sdk/src/medusa-workflow.ts b/packages/core/workflows-sdk/src/medusa-workflow.ts index 04602d0b13..e4639f4ac0 100644 --- a/packages/core/workflows-sdk/src/medusa-workflow.ts +++ b/packages/core/workflows-sdk/src/medusa-workflow.ts @@ -22,6 +22,10 @@ class MedusaWorkflow { MedusaWorkflow.workflows[workflowId] = exportedWorkflow } + static unregisterWorkflow(workflowId) { + delete MedusaWorkflow.workflows[workflowId] + } + static getWorkflow(workflowId): ExportedWorkflow { return MedusaWorkflow.workflows[workflowId] as unknown as ExportedWorkflow } diff --git a/packages/medusa-test-utils/src/database.ts b/packages/medusa-test-utils/src/database.ts index 9471efab55..621f6358df 100644 --- a/packages/medusa-test-utils/src/database.ts +++ b/packages/medusa-test-utils/src/database.ts @@ -1,4 +1,6 @@ import { logger } from "@medusajs/framework/logger" +import { CustomDBMigrator } from "@medusajs/framework/utils" + import { defineConfig, MikroORM, @@ -54,6 +56,7 @@ export function getMikroOrmConfig({ pathTs: pathToMigrations, silent: true, }, + extensions: [CustomDBMigrator], }) } diff --git a/packages/medusa-test-utils/src/init-modules.ts b/packages/medusa-test-utils/src/init-modules.ts index c15c2e6665..fc0beb6784 100644 --- a/packages/medusa-test-utils/src/init-modules.ts +++ b/packages/medusa-test-utils/src/init-modules.ts @@ -1,3 +1,4 @@ +import { logger } from "@medusajs/framework/logger" import { ExternalModuleDeclaration, InternalModuleDeclaration, @@ -8,7 +9,6 @@ import { createPgConnection, promiseAll, } from "@medusajs/framework/utils" -import { logger } from "@medusajs/framework/logger" export interface InitModulesOptions { injectedDependencies?: Record @@ -24,6 +24,7 @@ export interface InitModulesOptions { } joinerConfig?: ModuleJoinerConfig[] preventConnectionDestroyWarning?: boolean + cwd?: string } export async function initModules({ @@ -32,6 +33,7 @@ export async function initModules({ modulesConfig, joinerConfig, preventConnectionDestroyWarning = false, + cwd, }: InitModulesOptions) { const moduleSdkImports = require("@medusajs/framework/modules-sdk") @@ -55,6 +57,7 @@ export async function initModules({ modulesConfig, servicesConfig: joinerConfig, injectedDependencies, + cwd, }) await medusaApp.onApplicationStart() diff --git a/packages/medusa-test-utils/src/medusa-test-runner-utils/bootstrap-app.ts b/packages/medusa-test-utils/src/medusa-test-runner-utils/bootstrap-app.ts index e2b81759d7..afe57331f6 100644 --- a/packages/medusa-test-utils/src/medusa-test-runner-utils/bootstrap-app.ts +++ b/packages/medusa-test-utils/src/medusa-test-runner-utils/bootstrap-app.ts @@ -1,10 +1,10 @@ +import { logger } from "@medusajs/framework/logger" +import { MedusaContainer } from "@medusajs/framework/types" +import { GracefulShutdownServer, promiseAll } from "@medusajs/framework/utils" import express from "express" import getPort from "get-port" import { resolve } from "path" -import { MedusaContainer } from "@medusajs/framework/types" import { applyEnvVarsToProcess, execOrTimeout } from "./utils" -import { promiseAll, GracefulShutdownServer } from "@medusajs/framework/utils" -import { logger } from "@medusajs/framework/logger" async function bootstrapApp({ cwd, diff --git a/packages/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts b/packages/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts index 57704e88f6..af15889769 100644 --- a/packages/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts +++ b/packages/medusa-test-utils/src/medusa-test-runner-utils/use-db.ts @@ -1,6 +1,6 @@ import type { MedusaAppLoader } from "@medusajs/framework" -import { Logger, MedusaContainer } from "@medusajs/framework/types" import { logger } from "@medusajs/framework/logger" +import { Logger, MedusaContainer } from "@medusajs/framework/types" import { ContainerRegistrationKeys, getResolvedPlugins, @@ -11,12 +11,9 @@ import { join } from "path" * Initiates the database connection */ export async function initDb() { - const { pgConnectionLoader, featureFlagsLoader } = await import( - "@medusajs/framework" - ) + const { pgConnectionLoader } = await import("@medusajs/framework") const pgConnection = await pgConnectionLoader() - await featureFlagsLoader() return pgConnection } diff --git a/packages/medusa-test-utils/src/medusa-test-runner.ts b/packages/medusa-test-utils/src/medusa-test-runner.ts index 4b967be35b..e0febd1867 100644 --- a/packages/medusa-test-utils/src/medusa-test-runner.ts +++ b/packages/medusa-test-utils/src/medusa-test-runner.ts @@ -51,11 +51,13 @@ interface TestRunnerConfig { hooks?: { beforeServerStart?: (container: MedusaContainer) => Promise } + cwd?: string } class MedusaTestRunner { private dbName: string private schema: string + private modulesConfigPath: string private cwd: string private env: Record private debug: boolean @@ -85,7 +87,8 @@ class MedusaTestRunner { config.dbName ?? `medusa-${moduleName.toLowerCase()}-integration-${tempName}` this.schema = config.schema ?? "public" - this.cwd = config.medusaConfigFile ?? process.cwd() + this.cwd = config.cwd ?? config.medusaConfigFile ?? process.cwd() + this.modulesConfigPath = config.medusaConfigFile ?? this.cwd this.env = config.env ?? {} this.debug = config.debug ?? false this.inApp = config.inApp ?? false @@ -150,7 +153,10 @@ class MedusaTestRunner { private async setupApplication(): Promise { const { container, MedusaAppLoader } = await import("@medusajs/framework") - const appLoader = new MedusaAppLoader() + const appLoader = new MedusaAppLoader({ + medusaConfigPath: this.modulesConfigPath, + cwd: this.cwd, + }) // Load plugins modules const configModule = container.resolve( @@ -173,7 +179,7 @@ class MedusaTestRunner { `Migrating database with core migrations and links ${this.dbName}` ) await migrateDatabase(appLoader) - await syncLinks(appLoader, this.cwd, container, logger) + await syncLinks(appLoader, this.modulesConfigPath, container, logger) await clearInstances() this.loadedApplication = await appLoader.load() @@ -184,7 +190,7 @@ class MedusaTestRunner { container: appContainer, port, } = await startApp({ - cwd: this.cwd, + cwd: this.modulesConfigPath, env: this.env, }) @@ -270,6 +276,8 @@ class MedusaTestRunner { const { MedusaAppLoader } = await import("@medusajs/framework") const medusaAppLoader = new MedusaAppLoader({ container: copiedContainer, + medusaConfigPath: this.modulesConfigPath, + cwd: this.cwd, }) await medusaAppLoader.runModulesLoader() } catch (error) { @@ -319,6 +327,7 @@ export function medusaIntegrationTestRunner({ inApp = false, testSuite, hooks, + cwd, }: { moduleName?: string env?: Record @@ -329,6 +338,7 @@ export function medusaIntegrationTestRunner({ inApp?: boolean testSuite: (options: MedusaSuiteOptions) => void hooks?: TestRunnerConfig["hooks"] + cwd?: string }) { const runner = new MedusaTestRunner({ moduleName, @@ -339,6 +349,7 @@ export function medusaIntegrationTestRunner({ debug, inApp, hooks, + cwd, }) return describe("", () => { diff --git a/packages/medusa-test-utils/src/module-test-runner.ts b/packages/medusa-test-utils/src/module-test-runner.ts index 84fd403c93..606505e17b 100644 --- a/packages/medusa-test-utils/src/module-test-runner.ts +++ b/packages/medusa-test-utils/src/module-test-runner.ts @@ -27,6 +27,7 @@ function createMikroOrmWrapper(options: { moduleModels?: (Function | DmlEntity)[] resolve?: string dbConfig: any + cwd?: string }): { MikroOrmWrapper: TestDatabase models: (Function | DmlEntity)[] @@ -36,7 +37,7 @@ function createMikroOrmWrapper(options: { if (!options.moduleModels) { const basePath = normalizeImportPathWithSource( - options.resolve ?? process.cwd() + options.resolve ?? options.cwd ?? process.cwd() ) const modelsPath = fs.existsSync(`${basePath}/dist/models`) @@ -74,6 +75,7 @@ export function moduleIntegrationTestRunner({ testSuite, resolve, injectedDependencies = {}, + cwd, }: { moduleName: string moduleModels?: any[] @@ -85,6 +87,7 @@ export function moduleIntegrationTestRunner({ injectedDependencies?: Record resolve?: string debug?: boolean + cwd?: string testSuite: (options: SuiteOptions) => void }) { const moduleSdkImports = require("@medusajs/framework/modules-sdk") @@ -107,6 +110,7 @@ export function moduleIntegrationTestRunner({ moduleModels, resolve, dbConfig, + cwd, }) moduleModels = models @@ -135,6 +139,7 @@ export function moduleIntegrationTestRunner({ databaseConfig: dbConfig, joinerConfig, preventConnectionDestroyWarning: true, + cwd, } let shutdown: () => Promise diff --git a/packages/medusa/src/api/admin/feature-flags/route.ts b/packages/medusa/src/api/admin/feature-flags/route.ts index c8e75270a5..581133af74 100644 --- a/packages/medusa/src/api/admin/feature-flags/route.ts +++ b/packages/medusa/src/api/admin/feature-flags/route.ts @@ -1,7 +1,4 @@ -import { - MedusaRequest, - MedusaResponse, -} from "@medusajs/framework/http" +import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" import { ContainerRegistrationKeys } from "@medusajs/framework/utils" export const AUTHENTICATE = false @@ -13,14 +10,14 @@ export const GET = async ( const featureFlagRouter = req.scope.resolve( ContainerRegistrationKeys.FEATURE_FLAG_ROUTER ) as any - + const flags = featureFlagRouter.listFlags() - + // Convert array of flags to a simple key-value object const featureFlags: Record = {} - flags.forEach(flag => { + flags.forEach((flag) => { featureFlags[flag.key] = flag.value }) - + res.json({ feature_flags: featureFlags }) -} \ No newline at end of file +} diff --git a/packages/medusa/src/api/admin/products/middlewares.ts b/packages/medusa/src/api/admin/products/middlewares.ts index 012532871b..42ecb835b6 100644 --- a/packages/medusa/src/api/admin/products/middlewares.ts +++ b/packages/medusa/src/api/admin/products/middlewares.ts @@ -1,10 +1,11 @@ import { - featureFlagRouter, validateAndTransformBody, validateAndTransformQuery, } from "@medusajs/framework" -import multer from "multer" import { maybeApplyLinkFilter, MiddlewareRoute } from "@medusajs/framework/http" +import { FeatureFlag } from "@medusajs/framework/utils" +import multer from "multer" +import IndexEngineFeatureFlag from "../../../feature-flags/index-engine" import { DEFAULT_BATCH_ENDPOINTS_SIZE_LIMIT } from "../../../utils/middlewares" import { createBatchBody } from "../../utils/validators" import * as QueryConfig from "./query-config" @@ -33,7 +34,6 @@ import { CreateProduct, CreateProductVariant, } from "./validators" -import IndexEngineFeatureFlag from "../../../loaders/feature-flags/index-engine" const upload = multer({ storage: multer.memoryStorage() }) @@ -47,7 +47,7 @@ export const adminProductRoutesMiddlewares: MiddlewareRoute[] = [ QueryConfig.listProductQueryConfig ), (req, res, next) => { - if (featureFlagRouter.isFeatureEnabled(IndexEngineFeatureFlag.key)) { + if (FeatureFlag.isFeatureEnabled(IndexEngineFeatureFlag.key)) { return next() } diff --git a/packages/medusa/src/api/admin/products/route.ts b/packages/medusa/src/api/admin/products/route.ts index 49a3a534bd..7ff8a4954e 100644 --- a/packages/medusa/src/api/admin/products/route.ts +++ b/packages/medusa/src/api/admin/products/route.ts @@ -1,5 +1,4 @@ import { createProductsWorkflow } from "@medusajs/core-flows" -import { featureFlagRouter } from "@medusajs/framework" import { AuthenticatedMedusaRequest, MedusaResponse, @@ -7,15 +6,19 @@ import { refetchEntity, } from "@medusajs/framework/http" import { AdditionalData, HttpTypes } from "@medusajs/framework/types" -import { ContainerRegistrationKeys, isPresent } from "@medusajs/framework/utils" -import IndexEngineFeatureFlag from "../../../loaders/feature-flags/index-engine" +import { + ContainerRegistrationKeys, + FeatureFlag, + isPresent, +} from "@medusajs/framework/utils" +import IndexEngineFeatureFlag from "../../../feature-flags/index-engine" import { remapKeysForProduct, remapProductResponse } from "./helpers" export const GET = async ( req: AuthenticatedMedusaRequest, res: MedusaResponse ) => { - if (featureFlagRouter.isFeatureEnabled(IndexEngineFeatureFlag.key)) { + if (FeatureFlag.isFeatureEnabled(IndexEngineFeatureFlag.key)) { // Use regular list when no filters are provided // TODO: Tags and categories are not supported by the index engine yet if ( diff --git a/packages/medusa/src/api/admin/views/[entity]/configurations/middleware.ts b/packages/medusa/src/api/admin/views/[entity]/configurations/middleware.ts index 8b805c146c..1c1d5cc9e7 100644 --- a/packages/medusa/src/api/admin/views/[entity]/configurations/middleware.ts +++ b/packages/medusa/src/api/admin/views/[entity]/configurations/middleware.ts @@ -1,10 +1,10 @@ -import { - MedusaRequest, - MedusaResponse, - MedusaNextFunction +import { + MedusaNextFunction, + MedusaRequest, + MedusaResponse, } from "@medusajs/framework/http" import { ContainerRegistrationKeys } from "@medusajs/framework/utils" -import ViewConfigurationsFeatureFlag from "../../../../../loaders/feature-flags/view-configurations" +import ViewConfigurationsFeatureFlag from "../../../../../feature-flags/view-configurations" export const ensureViewConfigurationsEnabled = async ( req: MedusaRequest, @@ -14,14 +14,14 @@ export const ensureViewConfigurationsEnabled = async ( const flagRouter = req.scope.resolve( ContainerRegistrationKeys.FEATURE_FLAG_ROUTER ) as any - + if (!flagRouter.isFeatureEnabled(ViewConfigurationsFeatureFlag.key)) { res.status(404).json({ type: "not_found", - message: "Route not found" + message: "Route not found", }) return } - + next() -} \ No newline at end of file +} diff --git a/packages/medusa/src/api/store/products/middlewares.ts b/packages/medusa/src/api/store/products/middlewares.ts index 2f4eee1f4e..dba652487f 100644 --- a/packages/medusa/src/api/store/products/middlewares.ts +++ b/packages/medusa/src/api/store/products/middlewares.ts @@ -1,7 +1,4 @@ -import { - featureFlagRouter, - validateAndTransformQuery, -} from "@medusajs/framework" +import { validateAndTransformQuery } from "@medusajs/framework" import { applyDefaultFilters, applyParamsAsFilters, @@ -10,8 +7,12 @@ import { maybeApplyLinkFilter, MiddlewareRoute, } from "@medusajs/framework/http" -import { isPresent, ProductStatus } from "@medusajs/framework/utils" -import IndexEngineFeatureFlag from "../../../loaders/feature-flags/index-engine" +import { + FeatureFlag, + isPresent, + ProductStatus, +} from "@medusajs/framework/utils" +import IndexEngineFeatureFlag from "../../../feature-flags/index-engine" import { filterByValidSalesChannels, normalizeDataForContext, @@ -40,7 +41,7 @@ export const storeProductRoutesMiddlewares: MiddlewareRoute[] = [ isPresent(req.filterableFields.categories) ) if ( - featureFlagRouter.isFeatureEnabled(IndexEngineFeatureFlag.key) && + FeatureFlag.isFeatureEnabled(IndexEngineFeatureFlag.key) && canUseIndex ) { return next() diff --git a/packages/medusa/src/api/store/products/route.ts b/packages/medusa/src/api/store/products/route.ts index a6dec0c297..d99d18f4cb 100644 --- a/packages/medusa/src/api/store/products/route.ts +++ b/packages/medusa/src/api/store/products/route.ts @@ -1,13 +1,13 @@ -import { featureFlagRouter } from "@medusajs/framework" import { MedusaResponse } from "@medusajs/framework/http" import { HttpTypes, QueryContextType } from "@medusajs/framework/types" import { ContainerRegistrationKeys, + FeatureFlag, isPresent, QueryContext, remoteQueryObjectFromString, } from "@medusajs/framework/utils" -import IndexEngineFeatureFlag from "../../../loaders/feature-flags/index-engine" +import IndexEngineFeatureFlag from "../../../feature-flags/index-engine" import { wrapVariantsWithInventoryQuantityForSalesChannel } from "../../utils/middlewares" import { RequestWithContext, wrapProductsWithTaxPrices } from "./helpers" @@ -15,7 +15,7 @@ export const GET = async ( req: RequestWithContext, res: MedusaResponse ) => { - if (featureFlagRouter.isFeatureEnabled(IndexEngineFeatureFlag.key)) { + if (FeatureFlag.isFeatureEnabled(IndexEngineFeatureFlag.key)) { // TODO: These filters are not supported by the index engine yet if ( isPresent(req.filterableFields.tags) || diff --git a/packages/medusa/src/commands/exec.ts b/packages/medusa/src/commands/exec.ts index beb8df41ab..1bc22e16d5 100644 --- a/packages/medusa/src/commands/exec.ts +++ b/packages/medusa/src/commands/exec.ts @@ -1,10 +1,10 @@ -import loaders from "../loaders" -import express from "express" -import path from "path" -import { existsSync } from "fs" import { logger } from "@medusajs/framework/logger" import { ExecArgs } from "@medusajs/framework/types" -import { dynamicImport } from "@medusajs/framework/utils" +import { dynamicImport, isFileSkipped } from "@medusajs/framework/utils" +import express from "express" +import { existsSync } from "fs" +import path from "path" +import loaders from "../loaders" type Options = { file: string @@ -25,6 +25,10 @@ export default async function exec({ file, args }: Options) { const scriptToExec = (await dynamicImport(path.resolve(filePath))).default + if (isFileSkipped(scriptToExec)) { + throw new Error(`File is disabled.`) + } + if (!scriptToExec || typeof scriptToExec !== "function") { throw new Error(`File doesn't default export a function to execute.`) } diff --git a/packages/medusa/src/commands/plugin/db/generate.ts b/packages/medusa/src/commands/plugin/db/generate.ts index 90110cc1e9..fdb757b389 100644 --- a/packages/medusa/src/commands/plugin/db/generate.ts +++ b/packages/medusa/src/commands/plugin/db/generate.ts @@ -1,11 +1,12 @@ -import { glob } from "glob" import { logger } from "@medusajs/framework/logger" import { - toUnixSlash, + defineMikroOrmCliConfig, DmlEntity, dynamicImport, - defineMikroOrmCliConfig, + isFileSkipped, + toUnixSlash, } from "@medusajs/framework/utils" +import { glob } from "glob" import { dirname, join } from "path" import { MetadataStorage } from "@mikro-orm/core" @@ -68,6 +69,9 @@ async function getEntitiesForModule(path: string) { for (const entityPath of entityPaths) { const entityExports = await dynamicImport(entityPath) + if (isFileSkipped(entityExports)) { + continue + } const validEntities = Object.values(entityExports).filter( (potentialEntity) => { diff --git a/packages/medusa/src/commands/start.ts b/packages/medusa/src/commands/start.ts index 24f590b1ee..e0b3be72f7 100644 --- a/packages/medusa/src/commands/start.ts +++ b/packages/medusa/src/commands/start.ts @@ -1,25 +1,26 @@ +import { track } from "@medusajs/telemetry" +import cluster from "cluster" +import express from "express" +import http from "http" +import { scheduleJob } from "node-schedule" import os from "os" import path from "path" -import http from "http" -import express from "express" -import cluster from "cluster" -import { track } from "@medusajs/telemetry" -import { scheduleJob } from "node-schedule" +import { logger } from "@medusajs/framework/logger" import { dynamicImport, FileSystem, + generateContainerTypes, gqlSchemaToTypes, GracefulShutdownServer, + isFileSkipped, isPresent, - generateContainerTypes, } from "@medusajs/framework/utils" -import { logger } from "@medusajs/framework/logger" -import loaders from "../loaders" import { MedusaModule } from "@medusajs/framework/modules-sdk" import { MedusaContainer } from "@medusajs/framework/types" import { parse } from "url" +import loaders from "../loaders" const EVERY_SIXTH_HOUR = "0 */6 * * *" const CRON_SCHEDULE = EVERY_SIXTH_HOUR @@ -43,7 +44,11 @@ export async function registerInstrumentation(directory: string) { const instrumentation = await dynamicImport( path.join(directory, INSTRUMENTATION_FILE) ) - if (typeof instrumentation.register === "function") { + + if ( + typeof instrumentation.register === "function" && + !isFileSkipped(instrumentation) + ) { logger.info("OTEL registered") instrumentation.register() } else { diff --git a/packages/medusa/src/loaders/feature-flags/index-engine.ts b/packages/medusa/src/feature-flags/index-engine.ts similarity index 100% rename from packages/medusa/src/loaders/feature-flags/index-engine.ts rename to packages/medusa/src/feature-flags/index-engine.ts diff --git a/packages/medusa/src/loaders/feature-flags/view-configurations.ts b/packages/medusa/src/feature-flags/view-configurations.ts similarity index 100% rename from packages/medusa/src/loaders/feature-flags/view-configurations.ts rename to packages/medusa/src/feature-flags/view-configurations.ts diff --git a/packages/medusa/src/instrumentation/__fixtures__/server/index.ts b/packages/medusa/src/instrumentation/__fixtures__/server/index.ts index eaec6b43d6..6ed0b0f675 100644 --- a/packages/medusa/src/instrumentation/__fixtures__/server/index.ts +++ b/packages/medusa/src/instrumentation/__fixtures__/server/index.ts @@ -9,9 +9,6 @@ import express from "express" import querystring from "querystring" import supertest from "supertest" -import { config } from "../mocks" -import { ConfigModule, MedusaContainer } from "@medusajs/types" -import { configManager } from "@medusajs/framework/config" import { ApiLoader, container, @@ -19,6 +16,9 @@ import { logger, MedusaRequest, } from "@medusajs/framework" +import { configManager } from "@medusajs/framework/config" +import { ConfigModule, MedusaContainer } from "@medusajs/types" +import { config } from "../mocks" function asArray(resolvers) { return { @@ -37,12 +37,11 @@ export const createServer = async (rootDir) => { const moduleResolutions = {} Object.entries(ModulesDefinition).forEach(([moduleKey, module]) => { - moduleResolutions[moduleKey] = registerMedusaModule( + moduleResolutions[moduleKey] = registerMedusaModule({ moduleKey, - module.defaultModuleDeclaration, - undefined, - module - )[moduleKey] + moduleDeclaration: module.defaultModuleDeclaration, + moduleExports: module as any, + })[moduleKey] }) configManager.loadConfig({ diff --git a/packages/medusa/src/loaders/feature-flags/analytics.ts b/packages/medusa/src/loaders/feature-flags/analytics.ts deleted file mode 100644 index a46e43aaa7..0000000000 --- a/packages/medusa/src/loaders/feature-flags/analytics.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { FlagSettings } from "@medusajs/framework/feature-flags" - -const AnalyticsFeatureFlag: FlagSettings = { - key: "analytics", - default_val: true, - env_key: "MEDUSA_FF_ANALYTICS", - description: - "Enable Medusa to collect data on usage, errors and performance for the purpose of improving the product", -} - -export default AnalyticsFeatureFlag diff --git a/packages/medusa/src/loaders/feature-flags/medusa-v2.ts b/packages/medusa/src/loaders/feature-flags/medusa-v2.ts deleted file mode 100644 index 62781944dd..0000000000 --- a/packages/medusa/src/loaders/feature-flags/medusa-v2.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { MedusaV2Flag } from "@medusajs/framework/utils" - -export default MedusaV2Flag diff --git a/packages/medusa/src/loaders/feature-flags/order-editing.ts b/packages/medusa/src/loaders/feature-flags/order-editing.ts deleted file mode 100644 index a8b83e4bba..0000000000 --- a/packages/medusa/src/loaders/feature-flags/order-editing.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FlagSettings } from "@medusajs/framework/feature-flags" - -const OrderEditingFeatureFlag: FlagSettings = { - key: "order_editing", - default_val: true, - env_key: "MEDUSA_FF_ORDER_EDITING", - description: "[WIP] Enable the order editing feature", -} - -export default OrderEditingFeatureFlag diff --git a/packages/medusa/src/loaders/feature-flags/product-categories.ts b/packages/medusa/src/loaders/feature-flags/product-categories.ts deleted file mode 100644 index 03c3999b22..0000000000 --- a/packages/medusa/src/loaders/feature-flags/product-categories.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FlagSettings } from "@medusajs/framework/feature-flags" - -const ProductCategoryFeatureFlag: FlagSettings = { - key: "product_categories", - default_val: false, - env_key: "MEDUSA_FF_PRODUCT_CATEGORIES", - description: "[WIP] Enable the product categories feature", -} - -export default ProductCategoryFeatureFlag diff --git a/packages/medusa/src/loaders/feature-flags/publishable-api-keys.ts b/packages/medusa/src/loaders/feature-flags/publishable-api-keys.ts deleted file mode 100644 index 9aa4d36a17..0000000000 --- a/packages/medusa/src/loaders/feature-flags/publishable-api-keys.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FlagSettings } from "@medusajs/framework/feature-flags" - -const PublishableAPIKeysFeatureFlag: FlagSettings = { - key: "publishable_api_keys", - default_val: true, - env_key: "MEDUSA_FF_PUBLISHABLE_API_KEYS", - description: "[WIP] Enable the publishable API keys feature", -} - -export default PublishableAPIKeysFeatureFlag diff --git a/packages/medusa/src/loaders/feature-flags/sales-channels.ts b/packages/medusa/src/loaders/feature-flags/sales-channels.ts deleted file mode 100644 index 9137705461..0000000000 --- a/packages/medusa/src/loaders/feature-flags/sales-channels.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FlagSettings } from "@medusajs/framework/feature-flags" - -const SalesChannelFeatureFlag: FlagSettings = { - key: "sales_channels", - default_val: true, - env_key: "MEDUSA_FF_SALES_CHANNELS", - description: "[WIP] Enable the sales channels feature", -} - -export default SalesChannelFeatureFlag diff --git a/packages/medusa/src/loaders/feature-flags/tax-inclusive-pricing.ts b/packages/medusa/src/loaders/feature-flags/tax-inclusive-pricing.ts deleted file mode 100644 index 0149675dac..0000000000 --- a/packages/medusa/src/loaders/feature-flags/tax-inclusive-pricing.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FlagSettings } from "@medusajs/framework/feature-flags" - -const TaxInclusivePricingFeatureFlag: FlagSettings = { - key: "tax_inclusive_pricing", - default_val: false, - env_key: "MEDUSA_FF_TAX_INCLUSIVE_PRICING", - description: "[WIP] Enable tax inclusive pricing", -} - -export default TaxInclusivePricingFeatureFlag diff --git a/packages/medusa/src/loaders/feature-flags/workflows.ts b/packages/medusa/src/loaders/feature-flags/workflows.ts deleted file mode 100644 index 112d7b7e14..0000000000 --- a/packages/medusa/src/loaders/feature-flags/workflows.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { WorkflowsFeatureFlag } from "@medusajs/framework/utils" - -export default WorkflowsFeatureFlag diff --git a/packages/medusa/src/loaders/index.ts b/packages/medusa/src/loaders/index.ts index 9bccfcdfb9..5b56916004 100644 --- a/packages/medusa/src/loaders/index.ts +++ b/packages/medusa/src/loaders/index.ts @@ -126,7 +126,7 @@ export async function initializeContainer( rootDirectory: string ): Promise { await configLoader(rootDirectory, "medusa-config") - await featureFlagsLoader(join(__dirname, "feature-flags")) + await featureFlagsLoader(join(__dirname, "..")) container.register({ [ContainerRegistrationKeys.LOGGER]: asValue(logger), diff --git a/packages/modules/link-modules/src/initialize/index.ts b/packages/modules/link-modules/src/initialize/index.ts index f4dda97d65..937890a311 100644 --- a/packages/modules/link-modules/src/initialize/index.ts +++ b/packages/modules/link-modules/src/initialize/index.ts @@ -32,7 +32,8 @@ export const initialize = async ( | ExternalModuleDeclaration | InternalModuleDeclaration, pluginLinksDefinitions?: ModuleJoinerConfig[], - injectedDependencies?: InitializeModuleInjectableDependencies + injectedDependencies?: InitializeModuleInjectableDependencies, + cwd?: string ): Promise<{ [link: string]: ILinkModule }> => { const allLinks = {} const modulesLoadedKeys = MedusaModule.getLoadedModules().map( @@ -167,6 +168,7 @@ export const initialize = async ( declaration: options as InternalModuleDeclaration, moduleExports: moduleDefinition, injectedDependencies, + cwd, }) allLinks[serviceKey as string] = Object.values(loaded)[0]