Improve error handling

This commit is contained in:
Aman Varshney
2025-02-13 12:45:17 +05:30
parent bb630bc355
commit ffda73ea98
5 changed files with 10875 additions and 15 deletions

View File

@@ -0,0 +1,5 @@
---
"create-better-t-stack": patch
---
Improve error handling

View File

@@ -3,6 +3,7 @@ import { confirm, select } from "@inquirer/prompts";
import { $ } from "execa";
import fs from "fs-extra";
import ora from "ora";
import { DEFAULT_CONFIG } from "./consts";
import { setupTurso } from "./helpers/db-setup";
import type { PackageManager, ProjectConfig } from "./types";
import { getUserPkgManager } from "./utils/get-package-manager";
@@ -23,6 +24,9 @@ export async function createProject(options: ProjectConfig) {
const initGit = await confirm({
message: "Initialize a git repository?",
default: true,
}).catch((error) => {
spinner.stop();
throw error;
});
if (initGit) {
@@ -39,6 +43,9 @@ export async function createProject(options: ProjectConfig) {
const useDetectedPackageManager = await confirm({
message: `Use detected package manager (${detectedPackageManager})?`,
default: true,
}).catch((error) => {
spinner.stop();
throw error;
});
if (useDetectedPackageManager) {
@@ -52,6 +59,9 @@ export async function createProject(options: ProjectConfig) {
{ value: "pnpm", name: "pnpm" },
{ value: "bun", name: "bun" },
],
}).catch((error) => {
spinner.stop();
throw error;
});
}
}
@@ -59,11 +69,14 @@ export async function createProject(options: ProjectConfig) {
const installDeps = await confirm({
message: `Install dependencies using ${packageManager}?`,
default: true,
}).catch((error) => {
spinner.stop();
throw error;
});
if (installDeps) {
spinner.start(`Installing dependencies using ${packageManager}...`);
switch (packageManager) {
switch (packageManager ?? DEFAULT_CONFIG.packageManager) {
case "npm":
await $`npm install ${projectDir}`;
break;
@@ -96,6 +109,19 @@ export async function createProject(options: ProjectConfig) {
` ${packageManager === "npm" ? "npm run" : packageManager} dev`,
);
} catch (error) {
spinner.stop();
if (
error instanceof Error &&
(error.name === "ExitPromptError" ||
error.message.includes("User force closed"))
) {
console.log("\n");
logger.warn("Operation cancelled");
process.exit(0);
return;
}
spinner.fail("Failed to create project");
logger.error("Error during project creation:", error);
process.exit(1);

View File

@@ -97,19 +97,22 @@ export async function setupTurso(projectDir: string) {
const isMac = platform === "darwin";
const canInstallCLI = platform !== "win32";
if (!canInstallCLI) {
await writeEnvFile(projectDir);
displayManualSetupInstructions();
return;
}
try {
if (!canInstallCLI) {
await writeEnvFile(projectDir);
displayManualSetupInstructions();
return;
}
const isCliInstalled = await isTursoInstalled();
if (!isCliInstalled) {
const shouldInstall = await confirm({
message: "Would you like to install Turso CLI?",
default: true,
}).catch((error) => {
spinner.stop();
throw error;
});
if (!shouldInstall) {
@@ -130,6 +133,9 @@ export async function setupTurso(projectDir: string) {
let dbName = await input({
message: `Enter database name (default: ${defaultDbName}):`,
default: defaultDbName,
}).catch((error) => {
spinner.stop();
throw error;
});
let success = false;
@@ -146,6 +152,9 @@ export async function setupTurso(projectDir: string) {
dbName = await input({
message: "Please enter a different database name:",
default: `${dbName}-${Math.floor(Math.random() * 1000)}`,
}).catch((error) => {
spinner.stop();
throw error;
});
} else {
throw error;
@@ -153,6 +162,19 @@ export async function setupTurso(projectDir: string) {
}
}
} catch (error) {
spinner.stop();
if (
error instanceof Error &&
(error.name === "ExitPromptError" ||
error.message.includes("User force closed"))
) {
logger.warn("\nTurso setup cancelled");
await writeEnvFile(projectDir);
displayManualSetupInstructions();
return;
}
logger.error("Error during Turso setup:", error);
await writeEnvFile(projectDir);
displayManualSetupInstructions();

View File

@@ -14,6 +14,12 @@ import { generateReproducibleCommand } from "./utils/generate-reproducible-comma
import { getVersion } from "./utils/get-version";
import { logger } from "./utils/logger";
process.on("SIGINT", () => {
console.log("\n");
logger.warn("Operation cancelled");
process.exit(0);
});
const program = new Command();
async function gatherConfig(
@@ -143,20 +149,19 @@ async function main() {
logger.info("\n📋 To reproduce this setup, run:");
logger.success(chalk.cyan(generateReproducibleCommand(config)));
} catch (error) {
if (error instanceof Error && error.message.includes("User force closed")) {
if (
error instanceof Error &&
(error.name === "ExitPromptError" ||
error.message.includes("User force closed"))
) {
console.log("\n");
logger.warn("Operation cancelled by user");
logger.warn("Operation cancelled");
process.exit(0);
}
logger.error("An unexpected error occurred:", error);
process.exit(1);
}
}
process.on("SIGINT", () => {
console.log("\n");
logger.warn("Operation cancelled by user");
process.exit(0);
});
main();

10802
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff