Skip to content
Open
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
551bcc9
feat(event): Module providers architecture
adrien2p Jan 13, 2026
75782e2
cleanup
adrien2p Jan 13, 2026
6562cfd
cleanup
adrien2p Jan 13, 2026
40367a3
fix tests
adrien2p Jan 14, 2026
10afa23
fix tests
adrien2p Jan 14, 2026
f06c478
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 14, 2026
47ce880
fix tests
adrien2p Jan 14, 2026
77dda52
remove package.json constraint
adrien2p Jan 14, 2026
0e361fb
cleanup
adrien2p Jan 14, 2026
18a0b43
cleanup
adrien2p Jan 14, 2026
3e5c137
improvements
adrien2p Jan 14, 2026
1d235c1
improvements
adrien2p Jan 14, 2026
3e4935e
Create little-bears-rescue.md
adrien2p Jan 14, 2026
4790344
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 14, 2026
e0c4f5d
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 15, 2026
a16b625
rename module and provider
adrien2p Jan 15, 2026
357def8
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 15, 2026
97e3d32
fix tests and cleanup
adrien2p Jan 15, 2026
ad532c1
Merge branch 'feat/event-module-w-providers' of github.com:medusajs/m…
adrien2p Jan 15, 2026
09a9bc0
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 15, 2026
442634b
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 15, 2026
3620a8d
remove deprecation logs temporarely
adrien2p Jan 21, 2026
7e02f93
Merge branch 'feat/event-module-w-providers' of github.com:medusajs/m…
adrien2p Jan 21, 2026
62af0ba
resolve conflicts
adrien2p Jan 21, 2026
84b6337
fix interceptor
adrien2p Jan 21, 2026
666579f
nullish + worker mode unused
adrien2p Jan 21, 2026
089f789
handle feedback
adrien2p Jan 22, 2026
55ad9b2
resolve conflicts
adrien2p Jan 22, 2026
5f0f768
handle feedback fixes
adrien2p Jan 22, 2026
564cf16
fix subscribe, unsubscribe etc
adrien2p Jan 22, 2026
092290d
fix injection
adrien2p Jan 22, 2026
8ffacf6
naming
adrien2p Jan 23, 2026
49fbe11
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 23, 2026
94593db
centralize subscriberId default generation to the module
adrien2p Jan 23, 2026
66e42d3
Merge branch 'develop' into feat/event-module-w-providers
adrien2p Jan 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .changeset/little-bears-rescue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@medusajs/medusa": patch
"@medusajs/test-utils": patch
"@medusajs/event": patch
"@medusajs/types": patch
"@medusajs/utils": patch
---

feat(event): Module providers architecture
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ packages/*
!packages/modules/providers/locking-postgres
!packages/modules/providers/locking-redis
!packages/modules/index
!packages/modules/event
!packages/core/framework


Expand Down
137 changes: 110 additions & 27 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const path = require("path");
const path = require("path")

module.exports = {
root: true,
Expand Down Expand Up @@ -84,13 +84,22 @@ module.exports = {
path.join(__dirname, "./packages/admin/admin-bundler/tsconfig.json"),
path.join(__dirname, "./packages/admin/admin-sdk/tsconfig.json"),
path.join(__dirname, "./packages/admin/admin-shared/tsconfig.json"),
path.join(__dirname, "./packages/admin/admin-vite-plugin/tsconfig.json"),
path.join(
__dirname,
"./packages/admin/admin-vite-plugin/tsconfig.json"
),
path.join(__dirname, "./packages/admin/dashboard/tsconfig.json"),

path.join(__dirname, "./packages/cli/create-medusa-app/tsconfig.json"),
path.join(
__dirname,
"./packages/cli/create-medusa-app/tsconfig.json"
),
path.join(__dirname, "./packages/cli/medusa-cli/tsconfig.json"),
path.join(__dirname, "./packages/cli/medusa-dev-cli/tsconfig.json"),
path.join(__dirname, "./packages/cli/oas/medusa-oas-cli/tsconfig.json"),
path.join(
__dirname,
"./packages/cli/oas/medusa-oas-cli/tsconfig.json"
),

path.join(__dirname, "./packages/core/core-flows/tsconfig.json"),
path.join(__dirname, "./packages/core/framework/tsconfig.json"),
Expand All @@ -104,9 +113,15 @@ module.exports = {
path.join(__dirname, "./packages/deps/tsconfig.json"),

path.join(__dirname, "./packages/design-system/icons/tsconfig.json"),
path.join(__dirname, "./packages/design-system/toolbox/tsconfig.json"),
path.join(
__dirname,
"./packages/design-system/toolbox/tsconfig.json"
),
path.join(__dirname, "./packages/design-system/ui/tsconfig.json"),
path.join(__dirname, "./packages/design-system/ui-preset/tsconfig.json"),
path.join(
__dirname,
"./packages/design-system/ui-preset/tsconfig.json"
),

path.join(__dirname, "./packages/medusa/tsconfig.json"),

Expand All @@ -116,14 +131,23 @@ module.exports = {
path.join(__dirname, "./packages/modules/analytics/tsconfig.json"),
path.join(__dirname, "./packages/modules/api-key/tsconfig.json"),
path.join(__dirname, "./packages/modules/auth/tsconfig.json"),
path.join(__dirname, "./packages/modules/cache-inmemory/tsconfig.json"),
path.join(
__dirname,
"./packages/modules/cache-inmemory/tsconfig.json"
),
path.join(__dirname, "./packages/modules/cache-redis/tsconfig.json"),
path.join(__dirname, "./packages/modules/caching/tsconfig.json"),
path.join(__dirname, "./packages/modules/cart/tsconfig.json"),
path.join(__dirname, "./packages/modules/currency/tsconfig.json"),
path.join(__dirname, "./packages/modules/customer/tsconfig.json"),
path.join(__dirname, "./packages/modules/event-bus-local/tsconfig.json"),
path.join(__dirname, "./packages/modules/event-bus-redis/tsconfig.json"),
path.join(
__dirname,
"./packages/modules/event-bus-local/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/event-bus-redis/tsconfig.json"
),
path.join(__dirname, "./packages/modules/file/tsconfig.json"),
path.join(__dirname, "./packages/modules/fulfillment/tsconfig.json"),
path.join(__dirname, "./packages/modules/index/tsconfig.json"),
Expand All @@ -137,30 +161,89 @@ module.exports = {
path.join(__dirname, "./packages/modules/product/tsconfig.json"),
path.join(__dirname, "./packages/modules/promotion/tsconfig.json"),
path.join(__dirname, "./packages/modules/region/tsconfig.json"),
path.join(__dirname, "./packages/modules/sales-channel/tsconfig.json"),
path.join(
__dirname,
"./packages/modules/sales-channel/tsconfig.json"
),
path.join(__dirname, "./packages/modules/settings/tsconfig.json"),
path.join(__dirname, "./packages/modules/stock-location/tsconfig.json"),
path.join(
__dirname,
"./packages/modules/stock-location/tsconfig.json"
),
path.join(__dirname, "./packages/modules/store/tsconfig.json"),
path.join(__dirname, "./packages/modules/tax/tsconfig.json"),
path.join(__dirname, "./packages/modules/translation/tsconfig.json"),
path.join(__dirname, "./packages/modules/user/tsconfig.json"),
path.join(__dirname, "./packages/modules/workflow-engine-inmemory/tsconfig.json"),
path.join(__dirname, "./packages/modules/workflow-engine-redis/tsconfig.json"),
path.join(
__dirname,
"./packages/modules/workflow-engine-inmemory/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/workflow-engine-redis/tsconfig.json"
),
path.join(__dirname, "./packages/modules/event/tsconfig.json"),

path.join(__dirname, "./packages/modules/providers/analytics-local/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/analytics-posthog/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/auth-emailpass/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/auth-github/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/auth-google/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/caching-redis/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/file-local/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/file-s3/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/fulfillment-manual/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/locking-postgres/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/locking-redis/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/notification-local/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/notification-sendgrid/tsconfig.json"),
path.join(__dirname, "./packages/modules/providers/payment-stripe/tsconfig.json"),
path.join(
__dirname,
"./packages/modules/providers/analytics-local/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/analytics-posthog/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/auth-emailpass/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/auth-github/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/auth-google/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/caching-redis/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/file-local/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/file-s3/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/fulfillment-manual/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/locking-postgres/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/locking-redis/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/notification-local/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/notification-sendgrid/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/payment-stripe/tsconfig.json"
),
path.join(
__dirname,
"./packages/modules/providers/event-redis/tsconfig.json"
),

path.join(__dirname, "./packages/plugins/draft-order/tsconfig.json"),
],
Expand Down
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ The code snippets in this section assume that your forked Medusa project and the
"@medusajs/caching-redis": "file:../medusa/packages/modules/providers/caching-redis",
"@medusajs/caching": "file:../medusa/packages/modules/caching",
"@medusajs/translation": "file:../medusa/packages/modules/translation",
"@medusajs/event": "file:../medusa/packages/modules/event",
}
```

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IEventBusModuleService } from "@medusajs/types"
import { IEventBusModuleService, IEventProvider } from "@medusajs/types"
import { CommonEvents, Modules } from "@medusajs/utils"
import os from "os"
import fs from "fs/promises"
Expand All @@ -13,9 +13,15 @@ import {
} from "../../../../helpers/create-admin-user"
import { getProductFixture } from "../../../../helpers/fixtures"
import { csv2json } from "json-2-csv"
import EventEmitter from "events"

jest.setTimeout(50000)

const LOCAL_PROVIDER_ID = "local"
type EventBus = IEventBusModuleService & {
getProvider: (id: string) => IEventProvider & { eventEmitter_: EventEmitter }
}

const getCSVContents = async (filePath: string) => {
const asLocalPath = filePath.replace("http://localhost:9000", os.tmpdir())
const fileContent = await fs.readFile(asLocalPath, { encoding: "utf-8" })
Expand Down Expand Up @@ -58,9 +64,9 @@ medusaIntegrationTestRunner({
let newTag
let shippingProfile

let eventBus: IEventBusModuleService
let eventBus: EventBus
beforeAll(async () => {
eventBus = getContainer().resolve(Modules.EVENT_BUS)
eventBus = getContainer().resolve<EventBus>(Modules.EVENT_BUS)
})

beforeEach(async () => {
Expand Down Expand Up @@ -217,7 +223,7 @@ medusaIntegrationTestRunner({
})

afterEach(() => {
;(eventBus as any).eventEmitter_.removeAllListeners()
eventBus.getProvider(LOCAL_PROVIDER_ID).eventEmitter_.removeAllListeners()
})

describe("POST /admin/products/export", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import {
medusaIntegrationTestRunner,
TestEventUtils,
} from "@medusajs/test-utils"
import { IEventBusModuleService } from "@medusajs/types"
import { IEventBusModuleService, IEventProvider } from "@medusajs/types"
import { CommonEvents, Modules } from "@medusajs/utils"
import FormData from "form-data"
import EventEmitter from "events"
import fs from "fs/promises"
import path from "path"
import {
Expand All @@ -14,6 +15,11 @@ import {
} from "../../../../helpers/create-admin-user"
import { getProductFixture } from "../../../../helpers/fixtures"

const LOCAL_PROVIDER_ID = "local"
type EventBus = IEventBusModuleService & {
getProvider: (id: string) => IEventProvider & { eventEmitter_: EventEmitter }
}

const UNALLOWED_EXPORTED_COLUMNS = [
"Product Is Giftcard",
"Product Created At",
Expand Down Expand Up @@ -67,9 +73,9 @@ medusaIntegrationTestRunner({
let newTag
let shippingProfile

let eventBus: IEventBusModuleService
let eventBus: EventBus
beforeAll(async () => {
eventBus = getContainer().resolve(Modules.EVENT_BUS)
eventBus = getContainer().resolve<EventBus>(Modules.EVENT_BUS)
})

beforeEach(async () => {
Expand Down Expand Up @@ -163,7 +169,7 @@ medusaIntegrationTestRunner({
})

afterEach(() => {
;(eventBus as any).eventEmitter_.removeAllListeners()
eventBus.getProvider(LOCAL_PROVIDER_ID).eventEmitter_.removeAllListeners()
})

describe("POST /admin/products/import", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import fs from "fs/promises"
import path, { extname } from "path"
import { csv2json, json2csv } from "json-2-csv"
import { CommonEvents, Modules } from "@medusajs/utils"
import { IEventBusModuleService, IFileModuleService } from "@medusajs/types"
import {
IEventBusModuleService,
IEventProvider,
IFileModuleService,
} from "@medusajs/types"
import {
TestEventUtils,
medusaIntegrationTestRunner,
Expand All @@ -12,6 +16,12 @@ import {
createAdminUser,
} from "../../../../helpers/create-admin-user"
import { getProductFixture } from "../../../../helpers/fixtures"
import EventEmitter from "events"

const LOCAL_PROVIDER_ID = "local"
type EventBus = IEventBusModuleService & {
getProvider: (id: string) => IEventProvider & { eventEmitter_: EventEmitter }
}

const UNALLOWED_EXPORTED_COLUMNS = [
"Product Is Giftcard",
Expand Down Expand Up @@ -69,10 +79,10 @@ medusaIntegrationTestRunner({
let newTag
let shippingProfile

let eventBus: IEventBusModuleService
let eventBus: EventBus
let fileModule: IFileModuleService
beforeAll(async () => {
eventBus = getContainer().resolve(Modules.EVENT_BUS)
eventBus = getContainer().resolve<EventBus>(Modules.EVENT_BUS)
fileModule = getContainer().resolve(Modules.FILE)
})

Expand Down Expand Up @@ -167,7 +177,7 @@ medusaIntegrationTestRunner({
})

afterEach(() => {
;(eventBus as any).eventEmitter_.removeAllListeners()
eventBus.getProvider(LOCAL_PROVIDER_ID).eventEmitter_.removeAllListeners()
})

describe("POST /admin/products/imports", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1002,7 +1002,10 @@ medusaIntegrationTestRunner({
invoke: async function failStep({ context }) {
eventGroupId = context!.eventGroupId!
grouppedEventBefore = (
(eventBus as any).groupedEventsMap_ as Map<string, any>
(eventBus as any).getProvider("local").groupedEventsMap_ as Map<
string,
any
>
).get(context!.eventGroupId!)

throw new Error(
Expand All @@ -1019,9 +1022,12 @@ medusaIntegrationTestRunner({
})

const grouppedEventAfter =
((eventBus as any).groupedEventsMap_ as Map<string, any>).get(
eventGroupId
) ?? []
(
(eventBus as any).getProvider("local").groupedEventsMap_ as Map<
string,
any
>
).get(eventGroupId) ?? []

expect(grouppedEventBefore).toHaveLength(17)
expect(grouppedEventAfter).toHaveLength(0) // events have been compensated
Expand Down
1 change: 1 addition & 0 deletions packages/core/types/src/event/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./provider"
Loading
Loading