From 73c917fdce9bdf30f99db910619c8f14be6a8d6e Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Tue, 21 May 2024 11:56:44 +0300 Subject: [PATCH] feat(medusa,medusa-cli): add an exec command (#7376) --- packages/cli/medusa-cli/src/create-cli.ts | 13 ++++++ packages/core/types/src/common/index.ts | 1 + packages/core/types/src/common/medusa-cli.ts | 6 +++ packages/medusa/src/commands/exec.ts | 42 ++++++++++++++++++++ packages/medusa/src/loaders/index.ts | 1 - 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 packages/core/types/src/common/medusa-cli.ts create mode 100644 packages/medusa/src/commands/exec.ts diff --git a/packages/cli/medusa-cli/src/create-cli.ts b/packages/cli/medusa-cli/src/create-cli.ts index d8e3db39f7..341d1fdcac 100644 --- a/packages/cli/medusa-cli/src/create-cli.ts +++ b/packages/cli/medusa-cli/src/create-cli.ts @@ -321,6 +321,19 @@ function buildLocalCommands(cli, isLocalProject) { }) ), }) + .command({ + command: `exec [file] [args..]`, + desc: `Run a function defined in a file.`, + handler: handlerP( + getCommandHandler(`exec`, (args, cmd) => { + cmd(args) + // Return an empty promise to prevent handlerP from exiting early. + // The development server shouldn't ever exit until the user directly + // kills it so this is fine. + return new Promise((resolve) => {}) + }) + ), + }) } function isLocalMedusaProject() { diff --git a/packages/core/types/src/common/index.ts b/packages/core/types/src/common/index.ts index 2717f4ecc6..01b88856d0 100644 --- a/packages/core/types/src/common/index.ts +++ b/packages/core/types/src/common/index.ts @@ -2,5 +2,6 @@ export * from "./common" export * from "./rule" export * from "./batch" export * from "./config-module" +export * from "./medusa-cli" export * from "./medusa-container" export * from "./with-calculated" diff --git a/packages/core/types/src/common/medusa-cli.ts b/packages/core/types/src/common/medusa-cli.ts new file mode 100644 index 0000000000..94f755eac5 --- /dev/null +++ b/packages/core/types/src/common/medusa-cli.ts @@ -0,0 +1,6 @@ +import { MedusaContainer } from "./medusa-container" + +export type ExecArgs = { + container: MedusaContainer + args: string[] +} \ No newline at end of file diff --git a/packages/medusa/src/commands/exec.ts b/packages/medusa/src/commands/exec.ts new file mode 100644 index 0000000000..a4f76f93bb --- /dev/null +++ b/packages/medusa/src/commands/exec.ts @@ -0,0 +1,42 @@ +import loaders from "../loaders" +import express from "express" +import path from "path" +import logger from "../loaders/logger" +import { ExecArgs } from "@medusajs/types" + +type Options = { + file: string + args: string[] +} + +export default async function script({ file, args }: Options) { + logger.info(`Executing script at ${file}...`) + const app = express() + const directory = process.cwd() + + try { + // set worker mode + process.env.MEDUSA_WORKER_MODE = "worker" + + const { container } = await loaders({ + directory, + expressApp: app, + }) + + const scriptFile = (await import(path.resolve(directory, file))).default + + const scriptParams: ExecArgs = { + container, + args, + } + + await scriptFile(scriptParams) + + logger.info(`Finished executing script.`) + + process.exit() + } catch (err) { + logger.error("Error running script", err) + process.exit(1) + } +} diff --git a/packages/medusa/src/loaders/index.ts b/packages/medusa/src/loaders/index.ts index 43077df4d1..8baade8d6e 100644 --- a/packages/medusa/src/loaders/index.ts +++ b/packages/medusa/src/loaders/index.ts @@ -22,7 +22,6 @@ import { SubscriberLoader } from "./helpers/subscribers" type Options = { directory: string expressApp: Express - isTest: boolean } const isWorkerMode = (configModule) => {