From be8bc9ce26fe6ed483cf6b0fe0bb2e0e2487e5c4 Mon Sep 17 00:00:00 2001 From: Scott Trinh Date: Tue, 7 May 2024 23:27:42 -0400 Subject: [PATCH 1/4] Use CLI wrapper to initialize project Now that we have the `edgedb` CLI wrapper script that handles installing the CLI if it's missing, the wrapper takes care of installing the correct version or finding the already installed binary. --- packages/create/src/recipes/_edgedb/index.ts | 51 ++------------------ packages/create/src/utils.ts | 25 ++++++++++ 2 files changed, 30 insertions(+), 46 deletions(-) diff --git a/packages/create/src/recipes/_edgedb/index.ts b/packages/create/src/recipes/_edgedb/index.ts index dc799c6f5..f0660a9d1 100644 --- a/packages/create/src/recipes/_edgedb/index.ts +++ b/packages/create/src/recipes/_edgedb/index.ts @@ -4,7 +4,7 @@ import path from "node:path"; import debug from "debug"; import type { BaseOptions, Recipe } from "../types.js"; -import { copyTemplateFiles, execInLoginShell } from "../../utils.js"; +import { copyTemplateFiles, execInPackageManager } from "../../utils.js"; const logger = debug("@edgedb/create:recipe:edgedb"); @@ -33,53 +33,12 @@ const recipe: Recipe = { const spinner = p.spinner(); if (initializeProject) { - let edgedbCliVersion: string | null = null; - let shouldInstallCli: boolean | symbol = true; - try { - const { stdout } = await execInLoginShell("edgedb --version"); - edgedbCliVersion = stdout.trim(); - logger(edgedbCliVersion); - } catch (error) { - logger("No EdgeDB CLI detected"); - shouldInstallCli = await p.confirm({ - message: - "The EdgeDB CLI is required to initialize a project. Install now?", - initialValue: true, - }); - } - - if (edgedbCliVersion === null) { - if (shouldInstallCli === false) { - logger("User declined to install EdgeDB CLI"); - throw new Error("EdgeDB CLI is required"); - } - - logger("Installing EdgeDB CLI"); - - spinner.start("Installing EdgeDB CLI"); - const { stdout, stderr } = await execInLoginShell( - "curl --proto '=https' --tlsv1.2 -sSf https://sh.edgedb.com | sh -s -- -y" - ); - logger({ stdout, stderr }); - spinner.stop("EdgeDB CLI installed"); - } - - try { - const { stdout } = await execInLoginShell("edgedb --version"); - edgedbCliVersion = stdout.trim(); - logger(edgedbCliVersion); - } catch (error) { - logger("EdgeDB CLI could not be installed."); - logger(error); - throw new Error("EdgeDB CLI could not be installed."); - } - spinner.start("Initializing EdgeDB project"); try { - await execInLoginShell("edgedb project init --non-interactive", { + await execInPackageManager("edgedb project init --non-interactive", { cwd: projectDir, }); - const { stdout, stderr } = await execInLoginShell( + const { stdout, stderr } = await execInPackageManager( "edgedb query 'select sys::get_version_as_str()'", { cwd: projectDir } ); @@ -122,10 +81,10 @@ const recipe: Recipe = { logger("Creating and applying initial migration"); spinner.start("Creating and applying initial migration"); try { - await execInLoginShell("edgedb migration create", { + await execInPackageManager("edgedb migration create", { cwd: projectDir, }); - await execInLoginShell("edgedb migrate", { cwd: projectDir }); + await execInPackageManager("edgedb migrate", { cwd: projectDir }); spinner.stop("Initial migration created and applied"); } catch (error) { logger(error); diff --git a/packages/create/src/utils.ts b/packages/create/src/utils.ts index 7682bdb38..32a2ea378 100644 --- a/packages/create/src/utils.ts +++ b/packages/create/src/utils.ts @@ -151,3 +151,28 @@ stdout: ${stdout}` }); }); } + +export async function execInPackageManager( + cmd: string, + options?: SpawnOptionsWithoutStdio +): Promise<{ stdout: string; stderr: string }> { + const packageManager = getPackageManager(); + let command; + switch (packageManager) { + case "yarn": + command = `yarn exec '${cmd}'`; + break; + case "bun": + command = `bun run --bun '${cmd}'`; + break; + case "pnpm": + command = `pnpm exec '${cmd}'`; + break; + case "npm": + command = `npm exec -- '${cmd}'`; + break; + default: + command = cmd; + } + return execInLoginShell(command, options); +} From d617e82975cc24654af654f4011d705253377ae9 Mon Sep 17 00:00:00 2001 From: Scott Trinh Date: Tue, 7 May 2024 23:49:48 -0400 Subject: [PATCH 2/4] Install package dependencies before running edgedb We want to use the installed CLI wrapper rather than downloading a separate copy to the global cache of the package manager. Assuming the user choses to install the dependencies, running the EdgeDB initialization _after_ that should pick up the installed CLI wrapper. --- packages/create/src/recipes/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create/src/recipes/index.ts b/packages/create/src/recipes/index.ts index 73255230f..8d724b1d7 100644 --- a/packages/create/src/recipes/index.ts +++ b/packages/create/src/recipes/index.ts @@ -18,6 +18,6 @@ export const recipes: Recipe[] = [ remix, sveltekit, // init - _edgedbInit, _install, + _edgedbInit, ]; From e707bf4b130d40d2a73d5e77cfce79cf1e427195 Mon Sep 17 00:00:00 2001 From: Scott Trinh Date: Thu, 9 May 2024 08:43:30 -0400 Subject: [PATCH 3/4] Fix `exec` formatting based on testing --- packages/create/src/utils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/create/src/utils.ts b/packages/create/src/utils.ts index 32a2ea378..73473de71 100644 --- a/packages/create/src/utils.ts +++ b/packages/create/src/utils.ts @@ -160,16 +160,16 @@ export async function execInPackageManager( let command; switch (packageManager) { case "yarn": - command = `yarn exec '${cmd}'`; + command = `yarn exec -- ${cmd}`; break; case "bun": - command = `bun run --bun '${cmd}'`; + command = `bun run --bun ${cmd}`; break; case "pnpm": - command = `pnpm exec '${cmd}'`; + command = `pnpm exec ${cmd}`; break; case "npm": - command = `npm exec -- '${cmd}'`; + command = `npm exec -- ${cmd}`; break; default: command = cmd; From d3b73f85cdbe7e77ab5ea1d6cd79e2aa17f64e54 Mon Sep 17 00:00:00 2001 From: Scott Trinh Date: Thu, 9 May 2024 08:43:43 -0400 Subject: [PATCH 4/4] wip Make `query` work with npx wrapper This doesn't currently work because the quotes get removed when passing the arguments to the wrapper script, so we need to do some additional work in the CLI wrapper to ensure that quoted arguments like this get forwarded to the CLI properly. --- packages/create/src/recipes/_edgedb/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/create/src/recipes/_edgedb/index.ts b/packages/create/src/recipes/_edgedb/index.ts index f0660a9d1..d41d1f814 100644 --- a/packages/create/src/recipes/_edgedb/index.ts +++ b/packages/create/src/recipes/_edgedb/index.ts @@ -28,7 +28,6 @@ const recipe: Recipe = { { initializeProject }: EdgeDBOptions ) { logger("Running edgedb recipe"); - logger("Checking for existing EdgeDB CLI"); const spinner = p.spinner(); @@ -39,7 +38,7 @@ const recipe: Recipe = { cwd: projectDir, }); const { stdout, stderr } = await execInPackageManager( - "edgedb query 'select sys::get_version_as_str()'", + `edgedb query "select sys::get_version_as_str()"`, { cwd: projectDir } ); const serverVersion = JSON.parse(stdout.trim());