fix: load custom modules by path (#6312)

What:
medusa-config.js loading custom modules by their path.

```typescript
{
  modules: {
    internalModule: {
      scope: MODULE_SCOPE.INTERNAL,
      resources: MODULE_RESOURCE_TYPE.SHARED,
      resolve: "./internal_module",
      definition: {
        key: "internalModule",
        registrationName: "internalModule",
      },
    },
  }
}
```
This commit is contained in:
Carlos R. L. Rodrigues
2024-02-04 11:26:34 -03:00
committed by GitHub
parent 58baead34e
commit 96ba49329b
13 changed files with 14 additions and 35 deletions

View File

@@ -5,7 +5,6 @@ export const InventoryModule = {
defaultPackage: false,
label: "InventoryService",
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: [],
defaultModuleDeclaration: {

View File

@@ -4,7 +4,6 @@ export const InventoryStockLocationLink = {
registrationName: "inventoryStockLocationLink",
defaultPackage: "",
label: "inventoryStockLocationLink",
canOverride: true,
isRequired: false,
isQueryable: true,
defaultModuleDeclaration: {

View File

@@ -4,7 +4,6 @@ export const ProductInventoryLinkModule = {
registrationName: "productVariantInventoryInventoryItemLink",
defaultPackage: "",
label: "productVariantInventoryInventoryItemLink",
canOverride: true,
isRequired: false,
isQueryable: true,
defaultModuleDeclaration: {

View File

@@ -5,7 +5,6 @@ export const ProductModule = {
defaultPackage: false,
label: "ProductModuleService",
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["eventBusModuleService"],
defaultModuleDeclaration: {

View File

@@ -5,7 +5,6 @@ export const StockLocationModule = {
defaultPackage: false,
label: "StockLocationService",
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["eventBusService"],
defaultModuleDeclaration: {

View File

@@ -64,7 +64,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
registrationName: ModuleRegistrationName.EVENT_BUS,
defaultPackage: MODULE_PACKAGE_NAMES[Modules.EVENT_BUS],
label: upperCaseFirst(ModuleRegistrationName.EVENT_BUS),
canOverride: true,
isRequired: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -79,7 +78,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.STOCK_LOCATION),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["eventBusService"],
defaultModuleDeclaration: {
@@ -94,7 +92,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.INVENTORY),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["eventBusService"],
defaultModuleDeclaration: {
@@ -109,7 +106,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: MODULE_PACKAGE_NAMES[Modules.CACHE],
label: upperCaseFirst(ModuleRegistrationName.CACHE),
isRequired: true,
canOverride: true,
defaultModuleDeclaration: {
scope: MODULE_SCOPE.INTERNAL,
resources: MODULE_RESOURCE_TYPE.SHARED,
@@ -121,7 +117,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.PRODUCT),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: [ModuleRegistrationName.EVENT_BUS, "logger"],
defaultModuleDeclaration: {
@@ -135,7 +130,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.PRICING),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -149,7 +143,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.PROMOTION),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -163,7 +156,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.AUTH),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -177,7 +169,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.WORKFLOW_ENGINE),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -191,7 +182,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.SALES_CHANNEL),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -205,7 +195,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.CART),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -219,7 +208,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.CUSTOMER),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {
@@ -233,7 +221,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
defaultPackage: false,
label: upperCaseFirst(ModuleRegistrationName.PAYMENT),
isRequired: false,
canOverride: true,
isQueryable: true,
dependencies: ["logger"],
defaultModuleDeclaration: {

View File

@@ -18,7 +18,6 @@ describe("module definitions loader", () => {
label: "TestService",
isLegacy: true,
isRequired: false,
canOverride: true,
defaultModuleDeclaration: {
scope: MODULE_SCOPE.INTERNAL,
resources: MODULE_RESOURCE_TYPE.SHARED,

View File

@@ -94,7 +94,7 @@ function getInternalModuleResolution(
// If user added a module and it's overridable, we resolve that instead
const isString = typeof moduleConfig === "string"
if (definition.canOverride && (isString || (isObj && moduleConfig.resolve))) {
if (isString || (isObj && moduleConfig.resolve)) {
resolutionPath = !moduleExports
? resolveCwd(isString ? moduleConfig : (moduleConfig.resolve as string))
: // Explicitly assign an empty string, later, we will check if the value is exactly false.

View File

@@ -29,12 +29,12 @@ export async function loadInternalModule(
// the exports. This is useful when a package export an initialize function which will bootstrap itself and therefore
// does not need to import the package that is currently being loaded as it would create a
// circular reference.
const path = resolution.resolutionPath as string
const modulePath = resolution.resolutionPath as string
if (resolution.moduleExports) {
loadedModule = resolution.moduleExports
} else {
loadedModule = await import(path)
loadedModule = await import(modulePath)
loadedModule = (loadedModule as any).default
}
} catch (error) {

View File

@@ -74,7 +74,7 @@ async function loadModules(modulesConfig, sharedContainer) {
let path: string
let moduleExports: ModuleExports | undefined = undefined
let declaration: any = {}
let definition: ModuleDefinition | undefined = undefined
let definition: Partial<ModuleDefinition> | undefined = undefined
if (isObject(mod)) {
const mod_ = mod as unknown as InternalModuleDeclaration
@@ -102,7 +102,7 @@ async function loadModules(modulesConfig, sharedContainer) {
defaultPath: path,
declaration,
sharedContainer,
moduleDefinition: definition,
moduleDefinition: definition as ModuleDefinition,
moduleExports,
})) as LoadedModule

View File

@@ -86,7 +86,7 @@ export class MedusaModule {
return MedusaModule.getModuleInstance(key)
})
}
public static onApplicationStart(): void {
for (const instances of MedusaModule.instances_.values()) {
for (const instance of Object.values(instances) as IModuleService[]) {
@@ -354,7 +354,6 @@ export class MedusaModule {
dependencies: definition.dependencies,
defaultPackage: "",
label: definition.label,
canOverride: true,
isRequired: false,
isQueryable: true,
defaultModuleDeclaration: definition.defaultModuleDeclaration,