mirror of
https://github.com/FranP-code/create-better-t-stack.git
synced 2025-10-12 23:52:15 +00:00
Improve error handling
This commit is contained in:
5
.changeset/early-dots-film.md
Normal file
5
.changeset/early-dots-film.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"create-better-t-stack": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Improve error handling
|
||||||
@@ -3,6 +3,7 @@ import { confirm, select } from "@inquirer/prompts";
|
|||||||
import { $ } from "execa";
|
import { $ } from "execa";
|
||||||
import fs from "fs-extra";
|
import fs from "fs-extra";
|
||||||
import ora from "ora";
|
import ora from "ora";
|
||||||
|
import { DEFAULT_CONFIG } from "./consts";
|
||||||
import { setupTurso } from "./helpers/db-setup";
|
import { setupTurso } from "./helpers/db-setup";
|
||||||
import type { PackageManager, ProjectConfig } from "./types";
|
import type { PackageManager, ProjectConfig } from "./types";
|
||||||
import { getUserPkgManager } from "./utils/get-package-manager";
|
import { getUserPkgManager } from "./utils/get-package-manager";
|
||||||
@@ -23,6 +24,9 @@ export async function createProject(options: ProjectConfig) {
|
|||||||
const initGit = await confirm({
|
const initGit = await confirm({
|
||||||
message: "Initialize a git repository?",
|
message: "Initialize a git repository?",
|
||||||
default: true,
|
default: true,
|
||||||
|
}).catch((error) => {
|
||||||
|
spinner.stop();
|
||||||
|
throw error;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (initGit) {
|
if (initGit) {
|
||||||
@@ -39,6 +43,9 @@ export async function createProject(options: ProjectConfig) {
|
|||||||
const useDetectedPackageManager = await confirm({
|
const useDetectedPackageManager = await confirm({
|
||||||
message: `Use detected package manager (${detectedPackageManager})?`,
|
message: `Use detected package manager (${detectedPackageManager})?`,
|
||||||
default: true,
|
default: true,
|
||||||
|
}).catch((error) => {
|
||||||
|
spinner.stop();
|
||||||
|
throw error;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (useDetectedPackageManager) {
|
if (useDetectedPackageManager) {
|
||||||
@@ -52,6 +59,9 @@ export async function createProject(options: ProjectConfig) {
|
|||||||
{ value: "pnpm", name: "pnpm" },
|
{ value: "pnpm", name: "pnpm" },
|
||||||
{ value: "bun", name: "bun" },
|
{ value: "bun", name: "bun" },
|
||||||
],
|
],
|
||||||
|
}).catch((error) => {
|
||||||
|
spinner.stop();
|
||||||
|
throw error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -59,11 +69,14 @@ export async function createProject(options: ProjectConfig) {
|
|||||||
const installDeps = await confirm({
|
const installDeps = await confirm({
|
||||||
message: `Install dependencies using ${packageManager}?`,
|
message: `Install dependencies using ${packageManager}?`,
|
||||||
default: true,
|
default: true,
|
||||||
|
}).catch((error) => {
|
||||||
|
spinner.stop();
|
||||||
|
throw error;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (installDeps) {
|
if (installDeps) {
|
||||||
spinner.start(`Installing dependencies using ${packageManager}...`);
|
spinner.start(`Installing dependencies using ${packageManager}...`);
|
||||||
switch (packageManager) {
|
switch (packageManager ?? DEFAULT_CONFIG.packageManager) {
|
||||||
case "npm":
|
case "npm":
|
||||||
await $`npm install ${projectDir}`;
|
await $`npm install ${projectDir}`;
|
||||||
break;
|
break;
|
||||||
@@ -96,6 +109,19 @@ export async function createProject(options: ProjectConfig) {
|
|||||||
` ${packageManager === "npm" ? "npm run" : packageManager} dev`,
|
` ${packageManager === "npm" ? "npm run" : packageManager} dev`,
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} 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");
|
spinner.fail("Failed to create project");
|
||||||
logger.error("Error during project creation:", error);
|
logger.error("Error during project creation:", error);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|||||||
@@ -97,19 +97,22 @@ export async function setupTurso(projectDir: string) {
|
|||||||
const isMac = platform === "darwin";
|
const isMac = platform === "darwin";
|
||||||
const canInstallCLI = platform !== "win32";
|
const canInstallCLI = platform !== "win32";
|
||||||
|
|
||||||
if (!canInstallCLI) {
|
|
||||||
await writeEnvFile(projectDir);
|
|
||||||
displayManualSetupInstructions();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (!canInstallCLI) {
|
||||||
|
await writeEnvFile(projectDir);
|
||||||
|
displayManualSetupInstructions();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const isCliInstalled = await isTursoInstalled();
|
const isCliInstalled = await isTursoInstalled();
|
||||||
|
|
||||||
if (!isCliInstalled) {
|
if (!isCliInstalled) {
|
||||||
const shouldInstall = await confirm({
|
const shouldInstall = await confirm({
|
||||||
message: "Would you like to install Turso CLI?",
|
message: "Would you like to install Turso CLI?",
|
||||||
default: true,
|
default: true,
|
||||||
|
}).catch((error) => {
|
||||||
|
spinner.stop();
|
||||||
|
throw error;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!shouldInstall) {
|
if (!shouldInstall) {
|
||||||
@@ -130,6 +133,9 @@ export async function setupTurso(projectDir: string) {
|
|||||||
let dbName = await input({
|
let dbName = await input({
|
||||||
message: `Enter database name (default: ${defaultDbName}):`,
|
message: `Enter database name (default: ${defaultDbName}):`,
|
||||||
default: defaultDbName,
|
default: defaultDbName,
|
||||||
|
}).catch((error) => {
|
||||||
|
spinner.stop();
|
||||||
|
throw error;
|
||||||
});
|
});
|
||||||
|
|
||||||
let success = false;
|
let success = false;
|
||||||
@@ -146,6 +152,9 @@ export async function setupTurso(projectDir: string) {
|
|||||||
dbName = await input({
|
dbName = await input({
|
||||||
message: "Please enter a different database name:",
|
message: "Please enter a different database name:",
|
||||||
default: `${dbName}-${Math.floor(Math.random() * 1000)}`,
|
default: `${dbName}-${Math.floor(Math.random() * 1000)}`,
|
||||||
|
}).catch((error) => {
|
||||||
|
spinner.stop();
|
||||||
|
throw error;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
throw error;
|
throw error;
|
||||||
@@ -153,6 +162,19 @@ export async function setupTurso(projectDir: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} 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);
|
logger.error("Error during Turso setup:", error);
|
||||||
await writeEnvFile(projectDir);
|
await writeEnvFile(projectDir);
|
||||||
displayManualSetupInstructions();
|
displayManualSetupInstructions();
|
||||||
|
|||||||
@@ -14,6 +14,12 @@ import { generateReproducibleCommand } from "./utils/generate-reproducible-comma
|
|||||||
import { getVersion } from "./utils/get-version";
|
import { getVersion } from "./utils/get-version";
|
||||||
import { logger } from "./utils/logger";
|
import { logger } from "./utils/logger";
|
||||||
|
|
||||||
|
process.on("SIGINT", () => {
|
||||||
|
console.log("\n");
|
||||||
|
logger.warn("Operation cancelled");
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
const program = new Command();
|
const program = new Command();
|
||||||
|
|
||||||
async function gatherConfig(
|
async function gatherConfig(
|
||||||
@@ -143,20 +149,19 @@ async function main() {
|
|||||||
logger.info("\n📋 To reproduce this setup, run:");
|
logger.info("\n📋 To reproduce this setup, run:");
|
||||||
logger.success(chalk.cyan(generateReproducibleCommand(config)));
|
logger.success(chalk.cyan(generateReproducibleCommand(config)));
|
||||||
} catch (error) {
|
} 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");
|
console.log("\n");
|
||||||
logger.warn("Operation cancelled by user");
|
logger.warn("Operation cancelled");
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.error("An unexpected error occurred:", error);
|
logger.error("An unexpected error occurred:", error);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
process.on("SIGINT", () => {
|
|
||||||
console.log("\n");
|
|
||||||
logger.warn("Operation cancelled by user");
|
|
||||||
process.exit(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|||||||
10802
package-lock.json
generated
Normal file
10802
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user