chore: Enable draft order plugin by default (#13314)

* wip

* fix

* fix tests

* update lockfile

* fix deps

* Enable draft order plugin by default

* remove double negation

* support merging modules
This commit is contained in:
Oli Juhl
2025-08-28 14:14:40 +02:00
committed by GitHub
parent be62cf87c7
commit cbaa403744
8 changed files with 302 additions and 36 deletions

View File

@@ -0,0 +1,7 @@
---
"@medusajs/medusa": patch
"@medusajs/draft-order": patch
"@medusajs/utils": patch
---
chore: Enable draft order plugin by default

2
.gitignore vendored
View File

@@ -13,6 +13,8 @@ packages/**/.yarn/*
integration-tests/**/.yarn/*
www/**/.yarn/*
packages/**/plugins/**/.medusa/
.DS_Store
.eslintcache

View File

@@ -131,7 +131,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-inmemory",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -298,7 +303,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-inmemory",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -473,7 +483,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-inmemory",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -649,7 +664,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-inmemory",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -813,7 +833,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-inmemory",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -980,7 +1005,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-inmemory",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -1180,7 +1210,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-redis",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -1382,7 +1417,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-redis",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -1600,7 +1640,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-redis",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {
@@ -1638,6 +1683,88 @@ describe("defineConfig", function () {
`)
})
it("should include default plugins", function () {
const config = defineConfig()
expect(config.plugins).toEqual([
{ resolve: "@medusajs/draft-order", options: {} },
])
})
it("should append custom plugins to defaults", function () {
const config = defineConfig({
plugins: [
{ resolve: "@medusajs/custom-plugin", options: { key: "value" } },
],
})
expect(config.plugins).toEqual([
{ resolve: "@medusajs/draft-order", options: {} },
{ resolve: "@medusajs/custom-plugin", options: { key: "value" } },
])
})
it("should handle multiple custom plugins", function () {
const config = defineConfig({
plugins: [
{ resolve: "@medusajs/plugin-one", options: { setting: "a" } },
{ resolve: "@medusajs/plugin-two", options: { setting: "b" } },
{ resolve: "./local-plugin", options: {} },
],
})
expect(config.plugins).toEqual([
{ resolve: "@medusajs/draft-order", options: {} },
{ resolve: "@medusajs/plugin-one", options: { setting: "a" } },
{ resolve: "@medusajs/plugin-two", options: { setting: "b" } },
{ resolve: "./local-plugin", options: {} },
])
})
it("should merge plugins", function () {
const config = defineConfig({
plugins: [
{ resolve: "@medusajs/draft-order", options: { setting: "a" } },
],
})
expect(config.plugins).toEqual([
{ resolve: "@medusajs/draft-order", options: { setting: "a" } },
])
})
it("should include plugins in cloud environment", function () {
const originalEnv = { ...process.env }
process.env.EXECUTION_CONTEXT = "medusa-cloud"
const config = defineConfig({
plugins: [
{ resolve: "@medusajs/cloud-plugin", options: { cloud: true } },
],
})
process.env = { ...originalEnv }
expect(config.plugins).toEqual([
{ resolve: "@medusajs/draft-order", options: {} },
{ resolve: "@medusajs/cloud-plugin", options: { cloud: true } },
])
})
it("should handle empty plugins array", function () {
const config = defineConfig({
plugins: [],
})
expect(config.plugins).toEqual([
{ resolve: "@medusajs/draft-order", options: {} },
])
})
it("should handle undefined plugins", function () {
const config = defineConfig({
modules: {},
})
expect(config.plugins).toEqual([
{ resolve: "@medusajs/draft-order", options: {} },
])
})
it("should allow custom dynamodb config", function () {
expect(
defineConfig({
@@ -1785,7 +1912,12 @@ describe("defineConfig", function () {
"resolve": "@medusajs/medusa/workflow-engine-inmemory",
},
},
"plugins": [],
"plugins": [
{
"options": {},
"resolve": "@medusajs/draft-order",
},
],
"projectConfig": {
"databaseUrl": "postgres://localhost/medusa-starter-default",
"http": {

View File

@@ -12,6 +12,11 @@ afterEach(async () => {
describe("getResolvedPlugins | relative paths", () => {
test("resolve configured plugins", async () => {
await fs.createJson("node_modules/@medusajs/draft-order/package.json", {
name: "@medusajs/draft-order",
version: "1.0.0",
})
await fs.createJson("plugins/dummy/package.json", {
name: "my-dummy-plugin",
version: "1.0.0",
@@ -27,12 +32,28 @@ describe("getResolvedPlugins | relative paths", () => {
apiKey: "asecret",
},
},
{
resolve: "@medusajs/draft-order",
options: {},
},
],
}),
false
)
expect(plugins).toEqual([
expect(plugins).toEqual(
expect.arrayContaining([
{
id: "@medusajs/draft-order",
modules: [],
name: "@medusajs/draft-order",
options: {},
resolve: path.join(
fs.basePath,
"node_modules/@medusajs/draft-order/.medusa/server/src"
),
version: "1.0.0",
},
{
resolve: path.join(fs.basePath, "./plugins/dummy/.medusa/server/src"),
admin: undefined,
@@ -43,9 +64,14 @@ describe("getResolvedPlugins | relative paths", () => {
modules: [],
},
])
)
})
test("scan plugin modules", async () => {
await fs.createJson("node_modules/@medusajs/draft-order/package.json", {
name: "@medusajs/draft-order",
version: "1.0.0",
})
await fs.createJson("plugins/dummy/package.json", {
name: "my-dummy-plugin",
version: "1.0.0",
@@ -70,7 +96,7 @@ describe("getResolvedPlugins | relative paths", () => {
false
)
expect(plugins).toEqual([
expect(plugins).toEqual(expect.arrayContaining([
{
resolve: path.join(fs.basePath, "./plugins/dummy/.medusa/server/src"),
admin: undefined,
@@ -87,10 +113,26 @@ describe("getResolvedPlugins | relative paths", () => {
},
],
},
])
{
id: "@medusajs/draft-order",
modules: [],
name: "@medusajs/draft-order",
options: {},
resolve: path.join(
fs.basePath,
"node_modules/@medusajs/draft-order/.medusa/server/src"
),
version: "1.0.0",
},
]))
})
test("throw error when package.json file is missing", async () => {
await fs.createJson("node_modules/@medusajs/draft-order/package.json", {
name: "@medusajs/draft-order",
version: "1.0.0",
})
const resolvePlugins = async () =>
getResolvedPlugins(
fs.basePath,
@@ -113,6 +155,10 @@ describe("getResolvedPlugins | relative paths", () => {
})
test("resolve admin source from medusa-plugin-options file", async () => {
await fs.createJson("node_modules/@medusajs/draft-order/package.json", {
name: "@medusajs/draft-order",
version: "1.0.0",
})
await fs.createJson("plugins/dummy/package.json", {
name: "my-dummy-plugin",
version: "1.0.0",
@@ -138,12 +184,16 @@ describe("getResolvedPlugins | relative paths", () => {
apiKey: "asecret",
},
},
{
resolve: "@medusajs/draft-order",
options: {},
},
],
}),
false
)
expect(plugins).toEqual([
expect(plugins).toEqual(expect.arrayContaining([
{
resolve: path.join(fs.basePath, "./plugins/dummy/.medusa/server/src"),
admin: {
@@ -163,12 +213,27 @@ describe("getResolvedPlugins | relative paths", () => {
},
],
},
])
{
id: "@medusajs/draft-order",
modules: [],
name: "@medusajs/draft-order",
options: {},
resolve: path.join(
fs.basePath,
"node_modules/@medusajs/draft-order/.medusa/server/src"
),
version: "1.0.0",
},
]))
})
})
describe("getResolvedPlugins | package reference", () => {
test("resolve configured plugins", async () => {
await fs.createJson("node_modules/@medusajs/draft-order/package.json", {
name: "@medusajs/draft-order",
version: "1.0.0",
})
await fs.createJson("package.json", {})
await fs.createJson("node_modules/@plugins/dummy/package.json", {
name: "my-dummy-plugin",
@@ -190,7 +255,7 @@ describe("getResolvedPlugins | package reference", () => {
false
)
expect(plugins).toEqual([
expect(plugins).toEqual(expect.arrayContaining([
{
resolve: path.join(
fs.basePath,
@@ -203,10 +268,25 @@ describe("getResolvedPlugins | package reference", () => {
version: "1.0.0",
modules: [],
},
])
{
id: "@medusajs/draft-order",
modules: [],
name: "@medusajs/draft-order",
options: {},
resolve: path.join(
fs.basePath,
"node_modules/@medusajs/draft-order/.medusa/server/src"
),
version: "1.0.0",
},
]))
})
test("scan plugin modules", async () => {
await fs.createJson("node_modules/@medusajs/draft-order/package.json", {
name: "@medusajs/draft-order",
version: "1.0.0",
})
await fs.createJson("package.json", {})
await fs.createJson("node_modules/@plugins/dummy/package.json", {
name: "my-dummy-plugin",
@@ -232,7 +312,7 @@ describe("getResolvedPlugins | package reference", () => {
false
)
expect(plugins).toEqual([
expect(plugins).toEqual(expect.arrayContaining([
{
resolve: path.join(
fs.basePath,
@@ -252,10 +332,25 @@ describe("getResolvedPlugins | package reference", () => {
},
],
},
])
{
id: "@medusajs/draft-order",
modules: [],
name: "@medusajs/draft-order",
options: {},
resolve: path.join(
fs.basePath,
"node_modules/@medusajs/draft-order/.medusa/server/src"
),
version: "1.0.0",
},
]))
})
test("throw error when package.json file is missing", async () => {
await fs.createJson("node_modules/@medusajs/draft-order/package.json", {
name: "@medusajs/draft-order",
version: "1.0.0",
})
const resolvePlugins = async () =>
getResolvedPlugins(
fs.basePath,
@@ -267,6 +362,10 @@ describe("getResolvedPlugins | package reference", () => {
apiKey: "asecret",
},
},
{
resolve: "@medusajs/draft-order",
options: {},
},
],
}),
false

View File

@@ -12,9 +12,9 @@ import {
} from "../modules-sdk"
import { isObject } from "./is-object"
import { isString } from "./is-string"
import { tryConvertToNumber } from "./try-convert-to-number"
import { normalizeImportPathWithSource } from "./normalize-import-path-with-source"
import { resolveExports } from "./resolve-exports"
import { tryConvertToNumber } from "./try-convert-to-number"
const MEDUSA_CLOUD_EXECUTION_CONTEXT = "medusa-cloud"
const DEFAULT_SECRET = "supersecret"
@@ -49,13 +49,14 @@ export function defineConfig(config: InputConfig = {}): ConfigModule {
const projectConfig = normalizeProjectConfig(config.projectConfig, options)
const adminConfig = normalizeAdminConfig(config.admin)
const modules = resolveModules(config.modules, options, config.projectConfig)
const plugins = resolvePlugins(config.plugins, options)
return {
projectConfig,
featureFlags: (config.featureFlags ?? {}) as ConfigModule["featureFlags"],
plugins: config.plugins || [],
admin: adminConfig,
modules: modules,
plugins,
}
}
@@ -124,6 +125,33 @@ export function transformModules(
return remappedModules as Exclude<ConfigModule["modules"], undefined>
}
function resolvePlugins(
configPlugins: InputConfig["plugins"],
{ isCloud }: { isCloud: boolean }
): ConfigModule["plugins"] {
const defaultPlugins: Map<string, ConfigModule["plugins"][number]> = new Map([
[
"@medusajs/draft-order",
{ resolve: "@medusajs/draft-order", options: {} },
],
])
if (configPlugins?.length) {
configPlugins.forEach((plugin) => {
if (typeof plugin === "string") {
defaultPlugins.set(plugin, { resolve: plugin, options: {} })
} else {
defaultPlugins.set(plugin.resolve, plugin)
}
})
}
// We don't have any cloud plugins yet, but we might in the future
const cloudPlugins = [...Array.from(defaultPlugins.values())]
return isCloud ? cloudPlugins : Array.from(defaultPlugins.values())
}
/**
* The user API allow to use array of modules configuration. This method manage the loading of the
* user modules along side the default modules and re map them to an object.

View File

@@ -84,6 +84,7 @@
"@medusajs/core-flows": "2.9.0",
"@medusajs/currency": "2.9.0",
"@medusajs/customer": "2.9.0",
"@medusajs/draft-order": "2.9.0",
"@medusajs/event-bus-local": "2.9.0",
"@medusajs/event-bus-redis": "2.9.0",
"@medusajs/file": "2.9.0",

View File

@@ -49,7 +49,6 @@
"@medusajs/cli": "2.9.0",
"@medusajs/framework": "2.9.0",
"@medusajs/icons": "2.9.0",
"@medusajs/medusa": "2.9.0",
"@medusajs/test-utils": "2.9.0",
"@medusajs/types": "2.9.0",
"@medusajs/ui": "4.0.19",
@@ -81,7 +80,6 @@
"@medusajs/cli": "2.9.0",
"@medusajs/framework": "2.9.0",
"@medusajs/icons": "2.9.0",
"@medusajs/medusa": "2.9.0",
"@medusajs/test-utils": "2.9.0",
"@medusajs/ui": "4.0.19",
"@mikro-orm/cli": "6.4.3",

View File

@@ -6391,7 +6391,7 @@ __metadata:
languageName: unknown
linkType: soft
"@medusajs/draft-order@workspace:packages/plugins/draft-order":
"@medusajs/draft-order@2.9.0, @medusajs/draft-order@workspace:packages/plugins/draft-order":
version: 0.0.0-use.local
resolution: "@medusajs/draft-order@workspace:packages/plugins/draft-order"
dependencies:
@@ -6402,7 +6402,6 @@ __metadata:
"@medusajs/framework": 2.9.0
"@medusajs/icons": 2.9.0
"@medusajs/js-sdk": 2.9.0
"@medusajs/medusa": 2.9.0
"@medusajs/test-utils": 2.9.0
"@medusajs/types": 2.9.0
"@medusajs/ui": 4.0.19
@@ -6439,7 +6438,6 @@ __metadata:
"@medusajs/cli": 2.9.0
"@medusajs/framework": 2.9.0
"@medusajs/icons": 2.9.0
"@medusajs/medusa": 2.9.0
"@medusajs/test-utils": 2.9.0
"@medusajs/ui": 4.0.19
"@mikro-orm/cli": 6.4.3
@@ -6895,6 +6893,7 @@ __metadata:
"@medusajs/core-flows": 2.9.0
"@medusajs/currency": 2.9.0
"@medusajs/customer": 2.9.0
"@medusajs/draft-order": 2.9.0
"@medusajs/event-bus-local": 2.9.0
"@medusajs/event-bus-redis": 2.9.0
"@medusajs/file": 2.9.0