feat(modules-sdk): Module provider plugin loader (#6286)

This commit is contained in:
Oli Juhl
2024-02-01 17:03:31 +01:00
committed by GitHub
parent 45134e4d11
commit 3a103f0c36
13 changed files with 255 additions and 6 deletions
@@ -0,0 +1,80 @@
import { MedusaContainer, ModuleProvider } from "@medusajs/types"
import { isString, lowerCaseFirst, promiseAll } from "@medusajs/utils"
import { Lifetime, asFunction } from "awilix"
export async function moduleProviderLoader({
container,
providers,
registerServiceFn,
}: {
container: MedusaContainer
providers: ModuleProvider[]
registerServiceFn?: (
klass,
container: MedusaContainer,
pluginDetails: any
) => Promise<void>
}) {
if (!providers?.length) {
return
}
await promiseAll(
providers.map(async (pluginDetails) => {
await loadModuleProvider(container, pluginDetails, registerServiceFn)
})
)
}
export async function loadModuleProvider(
container: MedusaContainer,
provider: ModuleProvider,
registerServiceFn?: (klass, container, pluginDetails) => Promise<void>
) {
let loadedProvider: any
const pluginName = provider.resolve ?? provider.provider_name ?? ""
try {
loadedProvider = provider.resolve
if (isString(provider.resolve)) {
loadedProvider = await import(provider.resolve)
}
} catch (error) {
throw new Error(
`Unable to find plugin ${pluginName} -- perhaps you need to install its package?`
)
}
loadedProvider = (loadedProvider as any).default ?? loadedProvider
if (!loadedProvider?.services?.length) {
throw new Error(
`No services found in plugin ${provider.resolve} -- make sure your plugin has a default export of services.`
)
}
const services = await promiseAll(
loadedProvider.services.map(async (service) => {
const name = lowerCaseFirst(service.name)
if (registerServiceFn) {
// Used to register the specific type of service in the provider
await registerServiceFn(service, container, provider.options)
} else {
container.register({
[name]: asFunction(
(cradle) => new service(cradle, provider.options),
{
lifetime: service.LIFE_TIME || Lifetime.SCOPED,
}
),
})
}
return service
})
)
return services
}