chore(framework): medusa app loaders (#8393)
RESOLVE FRMW-2636 **What** cleanup and move medusa app loader for now
This commit is contained in:
@@ -2,11 +2,10 @@ import boxen from "boxen"
|
||||
import chalk from "chalk"
|
||||
import checkbox from "@inquirer/checkbox"
|
||||
|
||||
import { LinkLoader, logger } from "@medusajs/framework"
|
||||
import { LinkLoader, logger, MedusaAppLoader } from "@medusajs/framework"
|
||||
import { initializeContainer } from "../loaders"
|
||||
import { ContainerRegistrationKeys } from "@medusajs/utils"
|
||||
import { getResolvedPlugins } from "../loaders/helpers/resolve-plugins"
|
||||
import { getLinksExecutionPlanner } from "../loaders/medusa-app"
|
||||
import { LinkMigrationsPlannerAction } from "@medusajs/types"
|
||||
import { join } from "path"
|
||||
|
||||
@@ -28,7 +27,7 @@ function groupByActionPlan(actionPlan: LinkMigrationsPlannerAction[]) {
|
||||
* Creates the link description for printing it to the
|
||||
* console
|
||||
*
|
||||
* @param action: LinkMigrationsPlannerAction
|
||||
* @param action LinkMigrationsPlannerAction
|
||||
*/
|
||||
function buildLinkDescription(action: LinkMigrationsPlannerAction) {
|
||||
const { linkDescriptor } = action
|
||||
@@ -102,16 +101,15 @@ const main = async function ({ directory }) {
|
||||
ContainerRegistrationKeys.CONFIG_MODULE
|
||||
)
|
||||
|
||||
const medusaAppLoader = new MedusaAppLoader()
|
||||
|
||||
const plugins = getResolvedPlugins(directory, configModule, true) || []
|
||||
const linksSourcePaths = plugins.map((plugin) =>
|
||||
join(plugin.resolve, "links")
|
||||
)
|
||||
await new LinkLoader(linksSourcePaths).load()
|
||||
|
||||
const planner = await getLinksExecutionPlanner({
|
||||
configModule,
|
||||
container,
|
||||
})
|
||||
const planner = await medusaAppLoader.getLinksExecutionPlanner()
|
||||
|
||||
logger.info("Syncing links...")
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { LinkLoader, logger } from "@medusajs/framework"
|
||||
import { runMedusaAppMigrations } from "../loaders/medusa-app"
|
||||
import { LinkLoader, logger, MedusaAppLoader } from "@medusajs/framework"
|
||||
import { initializeContainer } from "../loaders"
|
||||
import { ContainerRegistrationKeys, MedusaError } from "@medusajs/utils"
|
||||
import { getResolvedPlugins } from "../loaders/helpers/resolve-plugins"
|
||||
@@ -51,6 +50,8 @@ const main = async function ({ directory }) {
|
||||
ContainerRegistrationKeys.CONFIG_MODULE
|
||||
)
|
||||
|
||||
const medusaAppLoader = new MedusaAppLoader()
|
||||
|
||||
const plugins = getResolvedPlugins(directory, configModule, true) || []
|
||||
const linksSourcePaths = plugins.map((plugin) =>
|
||||
join(plugin.resolve, "links")
|
||||
@@ -60,9 +61,7 @@ const main = async function ({ directory }) {
|
||||
if (action === "run") {
|
||||
logger.info("Running migrations...")
|
||||
|
||||
await runMedusaAppMigrations({
|
||||
configModule,
|
||||
container,
|
||||
await medusaAppLoader.runModulesMigrations({
|
||||
action: "run",
|
||||
})
|
||||
|
||||
@@ -73,10 +72,8 @@ const main = async function ({ directory }) {
|
||||
logger.info("Reverting migrations...")
|
||||
|
||||
try {
|
||||
await runMedusaAppMigrations({
|
||||
await medusaAppLoader.runModulesMigrations({
|
||||
moduleNames: modules,
|
||||
configModule,
|
||||
container,
|
||||
action: "revert",
|
||||
})
|
||||
console.log(new Array(TERMINAL_SIZE).join("-"))
|
||||
@@ -98,10 +95,8 @@ const main = async function ({ directory }) {
|
||||
} else if (action === "generate") {
|
||||
logger.info("Generating migrations...")
|
||||
|
||||
await runMedusaAppMigrations({
|
||||
await medusaAppLoader.runModulesMigrations({
|
||||
moduleNames: modules,
|
||||
configModule,
|
||||
container,
|
||||
action: "generate",
|
||||
})
|
||||
|
||||
|
||||
@@ -16,12 +16,12 @@ import {
|
||||
JobLoader,
|
||||
LinkLoader,
|
||||
logger,
|
||||
MedusaAppLoader,
|
||||
pgConnectionLoader,
|
||||
SubscriberLoader,
|
||||
WorkflowLoader,
|
||||
} from "@medusajs/framework"
|
||||
import { getResolvedPlugins } from "./helpers/resolve-plugins"
|
||||
import loadMedusaApp from "./medusa-app"
|
||||
|
||||
type Options = {
|
||||
directory: string
|
||||
@@ -157,9 +157,7 @@ export default async ({
|
||||
onApplicationStart,
|
||||
onApplicationShutdown,
|
||||
onApplicationPrepareShutdown,
|
||||
} = await loadMedusaApp({
|
||||
container,
|
||||
})
|
||||
} = await new MedusaAppLoader().load()
|
||||
|
||||
const workflowsSourcePaths = plugins.map((p) => join(p.resolve, "workflows"))
|
||||
const workflowLoader = new WorkflowLoader(workflowsSourcePaths)
|
||||
|
||||
@@ -1,314 +0,0 @@
|
||||
import {
|
||||
MedusaApp,
|
||||
MedusaAppGetLinksExecutionPlanner,
|
||||
MedusaAppMigrateDown,
|
||||
MedusaAppMigrateGenerate,
|
||||
MedusaAppMigrateUp,
|
||||
MedusaAppOptions,
|
||||
MedusaAppOutput,
|
||||
ModulesDefinition,
|
||||
} from "@medusajs/modules-sdk"
|
||||
import {
|
||||
CommonTypes,
|
||||
ConfigModule,
|
||||
ILinkMigrationsPlanner,
|
||||
InternalModuleDeclaration,
|
||||
LoadedModule,
|
||||
MedusaContainer,
|
||||
ModuleDefinition,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
ContainerRegistrationKeys,
|
||||
isBoolean,
|
||||
isObject,
|
||||
isPresent,
|
||||
upperCaseFirst,
|
||||
} from "@medusajs/utils"
|
||||
|
||||
import { asValue } from "awilix"
|
||||
|
||||
export function mergeDefaultModules(
|
||||
modulesConfig: CommonTypes.ConfigModule["modules"]
|
||||
) {
|
||||
const defaultModules = Object.values(ModulesDefinition).filter(
|
||||
(definition: ModuleDefinition) => {
|
||||
return !!definition.defaultPackage
|
||||
}
|
||||
)
|
||||
|
||||
const configModules = { ...modulesConfig } ?? {}
|
||||
|
||||
for (const defaultModule of defaultModules as ModuleDefinition[]) {
|
||||
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 ??= ModulesDefinition[key]?.registrationName ?? key
|
||||
def.label ??= ModulesDefinition[key]?.label ?? upperCaseFirst(key)
|
||||
def.isQueryable = ModulesDefinition[key]?.isQueryable ?? true
|
||||
|
||||
const orignalDef = value?.definition ?? ModulesDefinition[key]
|
||||
if (
|
||||
!isBoolean(value) &&
|
||||
(isObject(orignalDef) || !isPresent(value.definition))
|
||||
) {
|
||||
value.definition = {
|
||||
...def,
|
||||
...orignalDef,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return configModules
|
||||
}
|
||||
|
||||
/**
|
||||
* Run, Revert or Generate the migrations for the medusa app.
|
||||
*
|
||||
* @param configModule
|
||||
* @param container
|
||||
* @param moduleNames
|
||||
* @param linkModules
|
||||
* @param action
|
||||
*/
|
||||
export async function runMedusaAppMigrations({
|
||||
configModule,
|
||||
container,
|
||||
moduleNames,
|
||||
linkModules,
|
||||
action = "run",
|
||||
}: {
|
||||
configModule: {
|
||||
modules?: CommonTypes.ConfigModule["modules"]
|
||||
projectConfig: CommonTypes.ConfigModule["projectConfig"]
|
||||
}
|
||||
linkModules?: MedusaAppOptions["linkModules"]
|
||||
container: MedusaContainer
|
||||
} & (
|
||||
| {
|
||||
moduleNames?: never
|
||||
action: "run"
|
||||
}
|
||||
| {
|
||||
moduleNames: string[]
|
||||
action: "revert" | "generate"
|
||||
}
|
||||
)): Promise<void> {
|
||||
const injectedDependencies = {
|
||||
[ContainerRegistrationKeys.PG_CONNECTION]: container.resolve(
|
||||
ContainerRegistrationKeys.PG_CONNECTION
|
||||
),
|
||||
[ContainerRegistrationKeys.LOGGER]: container.resolve(
|
||||
ContainerRegistrationKeys.LOGGER
|
||||
),
|
||||
}
|
||||
|
||||
const sharedResourcesConfig = {
|
||||
database: {
|
||||
clientUrl:
|
||||
injectedDependencies[ContainerRegistrationKeys.PG_CONNECTION]?.client
|
||||
?.config?.connection?.connectionString ??
|
||||
configModule.projectConfig.databaseUrl,
|
||||
driverOptions: configModule.projectConfig.databaseDriverOptions,
|
||||
debug: !!(configModule.projectConfig.databaseLogging ?? false),
|
||||
},
|
||||
}
|
||||
const configModules = mergeDefaultModules(configModule.modules)
|
||||
|
||||
const migrationOptions = {
|
||||
modulesConfig: configModules,
|
||||
sharedContainer: container,
|
||||
linkModules,
|
||||
sharedResourcesConfig,
|
||||
injectedDependencies,
|
||||
}
|
||||
|
||||
if (action === "revert") {
|
||||
await MedusaAppMigrateDown(moduleNames!, migrationOptions)
|
||||
} else if (action === "run") {
|
||||
await MedusaAppMigrateUp(migrationOptions)
|
||||
} else {
|
||||
await MedusaAppMigrateGenerate(moduleNames!, migrationOptions)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an instance of the link module migration planner.
|
||||
*
|
||||
* @param configModule
|
||||
* @param container
|
||||
* @param linkModules
|
||||
*/
|
||||
export async function getLinksExecutionPlanner({
|
||||
configModule,
|
||||
container,
|
||||
linkModules,
|
||||
}: {
|
||||
configModule: {
|
||||
modules?: CommonTypes.ConfigModule["modules"]
|
||||
projectConfig: CommonTypes.ConfigModule["projectConfig"]
|
||||
}
|
||||
linkModules?: MedusaAppOptions["linkModules"]
|
||||
container: MedusaContainer
|
||||
}): Promise<ILinkMigrationsPlanner> {
|
||||
const injectedDependencies = {
|
||||
[ContainerRegistrationKeys.PG_CONNECTION]: container.resolve(
|
||||
ContainerRegistrationKeys.PG_CONNECTION
|
||||
),
|
||||
[ContainerRegistrationKeys.LOGGER]: container.resolve(
|
||||
ContainerRegistrationKeys.LOGGER
|
||||
),
|
||||
}
|
||||
|
||||
const sharedResourcesConfig = {
|
||||
database: {
|
||||
clientUrl:
|
||||
injectedDependencies[ContainerRegistrationKeys.PG_CONNECTION]?.client
|
||||
?.config?.connection?.connectionString ??
|
||||
configModule.projectConfig.databaseUrl,
|
||||
driverOptions: configModule.projectConfig.databaseDriverOptions,
|
||||
debug: !!(configModule.projectConfig.databaseLogging ?? false),
|
||||
},
|
||||
}
|
||||
const configModules = mergeDefaultModules(configModule.modules)
|
||||
|
||||
const migrationOptions = {
|
||||
modulesConfig: configModules,
|
||||
sharedContainer: container,
|
||||
linkModules,
|
||||
sharedResourcesConfig,
|
||||
injectedDependencies,
|
||||
}
|
||||
|
||||
return await MedusaAppGetLinksExecutionPlanner(migrationOptions)
|
||||
}
|
||||
|
||||
export const loadMedusaApp = async (
|
||||
{
|
||||
container,
|
||||
linkModules,
|
||||
}: {
|
||||
container: MedusaContainer
|
||||
linkModules?: MedusaAppOptions["linkModules"]
|
||||
},
|
||||
config = { registerInContainer: true }
|
||||
): Promise<MedusaAppOutput> => {
|
||||
const injectedDependencies = {
|
||||
[ContainerRegistrationKeys.PG_CONNECTION]: container.resolve(
|
||||
ContainerRegistrationKeys.PG_CONNECTION
|
||||
),
|
||||
[ContainerRegistrationKeys.LOGGER]: container.resolve(
|
||||
ContainerRegistrationKeys.LOGGER
|
||||
),
|
||||
}
|
||||
|
||||
const configModule: ConfigModule = container.resolve(
|
||||
ContainerRegistrationKeys.CONFIG_MODULE
|
||||
)
|
||||
|
||||
const sharedResourcesConfig = {
|
||||
database: {
|
||||
clientUrl: configModule.projectConfig.databaseUrl,
|
||||
driverOptions: configModule.projectConfig.databaseDriverOptions,
|
||||
debug: !!(configModule.projectConfig.databaseLogging ?? false),
|
||||
},
|
||||
}
|
||||
|
||||
container.register(ContainerRegistrationKeys.REMOTE_QUERY, asValue(undefined))
|
||||
container.register(ContainerRegistrationKeys.REMOTE_LINK, asValue(undefined))
|
||||
|
||||
const configModules = mergeDefaultModules(configModule.modules)
|
||||
|
||||
const medusaApp = await MedusaApp({
|
||||
workerMode: configModule.projectConfig.workerMode,
|
||||
modulesConfig: configModules,
|
||||
sharedContainer: container,
|
||||
linkModules,
|
||||
sharedResourcesConfig,
|
||||
injectedDependencies,
|
||||
})
|
||||
|
||||
if (!config.registerInContainer) {
|
||||
return medusaApp
|
||||
}
|
||||
|
||||
container.register(
|
||||
ContainerRegistrationKeys.REMOTE_LINK,
|
||||
asValue(medusaApp.link)
|
||||
)
|
||||
container.register(
|
||||
ContainerRegistrationKeys.REMOTE_QUERY,
|
||||
asValue(medusaApp.query)
|
||||
)
|
||||
|
||||
for (const moduleService of Object.values(medusaApp.modules)) {
|
||||
const loadedModule = moduleService as LoadedModule
|
||||
container.register(
|
||||
loadedModule.__definition.registrationName,
|
||||
asValue(moduleService)
|
||||
)
|
||||
}
|
||||
|
||||
// Register all unresolved modules as undefined to be present in the container with undefined value by default
|
||||
// but still resolvable
|
||||
for (const moduleDefinition of Object.values(ModulesDefinition)) {
|
||||
if (!container.hasRegistration(moduleDefinition.registrationName)) {
|
||||
container.register(moduleDefinition.registrationName, asValue(undefined))
|
||||
}
|
||||
}
|
||||
|
||||
return medusaApp
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the modules loader without taking care of anything else. This is useful for running the loader as a separate action or to re run all modules loaders.
|
||||
*
|
||||
* @param configModule
|
||||
* @param container
|
||||
*/
|
||||
export async function runModulesLoader({
|
||||
configModule,
|
||||
linkModules,
|
||||
container,
|
||||
}: {
|
||||
configModule: {
|
||||
modules?: CommonTypes.ConfigModule["modules"]
|
||||
projectConfig: CommonTypes.ConfigModule["projectConfig"]
|
||||
}
|
||||
container: MedusaContainer
|
||||
linkModules?: MedusaAppOptions["linkModules"]
|
||||
}): Promise<void> {
|
||||
const injectedDependencies = {
|
||||
[ContainerRegistrationKeys.PG_CONNECTION]: container.resolve(
|
||||
ContainerRegistrationKeys.PG_CONNECTION
|
||||
),
|
||||
[ContainerRegistrationKeys.LOGGER]: container.resolve(
|
||||
ContainerRegistrationKeys.LOGGER
|
||||
),
|
||||
}
|
||||
|
||||
const sharedResourcesConfig = {
|
||||
database: {
|
||||
clientUrl: configModule.projectConfig.databaseUrl,
|
||||
driverOptions: configModule.projectConfig.databaseDriverOptions,
|
||||
debug: !!(configModule.projectConfig.databaseLogging ?? false),
|
||||
},
|
||||
}
|
||||
|
||||
const configModules = mergeDefaultModules(configModule.modules)
|
||||
|
||||
await MedusaApp({
|
||||
modulesConfig: configModules,
|
||||
sharedContainer: container,
|
||||
linkModules,
|
||||
sharedResourcesConfig,
|
||||
injectedDependencies,
|
||||
loaderOnly: true,
|
||||
})
|
||||
}
|
||||
|
||||
export default loadMedusaApp
|
||||
Reference in New Issue
Block a user