From 7e3eb6e41316d7b04d32bc7186ed0c78de1aa539 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Mon, 10 Nov 2025 14:35:20 +0100 Subject: [PATCH] chore: cleanup/improve bootstrap (#14023) * chore: cleanup/improve bootstrap * chore: cleanup/improve bootstrap * Create few-guests-visit.md --- .changeset/few-guests-visit.md | 7 ++++ packages/core/framework/src/http/router.ts | 12 ++++--- .../modules-sdk/src/loaders/module-loader.ts | 18 +++++------ .../core/modules-sdk/src/medusa-module.ts | 32 +++++++++++-------- packages/medusa/src/commands/start.ts | 4 +-- packages/medusa/src/loaders/index.ts | 31 +++++++++--------- 6 files changed, 59 insertions(+), 45 deletions(-) create mode 100644 .changeset/few-guests-visit.md diff --git a/.changeset/few-guests-visit.md b/.changeset/few-guests-visit.md new file mode 100644 index 0000000000..3ecd648da1 --- /dev/null +++ b/.changeset/few-guests-visit.md @@ -0,0 +1,7 @@ +--- +"@medusajs/medusa": patch +"@medusajs/framework": patch +"@medusajs/modules-sdk": patch +--- + +chore: cleanup/improve bootstrap diff --git a/packages/core/framework/src/http/router.ts b/packages/core/framework/src/http/router.ts index cc7592601f..97357e77f2 100644 --- a/packages/core/framework/src/http/router.ts +++ b/packages/core/framework/src/http/router.ts @@ -1,4 +1,4 @@ -import { ContainerRegistrationKeys, parseCorsOrigins } from "@medusajs/utils" +import { ContainerRegistrationKeys, parseCorsOrigins, promiseAll } from "@medusajs/utils" import cors, { CorsOptions } from "cors" import type { ErrorRequestHandler, Express, RequestHandler } from "express" import type { @@ -85,10 +85,12 @@ export class ApiLoader { const routesLoader = new RoutesLoader() const middlewareLoader = new MiddlewareFileLoader() - for (let dir of this.#sourceDirs) { - await routesLoader.scanDir(dir) - await middlewareLoader.scanDir(dir) - } + await promiseAll( + this.#sourceDirs.flatMap(dir => [ + routesLoader.scanDir(dir), + middlewareLoader.scanDir(dir) + ]) + ) return { routes: routesLoader.getRoutes(), diff --git a/packages/core/modules-sdk/src/loaders/module-loader.ts b/packages/core/modules-sdk/src/loaders/module-loader.ts index fcd339e3c0..5e12a856aa 100644 --- a/packages/core/modules-sdk/src/loaders/module-loader.ts +++ b/packages/core/modules-sdk/src/loaders/module-loader.ts @@ -1,4 +1,5 @@ import { Logger, MedusaContainer, ModuleResolution } from "@medusajs/types" +import { promiseAll } from "@medusajs/utils" import { asValue } from "@medusajs/deps/awilix" import { EOL } from "os" import { MODULE_SCOPE } from "../types" @@ -17,23 +18,22 @@ export const moduleLoader = async ({ migrationOnly?: boolean loaderOnly?: boolean }): Promise => { - for (const resolution of Object.values(moduleResolutions ?? {})) { - const registrationResult = await loadModule( - container, - resolution, - logger!, - migrationOnly, - loaderOnly + const resolutions = Object.values(moduleResolutions ?? {}) + const results = await promiseAll( + resolutions.map((resolution) => + loadModule(container, resolution, logger!, migrationOnly, loaderOnly) ) + ) + results.forEach((registrationResult, idx) => { if (registrationResult?.error) { const { error } = registrationResult logger?.error( - `Could not resolve module: ${resolution.definition.label}. Error: ${error.message}${EOL}` + `Could not resolve module: ${resolutions[idx].definition.label}. Error: ${error.message}${EOL}` ) throw error } - } + }) } async function loadModule( diff --git a/packages/core/modules-sdk/src/medusa-module.ts b/packages/core/modules-sdk/src/medusa-module.ts index 8631db749d..65e9fffec6 100644 --- a/packages/core/modules-sdk/src/medusa-module.ts +++ b/packages/core/modules-sdk/src/medusa-module.ts @@ -515,25 +515,29 @@ class MedusaModule { return [{}] } - for (const { - hashKey, - modDeclaration, - moduleResolutions, - container, - finishLoading, - } of loadedModules) { - const service = await MedusaModule.resolveLoadedModule({ + const resolvedServices = await promiseAll( + loadedModules.map(async ({ hashKey, modDeclaration, moduleResolutions, container, - }) + finishLoading, + }) => { + const service = await MedusaModule.resolveLoadedModule({ + hashKey, + modDeclaration, + moduleResolutions, + container, + }) - MedusaModule.instances_.set(hashKey, service) - finishLoading(service) - MedusaModule.loading_.delete(hashKey) - services.push(service) - } + MedusaModule.instances_.set(hashKey, service) + finishLoading(service) + MedusaModule.loading_.delete(hashKey) + return service + }) + ) + + services.push(...resolvedServices) return services } diff --git a/packages/medusa/src/commands/start.ts b/packages/medusa/src/commands/start.ts index f4af3cf9ef..e01d7f98df 100644 --- a/packages/medusa/src/commands/start.ts +++ b/packages/medusa/src/commands/start.ts @@ -200,6 +200,8 @@ async function start(args: { skipDbConnection: true, }) const logger = container.resolve(ContainerRegistrationKeys.LOGGER) + const serverActivity = logger.activity(`Creating server`) + await registerInstrumentation(directory) const app = express() @@ -259,8 +261,6 @@ async function start(args: { } } - const serverActivity = logger.activity(`Creating server`) - // Register a health check endpoint. Ideally this also checks the readiness of the service, rather than just returning a static response. app.get("/health", (_, res) => { res.status(200).send("OK") diff --git a/packages/medusa/src/loaders/index.ts b/packages/medusa/src/loaders/index.ts index c8e8e87034..c5d17304e6 100644 --- a/packages/medusa/src/loaders/index.ts +++ b/packages/medusa/src/loaders/index.ts @@ -92,8 +92,10 @@ async function loadEntrypoints( ) if (shouldLoadBackgroundProcessors(configModule)) { - await subscribersLoader(plugins, container) - await jobsLoader(plugins, container) + await promiseAll([ + subscribersLoader(plugins, container), + jobsLoader(plugins, container), + ]) } if (isWorkerMode(configModule)) { @@ -119,17 +121,18 @@ async function loadEntrypoints( next() }) - const { shutdown } = await expressLoader({ - app: expressApp, - container, - }) - - await adminLoader({ app: expressApp, configModule, rootDirectory, plugins }) - await apiLoader({ - container, - plugins, - app: expressApp, - }) + const [{ shutdown }] = await promiseAll([ + expressLoader({ + app: expressApp, + container, + }), + adminLoader({ app: expressApp, configModule, rootDirectory, plugins }), + apiLoader({ + container, + plugins, + app: expressApp, + }), + ]) return shutdown } @@ -140,10 +143,8 @@ export async function initializeContainer( skipDbConnection?: boolean } ): Promise { - // custom flags from medusa project await featureFlagsLoader(rootDirectory) const configDir = await configLoader(rootDirectory, "medusa-config") - // core flags await featureFlagsLoader(join(__dirname, "..")) const customLogger = configDir.logger ?? defaultLogger