diff --git a/packages/cli/medusa-cli/src/create-cli.ts b/packages/cli/medusa-cli/src/create-cli.ts index 20ae5d8ca0..14c2c38dc3 100644 --- a/packages/cli/medusa-cli/src/create-cli.ts +++ b/packages/cli/medusa-cli/src/create-cli.ts @@ -204,6 +204,16 @@ function buildLocalCommands(cli, isLocalProject) { }) ), }) + .command({ + command: "db:migrate:scripts", + desc: "Run all migration scripts", + handler: handlerP( + getCommandHandler("db/run-scripts", (args, cmd) => { + process.env.NODE_ENV = process.env.NODE_ENV || `development` + return cmd(args) + }) + ), + }) .command({ command: "db:rollback [modules...]", desc: "Rollback last batch of executed migrations for a given module", diff --git a/packages/medusa/src/commands/db/migrate.ts b/packages/medusa/src/commands/db/migrate.ts index 1828115ecd..046210360b 100644 --- a/packages/medusa/src/commands/db/migrate.ts +++ b/packages/medusa/src/commands/db/migrate.ts @@ -1,20 +1,22 @@ -import { join } from "path" +import { MEDUSA_CLI_PATH, MedusaAppLoader } from "@medusajs/framework" +import { LinkLoader } from "@medusajs/framework/links" +import { logger } from "@medusajs/framework/logger" import { ContainerRegistrationKeys, mergePluginModules, } from "@medusajs/framework/utils" -import { LinkLoader } from "@medusajs/framework/links" -import { logger } from "@medusajs/framework/logger" -import { MedusaAppLoader } from "@medusajs/framework" +import { join } from "path" -import { syncLinks } from "./sync-links" -import { ensureDbExists } from "../utils" +import { fork } from "child_process" +import path from "path" import { initializeContainer } from "../../loaders" import { getResolvedPlugins } from "../../loaders/helpers/resolve-plugins" -import { runMigrationScripts } from "./run-scripts" - +import { ensureDbExists } from "../utils" +import { syncLinks } from "./sync-links" const TERMINAL_SIZE = process.stdout.columns +const cliPath = path.resolve(MEDUSA_CLI_PATH, "..", "..", "cli.js") + /** * A low-level utility to migrate the database. This util should * never exit the process implicitly. @@ -77,9 +79,18 @@ export async function migrate({ * Run migration scripts */ console.log(new Array(TERMINAL_SIZE).join("-")) - await runMigrationScripts({ - directory, - container, + const childProcess = fork(cliPath, ["db:migrate:scripts"], { + cwd: directory, + env: process.env, + }) + + await new Promise((resolve, reject) => { + childProcess.on("error", (error) => { + reject(error) + }) + childProcess.on("close", () => { + resolve() + }) }) } diff --git a/packages/medusa/src/commands/db/run-scripts.ts b/packages/medusa/src/commands/db/run-scripts.ts index 60d7cc4468..67a4241a6c 100644 --- a/packages/medusa/src/commands/db/run-scripts.ts +++ b/packages/medusa/src/commands/db/run-scripts.ts @@ -9,7 +9,7 @@ import { import { dirname, join } from "path" import { MedusaModule } from "@medusajs/framework/modules-sdk" -import { MedusaContainer } from "@medusajs/types" +import { MedusaContainer, PluginDetails } from "@medusajs/types" import { initializeContainer } from "../../loaders" import { getResolvedPlugins } from "../../loaders/helpers/resolve-plugins" import { ensureDbExists } from "../utils" @@ -22,46 +22,30 @@ const TERMINAL_SIZE = process.stdout.columns */ export async function runMigrationScripts({ directory, - container, }: { directory: string - container?: MedusaContainer }): Promise { - /** - * Clear all module instances to prevent cache from kicking in - */ - MedusaModule.clearInstances() - - let container_: MedusaContainer = container! let onApplicationPrepareShutdown: () => Promise = async () => Promise.resolve() let onApplicationShutdown: () => Promise = async () => Promise.resolve() + let container_: MedusaContainer + let plugins: PluginDetails[] try { - /** - * Setup - */ - container_ ??= await initializeContainer(directory) + container_ = await initializeContainer(directory) await ensureDbExists(container_) const configModule = container_.resolve( ContainerRegistrationKeys.CONFIG_MODULE ) - const plugins = await getResolvedPlugins(directory, configModule, true) + plugins = await getResolvedPlugins(directory, configModule, true) mergePluginModules(configModule, plugins) - const linksSourcePaths = plugins.map((plugin) => - join(plugin.resolve, "links") - ) - await new LinkLoader(linksSourcePaths).load() - - const medusaAppResources = await new MedusaAppLoader().load() - onApplicationPrepareShutdown = - medusaAppResources.onApplicationPrepareShutdown - onApplicationShutdown = medusaAppResources.onApplicationShutdown - await medusaAppResources.onApplicationStart() + const resources = await loadResources(plugins) + onApplicationPrepareShutdown = resources.onApplicationPrepareShutdown + onApplicationShutdown = resources.onApplicationShutdown const scriptsSourcePaths = [ join(dirname(require.resolve("@medusajs/medusa")), "migration-scripts"), @@ -97,7 +81,42 @@ export async function runMigrationScripts({ } } -const main = async function ({ directory }: { directory: string }) { +async function loadResources(plugins: any): Promise<{ + onApplicationPrepareShutdown: () => Promise + onApplicationShutdown: () => Promise +}> { + /** + * Clear all module instances to prevent cache from kicking in + */ + MedusaModule.clearInstances() + + /** + * Setup + */ + + const linksSourcePaths = plugins.map((plugin) => + join(plugin.resolve, "links") + ) + await new LinkLoader(linksSourcePaths).load() + + const medusaAppResources = await new MedusaAppLoader().load() + const onApplicationPrepareShutdown = + medusaAppResources.onApplicationPrepareShutdown + const onApplicationShutdown = medusaAppResources.onApplicationShutdown + await medusaAppResources.onApplicationStart() + + return { + onApplicationPrepareShutdown, + onApplicationShutdown, + } +} + +const main = async function ({ + directory, +}: { + directory: string + container?: MedusaContainer +}) { try { const migrated = await runMigrationScripts({ directory,