Feat: Move container bindings declaration merging within the framework (#9467)
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import "../types/container"
|
||||
|
||||
export * from "./loader"
|
||||
export * from "./config"
|
||||
export * from "./types"
|
||||
|
||||
@@ -1,32 +1,4 @@
|
||||
export * from "./types/container"
|
||||
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()
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
import "../types/container"
|
||||
export * from "./pg-connection-loader"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import "../types/container"
|
||||
|
||||
export * from "./types"
|
||||
export * from "./feature-flag-loader"
|
||||
export * from "./flag-router"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import "../types/container"
|
||||
|
||||
export * from "./express-loader"
|
||||
export * from "./router"
|
||||
export * from "./types"
|
||||
|
||||
89
packages/core/framework/src/types/container.ts
Normal file
89
packages/core/framework/src/types/container.ts
Normal file
@@ -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"
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
import "../types/container"
|
||||
|
||||
export * from "@medusajs/workflows-sdk"
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
import "../types/container"
|
||||
|
||||
export * from "./workflow-loader"
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import { RemoteFetchDataCallback } from "@medusajs/orchestration"
|
||||
import {
|
||||
ConfigModule,
|
||||
ExternalModuleDeclaration,
|
||||
ILinkMigrationsPlanner,
|
||||
InternalModuleDeclaration,
|
||||
LoadedModule,
|
||||
Logger,
|
||||
MedusaContainer,
|
||||
ModuleBootstrapDeclaration,
|
||||
ModuleDefinition,
|
||||
@@ -26,7 +24,6 @@ import {
|
||||
ModulesSdkUtils,
|
||||
promiseAll,
|
||||
} from "@medusajs/utils"
|
||||
import type { Knex } from "@mikro-orm/knex"
|
||||
import { asValue } from "awilix"
|
||||
import { MODULE_PACKAGE_NAMES } from "./definitions"
|
||||
import {
|
||||
@@ -41,17 +38,6 @@ import { MODULE_RESOURCE_TYPE, MODULE_SCOPE } from "./types"
|
||||
|
||||
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 RevertMigrationFn = (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 {
|
||||
AUTH = "Auth",
|
||||
CACHE = "Cache",
|
||||
@@ -53,32 +27,3 @@ export enum 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,
|
||||
TransactionState,
|
||||
} from "@medusajs/orchestration"
|
||||
import { Context, LoadedModule, MedusaContainer } from "@medusajs/types"
|
||||
import {
|
||||
Context,
|
||||
IEventBusModuleService,
|
||||
LoadedModule,
|
||||
Logger,
|
||||
MedusaContainer,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
ContainerRegistrationKeys,
|
||||
isPresent,
|
||||
@@ -514,7 +520,7 @@ function attachOnFinishReleaseEvents(
|
||||
const flowEventGroupId = transaction.getFlow().metadata?.eventGroupId
|
||||
|
||||
const logger =
|
||||
(flow.container as MedusaContainer).resolve(
|
||||
(flow.container as MedusaContainer).resolve<Logger>(
|
||||
ContainerRegistrationKeys.LOGGER,
|
||||
{ allowUnregistered: true }
|
||||
) || console
|
||||
@@ -539,10 +545,11 @@ function attachOnFinishReleaseEvents(
|
||||
|
||||
await onFinish?.(args)
|
||||
|
||||
const eventBusService = (flow.container as MedusaContainer).resolve(
|
||||
Modules.EVENT_BUS,
|
||||
{ allowUnregistered: true }
|
||||
)
|
||||
const eventBusService = (
|
||||
flow.container as MedusaContainer
|
||||
).resolve<IEventBusModuleService>(Modules.EVENT_BUS, {
|
||||
allowUnregistered: true,
|
||||
})
|
||||
|
||||
if (!eventBusService || !flowEventGroupId) {
|
||||
return
|
||||
|
||||
@@ -2216,7 +2216,9 @@ describe("Workflow composer", function () {
|
||||
throwOnError: false,
|
||||
})
|
||||
|
||||
const eventBusMock = container.resolve(Modules.EVENT_BUS)
|
||||
const eventBusMock = container.resolve<IEventBusModuleService>(
|
||||
Modules.EVENT_BUS
|
||||
)
|
||||
|
||||
expect(eventBusMock.emit).toHaveBeenCalledTimes(1)
|
||||
expect(eventBusMock.releaseGroupedEvents).toHaveBeenCalledTimes(0)
|
||||
|
||||
Reference in New Issue
Block a user