Feat: Move container bindings declaration merging within the framework (#9467)

This commit is contained in:
Harminder Virk
2024-10-04 15:47:06 +05:30
committed by GitHub
parent 0a2ecdc889
commit d98f22c7d6
13 changed files with 119 additions and 105 deletions

View File

@@ -1,3 +1,5 @@
import "../types/container"
export * from "./loader"
export * from "./config"
export * from "./types"

View File

@@ -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()

View File

@@ -1 +1,2 @@
import "../types/container"
export * from "./pg-connection-loader"

View File

@@ -1,3 +1,5 @@
import "../types/container"
export * from "./types"
export * from "./feature-flag-loader"
export * from "./flag-router"

View File

@@ -1,3 +1,5 @@
import "../types/container"
export * from "./express-loader"
export * from "./router"
export * from "./types"

View 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
}

View File

@@ -1 +1,3 @@
import "../types/container"
export * from "@medusajs/utils"

View File

@@ -1 +1,3 @@
import "../types/container"
export * from "@medusajs/workflows-sdk"

View File

@@ -1 +1,3 @@
import "../types/container"
export * from "./workflow-loader"

View File

@@ -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>

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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)