chore(modules-sdk): Custom Module definition (#7315)
This commit is contained in:
1 parent
bf83d1cfe6
commit
e2dfe91071
6 files changed
+35
-80
No files matched your search
@@ -96,7 +96,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
{
|
{
|
||||||
[Modules.EVENT_BUS]: {
|
[Modules.EVENT_BUS]: {
|
||||||
key: Modules.EVENT_BUS,
|
key: Modules.EVENT_BUS,
|
||||||
isLegacy: true,
|
|
||||||
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),
|
||||||
@@ -109,7 +108,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
},
|
},
|
||||||
[Modules.STOCK_LOCATION]: {
|
[Modules.STOCK_LOCATION]: {
|
||||||
key: Modules.STOCK_LOCATION,
|
key: Modules.STOCK_LOCATION,
|
||||||
isLegacy: true,
|
|
||||||
registrationName: ModuleRegistrationName.STOCK_LOCATION,
|
registrationName: ModuleRegistrationName.STOCK_LOCATION,
|
||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.STOCK_LOCATION),
|
label: upperCaseFirst(ModuleRegistrationName.STOCK_LOCATION),
|
||||||
@@ -123,7 +121,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
},
|
},
|
||||||
[Modules.INVENTORY]: {
|
[Modules.INVENTORY]: {
|
||||||
key: Modules.INVENTORY,
|
key: Modules.INVENTORY,
|
||||||
isLegacy: true,
|
|
||||||
registrationName: ModuleRegistrationName.INVENTORY,
|
registrationName: ModuleRegistrationName.INVENTORY,
|
||||||
defaultPackage: false,
|
defaultPackage: false,
|
||||||
label: upperCaseFirst(ModuleRegistrationName.INVENTORY),
|
label: upperCaseFirst(ModuleRegistrationName.INVENTORY),
|
||||||
@@ -137,7 +134,6 @@ export const ModulesDefinition: { [key: string | Modules]: ModuleDefinition } =
|
|||||||
},
|
},
|
||||||
[Modules.CACHE]: {
|
[Modules.CACHE]: {
|
||||||
key: Modules.CACHE,
|
key: Modules.CACHE,
|
||||||
isLegacy: true,
|
|
||||||
registrationName: ModuleRegistrationName.CACHE,
|
registrationName: ModuleRegistrationName.CACHE,
|
||||||
defaultPackage: MODULE_PACKAGE_NAMES[Modules.CACHE],
|
defaultPackage: MODULE_PACKAGE_NAMES[Modules.CACHE],
|
||||||
label: upperCaseFirst(ModuleRegistrationName.CACHE),
|
label: upperCaseFirst(ModuleRegistrationName.CACHE),
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ describe("module definitions loader", () => {
|
|||||||
registrationName: "testService",
|
registrationName: "testService",
|
||||||
defaultPackage: "@medusajs/test-service",
|
defaultPackage: "@medusajs/test-service",
|
||||||
label: "TestService",
|
label: "TestService",
|
||||||
isLegacy: true,
|
|
||||||
isRequired: false,
|
isRequired: false,
|
||||||
defaultModuleDeclaration: {
|
defaultModuleDeclaration: {
|
||||||
scope: MODULE_SCOPE.INTERNAL,
|
scope: MODULE_SCOPE.INTERNAL,
|
||||||
|
|||||||
@@ -55,6 +55,13 @@ async function loadModule(
|
|||||||
loaderOnly?: boolean
|
loaderOnly?: boolean
|
||||||
): Promise<{ error?: Error } | void> {
|
): Promise<{ error?: Error } | void> {
|
||||||
const modDefinition = resolution.definition
|
const modDefinition = resolution.definition
|
||||||
|
|
||||||
|
if (!modDefinition.key) {
|
||||||
|
throw new Error(`Module definition is missing property "key"`)
|
||||||
|
}
|
||||||
|
|
||||||
|
modDefinition.registrationName ??= modDefinition.key
|
||||||
|
|
||||||
const registrationName = modDefinition.registrationName
|
const registrationName = modDefinition.registrationName
|
||||||
|
|
||||||
const { scope, resources } = resolution.moduleDeclaration ?? ({} as any)
|
const { scope, resources } = resolution.moduleDeclaration ?? ({} as any)
|
||||||
|
|||||||
@@ -34,11 +34,19 @@ export enum MODULE_RESOURCE_TYPE {
|
|||||||
ISOLATED = "isolated",
|
ISOLATED = "isolated",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type CustomModuleDefinition = {
|
||||||
|
key?: string
|
||||||
|
registrationName?: string
|
||||||
|
label?: string
|
||||||
|
isQueryable?: boolean // If the module is queryable via Remote Joiner
|
||||||
|
dependencies?: string[]
|
||||||
|
}
|
||||||
|
|
||||||
export type InternalModuleDeclaration = {
|
export type InternalModuleDeclaration = {
|
||||||
scope: MODULE_SCOPE.INTERNAL
|
scope: MODULE_SCOPE.INTERNAL
|
||||||
resources: MODULE_RESOURCE_TYPE
|
resources: MODULE_RESOURCE_TYPE
|
||||||
dependencies?: string[]
|
dependencies?: string[]
|
||||||
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.
|
definition?: CustomModuleDefinition // 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>
|
||||||
/**
|
/**
|
||||||
@@ -54,7 +62,7 @@ export type InternalModuleDeclaration = {
|
|||||||
|
|
||||||
export type ExternalModuleDeclaration = {
|
export type ExternalModuleDeclaration = {
|
||||||
scope: MODULE_SCOPE.EXTERNAL
|
scope: MODULE_SCOPE.EXTERNAL
|
||||||
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.
|
definition?: CustomModuleDefinition // 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
|
||||||
@@ -87,7 +95,6 @@ export type ModuleDefinition = {
|
|||||||
label: string
|
label: string
|
||||||
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
|
|
||||||
dependencies?: string[]
|
dependencies?: string[]
|
||||||
defaultModuleDeclaration:
|
defaultModuleDeclaration:
|
||||||
| InternalModuleDeclaration
|
| InternalModuleDeclaration
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import {
|
|||||||
ContainerRegistrationKeys,
|
ContainerRegistrationKeys,
|
||||||
FlagRouter,
|
FlagRouter,
|
||||||
isObject,
|
isObject,
|
||||||
|
upperCaseFirst,
|
||||||
} from "@medusajs/utils"
|
} from "@medusajs/utils"
|
||||||
|
|
||||||
import { asValue } from "awilix"
|
import { asValue } from "awilix"
|
||||||
@@ -38,6 +39,23 @@ export function mergeDefaultModules(
|
|||||||
configModules[defaultModule.key] ??= defaultModule.defaultModuleDeclaration
|
configModules[defaultModule.key] ??= defaultModule.defaultModuleDeclaration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(
|
||||||
|
configModules as Record<string, InternalModuleDeclaration>
|
||||||
|
)) {
|
||||||
|
const def = {} as ModuleDefinition
|
||||||
|
def.key ??= key
|
||||||
|
def.registrationName ??= key
|
||||||
|
def.label ??= upperCaseFirst(key)
|
||||||
|
|
||||||
|
const orignalDef = value?.definition
|
||||||
|
if (isObject(orignalDef)) {
|
||||||
|
value.definition = {
|
||||||
|
...orignalDef,
|
||||||
|
...def,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return configModules
|
return configModules
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,28 +93,6 @@ export async function migrateMedusaApp(
|
|||||||
}
|
}
|
||||||
const configModules = mergeDefaultModules(configModule.modules)
|
const configModules = mergeDefaultModules(configModule.modules)
|
||||||
|
|
||||||
// Apply default options to legacy modules
|
|
||||||
for (const moduleKey of Object.keys(configModules)) {
|
|
||||||
if (!ModulesDefinition[moduleKey]?.isLegacy) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isObject(configModules[moduleKey])) {
|
|
||||||
;(
|
|
||||||
configModules[moduleKey] as Partial<InternalModuleDeclaration>
|
|
||||||
).options ??= {
|
|
||||||
database: {
|
|
||||||
type: "postgres",
|
|
||||||
url: sharedResourcesConfig.database.clientUrl,
|
|
||||||
clientUrl: sharedResourcesConfig.database.clientUrl,
|
|
||||||
extra: configModule.projectConfig.database_extra,
|
|
||||||
schema: configModule.projectConfig.database_schema,
|
|
||||||
logging: configModule.projectConfig.database_logging,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await MedusaAppMigrateUp({
|
await MedusaAppMigrateUp({
|
||||||
modulesConfig: configModules,
|
modulesConfig: configModules,
|
||||||
remoteFetchData: remoteQueryFetchData(container),
|
remoteFetchData: remoteQueryFetchData(container),
|
||||||
@@ -141,27 +137,6 @@ export const loadMedusaApp = async (
|
|||||||
|
|
||||||
const configModules = mergeDefaultModules(configModule.modules)
|
const configModules = mergeDefaultModules(configModule.modules)
|
||||||
|
|
||||||
// Apply default options to legacy modules
|
|
||||||
for (const moduleKey of Object.keys(configModules)) {
|
|
||||||
if (!ModulesDefinition[moduleKey]?.isLegacy) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isObject(configModules[moduleKey])) {
|
|
||||||
;(
|
|
||||||
configModules[moduleKey] as Partial<InternalModuleDeclaration>
|
|
||||||
).options ??= {
|
|
||||||
database: {
|
|
||||||
type: "postgres",
|
|
||||||
url: configModule.projectConfig.database_url,
|
|
||||||
extra: configModule.projectConfig.database_extra,
|
|
||||||
schema: configModule.projectConfig.database_schema,
|
|
||||||
logging: configModule.projectConfig.database_logging,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const medusaApp = await MedusaApp({
|
const medusaApp = await MedusaApp({
|
||||||
workerMode: configModule.projectConfig.worker_mode,
|
workerMode: configModule.projectConfig.worker_mode,
|
||||||
modulesConfig: configModules,
|
modulesConfig: configModules,
|
||||||
@@ -261,27 +236,6 @@ export async function runModulesLoader({
|
|||||||
|
|
||||||
const configModules = mergeDefaultModules(configModule.modules)
|
const configModules = mergeDefaultModules(configModule.modules)
|
||||||
|
|
||||||
// Apply default options to legacy modules
|
|
||||||
for (const moduleKey of Object.keys(configModules)) {
|
|
||||||
if (!ModulesDefinition[moduleKey]?.isLegacy) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isObject(configModules[moduleKey])) {
|
|
||||||
;(
|
|
||||||
configModules[moduleKey] as Partial<InternalModuleDeclaration>
|
|
||||||
).options ??= {
|
|
||||||
database: {
|
|
||||||
type: "postgres",
|
|
||||||
url: configModule.projectConfig.database_url,
|
|
||||||
extra: configModule.projectConfig.database_extra,
|
|
||||||
schema: configModule.projectConfig.database_schema,
|
|
||||||
logging: configModule.projectConfig.database_logging,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await MedusaApp({
|
await MedusaApp({
|
||||||
modulesConfig: configModules,
|
modulesConfig: configModules,
|
||||||
remoteFetchData: remoteQueryFetchData(container),
|
remoteFetchData: remoteQueryFetchData(container),
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import { ConfigModule } from "@medusajs/types"
|
import { ConfigModule } from "@medusajs/types"
|
||||||
|
|
||||||
import { ModulesDefinition } from "@medusajs/modules-sdk"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merge the modules config from the medusa-config file with the modules config from medusa package
|
* Merge the modules config from the medusa-config file with the modules config from medusa package
|
||||||
* @param modules
|
* @param modules
|
||||||
@@ -24,12 +22,6 @@ export function mergeModulesConfig(
|
|||||||
for (const moduleName of allModulesKeys) {
|
for (const moduleName of allModulesKeys) {
|
||||||
const internalModuleConfig = medusaInternalModulesConfig[moduleName]
|
const internalModuleConfig = medusaInternalModulesConfig[moduleName]
|
||||||
|
|
||||||
const moduleDefinition = ModulesDefinition[moduleName]
|
|
||||||
|
|
||||||
if (moduleDefinition?.isLegacy) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
modules_[moduleName] ??= internalModuleConfig
|
modules_[moduleName] ??= internalModuleConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user