diff --git a/.changeset/clean-pigs-hope.md b/.changeset/clean-pigs-hope.md new file mode 100644 index 0000000000..cb0e9d7883 --- /dev/null +++ b/.changeset/clean-pigs-hope.md @@ -0,0 +1,7 @@ +--- +"create-medusa-app": patch +"@medusajs/medusa-cli": patch +"@medusajs/utils": patch +--- + +feat(create-medusa-app,medusa-cli): Allow clearing project diff --git a/packages/create-medusa-app/package.json b/packages/create-medusa-app/package.json index 0129589442..3fa90b82ed 100644 --- a/packages/create-medusa-app/package.json +++ b/packages/create-medusa-app/package.json @@ -13,12 +13,15 @@ "prepare": "cross-env NODE_ENV=production yarn run build" }, "dependencies": { + "@medusajs/utils": "^1.9.0", "boxen": "^7.1.0", "chalk": "^5.2.0", "commander": "^10.0.1", + "glob": "^10.2.7", "inquirer": "^9.2.2", "medusa-telemetry": "^0.0.16", "nanoid": "^4.0.2", + "node-emoji": "^2.0.2", "node-fetch": "^3.3.1", "open": "^9.1.0", "ora": "^6.3.0", @@ -33,6 +36,7 @@ "@types/commander": "^2.12.2", "@types/configstore": "^6.0.0", "@types/inquirer": "^9.0.3", + "@types/node-emoji": "^1.8.2", "@types/pg": "^8.6.6", "@types/uuid": "^9.0.1", "@types/validator": "^13.7.17", diff --git a/packages/create-medusa-app/src/commands/create.ts b/packages/create-medusa-app/src/commands/create.ts index f6eca15d0c..96c733b775 100644 --- a/packages/create-medusa-app/src/commands/create.ts +++ b/packages/create-medusa-app/src/commands/create.ts @@ -15,13 +15,14 @@ import fs from "fs" import { nanoid } from "nanoid" import isEmailImported from "validator/lib/isEmail.js" import logMessage from "../utils/log-message.js" -import onProcessTerminated from "../utils/on-process-terminated.js" import createAbortController, { isAbortError, } from "../utils/create-abort-controller.js" import { track } from "medusa-telemetry" import { createFactBox, resetFactBox } from "../utils/facts.js" import boxen from "boxen" +import { emojify } from "node-emoji" +import ProcessManager from "../utils/process-manager.js" const slugify = slugifyType.default const isEmail = isEmailImported.default @@ -29,9 +30,11 @@ const isEmail = isEmailImported.default type CreateOptions = { repoUrl?: string seed?: boolean + // commander passed --no-boilerplate as boilerplate + boilerplate?: boolean } -export default async ({ repoUrl = "", seed }: CreateOptions) => { +export default async ({ repoUrl = "", seed, boilerplate }: CreateOptions) => { track("CREATE_CLI") if (repoUrl) { track("STARTER_SELECTED", { starter: repoUrl }) @@ -39,7 +42,8 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { if (seed) { track("SEED_SELECTED", { seed }) } - const abortController = createAbortController() + const processManager = new ProcessManager() + const abortController = createAbortController(processManager) const { projectName } = await inquirer.prompt([ { @@ -114,7 +118,7 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { type: "input", name: "adminEmail", message: "Enter an email for your admin dashboard user", - default: !seed ? "admin@medusa-test.com" : undefined, + default: !seed && boilerplate ? "admin@medusa-test.com" : undefined, validate: (input) => { return typeof input === "string" && input.length > 0 && isEmail(input) ? true @@ -123,13 +127,20 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { }, ]) + logMessage({ + message: `${emojify( + ":rocket:" + )} Starting project setup, this may take a few minutes.`, + }) + const spinner = ora().start() - onProcessTerminated(() => spinner.stop()) + processManager.onTerminated(() => spinner.stop()) let interval: NodeJS.Timer | null = createFactBox( spinner, - "Setting up project..." + "Setting up project...", + processManager ) // clone repository @@ -155,6 +166,7 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { interval, spinner, "Created project directory", + processManager, "Creating database..." ) @@ -182,7 +194,12 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { db: dbName, }) - resetFactBox(interval, spinner, `Database ${dbName} created`) + resetFactBox( + interval, + spinner, + `Database ${dbName} created`, + processManager + ) } // prepare project @@ -195,7 +212,9 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { email: adminEmail, }, seed, + boilerplate, spinner, + processManager, abortController, }) } catch (e: any) { @@ -240,19 +259,13 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { // this ensures that the message isn't printed twice to the user let printedMessage = false - onProcessTerminated(() => { + processManager.onTerminated(() => { if (!printedMessage) { printedMessage = true console.log( boxen( chalk.green( - `Change to the \`${projectName}\` directory to explore your Medusa project. - - Check out the Medusa documentation to start your development: - https://docs.medusajs.com/ - - Star us on GitHub if you like what we're building: - https://github.com/medusajs/medusa/stargazers` + `Change to the \`${projectName}\` directory to explore your Medusa project.\n\nStart your Medusa app again with the following command:\n\nnpx @medusajs/medusa-cli develop\n\nCheck out the Medusa documentation to start your development:\n\nhttps://docs.medusajs.com/\n\nStar us on GitHub if you like what we're building:\n\nhttps://github.com/medusajs/medusa/stargazers` ), { titleAlignment: "center", @@ -271,8 +284,8 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => { }).then(async () => open( inviteToken - ? `http://localhost:9000/app/invite?token=${inviteToken}&first_run=true` - : "http://localhost:9000/app" + ? `http://localhost:7001/invite?token=${inviteToken}&first_run=true` + : "http://localhost:7001" ) ) } diff --git a/packages/create-medusa-app/src/index.ts b/packages/create-medusa-app/src/index.ts index 07f4d45373..636de27738 100644 --- a/packages/create-medusa-app/src/index.ts +++ b/packages/create-medusa-app/src/index.ts @@ -6,6 +6,10 @@ program .description("Create a new Medusa project") .option("--repo-url ", "URL of repository to use to setup project.") .option("--seed", "Seed the created database with demo data.") + .option( + "--no-boilerplate", + "Install a Medusa project without the boilerplate and demo files." + ) .parse() void create(program.opts()) diff --git a/packages/create-medusa-app/src/utils/clone-repo.ts b/packages/create-medusa-app/src/utils/clone-repo.ts index c3c618ddeb..416b2c7339 100644 --- a/packages/create-medusa-app/src/utils/clone-repo.ts +++ b/packages/create-medusa-app/src/utils/clone-repo.ts @@ -6,7 +6,6 @@ type CloneRepoOptions = { abortController?: AbortController } -// TODO change default repo URL const DEFAULT_REPO = "https://github.com/medusajs/medusa-starter-default" export default async ({ diff --git a/packages/create-medusa-app/src/utils/create-abort-controller.ts b/packages/create-medusa-app/src/utils/create-abort-controller.ts index 2ffe334ce9..0e78f05420 100644 --- a/packages/create-medusa-app/src/utils/create-abort-controller.ts +++ b/packages/create-medusa-app/src/utils/create-abort-controller.ts @@ -1,8 +1,8 @@ -import onProcessTerminated from "./on-process-terminated.js" +import ProcessManager from "./process-manager.js" -export default () => { +export default (processManager: ProcessManager) => { const abortController = new AbortController() - onProcessTerminated(() => abortController.abort()) + processManager.onTerminated(() => abortController.abort()) return abortController } diff --git a/packages/create-medusa-app/src/utils/facts.ts b/packages/create-medusa-app/src/utils/facts.ts index 86d7be21d9..2f33555127 100644 --- a/packages/create-medusa-app/src/utils/facts.ts +++ b/packages/create-medusa-app/src/utils/facts.ts @@ -1,7 +1,8 @@ import boxen from "boxen" import chalk from "chalk" import { Ora } from "ora" -import onProcessTerminated from "./on-process-terminated.js" +import { emojify } from "node-emoji" +import ProcessManager from "./process-manager.js" const facts = [ "Plugins allow you to integrate third-party services for payment, fulfillment, notifications, and more.", @@ -31,17 +32,20 @@ export const getFact = () => { export const showFact = (spinner: Ora, title: string) => { const fact = getFact() - spinner.text = `${boxen(fact, { + spinner.text = `${boxen(`${emojify(":bulb:")} Medusa Tips\n\n${fact}`, { title: chalk.cyan(title), titleAlignment: "center", textAlignment: "center", padding: 1, margin: 1, - float: "center", })}` } -export const createFactBox = (spinner: Ora, title: string): NodeJS.Timer => { +export const createFactBox = ( + spinner: Ora, + title: string, + processManager: ProcessManager +): NodeJS.Timer => { spinner.spinner = { frames: [""], } @@ -50,7 +54,7 @@ export const createFactBox = (spinner: Ora, title: string): NodeJS.Timer => { showFact(spinner, title) }, 10000) - onProcessTerminated(() => clearInterval(interval)) + processManager.addInterval(interval) return interval } @@ -59,6 +63,7 @@ export const resetFactBox = ( interval: NodeJS.Timer | null, spinner: Ora, successMessage: string, + processManager: ProcessManager, newTitle?: string ): NodeJS.Timer | null => { if (interval) { @@ -69,7 +74,7 @@ export const resetFactBox = ( spinner.succeed(chalk.green(successMessage)).start() let newInterval = null if (newTitle) { - newInterval = createFactBox(spinner, newTitle) + newInterval = createFactBox(spinner, newTitle, processManager) } return newInterval diff --git a/packages/create-medusa-app/src/utils/on-process-terminated.ts b/packages/create-medusa-app/src/utils/on-process-terminated.ts deleted file mode 100644 index 4bb49c2cc7..0000000000 --- a/packages/create-medusa-app/src/utils/on-process-terminated.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default (fn: Function) => { - process.on("SIGTERM", () => fn()) - process.on("SIGINT", () => fn()) -} diff --git a/packages/create-medusa-app/src/utils/prepare-project.ts b/packages/create-medusa-app/src/utils/prepare-project.ts index 78e21362b8..5eecc0f1db 100644 --- a/packages/create-medusa-app/src/utils/prepare-project.ts +++ b/packages/create-medusa-app/src/utils/prepare-project.ts @@ -4,8 +4,9 @@ import path from "path" import { Ora } from "ora" import promiseExec from "./promise-exec.js" import { EOL } from "os" -import runProcess from "./run-process.js" import { createFactBox, resetFactBox } from "./facts.js" +import { clearProject } from "@medusajs/utils" +import ProcessManager from "./process-manager.js" type PrepareOptions = { directory: string @@ -14,7 +15,9 @@ type PrepareOptions = { email: string } seed?: boolean + boilerplate?: boolean spinner: Ora + processManager: ProcessManager abortController?: AbortController } @@ -23,7 +26,9 @@ export default async ({ dbConnectionString, admin, seed, + boilerplate, spinner, + processManager, abortController, }: PrepareOptions) => { // initialize execution options @@ -43,10 +48,11 @@ export default async ({ let interval: NodeJS.Timer | null = createFactBox( spinner, - "Installing dependencies..." + "Installing dependencies...", + processManager ) - await runProcess({ + await processManager.runProcess({ process: async () => { try { await promiseExec(`yarn`, execOptions) @@ -63,26 +69,73 @@ export default async ({ interval, spinner, "Installed Dependencies", - "Running Migrations...." + processManager ) - // run migrations - await runProcess({ + if (!boilerplate) { + interval = createFactBox( + spinner, + "Preparing Project Directory...", + processManager + ) + // delete files and directories related to onboarding + clearProject(directory) + interval = resetFactBox( + interval, + spinner, + "Prepared Project Directory", + processManager + ) + } + + interval = createFactBox(spinner, "Building Project...", processManager) + await processManager.runProcess({ process: async () => { - await promiseExec( + try { + await promiseExec(`yarn build`, execOptions) + } catch (e) { + // yarn isn't available + // use npm + await promiseExec(`npm run build`, execOptions) + } + }, + ignoreERESOLVE: true, + }) + + interval = resetFactBox(interval, spinner, "Project Built", processManager) + + interval = createFactBox(spinner, "Running Migrations...", processManager) + + // run migrations + await processManager.runProcess({ + process: async () => { + const proc = await promiseExec( "npx -y @medusajs/medusa-cli@latest migrations run", execOptions ) + + // ensure that migrations actually ran in case of an uncaught error + if (!proc.stdout.includes("Migrations completed")) { + throw new Error( + `An error occurred while running migrations: ${ + proc.stderr || proc.stdout + }` + ) + } }, }) - interval = resetFactBox(interval, spinner, "Ran Migrations") + interval = resetFactBox(interval, spinner, "Ran Migrations", processManager) if (admin) { // create admin user - interval = createFactBox(spinner, "Creating an admin user...") + interval = createFactBox( + spinner, + "Creating an admin user...", + processManager + ) - await runProcess({ + await processManager.runProcess({ process: async () => { const proc = await promiseExec( `npx -y @medusajs/medusa-cli@latest user -e ${admin.email} --invite`, @@ -94,11 +147,16 @@ export default async ({ }, }) - interval = resetFactBox(interval, spinner, "Created admin user") + interval = resetFactBox( + interval, + spinner, + "Created admin user", + processManager + ) } - if (seed) { - interval = createFactBox(spinner, "Seeding database...") + if (seed || !boilerplate) { + interval = createFactBox(spinner, "Seeding database...", processManager) // check if a seed file exists in the project if (!fs.existsSync(path.join(directory, "data", "seed.json"))) { @@ -112,7 +170,7 @@ export default async ({ return inviteToken } - await runProcess({ + await processManager.runProcess({ process: async () => { await promiseExec( `npx -y @medusajs/medusa-cli@latest seed --seed-file=${path.join( @@ -123,14 +181,19 @@ export default async ({ ) }, }) - resetFactBox(interval, spinner, "Seeded database with demo data") + resetFactBox( + interval, + spinner, + "Seeded database with demo data", + processManager + ) } else if ( fs.existsSync(path.join(directory, "data", "seed-onboarding.json")) ) { // seed the database with onboarding seed - interval = createFactBox(spinner, "Finish preparation...") + interval = createFactBox(spinner, "Finish preparation...", processManager) - await runProcess({ + await processManager.runProcess({ process: async () => { await promiseExec( `npx -y @medusajs/medusa-cli@latest seed --seed-file=${path.join( @@ -141,7 +204,7 @@ export default async ({ ) }, }) - resetFactBox(interval, spinner, "Finished Preparation") + resetFactBox(interval, spinner, "Finished Preparation", processManager) } return inviteToken diff --git a/packages/create-medusa-app/src/utils/process-manager.ts b/packages/create-medusa-app/src/utils/process-manager.ts new file mode 100644 index 0000000000..08b65c4548 --- /dev/null +++ b/packages/create-medusa-app/src/utils/process-manager.ts @@ -0,0 +1,60 @@ +type ProcessOptions = { + process: Function + ignoreERESOLVE?: boolean +} + +export default class ProcessManager { + intervals: NodeJS.Timer[] = [] + static MAX_RETRIES = 3 + + constructor() { + this.onTerminated(() => { + this.intervals.forEach((interval) => { + clearInterval(interval) + }) + }) + } + + onTerminated(fn: Function) { + process.on("SIGTERM", () => fn()) + process.on("SIGINT", () => fn()) + } + + addInterval(interval: NodeJS.Timer) { + this.intervals.push(interval) + } + + // when running commands with npx or npm sometimes they + // terminate with EAGAIN error unexpectedly + // this utility function allows retrying the process if + // EAGAIN occurs, or otherwise throw the error that occurs + async runProcess({ process, ignoreERESOLVE }: ProcessOptions) { + let processError = false + let retries = 0 + do { + retries++ + try { + await process() + } catch (error) { + if ( + typeof error === "object" && + error !== null && + "code" in error && + error?.code === "EAGAIN" + ) { + processError = true + } else if ( + ignoreERESOLVE && + typeof error === "object" && + error !== null && + "code" in error && + error?.code === "ERESOLVE" + ) { + // ignore error + } else { + throw error + } + } + } while (processError && retries <= ProcessManager.MAX_RETRIES) + } +} diff --git a/packages/create-medusa-app/src/utils/run-process.ts b/packages/create-medusa-app/src/utils/run-process.ts deleted file mode 100644 index 78b63ba806..0000000000 --- a/packages/create-medusa-app/src/utils/run-process.ts +++ /dev/null @@ -1,36 +0,0 @@ -type ProcessOptions = { - process: Function - ignoreERESOLVE?: boolean -} - -// when running commands with npx or npm sometimes they -// terminate with EAGAIN error unexpectedly -// this utility function allows retrying the process if -// EAGAIN occurs, or otherwise throw the error that occurs -export default async ({ process, ignoreERESOLVE }: ProcessOptions) => { - let processError = false - do { - try { - await process() - } catch (error) { - if ( - typeof error === "object" && - error !== null && - "code" in error && - error?.code === "EAGAIN" - ) { - processError = true - } else if ( - ignoreERESOLVE && - typeof error === "object" && - error !== null && - "code" in error && - error?.code === "ERESOLVE" - ) { - // ignore error - } else { - throw error - } - } - } while (processError) -} diff --git a/packages/medusa-cli/package.json b/packages/medusa-cli/package.json index db9d578cb5..a61485862e 100644 --- a/packages/medusa-cli/package.json +++ b/packages/medusa-cli/package.json @@ -45,6 +45,7 @@ "execa": "^5.1.1", "fs-exists-cached": "^1.0.0", "fs-extra": "^10.0.0", + "glob": "^10.2.7", "hosted-git-info": "^4.0.2", "inquirer": "^8.0.0", "is-valid-path": "^0.1.1", diff --git a/packages/medusa-cli/src/commands/new.js b/packages/medusa-cli/src/commands/new.js index ef49aae877..d5561d77a5 100644 --- a/packages/medusa-cli/src/commands/new.js +++ b/packages/medusa-cli/src/commands/new.js @@ -15,9 +15,11 @@ import url from "url" import { createDatabase } from "pg-god" import { track } from "medusa-telemetry" import inquirer from "inquirer" +import { globSync } from "glob" import reporter from "../reporter" import { getPackageManager, setPackageManager } from "../util/package-manager" +import { clearProject } from "@medusajs/utils" const removeUndefined = (obj) => { return Object.fromEntries( @@ -632,6 +634,12 @@ medusa new ${rootPath} [url-to-starter] } } + if (!selectedOtherStarter) { + reporter.info("Final project preparations...") + // remove demo files + clearProject(rootPath) + } + successMessage(rootPath) track("CLI_NEW_SUCCEEDED") } diff --git a/packages/utils/package.json b/packages/utils/package.json index 3dad27f711..62fa979171 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -27,6 +27,7 @@ }, "dependencies": { "awilix": "^8.0.1", + "glob": "^10.2.7", "ulid": "^2.3.0" }, "scripts": { diff --git a/packages/utils/src/cli/clear-project.ts b/packages/utils/src/cli/clear-project.ts new file mode 100644 index 0000000000..6a000a1993 --- /dev/null +++ b/packages/utils/src/cli/clear-project.ts @@ -0,0 +1,20 @@ +import fs from "fs" +import path from "path" +import { globSync } from "glob" + +export function clearProject (directory: string) { + const files = globSync([ + path.join(directory, `src`, `admin/**/*`), + path.join(directory, `src`, `**/onboarding/`), + path.join(directory, `src`, `types`), + path.join(directory, `src`, `**/*.{ts,tsx,js,jsx}`), + ]) + files.forEach((file) => + fs.rmSync(file, { + recursive: true, + force: true, + }) + ) + // add empty typescript file to avoid build errors + fs.openSync(path.join(directory, "src", "index.ts"), "w") +} diff --git a/packages/utils/src/cli/index.ts b/packages/utils/src/cli/index.ts new file mode 100644 index 0000000000..13d04c3410 --- /dev/null +++ b/packages/utils/src/cli/index.ts @@ -0,0 +1 @@ +export * from "./clear-project" \ No newline at end of file diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 5d89805f6f..0c75dd12f0 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,5 +1,6 @@ export * from "./bundles" +export * from "./cli" export * from "./common" export * from "./decorators" export * from "./event-bus" -export * from "./search" +export * from "./search" \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index cc878d2e70..5984295015 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3246,6 +3246,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm64@npm:0.17.19" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.15.18": version: 0.15.18 resolution: "@esbuild/android-arm@npm:0.15.18" @@ -3260,6 +3267,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm@npm:0.17.19" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/android-x64@npm:0.16.17" @@ -3267,6 +3281,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-x64@npm:0.17.19" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/darwin-arm64@npm:0.16.17" @@ -3274,6 +3295,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-arm64@npm:0.17.19" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/darwin-x64@npm:0.16.17" @@ -3281,6 +3309,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-x64@npm:0.17.19" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/freebsd-arm64@npm:0.16.17" @@ -3288,6 +3323,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-arm64@npm:0.17.19" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/freebsd-x64@npm:0.16.17" @@ -3295,6 +3337,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-x64@npm:0.17.19" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-arm64@npm:0.16.17" @@ -3302,6 +3351,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm64@npm:0.17.19" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-arm@npm:0.16.17" @@ -3309,6 +3365,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm@npm:0.17.19" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-ia32@npm:0.16.17" @@ -3316,6 +3379,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ia32@npm:0.17.19" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.15.18": version: 0.15.18 resolution: "@esbuild/linux-loong64@npm:0.15.18" @@ -3330,6 +3400,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-loong64@npm:0.17.19" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-mips64el@npm:0.16.17" @@ -3337,6 +3414,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-mips64el@npm:0.17.19" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-ppc64@npm:0.16.17" @@ -3344,6 +3428,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ppc64@npm:0.17.19" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-riscv64@npm:0.16.17" @@ -3351,6 +3442,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-riscv64@npm:0.17.19" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-s390x@npm:0.16.17" @@ -3358,6 +3456,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-s390x@npm:0.17.19" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-x64@npm:0.16.17" @@ -3365,6 +3470,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-x64@npm:0.17.19" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/netbsd-x64@npm:0.16.17" @@ -3372,6 +3484,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/netbsd-x64@npm:0.17.19" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/openbsd-x64@npm:0.16.17" @@ -3379,6 +3498,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/openbsd-x64@npm:0.17.19" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/sunos-x64@npm:0.16.17" @@ -3386,6 +3512,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/sunos-x64@npm:0.17.19" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/win32-arm64@npm:0.16.17" @@ -3393,6 +3526,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-arm64@npm:0.17.19" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/win32-ia32@npm:0.16.17" @@ -3400,6 +3540,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-ia32@npm:0.17.19" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/win32-x64@npm:0.16.17" @@ -3407,6 +3554,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-x64@npm:0.17.19" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -6113,6 +6267,7 @@ __metadata: execa: ^5.1.1 fs-exists-cached: ^1.0.0 fs-extra: ^10.0.0 + glob: ^10.2.7 hosted-git-info: ^4.0.2 inquirer: ^8.0.0 is-valid-path: ^0.1.1 @@ -6389,6 +6544,7 @@ __metadata: awilix: ^8.0.1 cross-env: ^5.2.1 express: ^4.18.2 + glob: ^10.2.7 jest: ^25.5.4 ts-jest: ^25.5.1 typescript: ^4.4.4 @@ -8703,6 +8859,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^5.3.0": + version: 5.4.1 + resolution: "@sindresorhus/is@npm:5.4.1" + checksum: 8f8e145c6b4c756e52bbfc9d88026aedd2b205caf3eff33d6f54fc436c75e0555e998826de942ff0a175dbefc12f71ceb2246ceedab73c9dd44f3ce258533a6a + languageName: node + linkType: hard + "@sindresorhus/slugify@npm:^1.1.2": version: 1.1.2 resolution: "@sindresorhus/slugify@npm:1.1.2" @@ -11962,6 +12125,13 @@ __metadata: languageName: node linkType: hard +"@types/node-emoji@npm:^1.8.2": + version: 1.8.2 + resolution: "@types/node-emoji@npm:1.8.2" + checksum: a8076eb48f004798ee6865e3133b8c4f421feedfa35d4756e9992114afe1212822a523f2737404a3aac9881aa8933695c037095dba4d509b6f3c1b0f22f5d9a1 + languageName: node + linkType: hard + "@types/node-fetch@npm:2, @types/node-fetch@npm:2.6.2, @types/node-fetch@npm:^2.5.7": version: 2.6.2 resolution: "@types/node-fetch@npm:2.6.2" @@ -15961,6 +16131,17 @@ __metadata: languageName: node linkType: hard +"bundle-require@npm:^4.0.0": + version: 4.0.1 + resolution: "bundle-require@npm:4.0.1" + dependencies: + load-tsconfig: ^0.2.3 + peerDependencies: + esbuild: ">=0.17" + checksum: 92a22b0618bfc4017a7873ac6f989b8fb8c4e2d483f3b05cc3e066a8410934e43f459436113c31fe19f247760bd7f9fd60c15a7a23269d749f8dda7b1b67a01b + languageName: node + linkType: hard + "bunyan@npm:1.8.15": version: 1.8.15 resolution: "bunyan@npm:1.8.15" @@ -16494,6 +16675,13 @@ __metadata: languageName: node linkType: hard +"char-regex@npm:^2.0.1": + version: 2.0.1 + resolution: "char-regex@npm:2.0.1" + checksum: ec592229ac3ef18f2ea1f5676ae9a829c37150db55fd7f709edce1bcdc9f506de22ae19388d853704806e51af71fe9239bcb7e7be583296951bfbf2a9a9763a2 + languageName: node + linkType: hard + "character-entities-legacy@npm:^1.0.0": version: 1.1.4 resolution: "character-entities-legacy@npm:1.1.4" @@ -17756,10 +17944,12 @@ __metadata: version: 0.0.0-use.local resolution: "create-medusa-app@workspace:packages/create-medusa-app" dependencies: + "@medusajs/utils": ^1.9.0 "@types/chalk": ^2.2.0 "@types/commander": ^2.12.2 "@types/configstore": ^6.0.0 "@types/inquirer": ^9.0.3 + "@types/node-emoji": ^1.8.2 "@types/pg": ^8.6.6 "@types/uuid": ^9.0.1 "@types/validator": ^13.7.17 @@ -17774,9 +17964,11 @@ __metadata: eslint-config-google: ^0.14.0 eslint-config-prettier: ^8.8.0 eslint-plugin-prettier: ^4.2.1 + glob: ^10.2.7 inquirer: ^9.2.2 medusa-telemetry: ^0.0.16 nanoid: ^4.0.2 + node-emoji: ^2.0.2 node-fetch: ^3.3.1 open: ^9.1.0 ora: ^6.3.0 @@ -19356,6 +19548,13 @@ __metadata: languageName: node linkType: hard +"emojilib@npm:^2.4.0": + version: 2.4.0 + resolution: "emojilib@npm:2.4.0" + checksum: 6e66ba8921175842193f974e18af448bb6adb0cf7aeea75e08b9d4ea8e9baba0e4a5347b46ed901491dcaba277485891c33a8d70b0560ca5cc9672a94c21ab8f + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -20067,6 +20266,83 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.17.6": + version: 0.17.19 + resolution: "esbuild@npm:0.17.19" + dependencies: + "@esbuild/android-arm": 0.17.19 + "@esbuild/android-arm64": 0.17.19 + "@esbuild/android-x64": 0.17.19 + "@esbuild/darwin-arm64": 0.17.19 + "@esbuild/darwin-x64": 0.17.19 + "@esbuild/freebsd-arm64": 0.17.19 + "@esbuild/freebsd-x64": 0.17.19 + "@esbuild/linux-arm": 0.17.19 + "@esbuild/linux-arm64": 0.17.19 + "@esbuild/linux-ia32": 0.17.19 + "@esbuild/linux-loong64": 0.17.19 + "@esbuild/linux-mips64el": 0.17.19 + "@esbuild/linux-ppc64": 0.17.19 + "@esbuild/linux-riscv64": 0.17.19 + "@esbuild/linux-s390x": 0.17.19 + "@esbuild/linux-x64": 0.17.19 + "@esbuild/netbsd-x64": 0.17.19 + "@esbuild/openbsd-x64": 0.17.19 + "@esbuild/sunos-x64": 0.17.19 + "@esbuild/win32-arm64": 0.17.19 + "@esbuild/win32-ia32": 0.17.19 + "@esbuild/win32-x64": 0.17.19 + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: c7ac14bfaaebe4745d5d18347b4f6854fd1140acb9389e88dbfa5c20d4e2122451d9647d5498920470a880a605d6e5502b5c2102da6c282b01f129ddd49d2874 + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -23262,7 +23538,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.5": +"glob@npm:^10.2.5, glob@npm:^10.2.7": version: 10.2.7 resolution: "glob@npm:10.2.7" dependencies: @@ -29262,6 +29538,13 @@ __metadata: languageName: node linkType: hard +"load-tsconfig@npm:^0.2.3": + version: 0.2.5 + resolution: "load-tsconfig@npm:0.2.5" + checksum: bf2823dd26389d3497b6567f07435c5a7a58d9df82e879b0b3892f87d8db26900f84c85bc329ef41c0540c0d6a448d1c23ddc64a80f3ff6838b940f3915a3fcb + languageName: node + linkType: hard + "load-yaml-file@npm:^0.2.0": version: 0.2.0 resolution: "load-yaml-file@npm:0.2.0" @@ -32145,6 +32428,19 @@ __metadata: languageName: node linkType: hard +"node-emoji@npm:^2.0.2": + version: 2.0.2 + resolution: "node-emoji@npm:2.0.2" + dependencies: + "@sindresorhus/is": ^5.3.0 + char-regex: ^2.0.1 + emojilib: ^2.4.0 + skin-tone: ^3.0.0 + tsup: ^6.7.0 + checksum: 3a6fde771e0ea94c798ba94789c7a834aeda938b6b2fb4bb5bc4426cdc02ca6f291df7517238c76b35dfe89f94363eeb843d17336e117c090eeb4c7524e9a792 + languageName: node + linkType: hard + "node-environment-flags@npm:^1.0.5": version: 1.0.6 resolution: "node-environment-flags@npm:1.0.6" @@ -38371,6 +38667,15 @@ __metadata: languageName: node linkType: hard +"skin-tone@npm:^3.0.0": + version: 3.0.0 + resolution: "skin-tone@npm:3.0.0" + dependencies: + unicode-emoji-modifier-base: ^1.0.0 + checksum: 11d08fd438611ab39382dde3ee27c2d4ece4fb5edca08ecf456304a666215b24dd17e7b0a15e84dcf99bdac236a648060b604a31d05cd64d9cba8c0d1a896d5c + languageName: node + linkType: hard + "slash@npm:^2.0.0": version: 2.0.0 resolution: "slash@npm:2.0.0" @@ -40888,6 +41193,42 @@ __metadata: languageName: node linkType: hard +"tsup@npm:^6.7.0": + version: 6.7.0 + resolution: "tsup@npm:6.7.0" + dependencies: + bundle-require: ^4.0.0 + cac: ^6.7.12 + chokidar: ^3.5.1 + debug: ^4.3.1 + esbuild: ^0.17.6 + execa: ^5.0.0 + globby: ^11.0.3 + joycon: ^3.0.1 + postcss-load-config: ^3.0.1 + resolve-from: ^5.0.0 + rollup: ^3.2.5 + source-map: 0.8.0-beta.0 + sucrase: ^3.20.3 + tree-kill: ^1.2.2 + peerDependencies: + "@swc/core": ^1 + postcss: ^8.4.12 + typescript: ">=4.1.0" + peerDependenciesMeta: + "@swc/core": + optional: true + postcss: + optional: true + typescript: + optional: true + bin: + tsup: dist/cli-default.js + tsup-node: dist/cli-node.js + checksum: f6ab9a191b91c68d2bcac9a4df062d26343a9253d5577ee617fa3409e306cb6373ffa6cdb3f6a772e7222a5cf945e330bf6ad9455a7ae3c47aa9eb13f98ac812 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -41476,6 +41817,13 @@ __metadata: languageName: node linkType: hard +"unicode-emoji-modifier-base@npm:^1.0.0": + version: 1.0.0 + resolution: "unicode-emoji-modifier-base@npm:1.0.0" + checksum: b37623fcf0162186debd20f116483e035a2d5b905b932a2c472459d9143d446ebcbefb2a494e2fe4fa7434355396e2a95ec3fc1f0c29a3bc8f2c827220e79c66 + languageName: node + linkType: hard + "unicode-match-property-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-match-property-ecmascript@npm:2.0.0"