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

This commit is contained in:
Harminder Virk authored and GitHub committed 2024-10-04 15:47:06 +05:30
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 -29
View File
@@ -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)