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:
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/modules-sdk": patch
|
||||||
|
"@medusajs/types": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Load custom modules by path
|
||||||
@@ -5,7 +5,6 @@ export const InventoryModule = {
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: "InventoryService",
|
label: "InventoryService",
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ export const InventoryStockLocationLink = {
|
|||||||
registrationName: "inventoryStockLocationLink",
|
registrationName: "inventoryStockLocationLink",
|
||||||
defaultPackage: "",
|
defaultPackage: "",
|
||||||
label: "inventoryStockLocationLink",
|
label: "inventoryStockLocationLink",
|
||||||
canOverride: true,
|
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ export const ProductInventoryLinkModule = {
|
|||||||
registrationName: "productVariantInventoryInventoryItemLink",
|
registrationName: "productVariantInventoryInventoryItemLink",
|
||||||
defaultPackage: "",
|
defaultPackage: "",
|
||||||
label: "productVariantInventoryInventoryItemLink",
|
label: "productVariantInventoryInventoryItemLink",
|
||||||
canOverride: true,
|
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ export const ProductModule = {
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: "ProductModuleService",
|
label: "ProductModuleService",
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["eventBusModuleService"],
|
dependencies: ["eventBusModuleService"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ export const StockLocationModule = {
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: "StockLocationService",
|
label: "StockLocationService",
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["eventBusService"],
|
dependencies: ["eventBusService"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
registrationName: ModuleRegistrationName.EVENT_BUS,
|
registrationName: ModuleRegistrationName.EVENT_BUS,
|
||||||
defaultPackage: MODULE_PACKAGE_NAMES[Modules.EVENT_BUS],
|
defaultPackage: MODULE_PACKAGE_NAMES[Modules.EVENT_BUS],
|
||||||
label: upperCaseFirst(ModuleRegistrationName.EVENT_BUS),
|
label: upperCaseFirst(ModuleRegistrationName.EVENT_BUS),
|
||||||
canOverride: true,
|
|
||||||
isRequired: true,
|
isRequired: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -79,7 +78,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.STOCK_LOCATION),
|
label: upperCaseFirst(ModuleRegistrationName.STOCK_LOCATION),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["eventBusService"],
|
dependencies: ["eventBusService"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -94,7 +92,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.INVENTORY),
|
label: upperCaseFirst(ModuleRegistrationName.INVENTORY),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["eventBusService"],
|
dependencies: ["eventBusService"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -109,7 +106,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: MODULE_PACKAGE_NAMES[Modules.CACHE],
|
defaultPackage: MODULE_PACKAGE_NAMES[Modules.CACHE],
|
||||||
label: upperCaseFirst(ModuleRegistrationName.CACHE),
|
label: upperCaseFirst(ModuleRegistrationName.CACHE),
|
||||||
isRequired: true,
|
isRequired: true,
|
||||||
canOverride: true,
|
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
scope: MODULE_SCOPE.INTERNAL,
|
scope: MODULE_SCOPE.INTERNAL,
|
||||||
resources: MODULE_RESOURCE_TYPE.SHARED,
|
resources: MODULE_RESOURCE_TYPE.SHARED,
|
||||||
@@ -121,7 +117,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.PRODUCT),
|
label: upperCaseFirst(ModuleRegistrationName.PRODUCT),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: [ModuleRegistrationName.EVENT_BUS, "logger"],
|
dependencies: [ModuleRegistrationName.EVENT_BUS, "logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -135,7 +130,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.PRICING),
|
label: upperCaseFirst(ModuleRegistrationName.PRICING),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -149,7 +143,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.PROMOTION),
|
label: upperCaseFirst(ModuleRegistrationName.PROMOTION),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -163,7 +156,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.AUTH),
|
label: upperCaseFirst(ModuleRegistrationName.AUTH),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -177,7 +169,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.WORKFLOW_ENGINE),
|
label: upperCaseFirst(ModuleRegistrationName.WORKFLOW_ENGINE),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -191,7 +182,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.SALES_CHANNEL),
|
label: upperCaseFirst(ModuleRegistrationName.SALES_CHANNEL),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -205,7 +195,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.CART),
|
label: upperCaseFirst(ModuleRegistrationName.CART),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -219,7 +208,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.CUSTOMER),
|
label: upperCaseFirst(ModuleRegistrationName.CUSTOMER),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
@@ -233,7 +221,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.PAYMENT),
|
label: upperCaseFirst(ModuleRegistrationName.PAYMENT),
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
dependencies: ["logger"],
|
dependencies: ["logger"],
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ describe("module definitions loader", () => {
|
|||||||
label: "TestService",
|
label: "TestService",
|
||||||
isLegacy: true,
|
isLegacy: true,
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
canOverride: true,
|
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
scope: MODULE_SCOPE.INTERNAL,
|
scope: MODULE_SCOPE.INTERNAL,
|
||||||
resources: MODULE_RESOURCE_TYPE.SHARED,
|
resources: MODULE_RESOURCE_TYPE.SHARED,
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ function getInternalModuleResolution(
|
|||||||
|
|
||||||
// If user added a module and it's overridable, we resolve that instead
|
// If user added a module and it's overridable, we resolve that instead
|
||||||
const isString = typeof moduleConfig === "string"
|
const isString = typeof moduleConfig === "string"
|
||||||
if (definition.canOverride && (isString || (isObj && moduleConfig.resolve))) {
|
if (isString || (isObj && moduleConfig.resolve)) {
|
||||||
resolutionPath = !moduleExports
|
resolutionPath = !moduleExports
|
||||||
? resolveCwd(isString ? moduleConfig : (moduleConfig.resolve as string))
|
? resolveCwd(isString ? moduleConfig : (moduleConfig.resolve as string))
|
||||||
: // Explicitly assign an empty string, later, we will check if the value is exactly false.
|
: // Explicitly assign an empty string, later, we will check if the value is exactly false.
|
||||||
|
|||||||
@@ -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
|
// 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
|
// does not need to import the package that is currently being loaded as it would create a
|
||||||
// circular reference.
|
// circular reference.
|
||||||
const path = resolution.resolutionPath as string
|
const modulePath = resolution.resolutionPath as string
|
||||||
|
|
||||||
if (resolution.moduleExports) {
|
if (resolution.moduleExports) {
|
||||||
loadedModule = resolution.moduleExports
|
loadedModule = resolution.moduleExports
|
||||||
} else {
|
} else {
|
||||||
loadedModule = await import(path)
|
loadedModule = await import(modulePath)
|
||||||
loadedModule = (loadedModule as any).default
|
loadedModule = (loadedModule as any).default
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ async function loadModules(modulesConfig, sharedContainer) {
|
|||||||
let path: string
|
let path: string
|
||||||
let moduleExports: ModuleExports | undefined = undefined
|
let moduleExports: ModuleExports | undefined = undefined
|
||||||
let declaration: any = {}
|
let declaration: any = {}
|
||||||
let definition: ModuleDefinition | undefined = undefined
|
let definition: Partial<ModuleDefinition> | undefined = undefined
|
||||||
|
|
||||||
if (isObject(mod)) {
|
if (isObject(mod)) {
|
||||||
const mod_ = mod as unknown as InternalModuleDeclaration
|
const mod_ = mod as unknown as InternalModuleDeclaration
|
||||||
@@ -102,7 +102,7 @@ async function loadModules(modulesConfig, sharedContainer) {
|
|||||||
defaultPath: path,
|
defaultPath: path,
|
||||||
declaration,
|
declaration,
|
||||||
sharedContainer,
|
sharedContainer,
|
||||||
moduleDefinition: definition,
|
moduleDefinition: definition as ModuleDefinition,
|
||||||
moduleExports,
|
moduleExports,
|
||||||
})) as LoadedModule
|
})) as LoadedModule
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export class MedusaModule {
|
|||||||
return MedusaModule.getModuleInstance(key)
|
return MedusaModule.getModuleInstance(key)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public static onApplicationStart(): void {
|
public static onApplicationStart(): void {
|
||||||
for (const instances of MedusaModule.instances_.values()) {
|
for (const instances of MedusaModule.instances_.values()) {
|
||||||
for (const instance of Object.values(instances) as IModuleService[]) {
|
for (const instance of Object.values(instances) as IModuleService[]) {
|
||||||
@@ -354,7 +354,6 @@ export class MedusaModule {
|
|||||||
dependencies: definition.dependencies,
|
dependencies: definition.dependencies,
|
||||||
defaultPackage: "",
|
defaultPackage: "",
|
||||||
label: definition.label,
|
label: definition.label,
|
||||||
canOverride: true,
|
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
isQueryable: true,
|
isQueryable: true,
|
||||||
defaultModuleDeclaration: definition.defaultModuleDeclaration,
|
defaultModuleDeclaration: definition.defaultModuleDeclaration,
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export type InternalModuleDeclaration = {
|
|||||||
scope: MODULE_SCOPE.INTERNAL
|
scope: MODULE_SCOPE.INTERNAL
|
||||||
resources: MODULE_RESOURCE_TYPE
|
resources: MODULE_RESOURCE_TYPE
|
||||||
dependencies?: string[]
|
dependencies?: string[]
|
||||||
definition?: ModuleDefinition // That represent the definition of the module, such as the one we have for the medusa supported modules. This property is used for custom made modules.
|
definition?: Partial<ModuleDefinition> // That represent the definition of the module, such as the one we have for the medusa supported modules. This property is used for custom made modules.
|
||||||
resolve?: string | ModuleExports
|
resolve?: string | ModuleExports
|
||||||
options?: Record<string, unknown>
|
options?: Record<string, unknown>
|
||||||
/**
|
/**
|
||||||
@@ -51,7 +51,7 @@ export type InternalModuleDeclaration = {
|
|||||||
|
|
||||||
export type ExternalModuleDeclaration = {
|
export type ExternalModuleDeclaration = {
|
||||||
scope: MODULE_SCOPE.EXTERNAL
|
scope: MODULE_SCOPE.EXTERNAL
|
||||||
definition?: ModuleDefinition // That represent the definition of the module, such as the one we have for the medusa supported modules. This property is used for custom made modules.
|
definition?: Partial<ModuleDefinition> // That represent the definition of the module, such as the one we have for the medusa supported modules. This property is used for custom made modules.
|
||||||
server?: {
|
server?: {
|
||||||
type: "http"
|
type: "http"
|
||||||
url: string
|
url: string
|
||||||
@@ -82,13 +82,6 @@ export type ModuleDefinition = {
|
|||||||
registrationName: string
|
registrationName: string
|
||||||
defaultPackage: string | false
|
defaultPackage: string | false
|
||||||
label: string
|
label: string
|
||||||
/**
|
|
||||||
* @deprecated property will be removed in future versions
|
|
||||||
*/
|
|
||||||
canOverride?: boolean
|
|
||||||
/**
|
|
||||||
* @deprecated property will be removed in future versions
|
|
||||||
*/
|
|
||||||
isRequired?: boolean
|
isRequired?: boolean
|
||||||
isQueryable?: boolean // If the module is queryable via Remote Joiner
|
isQueryable?: boolean // If the module is queryable via Remote Joiner
|
||||||
isLegacy?: boolean // If the module is a legacy module TODO: Remove once all the legacy modules are migrated
|
isLegacy?: boolean // If the module is a legacy module TODO: Remove once all the legacy modules are migrated
|
||||||
|
|||||||
Reference in New Issue
Block a user