fix turso cli issue

This commit is contained in:
fgrreloaded
2025-02-13 00:29:55 +05:30
parent 6b164951a6
commit 97a87bf4b5
2 changed files with 105 additions and 92 deletions

View File

@@ -5,32 +5,21 @@ import { execa } from "execa";
import fs from "fs-extra"; import fs from "fs-extra";
import ora, { type Ora } from "ora"; import ora, { type Ora } from "ora";
import { logger } from "../utils/logger"; import { logger } from "../utils/logger";
import { isTursoInstalled, isTursoLoggedIn } from "../utils/turso-cli";
async function isTursoInstalled() { async function loginToTurso(spinner: Ora) {
try { try {
await execa("turso", ["--version"]); spinner.start("Logging in to Turso...");
return true; await execa("turso", ["auth", "login"]);
} catch { spinner.succeed("Logged in to Turso successfully!");
return false; } catch (error) {
} spinner.fail("Failed to log in to Turso");
} throw error;
async function isTursoLoggedIn() {
try {
await execa("turso", ["auth", "whoami"]);
return true;
} catch {
return false;
} }
} }
async function installTursoCLI(isMac: boolean, spinner: Ora) { async function installTursoCLI(isMac: boolean, spinner: Ora) {
try { try {
if (await isTursoLoggedIn()) {
spinner.succeed("Turso CLI already logged in!");
return;
}
spinner.start("Installing Turso CLI..."); spinner.start("Installing Turso CLI...");
if (isMac) { if (isMac) {
@@ -44,10 +33,6 @@ async function installTursoCLI(isMac: boolean, spinner: Ora) {
} }
spinner.succeed("Turso CLI installed successfully!"); spinner.succeed("Turso CLI installed successfully!");
spinner.start("Logging in to Turso...");
await execa("turso", ["auth", "login"]);
spinner.succeed("Logged in to Turso!");
} catch (error) { } catch (error) {
if (error instanceof Error && error.message.includes("User force closed")) { if (error instanceof Error && error.message.includes("User force closed")) {
spinner.stop(); spinner.stop();
@@ -55,92 +40,100 @@ async function installTursoCLI(isMac: boolean, spinner: Ora) {
logger.warn("Turso CLI installation cancelled by user"); logger.warn("Turso CLI installation cancelled by user");
throw error; throw error;
} }
logger.error("Error during Turso CLI installation:", error); spinner.fail("Failed to install Turso CLI");
spinner.fail(
"Failed to install Turso CLI. Proceeding with manual setup...",
);
throw error; throw error;
} }
} }
async function createTursoDatabase(projectDir: string, spinner: Ora) {
try {
const defaultDbName = path.basename(projectDir);
const dbName = await input({
message: `Enter database name (default: ${defaultDbName}):`,
default: defaultDbName,
});
spinner.start(`Creating Turso database "${dbName}"...`);
await execa("turso", ["db", "create", dbName]);
const { stdout: dbUrl } = await execa("turso", [
"db",
"show",
dbName,
"--url",
]);
const { stdout: authToken } = await execa("turso", [
"db",
"tokens",
"create",
dbName,
]);
const envPath = path.join(projectDir, "packages/server", ".env");
const envContent = `TURSO_DATABASE_URL="${dbUrl.trim()}"
TURSO_AUTH_TOKEN="${authToken.trim()}"`;
await fs.writeFile(envPath, envContent);
spinner.succeed("Turso database configured successfully!");
} catch (error) {
spinner.fail("Failed to create Turso database");
throw error;
}
}
async function setupManualConfig(projectDir: string) {
const envPath = path.join(projectDir, "packages/server", ".env");
const envContent = `TURSO_DATABASE_URL=
TURSO_AUTH_TOKEN=`;
await fs.writeFile(envPath, envContent);
logger.info("\n📝 Manual Turso Setup Instructions:");
logger.info("1. Visit https://turso.tech and create an account");
logger.info("2. Create a new database from the dashboard");
logger.info("3. Get your database URL and authentication token");
logger.info("4. Add these credentials to the .env file in your project root");
logger.info("\nThe .env file has been created with placeholder variables:");
logger.info("TURSO_DATABASE_URL=your_database_url");
logger.info("TURSO_AUTH_TOKEN=your_auth_token");
}
export async function setupTurso(projectDir: string) { export async function setupTurso(projectDir: string) {
const spinner = ora(); const spinner = ora();
const platform = os.platform(); const platform = os.platform();
const isMac = platform === "darwin"; const isMac = platform === "darwin";
let canInstallCLI = platform !== "win32"; const canInstallCLI = platform !== "win32";
let installTurso = true;
const isCliInstalled = await isTursoInstalled(); if (!canInstallCLI) {
await setupManualConfig(projectDir);
if (canInstallCLI && !isCliInstalled) { return;
installTurso = await confirm({
message: "Would you like to install Turso CLI?",
default: true,
});
} }
canInstallCLI = canInstallCLI && installTurso; try {
const isCliInstalled = await isTursoInstalled();
if (canInstallCLI) { if (!isCliInstalled) {
try { const shouldInstall = await confirm({
await installTursoCLI(isMac, spinner); message: "Would you like to install Turso CLI?",
default: true,
const defaultDbName = path.basename(projectDir);
const dbName = await input({
message: `Enter database name (default: ${defaultDbName}):`,
default: defaultDbName,
}); });
spinner.start(`Creating Turso database "${dbName}"...`); if (!shouldInstall) {
await execa("turso", ["db", "create", dbName]); await setupManualConfig(projectDir);
return;
}
const { stdout: dbUrl } = await execa("turso", [ await installTursoCLI(isMac, spinner);
"db",
"show",
dbName,
"--url",
]);
const { stdout: authToken } = await execa("turso", [
"db",
"tokens",
"create",
dbName,
]);
const envPath = path.join(projectDir, "packages/server", ".env");
const envContent = `TURSO_DATABASE_URL="${dbUrl.trim()}"
TURSO_AUTH_TOKEN="${authToken.trim()}"`;
await fs.writeFile(envPath, envContent);
spinner.succeed("Turso database configured successfully!");
return;
} catch (error) {
logger.error("Error during Turso database creation:", error);
spinner.fail(
"Failed to install Turso CLI. Proceeding with manual setup...",
);
installTurso = false;
} }
}
if (!installTurso) { const isLoggedIn = await isTursoLoggedIn();
const envPath = path.join(projectDir, "packages/server", ".env"); if (!isLoggedIn) {
const envContent = `TURSO_DATABASE_URL= await loginToTurso(spinner);
TURSO_AUTH_TOKEN=`; }
await fs.writeFile(envPath, envContent); await createTursoDatabase(projectDir, spinner);
} catch (error) {
logger.info("\n📝 Manual Turso Setup Instructions:"); logger.error("Error during Turso setup:", error);
logger.info("1. Visit https://turso.tech and create an account"); await setupManualConfig(projectDir);
logger.info("2. Create a new database from the dashboard");
logger.info("3. Get your database URL and authentication token");
logger.info(
"4. Add these credentials to the .env file in your project root",
);
logger.info("\nThe .env file has been created with placeholder variables:");
logger.info("TURSO_DATABASE_URL=your_database_url");
logger.info("TURSO_AUTH_TOKEN=your_auth_token");
} }
} }

View File

@@ -0,0 +1,20 @@
import { execa } from "execa";
export async function isTursoInstalled() {
try {
await execa("turso", ["--version"]);
return true;
} catch {
return false;
}
}
export async function isTursoLoggedIn() {
try {
const output = await execa("turso", ["auth", "whoami"]);
console.log(output.stdout.includes("You are not logged in"));
return !output.stdout.includes("You are not logged in");
} catch {
return false;
}
}