From 18a05dee86f55366c92a2669eacbccf526373ff5 Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Fri, 29 Sep 2023 15:26:24 +0300 Subject: [PATCH] fix(create-medusa-app): fix inconsistency in checking errors in migrations (#5189) --- .changeset/ten-peaches-doubt.md | 5 +++ .../create-medusa-app/src/commands/create.ts | 5 +-- .../create-medusa-app/src/utils/create-db.ts | 16 ++++++++-- .../src/utils/postgres-client.ts | 1 + .../src/utils/prepare-project.ts | 31 ++++++++++++++----- packages/create-medusa-app/tsconfig.json | 2 +- 6 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 .changeset/ten-peaches-doubt.md diff --git a/.changeset/ten-peaches-doubt.md b/.changeset/ten-peaches-doubt.md new file mode 100644 index 0000000000..36522d1cff --- /dev/null +++ b/.changeset/ten-peaches-doubt.md @@ -0,0 +1,5 @@ +--- +"create-medusa-app": patch +--- + +fix(create-medusa-app): fix inconsistency in checking errors in migrations diff --git a/packages/create-medusa-app/src/commands/create.ts b/packages/create-medusa-app/src/commands/create.ts index 9f52dbda7a..7a4376c5e8 100644 --- a/packages/create-medusa-app/src/commands/create.ts +++ b/packages/create-medusa-app/src/commands/create.ts @@ -103,7 +103,7 @@ export default async ({ !skipDb && migrations ? await askForAdminEmail(seed, boilerplate) : "" const installNextjs = withNextjsStarter || (await askForNextjsStarter()) - const { client, dbConnectionString } = !skipDb + let { client, dbConnectionString } = !skipDb ? await getDbClientAndCredentials({ dbName, dbUrl, @@ -153,7 +153,7 @@ export default async ({ ...factBoxOptions, title: "Creating database...", }) - await runCreateDb({ client, dbName, spinner }) + client = await runCreateDb({ client, dbName, spinner }) factBoxOptions.interval = displayFactBox({ ...factBoxOptions, @@ -179,6 +179,7 @@ export default async ({ migrations, onboardingType: installNextjs ? "nextjs" : "default", nextjsDirectory, + client, }) } catch (e: any) { if (isAbortError(e)) { diff --git a/packages/create-medusa-app/src/utils/create-db.ts b/packages/create-medusa-app/src/utils/create-db.ts index c9998d3b97..745cbe387d 100644 --- a/packages/create-medusa-app/src/utils/create-db.ts +++ b/packages/create-medusa-app/src/utils/create-db.ts @@ -24,13 +24,23 @@ export async function runCreateDb({ client: pg.Client dbName: string spinner: Ora -}) { - // create postgres database +}): Promise { + let newClient = client + try { + // create postgres database await createDb({ client, db: dbName, }) + + // create a new connection with database selected + await client.end() + newClient = await postgresClient({ + user: client.user, + password: client.password, + database: dbName, + }) } catch (e) { spinner.stop() logMessage({ @@ -38,6 +48,8 @@ export async function runCreateDb({ type: "error", }) } + + return newClient } async function getForDbName(dbName: string): Promise<{ diff --git a/packages/create-medusa-app/src/utils/postgres-client.ts b/packages/create-medusa-app/src/utils/postgres-client.ts index 603d9d4a9e..21c80e3f9b 100644 --- a/packages/create-medusa-app/src/utils/postgres-client.ts +++ b/packages/create-medusa-app/src/utils/postgres-client.ts @@ -5,6 +5,7 @@ type PostgresConnection = { user?: string password?: string connectionString?: string + database?: string } export default async (connect: PostgresConnection) => { diff --git a/packages/create-medusa-app/src/utils/prepare-project.ts b/packages/create-medusa-app/src/utils/prepare-project.ts index 127b5a2403..e76005f947 100644 --- a/packages/create-medusa-app/src/utils/prepare-project.ts +++ b/packages/create-medusa-app/src/utils/prepare-project.ts @@ -7,6 +7,7 @@ import { EOL } from "os" import { displayFactBox, FactBoxOptions } from "./facts.js" import ProcessManager from "./process-manager.js" import { clearProject } from "./clear-project.js" +import type { Client } from "pg" type PrepareOptions = { directory: string @@ -23,6 +24,7 @@ type PrepareOptions = { migrations?: boolean onboardingType?: "default" | "nextjs" nextjsDirectory?: string + client: Client | null } export default async ({ @@ -38,6 +40,7 @@ export default async ({ migrations, onboardingType = "default", nextjsDirectory = "", + client, }: PrepareOptions) => { // initialize execution options const execOptions = { @@ -145,13 +148,27 @@ export default async ({ npxOptions ) - // 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 - }` - ) + if (client) { + // check the migrations table is in the database + // to ensure that migrations ran + let errorOccurred = false + try { + const migrations = await client.query(`SELECT * FROM "migrations"`) + errorOccurred = migrations.rowCount == 0 + } catch (e) { + // avoid error thrown if the migrations table + // doesn't exist + errorOccurred = true + } + + // ensure that migrations actually ran in case of an uncaught error + if (errorOccurred) { + throw new Error( + `An error occurred while running migrations: ${ + proc.stderr || proc.stdout + }` + ) + } } }, }) diff --git a/packages/create-medusa-app/tsconfig.json b/packages/create-medusa-app/tsconfig.json index 3a4e399437..5364806350 100644 --- a/packages/create-medusa-app/tsconfig.json +++ b/packages/create-medusa-app/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ESNext", - "module": "ESNext", + "module": "Node16", "moduleResolution": "node16", "outDir": "./dist", "esModuleInterop": true,