From 779ed018b9c1328d6554a0f3d3569147edaeae56 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Thu, 3 Jul 2025 15:58:18 +0200 Subject: [PATCH] feat(create-medusa-app): Allow to create project with specific medusa version (#12882) * feat(create-medusa-app): Allow to create project with specific medusa version * feat(create-medusa-app): Allow to create project with specific medusa version * feat(create-medusa-app): Allow to create project with specific medusa version * naming * Create smart-singers-dress.md --- .changeset/smart-singers-dress.md | 5 +++ packages/cli/create-medusa-app/src/index.ts | 1 + .../src/utils/nextjs-utils.ts | 9 ++++++ .../src/utils/prepare-project.ts | 8 +++++ .../src/utils/project-creator/creator.ts | 1 + .../project-creator/medusa-project-creator.ts | 2 ++ .../src/utils/update-package-versions.ts | 31 +++++++++++++++++++ 7 files changed, 57 insertions(+) create mode 100644 .changeset/smart-singers-dress.md create mode 100644 packages/cli/create-medusa-app/src/utils/update-package-versions.ts diff --git a/.changeset/smart-singers-dress.md b/.changeset/smart-singers-dress.md new file mode 100644 index 0000000000..22067f18db --- /dev/null +++ b/.changeset/smart-singers-dress.md @@ -0,0 +1,5 @@ +--- +"create-medusa-app": patch +--- + +feat(create-medusa-app): Allow to create project with specific medusa version diff --git a/packages/cli/create-medusa-app/src/index.ts b/packages/cli/create-medusa-app/src/index.ts index e0219c53fe..bee8292c43 100644 --- a/packages/cli/create-medusa-app/src/index.ts +++ b/packages/cli/create-medusa-app/src/index.ts @@ -7,6 +7,7 @@ program .argument("[project-name]", "Name of the project to create.") .option("--plugin", "Create a plugin instead of a project.") .option("--repo-url ", "URL of repository to use to setup project.") + .option("--version ", "The version of Medusa packages to install.") .option("--seed", "Seed the created database with demo data.") .option( "--skip-db", diff --git a/packages/cli/create-medusa-app/src/utils/nextjs-utils.ts b/packages/cli/create-medusa-app/src/utils/nextjs-utils.ts index 961208e232..8691fa86f5 100644 --- a/packages/cli/create-medusa-app/src/utils/nextjs-utils.ts +++ b/packages/cli/create-medusa-app/src/utils/nextjs-utils.ts @@ -8,6 +8,7 @@ import execute from "./execute.js" import { displayFactBox, FactBoxOptions } from "./facts.js" import logMessage from "./log-message.js" import ProcessManager from "./process-manager.js" +import { updatePackageVersions } from "./update-package-versions.js" const NEXTJS_REPO = "https://github.com/medusajs/nextjs-starter-medusa" const NEXTJS_BRANCH = "main" @@ -31,6 +32,7 @@ type InstallOptions = { factBoxOptions: FactBoxOptions verbose?: boolean processManager: ProcessManager + version?: string } export async function installNextjsStarter({ @@ -39,6 +41,7 @@ export async function installNextjsStarter({ factBoxOptions, verbose = false, processManager, + version, }: InstallOptions): Promise { factBoxOptions.interval = displayFactBox({ ...factBoxOptions, @@ -70,6 +73,12 @@ export async function installNextjsStarter({ ], { verbose } ) + + if (version) { + const packageJsonPath = path.join(nextjsDirectory, "package.json") + updatePackageVersions(packageJsonPath, version, { applyChanges: true }) + } + const execOptions = { signal: abortController?.signal, cwd: nextjsDirectory, diff --git a/packages/cli/create-medusa-app/src/utils/prepare-project.ts b/packages/cli/create-medusa-app/src/utils/prepare-project.ts index b81c136f12..68d1d6c977 100644 --- a/packages/cli/create-medusa-app/src/utils/prepare-project.ts +++ b/packages/cli/create-medusa-app/src/utils/prepare-project.ts @@ -7,6 +7,7 @@ import { displayFactBox, FactBoxOptions } from "./facts.js" import ProcessManager from "./process-manager.js" import type { Client } from "pg" import PackageManager from "./package-manager.js" +import { updatePackageVersions } from "./update-package-versions.js" const ADMIN_EMAIL = "admin@medusa-test.com" let STORE_CORS = "http://localhost:8000" @@ -45,6 +46,7 @@ type PrepareProjectOptions = { client: Client | null verbose?: boolean packageManager: PackageManager + version?: string } type PrepareOptions = PreparePluginOptions | PrepareProjectOptions @@ -128,6 +130,7 @@ async function prepareProject({ client, verbose = false, packageManager, + version, }: PrepareProjectOptions) { // initialize execution options const execOptions = { @@ -159,6 +162,11 @@ async function prepareProject({ // Update name packageJson.name = projectName + // Update medusa dependencies versions + if (version) { + updatePackageVersions(packageJson, version) + } + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)) // initialize the invite token to return diff --git a/packages/cli/create-medusa-app/src/utils/project-creator/creator.ts b/packages/cli/create-medusa-app/src/utils/project-creator/creator.ts index 21487edfe5..de40d12fe6 100644 --- a/packages/cli/create-medusa-app/src/utils/project-creator/creator.ts +++ b/packages/cli/create-medusa-app/src/utils/project-creator/creator.ts @@ -16,6 +16,7 @@ export interface ProjectOptions { withNextjsStarter?: boolean verbose?: boolean plugin?: boolean + version?: string } export interface ProjectCreator { diff --git a/packages/cli/create-medusa-app/src/utils/project-creator/medusa-project-creator.ts b/packages/cli/create-medusa-app/src/utils/project-creator/medusa-project-creator.ts index edd2f13320..9a2bc7af00 100644 --- a/packages/cli/create-medusa-app/src/utils/project-creator/medusa-project-creator.ts +++ b/packages/cli/create-medusa-app/src/utils/project-creator/medusa-project-creator.ts @@ -96,6 +96,7 @@ export class MedusaProjectCreator factBoxOptions: this.factBoxOptions, verbose: this.options.verbose, processManager: this.processManager, + version: this.options.version, }) } } catch (e) { @@ -154,6 +155,7 @@ export class MedusaProjectCreator client: this.client, verbose: this.options.verbose, packageManager: this.packageManager, + version: this.options.version, }) } finally { await this.client?.end() diff --git a/packages/cli/create-medusa-app/src/utils/update-package-versions.ts b/packages/cli/create-medusa-app/src/utils/update-package-versions.ts new file mode 100644 index 0000000000..f822480f7d --- /dev/null +++ b/packages/cli/create-medusa-app/src/utils/update-package-versions.ts @@ -0,0 +1,31 @@ +import { readFileSync, writeFileSync } from "fs" + +export function updatePackageVersions( + packageJsonOrPath: string | Record, + version: string, + { applyChanges = false }: { applyChanges?: boolean } = {} +) { + const packageJson = + typeof packageJsonOrPath === "string" + ? JSON.parse(readFileSync(packageJsonOrPath, "utf-8")) + : packageJsonOrPath + + if (packageJson.dependencies) { + for (const dependency of Object.keys(packageJson.dependencies)) { + if (dependency.startsWith("@medusajs/")) { + packageJson.dependencies[dependency] = version + } + } + } + if (packageJson.devDependencies) { + for (const dependency of Object.keys(packageJson.devDependencies)) { + if (dependency.startsWith("@medusajs/")) { + packageJson.devDependencies[dependency] = version + } + } + } + + if (applyChanges && typeof packageJsonOrPath === "string") { + writeFileSync(packageJsonOrPath, JSON.stringify(packageJson, null, 2)) + } +}