feat: custom logger (#13156)

* feat: custom logger

* mock log

* unit test

* FF and jobs loader

* unit test

* add to ResourceLoader

* get from container

* mock

* rm log

* default logger mock

* link loaders, express

* comments

* initialize container as first step

* db conn

* test

* initialize start

* plugin build using default logger

* ignore .medusa

* revert ignroe

---------

Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
This commit is contained in:
Carlos R. L. RodriguesandOli Juhl authored and GitHub committed 2025-08-28 15:31:19 +02:00
1 parent 9412669e65
commit e2213448ac
42 files changed
+471 -210

No files matched your search

@@ -1,13 +1,36 @@
import { registerInstrumentation } from "../start"
import * as utils from "@medusajs/framework/utils"
import * as logger from "@medusajs/framework/logger"
import path from "path"
import * as instrumentationFixture from "../__fixtures__/instrumentation"
import * as instrumentationFailureFixture from "../__fixtures__/instrumentation-failure/instrumentation"
import path from "path"
import { registerInstrumentation } from "../start"
const logger = {
info: jest.fn(),
error: jest.fn(),
}
jest.mock("@medusajs/framework/config", () => {
return {
configManager: {
config: {},
},
configLoader: jest.fn().mockImplementation(() => {
return {
logger,
}
}),
}
})
describe("start", () => {
beforeEach(() => {
jest.clearAllMocks()
jest.doMock("@medusajs/framework/utils", () => ({
...jest.requireActual("@medusajs/framework/utils"),
createMedusaContainer: jest.fn(() => ({
resolve: jest.fn(() => logger),
})),
}))
})
describe("registerInstrumentation", () => {
@@ -32,7 +55,7 @@ describe("start", () => {
"exists",
"" as never
)
const loggerSpy = jest.spyOn(logger.logger, "info", "" as never)
const loggerSpy = jest.spyOn(logger, "info", "" as never)
await registerInstrumentation(
path.join(__dirname, "../__fixtures__/instrumentation-no-register")
+7 -1
View File
@@ -1,5 +1,6 @@
import { logger } from "@medusajs/framework/logger"
import { Compiler } from "@medusajs/framework/build-tools"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
import { initializeContainer } from "../loaders"
export default async function build({
directory,
@@ -8,6 +9,11 @@ export default async function build({
directory: string
adminOnly: boolean
}) {
const container = await initializeContainer(directory, {
skipDbConnection: true,
})
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
logger.info("Starting build...")
const compiler = new Compiler(directory, logger)
+13 -4
View File
@@ -1,14 +1,16 @@
import slugify from "slugify"
import { basename } from "path"
import input from "@inquirer/input"
import { logger } from "@medusajs/framework/logger"
import type { Logger } from "@medusajs/framework/types"
import {
ContainerRegistrationKeys,
createClient,
createDb,
dbExists,
EnvEditor,
parseConnectionString,
} from "@medusajs/framework/utils"
import { basename } from "path"
import slugify from "slugify"
import { initializeContainer } from "../../loaders"
async function connectClient(client: ReturnType<typeof createClient>) {
try {
@@ -27,10 +29,12 @@ export async function dbCreate({
db,
directory,
interactive,
logger,
}: {
db: string | undefined
directory: string
interactive: boolean
logger: Logger
}): Promise<boolean> {
let dbName = db
@@ -155,8 +159,13 @@ export async function dbCreate({
}
const main = async function ({ directory, interactive, db }) {
const container = await initializeContainer(directory, {
skipDbConnection: true,
})
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
const created = await dbCreate({ directory, interactive, db })
const created = await dbCreate({ directory, interactive, db, logger })
process.exit(created ? 0 : 1)
} catch (error) {
if (error.name === "ExitPromptError") {
+7 -6
View File
@@ -1,6 +1,5 @@
import { MedusaAppLoader } from "@medusajs/framework"
import { LinkLoader } from "@medusajs/framework/links"
import { logger } from "@medusajs/framework/logger"
import {
ContainerRegistrationKeys,
getResolvedPlugins,
@@ -8,18 +7,20 @@ import {
mergePluginModules,
} from "@medusajs/framework/utils"
import { join } from "path"
import { initializeContainer } from "../../loaders"
import { ensureDbExists } from "../utils"
const TERMINAL_SIZE = process.stdout.columns
const main = async function ({ directory, modules }) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
/**
* Setup
*/
const container = await initializeContainer(directory)
await ensureDbExists(container)
const medusaAppLoader = new MedusaAppLoader()
@@ -33,7 +34,7 @@ const main = async function ({ directory, modules }) {
const linksSourcePaths = plugins.map((plugin) =>
join(plugin.resolve, "links")
)
await new LinkLoader(linksSourcePaths).load()
await new LinkLoader(linksSourcePaths, logger).load()
/**
* Generating migrations
@@ -45,12 +46,12 @@ const main = async function ({ directory, modules }) {
action: "generate",
})
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.info("Migrations generated")
process.exit()
} catch (error) {
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
if (error.code && error.code === MedusaError.Codes.UNKNOWN_MODULES) {
logger.error(error.message)
const modulesList = error.allModules.map(
+19 -9
View File
@@ -1,18 +1,17 @@
import { MEDUSA_CLI_PATH, MedusaAppLoader } from "@medusajs/framework"
import { LinkLoader } from "@medusajs/framework/links"
import { logger } from "@medusajs/framework/logger"
import {
ContainerRegistrationKeys,
getResolvedPlugins,
mergePluginModules,
} from "@medusajs/framework/utils"
import { join } from "path"
import { Logger, MedusaContainer } from "@medusajs/types"
import { fork } from "child_process"
import path from "path"
import path, { join } from "path"
import { initializeContainer } from "../../loaders"
import { ensureDbExists } from "../utils"
import { syncLinks } from "./sync-links"
const TERMINAL_SIZE = process.stdout.columns
const cliPath = path.resolve(MEDUSA_CLI_PATH, "..", "..", "cli.js")
@@ -27,17 +26,21 @@ export async function migrate({
skipScripts,
executeAllLinks,
executeSafeLinks,
logger,
container,
}: {
directory: string
skipLinks: boolean
skipScripts: boolean
executeAllLinks: boolean
executeSafeLinks: boolean
logger: Logger
container: MedusaContainer
}): Promise<boolean> {
/**
* Setup
*/
const container = await initializeContainer(directory)
await ensureDbExists(container)
const medusaAppLoader = new MedusaAppLoader()
@@ -51,7 +54,7 @@ export async function migrate({
const linksSourcePaths = plugins.map((plugin) =>
join(plugin.resolve, "links")
)
await new LinkLoader(linksSourcePaths).load()
await new LinkLoader(linksSourcePaths, logger).load()
/**
* Run migrations
@@ -60,17 +63,19 @@ export async function migrate({
await medusaAppLoader.runModulesMigrations({
action: "run",
})
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.info("Migrations completed")
/**
* Sync links
*/
if (!skipLinks) {
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
await syncLinks(medusaAppLoader, {
executeAll: executeAllLinks,
executeSafe: executeSafeLinks,
directory,
container,
})
}
@@ -78,7 +83,7 @@ export async function migrate({
/**
* Run migration scripts
*/
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
const childProcess = fork(cliPath, ["db:migrate:scripts"], {
cwd: directory,
env: process.env,
@@ -104,6 +109,9 @@ const main = async function ({
executeAllLinks,
executeSafeLinks,
}) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
const migrated = await migrate({
directory,
@@ -111,6 +119,8 @@ const main = async function ({
skipScripts,
executeAllLinks,
executeSafeLinks,
logger,
container,
})
process.exit(migrated ? 0 : 1)
} catch (error) {
+7 -6
View File
@@ -1,6 +1,5 @@
import { MedusaAppLoader } from "@medusajs/framework"
import { LinkLoader } from "@medusajs/framework/links"
import { logger } from "@medusajs/framework/logger"
import {
ContainerRegistrationKeys,
getResolvedPlugins,
@@ -8,18 +7,20 @@ import {
mergePluginModules,
} from "@medusajs/framework/utils"
import { join } from "path"
import { initializeContainer } from "../../loaders"
import { ensureDbExists } from "../utils"
const TERMINAL_SIZE = process.stdout.columns
const main = async function ({ directory, modules }) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
/**
* Setup
*/
const container = await initializeContainer(directory)
await ensureDbExists(container)
const medusaAppLoader = new MedusaAppLoader()
@@ -33,7 +34,7 @@ const main = async function ({ directory, modules }) {
const linksSourcePaths = plugins.map((plugin) =>
join(plugin.resolve, "links")
)
await new LinkLoader(linksSourcePaths).load()
await new LinkLoader(linksSourcePaths, logger).load()
/**
* Reverting migrations
@@ -43,12 +44,12 @@ const main = async function ({ directory, modules }) {
moduleNames: modules,
action: "revert",
})
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.info("Migrations reverted")
process.exit()
} catch (error) {
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
if (error.code && error.code === MedusaError.Codes.UNKNOWN_MODULES) {
logger.error(error.message)
const modulesList = error.allModules.map(
+23 -13
View File
@@ -1,6 +1,5 @@
import { MedusaAppLoader } from "@medusajs/framework"
import { LinkLoader } from "@medusajs/framework/links"
import { logger } from "@medusajs/framework/logger"
import { MigrationScriptsMigrator } from "@medusajs/framework/migrations"
import {
ContainerRegistrationKeys,
@@ -10,7 +9,7 @@ import {
import { dirname, join } from "path"
import { MedusaModule } from "@medusajs/framework/modules-sdk"
import { MedusaContainer, PluginDetails } from "@medusajs/types"
import { Logger, MedusaContainer, PluginDetails } from "@medusajs/types"
import { initializeContainer } from "../../loaders"
import { ensureDbExists } from "../utils"
@@ -22,20 +21,23 @@ const TERMINAL_SIZE = process.stdout.columns
*/
export async function runMigrationScripts({
directory,
container,
logger,
}: {
directory: string
container: MedusaContainer
logger: Logger
}): Promise<boolean> {
let onApplicationPrepareShutdown: () => Promise<void> = async () =>
Promise.resolve()
let onApplicationShutdown: () => Promise<void> = async () => Promise.resolve()
let container_: MedusaContainer
let plugins: PluginDetails[]
try {
container_ = await initializeContainer(directory)
await ensureDbExists(container_)
await ensureDbExists(container)
const configModule = container_.resolve(
const configModule = container.resolve(
ContainerRegistrationKeys.CONFIG_MODULE
)
@@ -43,7 +45,7 @@ export async function runMigrationScripts({
mergePluginModules(configModule, plugins)
const resources = await loadResources(plugins)
const resources = await loadResources(plugins, logger)
onApplicationPrepareShutdown = resources.onApplicationPrepareShutdown
onApplicationShutdown = resources.onApplicationShutdown
@@ -52,7 +54,7 @@ export async function runMigrationScripts({
...plugins.map((plugin) => join(plugin.resolve, "migration-scripts")),
]
const migrator = new MigrationScriptsMigrator({ container: container_ })
const migrator = new MigrationScriptsMigrator({ container: container })
await migrator.ensureMigrationsTable()
const pendingScripts = await migrator.getPendingMigrations(
scriptsSourcePaths
@@ -63,15 +65,15 @@ export async function runMigrationScripts({
return true
}
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.info("Pending migration scripts to execute")
logger.info(`${pendingScripts.join("\n")}`)
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.info("Running migration scripts...")
await migrator.run(scriptsSourcePaths)
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.info("Migration scripts completed")
return true
@@ -81,7 +83,10 @@ export async function runMigrationScripts({
}
}
async function loadResources(plugins: any): Promise<{
async function loadResources(
plugins: any,
logger: Logger
): Promise<{
onApplicationPrepareShutdown: () => Promise<void>
onApplicationShutdown: () => Promise<void>
}> {
@@ -97,7 +102,7 @@ async function loadResources(plugins: any): Promise<{
const linksSourcePaths = plugins.map((plugin) =>
join(plugin.resolve, "links")
)
await new LinkLoader(linksSourcePaths).load()
await new LinkLoader(linksSourcePaths, logger).load()
const medusaAppResources = await new MedusaAppLoader().load()
const onApplicationPrepareShutdown =
@@ -117,9 +122,14 @@ const main = async function ({
directory: string
container?: MedusaContainer
}) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
const migrated = await runMigrationScripts({
directory,
container: container,
logger,
})
process.exit(migrated ? 0 : 1)
} catch (error) {
+8 -2
View File
@@ -1,4 +1,5 @@
import { logger } from "@medusajs/framework/logger"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
import { initializeContainer } from "../../loaders"
import { dbCreate } from "./create"
import { migrate } from "./migrate"
@@ -11,8 +12,11 @@ const main = async function ({
executeAllLinks,
executeSafeLinks,
}) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
const created = await dbCreate({ directory, interactive, db })
const created = await dbCreate({ directory, interactive, db, logger })
if (!created) {
process.exit(1)
}
@@ -23,6 +27,8 @@ const main = async function ({
skipScripts,
executeAllLinks,
executeSafeLinks,
logger,
container,
})
process.exit(migrated ? 0 : 1)
+34 -14
View File
@@ -1,8 +1,11 @@
import checkbox from "@inquirer/checkbox"
import { MedusaAppLoader } from "@medusajs/framework"
import { LinkLoader } from "@medusajs/framework/links"
import { logger } from "@medusajs/framework/logger"
import { LinkMigrationsPlannerAction } from "@medusajs/framework/types"
import {
LinkMigrationsPlannerAction,
Logger,
MedusaContainer,
} from "@medusajs/framework/types"
import {
ContainerRegistrationKeys,
getResolvedPlugins,
@@ -52,13 +55,14 @@ function buildLinkDescription(action: LinkMigrationsPlannerAction) {
*/
function logActions(
title: string,
actionsOrContext: LinkMigrationsPlannerAction[]
actionsOrContext: LinkMigrationsPlannerAction[],
logger: Logger
) {
const actionsList = actionsOrContext
.map((action) => ` - ${buildLinkDescription(action)}`)
.join("\n")
console.log(boxen(`${title}\n${actionsList}`, { padding: 1 }))
logger.info(boxen(`${title}\n${actionsList}`, { padding: 1 }))
}
/**
@@ -67,9 +71,10 @@ function logActions(
*/
async function askForLinkActionsToPerform(
message: string,
actions: LinkMigrationsPlannerAction[]
actions: LinkMigrationsPlannerAction[],
logger: Logger
) {
console.log(boxen(message, { borderColor: "red", padding: 1 }))
logger.info(boxen(message, { borderColor: "red", padding: 1 }))
return await checkbox({
message: "Select tables to act upon",
@@ -95,11 +100,17 @@ export async function syncLinks(
{
executeAll,
executeSafe,
directory,
container,
}: {
executeSafe: boolean
executeAll: boolean
directory: string
container: MedusaContainer
}
) {
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
const planner = await medusaAppLoader.getLinksExecutionPlanner()
logger.info("Syncing links...")
@@ -120,7 +131,8 @@ export async function syncLinks(
`Select the tables to ${chalk.red(
"DELETE"
)}. The following links have been removed`,
groupActionPlan.delete
groupActionPlan.delete,
logger
)
}
}
@@ -140,7 +152,8 @@ export async function syncLinks(
`Select the tables to ${chalk.red(
"UPDATE"
)}. The following links have been updated`,
groupActionPlan.notify
groupActionPlan.notify,
logger
)
}
@@ -163,13 +176,13 @@ export async function syncLinks(
await planner.executePlan(actionsToExecute)
if (toCreate.length) {
logActions("Created following links tables", toCreate)
logActions("Created following links tables", toCreate, logger)
}
if (toUpdate.length) {
logActions("Updated following links tables", toUpdate)
logActions("Updated following links tables", toUpdate, logger)
}
if (toDelete.length) {
logActions("Deleted following links tables", toDelete)
logActions("Deleted following links tables", toDelete, logger)
}
if (actionsToExecute.length) {
@@ -180,8 +193,10 @@ export async function syncLinks(
}
const main = async function ({ directory, executeSafe, executeAll }) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
const container = await initializeContainer(directory)
await ensureDbExists(container)
const configModule = container.resolve(
@@ -196,9 +211,14 @@ const main = async function ({ directory, executeSafe, executeAll }) {
const linksSourcePaths = plugins.map((plugin) =>
join(plugin.resolve, "links")
)
await new LinkLoader(linksSourcePaths).load()
await new LinkLoader(linksSourcePaths, logger).load()
await syncLinks(medusaAppLoader, { executeAll, executeSafe })
await syncLinks(medusaAppLoader, {
executeAll,
executeSafe,
directory,
container,
})
process.exit()
} catch (error) {
logger.error(error)
+7 -4
View File
@@ -1,12 +1,12 @@
import { MEDUSA_CLI_PATH } from "@medusajs/framework"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
import { Store } from "@medusajs/telemetry"
import boxen from "boxen"
import { ChildProcess, execSync, fork } from "child_process"
import chokidar, { FSWatcher } from "chokidar"
import { Store } from "@medusajs/telemetry"
import { EOL } from "os"
import path from "path"
import { logger } from "@medusajs/framework/logger"
import { MEDUSA_CLI_PATH } from "@medusajs/framework"
import { initializeContainer } from "../loaders"
const defaultConfig = {
padding: 5,
@@ -15,6 +15,9 @@ const defaultConfig = {
} as boxen.Options
export default async function ({ types, directory }) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
const args = process.argv
const argv =
+11 -3
View File
@@ -1,10 +1,13 @@
import { logger } from "@medusajs/framework/logger"
import { ExecArgs } from "@medusajs/framework/types"
import { dynamicImport, isFileSkipped } from "@medusajs/framework/utils"
import {
ContainerRegistrationKeys,
dynamicImport,
isFileSkipped,
} from "@medusajs/framework/utils"
import express from "express"
import { existsSync } from "fs"
import path from "path"
import loaders from "../loaders"
import loaders, { initializeContainer } from "../loaders"
type Options = {
file: string
@@ -12,6 +15,11 @@ type Options = {
}
export default async function exec({ file, args }: Options) {
const container = await initializeContainer(process.cwd(), {
skipDbConnection: true,
})
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
logger.info(`Executing script at ${file}...`)
const app = express()
const directory = process.cwd()
@@ -1,5 +1,6 @@
import { Compiler } from "@medusajs/framework/build-tools"
import { logger } from "@medusajs/framework/logger"
export default async function build({ directory }: { directory: string }) {
logger.info("Starting build...")
const compiler = new Compiler(directory, logger)
@@ -1,5 +1,6 @@
import { logger } from "@medusajs/framework/logger"
import type { Logger } from "@medusajs/framework/types"
import {
ContainerRegistrationKeys,
defineMikroOrmCliConfig,
DmlEntity,
dynamicImport,
@@ -11,6 +12,7 @@ import { dirname, join } from "path"
import { MetadataStorage } from "@mikro-orm/core"
import { MikroORM } from "@mikro-orm/postgresql"
import { initializeContainer } from "../../../loaders"
const TERMINAL_SIZE = process.stdout.columns
@@ -18,6 +20,11 @@ const TERMINAL_SIZE = process.stdout.columns
* Generate migrations for all scanned modules in a plugin
*/
const main = async function ({ directory }) {
const container = await initializeContainer(directory, {
skipDbConnection: true,
})
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
try {
const moduleDescriptors = [] as {
serviceName: string
@@ -46,14 +53,14 @@ const main = async function ({ directory }) {
*/
logger.info("Generating migrations...")
await generateMigrations(moduleDescriptors)
await generateMigrations(moduleDescriptors, logger)
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.info("Migrations generated")
process.exit()
} catch (error) {
console.log(new Array(TERMINAL_SIZE).join("-"))
logger.log(new Array(TERMINAL_SIZE).join("-"))
logger.error(error.message, error)
process.exit(1)
@@ -101,7 +108,8 @@ async function generateMigrations(
serviceName: string
migrationsPath: string
entities: any[]
}[] = []
}[] = [],
logger: Logger
) {
const DB_HOST = process.env.DB_HOST ?? "localhost"
const DB_USERNAME = process.env.DB_USERNAME ?? ""
@@ -1,9 +1,24 @@
import { logger } from "@medusajs/framework/logger"
import { FileSystem } from "@medusajs/framework/utils"
import { join } from "path"
import main from "../../generate"
const logger = {
log: jest.fn(),
info: jest.fn(),
error: jest.fn(),
warn: jest.fn(),
}
jest.mock("@medusajs/framework/logger")
jest.mock("../../../../../loaders", () => {
return {
initializeContainer: jest.fn().mockImplementation(() => {
return {
resolve: jest.fn(() => logger),
}
}),
}
})
describe("plugin-generate", () => {
beforeEach(() => {
@@ -13,6 +28,8 @@ describe("plugin-generate", () => {
.mockImplementation((code?: string | number | null) => {
return code as never
})
jest.mock("@medusajs/framework/logger")
})
afterEach(async () => {
@@ -1,14 +1,18 @@
import path from "path"
import { Compiler } from "@medusajs/framework/build-tools"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
import * as swcCore from "@swc/core"
import { execFile } from "child_process"
import { logger } from "@medusajs/framework/logger"
import { Compiler } from "@medusajs/framework/build-tools"
import path from "path"
import { initializeContainer } from "../../loaders"
export default async function developPlugin({
directory,
}: {
directory: string
}) {
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
let isBusy = false
const compiler = new Compiler(directory, logger)
const parsedConfig = await compiler.loadTSConfigFile()
+12 -4
View File
@@ -6,8 +6,8 @@ import { scheduleJob } from "node-schedule"
import os from "os"
import path from "path"
import { logger } from "@medusajs/framework/logger"
import {
ContainerRegistrationKeys,
dynamicImport,
FileSystem,
generateContainerTypes,
@@ -20,7 +20,7 @@ import {
import { MedusaModule } from "@medusajs/framework/modules-sdk"
import { MedusaContainer } from "@medusajs/framework/types"
import { parse } from "url"
import loaders from "../loaders"
import loaders, { initializeContainer } from "../loaders"
const EVERY_SIXTH_HOUR = "0 */6 * * *"
const CRON_SCHEDULE = EVERY_SIXTH_HOUR
@@ -33,6 +33,11 @@ const INSTRUMENTATION_FILE = "instrumentation"
* errors.
*/
export async function registerInstrumentation(directory: string) {
const container = await initializeContainer(directory, {
skipDbConnection: true,
})
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
const fileSystem = new FileSystem(directory)
const exists =
(await fileSystem.exists(`${INSTRUMENTATION_FILE}.ts`)) ||
@@ -82,10 +87,10 @@ function displayAdminUrl({
return
}
const logger = container.resolve("logger")
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
const {
admin: { path: adminPath, disable },
} = container.resolve("configModule")
} = container.resolve(ContainerRegistrationKeys.CONFIG_MODULE)
if (disable) {
return
@@ -141,6 +146,9 @@ async function start(args: {
}) {
const { port = 9000, host, directory, types } = args
const container = await initializeContainer(directory)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
async function internalStart(generateTypes: boolean) {
track("CLI_START")
await registerInstrumentation(directory)
+3 -3
View File
@@ -1,7 +1,6 @@
import { logger } from "@medusajs/framework/logger"
import { Modules } from "@medusajs/framework/utils"
import express from "express"
import { ContainerRegistrationKeys, Modules } from "@medusajs/framework/utils"
import { track } from "@medusajs/telemetry"
import express from "express"
import loaders from "../loaders"
export default async function ({
@@ -25,6 +24,7 @@ export default async function ({
directory,
expressApp: app,
})
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
const userService = container.resolve(Modules.USER)
const authService = container.resolve(Modules.AUTH)
+1 -1
View File
@@ -1,8 +1,8 @@
import { logger } from "@medusajs/framework/logger"
import { MedusaContainer } from "@medusajs/framework/types"
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
export async function ensureDbExists(container: MedusaContainer) {
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
const pgConnection = container.resolve(
ContainerRegistrationKeys.PG_CONNECTION
)
@@ -13,10 +13,10 @@ import {
ApiLoader,
container,
featureFlagsLoader,
logger,
MedusaRequest,
} from "@medusajs/framework"
import { configManager } from "@medusajs/framework/config"
import { logger as defaultLogger } from "@medusajs/framework/logger"
import { ConfigModule, MedusaContainer } from "@medusajs/types"
import { config } from "../mocks"
@@ -67,10 +67,8 @@ export const createServer = async (rootDir) => {
container.register(ContainerRegistrationKeys.PG_CONNECTION, asValue({}))
container.register("configModule", asValue(config))
container.register(ContainerRegistrationKeys.LOGGER, asValue(defaultLogger))
container.register({
logger: asValue({
error: () => {},
}),
manager: asValue({}),
})
@@ -88,7 +86,7 @@ export const createServer = async (rootDir) => {
})
await featureFlagsLoader()
await moduleLoader({ container, moduleResolutions, logger })
await moduleLoader({ container, moduleResolutions, logger: defaultLogger })
app.use((req, res, next) => {
;(req as MedusaRequest).scope = container.createScope() as MedusaContainer
@@ -98,6 +96,7 @@ export const createServer = async (rootDir) => {
await new ApiLoader({
app,
sourceDir: rootDir,
container,
}).load()
const superRequest = supertest(app)
+4 -3
View File
@@ -1,9 +1,9 @@
import { ConfigModule } from "@medusajs/framework/config"
import { ApiLoader } from "@medusajs/framework/http"
import { MedusaContainer, PluginDetails } from "@medusajs/framework/types"
import { Express } from "express"
import { join } from "path"
import qs from "qs"
import { ApiLoader } from "@medusajs/framework/http"
import { MedusaContainer, PluginDetails } from "@medusajs/framework/types"
import { ConfigModule } from "@medusajs/framework/config"
type Options = {
app: Express
@@ -59,6 +59,7 @@ export default async ({ app, container, plugins }: Options) => {
app: app,
sourceDir: sourcePaths,
baseRestrictedFields: restrictedFields?.store,
container,
}).load()
} catch (err) {
throw Error(
+33 -14
View File
@@ -5,7 +5,7 @@ import { featureFlagsLoader } from "@medusajs/framework/feature-flags"
import { expressLoader } from "@medusajs/framework/http"
import { JobLoader } from "@medusajs/framework/jobs"
import { LinkLoader } from "@medusajs/framework/links"
import { logger } from "@medusajs/framework/logger"
import { logger as defaultLogger } from "@medusajs/framework/logger"
import { SubscriberLoader } from "@medusajs/framework/subscribers"
import {
ConfigModule,
@@ -46,7 +46,10 @@ const shouldLoadBackgroundProcessors = (configModule) => {
)
}
async function subscribersLoader(plugins: PluginDetails[]) {
async function subscribersLoader(
plugins: PluginDetails[],
container: MedusaContainer
) {
const pluginSubscribersSourcePaths = [
/**
* Load subscribers from the medusa/medusa package. Remove once the medusa core is converted to a plugin
@@ -54,19 +57,26 @@ async function subscribersLoader(plugins: PluginDetails[]) {
join(__dirname, "../subscribers"),
].concat(plugins.map((plugin) => join(plugin.resolve, "subscribers")))
const subscriberLoader = new SubscriberLoader(pluginSubscribersSourcePaths)
const subscriberLoader = new SubscriberLoader(
pluginSubscribersSourcePaths,
undefined,
container
)
await subscriberLoader.load()
}
async function jobsLoader(plugins: PluginDetails[]) {
async function jobsLoader(
plugins: PluginDetails[],
container: MedusaContainer
) {
const pluginJobSourcePaths = [
/**
* Load jobs from the medusa/medusa package. Remove once the medusa core is converted to a plugin
* Load jobs from the medusa/medusa package. Remove once the medusa core is converted to a plugin
*/
join(__dirname, "../jobs"),
].concat(plugins.map((plugin) => join(plugin.resolve, "jobs")))
const jobLoader = new JobLoader(pluginJobSourcePaths)
const jobLoader = new JobLoader(pluginJobSourcePaths, container)
await jobLoader.load()
}
@@ -81,8 +91,8 @@ async function loadEntrypoints(
)
if (shouldLoadBackgroundProcessors(configModule)) {
await subscribersLoader(plugins)
await jobsLoader(plugins)
await subscribersLoader(plugins, container)
await jobsLoader(plugins, container)
}
if (isWorkerMode(configModule)) {
@@ -110,6 +120,7 @@ async function loadEntrypoints(
const { shutdown } = await expressLoader({
app: expressApp,
container,
})
await adminLoader({ app: expressApp, configModule, rootDirectory, plugins })
@@ -123,17 +134,24 @@ async function loadEntrypoints(
}
export async function initializeContainer(
rootDirectory: string
rootDirectory: string,
options?: {
skipDbConnection?: boolean
}
): Promise<MedusaContainer> {
await configLoader(rootDirectory, "medusa-config")
const configDir = await configLoader(rootDirectory, "medusa-config")
await featureFlagsLoader(join(__dirname, ".."))
const customLogger = configDir.logger ?? defaultLogger
container.register({
[ContainerRegistrationKeys.LOGGER]: asValue(logger),
[ContainerRegistrationKeys.LOGGER]: asValue(customLogger),
[ContainerRegistrationKeys.REMOTE_QUERY]: asValue(null),
})
await pgConnectionLoader()
if (!options?.skipDbConnection) {
await pgConnectionLoader()
}
return container
}
@@ -151,6 +169,7 @@ export default async ({
const configModule = container.resolve(
ContainerRegistrationKeys.CONFIG_MODULE
)
const logger = container.resolve(ContainerRegistrationKeys.LOGGER)
const plugins = await getResolvedPlugins(rootDirectory, configModule, true)
mergePluginModules(configModule, plugins)
@@ -162,7 +181,7 @@ export default async ({
const linksSourcePaths = plugins.map((plugin) =>
join(plugin.resolve, "links")
)
await new LinkLoader(linksSourcePaths).load()
await new LinkLoader(linksSourcePaths, logger).load()
const {
onApplicationStart,
@@ -173,7 +192,7 @@ export default async ({
} = await new MedusaAppLoader().load()
const workflowsSourcePaths = plugins.map((p) => join(p.resolve, "workflows"))
const workflowLoader = new WorkflowLoader(workflowsSourcePaths)
const workflowLoader = new WorkflowLoader(workflowsSourcePaths, container)
await workflowLoader.load()
const entrypointsShutdown = await loadEntrypoints(