Feat: Move container bindings declaration merging within the framework (#9467)
This commit is contained in:
1 parent
0a2ecdc889
commit
d98f22c7d6
13 files changed
+119
-105
No files matched your search
@@ -1,3 +1,5 @@
|
|||||||
|
import "../types/container"
|
||||||
|
|
||||||
export * from "./loader"
|
export * from "./loader"
|
||||||
export * from "./config"
|
export * from "./config"
|
||||||
export * from "./types"
|
export * from "./types"
|
||||||
@@ -1,32 +1,4 @@
|
|||||||
|
export * from "./types/container"
|
||||||
import { createMedusaContainer } from "@medusajs/utils"
|
import { createMedusaContainer } from "@medusajs/utils"
|
||||||
import { AwilixContainer, ResolveOptions } from "awilix"
|
|
||||||
import { ModuleImplementations } from "@medusajs/types"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Medusa Container extends [Awilix](https://github.com/jeffijoe/awilix) to
|
|
||||||
* provide dependency injection functionalities.
|
|
||||||
*/
|
|
||||||
// export type MedusaContainer<Cradle extends object = TransformObjectMethodToAsync<ModuleImplementations>> =
|
|
||||||
export type MedusaContainer<Cradle extends object = ModuleImplementations> =
|
|
||||||
Omit<AwilixContainer, "resolve"> & {
|
|
||||||
resolve<K extends keyof Cradle>(
|
|
||||||
key: K,
|
|
||||||
resolveOptions?: ResolveOptions
|
|
||||||
): Cradle[K]
|
|
||||||
resolve<T>(key: string, resolveOptions?: ResolveOptions): T
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
registerAdd: <T>(name: string, registration: T) => MedusaContainer
|
|
||||||
/**
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
createScope: () => MedusaContainer
|
|
||||||
}
|
|
||||||
|
|
||||||
export type ContainerLike = {
|
|
||||||
resolve<T = unknown>(key: string): T
|
|
||||||
}
|
|
||||||
|
|
||||||
export const container = createMedusaContainer()
|
export const container = createMedusaContainer()
|
||||||
@@ -1 +1,2 @@
|
|||||||
|
import "../types/container"
|
||||||
export * from "./pg-connection-loader"
|
export * from "./pg-connection-loader"
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import "../types/container"
|
||||||
|
|
||||||
export * from "./types"
|
export * from "./types"
|
||||||
export * from "./feature-flag-loader"
|
export * from "./feature-flag-loader"
|
||||||
export * from "./flag-router"
|
export * from "./flag-router"
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import "../types/container"
|
||||||
|
|
||||||
export * from "./express-loader"
|
export * from "./express-loader"
|
||||||
export * from "./router"
|
export * from "./router"
|
||||||
export * from "./types"
|
export * from "./types"
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
import { Knex } from "@mikro-orm/knex"
|
||||||
|
import { RemoteLink } from "@medusajs/modules-sdk"
|
||||||
|
import { AwilixContainer, ResolveOptions } from "awilix"
|
||||||
|
import { Modules, ContainerRegistrationKeys } from "@medusajs/utils"
|
||||||
|
import {
|
||||||
|
Logger,
|
||||||
|
ConfigModule,
|
||||||
|
ModuleImplementations,
|
||||||
|
RemoteQueryFunction,
|
||||||
|
IAuthModuleService,
|
||||||
|
ICacheService,
|
||||||
|
ICartModuleService,
|
||||||
|
ICustomerModuleService,
|
||||||
|
IEventBusModuleService,
|
||||||
|
IInventoryService,
|
||||||
|
IPaymentModuleService,
|
||||||
|
IPricingModuleService,
|
||||||
|
IProductModuleService,
|
||||||
|
IPromotionModuleService,
|
||||||
|
ISalesChannelModuleService,
|
||||||
|
ITaxModuleService,
|
||||||
|
IFulfillmentModuleService,
|
||||||
|
IStockLocationService,
|
||||||
|
IUserModuleService,
|
||||||
|
IWorkflowEngineService,
|
||||||
|
IRegionModuleService,
|
||||||
|
IOrderModuleService,
|
||||||
|
IApiKeyModuleService,
|
||||||
|
IStoreModuleService,
|
||||||
|
ICurrencyModuleService,
|
||||||
|
IFileModuleService,
|
||||||
|
INotificationModuleService,
|
||||||
|
} from "@medusajs/types"
|
||||||
|
|
||||||
|
declare module "@medusajs/types" {
|
||||||
|
export interface ModuleImplementations {
|
||||||
|
[ContainerRegistrationKeys.REMOTE_LINK]: RemoteLink
|
||||||
|
[ContainerRegistrationKeys.CONFIG_MODULE]: ConfigModule
|
||||||
|
[ContainerRegistrationKeys.PG_CONNECTION]: Knex<any>
|
||||||
|
[ContainerRegistrationKeys.REMOTE_QUERY]: RemoteQueryFunction
|
||||||
|
[ContainerRegistrationKeys.QUERY]: Omit<RemoteQueryFunction, symbol>
|
||||||
|
[ContainerRegistrationKeys.LOGGER]: Logger
|
||||||
|
[Modules.AUTH]: IAuthModuleService
|
||||||
|
[Modules.CACHE]: ICacheService
|
||||||
|
[Modules.CART]: ICartModuleService
|
||||||
|
[Modules.CUSTOMER]: ICustomerModuleService
|
||||||
|
[Modules.EVENT_BUS]: IEventBusModuleService
|
||||||
|
[Modules.INVENTORY]: IInventoryService
|
||||||
|
[Modules.PAYMENT]: IPaymentModuleService
|
||||||
|
[Modules.PRICING]: IPricingModuleService
|
||||||
|
[Modules.PRODUCT]: IProductModuleService
|
||||||
|
[Modules.PROMOTION]: IPromotionModuleService
|
||||||
|
[Modules.SALES_CHANNEL]: ISalesChannelModuleService
|
||||||
|
[Modules.TAX]: ITaxModuleService
|
||||||
|
[Modules.FULFILLMENT]: IFulfillmentModuleService
|
||||||
|
[Modules.STOCK_LOCATION]: IStockLocationService
|
||||||
|
[Modules.USER]: IUserModuleService
|
||||||
|
[Modules.WORKFLOW_ENGINE]: IWorkflowEngineService
|
||||||
|
[Modules.REGION]: IRegionModuleService
|
||||||
|
[Modules.ORDER]: IOrderModuleService
|
||||||
|
[Modules.API_KEY]: IApiKeyModuleService
|
||||||
|
[Modules.STORE]: IStoreModuleService
|
||||||
|
[Modules.CURRENCY]: ICurrencyModuleService
|
||||||
|
[Modules.FILE]: IFileModuleService
|
||||||
|
[Modules.NOTIFICATION]: INotificationModuleService
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type MedusaContainer<Cradle extends object = ModuleImplementations> =
|
||||||
|
Omit<AwilixContainer, "resolve"> & {
|
||||||
|
resolve<K extends keyof Cradle>(
|
||||||
|
key: K,
|
||||||
|
resolveOptions?: ResolveOptions
|
||||||
|
): Cradle[K]
|
||||||
|
resolve<T>(key: string, resolveOptions?: ResolveOptions): T
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
registerAdd: <T>(name: string, registration: T) => MedusaContainer
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
createScope: () => MedusaContainer
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ContainerLike = {
|
||||||
|
resolve<T = unknown>(key: string): T
|
||||||
|
}
|
||||||
@@ -1 +1,3 @@
|
|||||||
|
import "../types/container"
|
||||||
|
|
||||||
export * from "@medusajs/utils"
|
export * from "@medusajs/utils"
|
||||||
@@ -1 +1,3 @@
|
|||||||
|
import "../types/container"
|
||||||
|
|
||||||
export * from "@medusajs/workflows-sdk"
|
export * from "@medusajs/workflows-sdk"
|
||||||
@@ -1 +1,3 @@
|
|||||||
|
import "../types/container"
|
||||||
|
|
||||||
export * from "./workflow-loader"
|
export * from "./workflow-loader"
|
||||||
@@ -1,11 +1,9 @@
|
|||||||
import { RemoteFetchDataCallback } from "@medusajs/orchestration"
|
import { RemoteFetchDataCallback } from "@medusajs/orchestration"
|
||||||
import {
|
import {
|
||||||
ConfigModule,
|
|
||||||
ExternalModuleDeclaration,
|
ExternalModuleDeclaration,
|
||||||
ILinkMigrationsPlanner,
|
ILinkMigrationsPlanner,
|
||||||
InternalModuleDeclaration,
|
InternalModuleDeclaration,
|
||||||
LoadedModule,
|
LoadedModule,
|
||||||
Logger,
|
|
||||||
MedusaContainer,
|
MedusaContainer,
|
||||||
ModuleBootstrapDeclaration,
|
ModuleBootstrapDeclaration,
|
||||||
ModuleDefinition,
|
ModuleDefinition,
|
||||||
@@ -26,7 +24,6 @@ import {
|
|||||||
ModulesSdkUtils,
|
ModulesSdkUtils,
|
||||||
promiseAll,
|
promiseAll,
|
||||||
} from "@medusajs/utils"
|
} from "@medusajs/utils"
|
||||||
import type { Knex } from "@mikro-orm/knex"
|
|
||||||
import { asValue } from "awilix"
|
import { asValue } from "awilix"
|
||||||
import { MODULE_PACKAGE_NAMES } from "./definitions"
|
import { MODULE_PACKAGE_NAMES } from "./definitions"
|
||||||
import {
|
import {
|
||||||
@@ -41,17 +38,6 @@ import { MODULE_RESOURCE_TYPE, MODULE_SCOPE } from "./types"
|
|||||||
|
|
||||||
const LinkModulePackage = MODULE_PACKAGE_NAMES[Modules.LINK]
|
const LinkModulePackage = MODULE_PACKAGE_NAMES[Modules.LINK]
|
||||||
|
|
||||||
declare module "@medusajs/types" {
|
|
||||||
export interface ModuleImplementations {
|
|
||||||
[ContainerRegistrationKeys.REMOTE_LINK]: RemoteLink
|
|
||||||
[ContainerRegistrationKeys.CONFIG_MODULE]: ConfigModule
|
|
||||||
[ContainerRegistrationKeys.PG_CONNECTION]: Knex<any>
|
|
||||||
[ContainerRegistrationKeys.REMOTE_QUERY]: RemoteQueryFunction
|
|
||||||
[ContainerRegistrationKeys.QUERY]: Omit<RemoteQueryFunction, symbol>
|
|
||||||
[ContainerRegistrationKeys.LOGGER]: Logger
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export type RunMigrationFn = () => Promise<void>
|
export type RunMigrationFn = () => Promise<void>
|
||||||
export type RevertMigrationFn = (moduleNames: string[]) => Promise<void>
|
export type RevertMigrationFn = (moduleNames: string[]) => Promise<void>
|
||||||
export type GenerateMigrations = (moduleNames: string[]) => Promise<void>
|
export type GenerateMigrations = (moduleNames: string[]) => Promise<void>
|
||||||
|
|||||||
@@ -1,29 +1,3 @@
|
|||||||
import type {
|
|
||||||
IApiKeyModuleService,
|
|
||||||
IAuthModuleService,
|
|
||||||
ICacheService,
|
|
||||||
ICartModuleService,
|
|
||||||
ICurrencyModuleService,
|
|
||||||
ICustomerModuleService,
|
|
||||||
IEventBusModuleService,
|
|
||||||
IFileModuleService,
|
|
||||||
IFulfillmentModuleService,
|
|
||||||
IInventoryService,
|
|
||||||
INotificationModuleService,
|
|
||||||
IOrderModuleService,
|
|
||||||
IPaymentModuleService,
|
|
||||||
IPricingModuleService,
|
|
||||||
IProductModuleService,
|
|
||||||
IPromotionModuleService,
|
|
||||||
IRegionModuleService,
|
|
||||||
ISalesChannelModuleService,
|
|
||||||
IStockLocationService,
|
|
||||||
IStoreModuleService,
|
|
||||||
ITaxModuleService,
|
|
||||||
IUserModuleService,
|
|
||||||
IWorkflowEngineService,
|
|
||||||
} from "@medusajs/types"
|
|
||||||
|
|
||||||
export enum Modules {
|
export enum Modules {
|
||||||
AUTH = "Auth",
|
AUTH = "Auth",
|
||||||
CACHE = "Cache",
|
CACHE = "Cache",
|
||||||
@@ -53,32 +27,3 @@ export enum Modules {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const ModuleRegistrationName = Modules
|
export const ModuleRegistrationName = Modules
|
||||||
|
|
||||||
declare module "@medusajs/types" {
|
|
||||||
export interface ModuleImplementations {
|
|
||||||
[Modules.AUTH]: IAuthModuleService
|
|
||||||
[Modules.CACHE]: ICacheService
|
|
||||||
[Modules.CART]: ICartModuleService
|
|
||||||
[Modules.CUSTOMER]: ICustomerModuleService
|
|
||||||
[Modules.EVENT_BUS]: IEventBusModuleService
|
|
||||||
[Modules.INVENTORY]: IInventoryService
|
|
||||||
[Modules.PAYMENT]: IPaymentModuleService
|
|
||||||
[Modules.PRICING]: IPricingModuleService
|
|
||||||
[Modules.PRODUCT]: IProductModuleService
|
|
||||||
[Modules.PROMOTION]: IPromotionModuleService
|
|
||||||
[Modules.SALES_CHANNEL]: ISalesChannelModuleService
|
|
||||||
[Modules.TAX]: ITaxModuleService
|
|
||||||
[Modules.FULFILLMENT]: IFulfillmentModuleService
|
|
||||||
[Modules.STOCK_LOCATION]: IStockLocationService
|
|
||||||
[Modules.USER]: IUserModuleService
|
|
||||||
[Modules.WORKFLOW_ENGINE]: IWorkflowEngineService
|
|
||||||
[Modules.REGION]: IRegionModuleService
|
|
||||||
[Modules.ORDER]: IOrderModuleService
|
|
||||||
[Modules.API_KEY]: IApiKeyModuleService
|
|
||||||
[Modules.STORE]: IStoreModuleService
|
|
||||||
[Modules.CURRENCY]: ICurrencyModuleService
|
|
||||||
[Modules.FILE]: IFileModuleService
|
|
||||||
[Modules.NOTIFICATION]: INotificationModuleService
|
|
||||||
[Modules.INDEX]: any // TODO: define index module interface
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,13 @@ import {
|
|||||||
TransactionHandlerType,
|
TransactionHandlerType,
|
||||||
TransactionState,
|
TransactionState,
|
||||||
} from "@medusajs/orchestration"
|
} from "@medusajs/orchestration"
|
||||||
import { Context, LoadedModule, MedusaContainer } from "@medusajs/types"
|
import {
|
||||||
|
Context,
|
||||||
|
IEventBusModuleService,
|
||||||
|
LoadedModule,
|
||||||
|
Logger,
|
||||||
|
MedusaContainer,
|
||||||
|
} from "@medusajs/types"
|
||||||
import {
|
import {
|
||||||
ContainerRegistrationKeys,
|
ContainerRegistrationKeys,
|
||||||
isPresent,
|
isPresent,
|
||||||
@@ -514,7 +520,7 @@ function attachOnFinishReleaseEvents(
|
|||||||
const flowEventGroupId = transaction.getFlow().metadata?.eventGroupId
|
const flowEventGroupId = transaction.getFlow().metadata?.eventGroupId
|
||||||
|
|
||||||
const logger =
|
const logger =
|
||||||
(flow.container as MedusaContainer).resolve(
|
(flow.container as MedusaContainer).resolve<Logger>(
|
||||||
ContainerRegistrationKeys.LOGGER,
|
ContainerRegistrationKeys.LOGGER,
|
||||||
{ allowUnregistered: true }
|
{ allowUnregistered: true }
|
||||||
) || console
|
) || console
|
||||||
@@ -539,10 +545,11 @@ function attachOnFinishReleaseEvents(
|
|||||||
|
|
||||||
await onFinish?.(args)
|
await onFinish?.(args)
|
||||||
|
|
||||||
const eventBusService = (flow.container as MedusaContainer).resolve(
|
const eventBusService = (
|
||||||
Modules.EVENT_BUS,
|
flow.container as MedusaContainer
|
||||||
{ allowUnregistered: true }
|
).resolve<IEventBusModuleService>(Modules.EVENT_BUS, {
|
||||||
)
|
allowUnregistered: true,
|
||||||
|
})
|
||||||
|
|
||||||
if (!eventBusService || !flowEventGroupId) {
|
if (!eventBusService || !flowEventGroupId) {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -2216,7 +2216,9 @@ describe("Workflow composer", function () {
|
|||||||
throwOnError: false,
|
throwOnError: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
const eventBusMock = container.resolve(Modules.EVENT_BUS)
|
const eventBusMock = container.resolve<IEventBusModuleService>(
|
||||||
|
Modules.EVENT_BUS
|
||||||
|
)
|
||||||
|
|
||||||
expect(eventBusMock.emit).toHaveBeenCalledTimes(1)
|
expect(eventBusMock.emit).toHaveBeenCalledTimes(1)
|
||||||
expect(eventBusMock.releaseGroupedEvents).toHaveBeenCalledTimes(0)
|
expect(eventBusMock.releaseGroupedEvents).toHaveBeenCalledTimes(0)
|
||||||
|
|||||||
Reference in new issue
Block a user