Skip to content

Commit ffda73e

Browse files
Improve error handling
1 parent bb630bc commit ffda73e

File tree

5 files changed

+10875
-15
lines changed

5 files changed

+10875
-15
lines changed

.changeset/early-dots-film.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"create-better-t-stack": patch
3+
---
4+
5+
Improve error handling

apps/cli/src/create-project.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { confirm, select } from "@inquirer/prompts";
33
import { $ } from "execa";
44
import fs from "fs-extra";
55
import ora from "ora";
6+
import { DEFAULT_CONFIG } from "./consts";
67
import { setupTurso } from "./helpers/db-setup";
78
import type { PackageManager, ProjectConfig } from "./types";
89
import { getUserPkgManager } from "./utils/get-package-manager";
@@ -23,6 +24,9 @@ export async function createProject(options: ProjectConfig) {
2324
const initGit = await confirm({
2425
message: "Initialize a git repository?",
2526
default: true,
27+
}).catch((error) => {
28+
spinner.stop();
29+
throw error;
2630
});
2731

2832
if (initGit) {
@@ -39,6 +43,9 @@ export async function createProject(options: ProjectConfig) {
3943
const useDetectedPackageManager = await confirm({
4044
message: `Use detected package manager (${detectedPackageManager})?`,
4145
default: true,
46+
}).catch((error) => {
47+
spinner.stop();
48+
throw error;
4249
});
4350

4451
if (useDetectedPackageManager) {
@@ -52,18 +59,24 @@ export async function createProject(options: ProjectConfig) {
5259
{ value: "pnpm", name: "pnpm" },
5360
{ value: "bun", name: "bun" },
5461
],
62+
}).catch((error) => {
63+
spinner.stop();
64+
throw error;
5565
});
5666
}
5767
}
5868

5969
const installDeps = await confirm({
6070
message: `Install dependencies using ${packageManager}?`,
6171
default: true,
72+
}).catch((error) => {
73+
spinner.stop();
74+
throw error;
6275
});
6376

6477
if (installDeps) {
6578
spinner.start(`Installing dependencies using ${packageManager}...`);
66-
switch (packageManager) {
79+
switch (packageManager ?? DEFAULT_CONFIG.packageManager) {
6780
case "npm":
6881
await $`npm install ${projectDir}`;
6982
break;
@@ -96,6 +109,19 @@ export async function createProject(options: ProjectConfig) {
96109
` ${packageManager === "npm" ? "npm run" : packageManager} dev`,
97110
);
98111
} catch (error) {
112+
spinner.stop();
113+
114+
if (
115+
error instanceof Error &&
116+
(error.name === "ExitPromptError" ||
117+
error.message.includes("User force closed"))
118+
) {
119+
console.log("\n");
120+
logger.warn("Operation cancelled");
121+
process.exit(0);
122+
return;
123+
}
124+
99125
spinner.fail("Failed to create project");
100126
logger.error("Error during project creation:", error);
101127
process.exit(1);

apps/cli/src/helpers/db-setup.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,22 @@ export async function setupTurso(projectDir: string) {
9797
const isMac = platform === "darwin";
9898
const canInstallCLI = platform !== "win32";
9999

100-
if (!canInstallCLI) {
101-
await writeEnvFile(projectDir);
102-
displayManualSetupInstructions();
103-
return;
104-
}
105-
106100
try {
101+
if (!canInstallCLI) {
102+
await writeEnvFile(projectDir);
103+
displayManualSetupInstructions();
104+
return;
105+
}
106+
107107
const isCliInstalled = await isTursoInstalled();
108108

109109
if (!isCliInstalled) {
110110
const shouldInstall = await confirm({
111111
message: "Would you like to install Turso CLI?",
112112
default: true,
113+
}).catch((error) => {
114+
spinner.stop();
115+
throw error;
113116
});
114117

115118
if (!shouldInstall) {
@@ -130,6 +133,9 @@ export async function setupTurso(projectDir: string) {
130133
let dbName = await input({
131134
message: `Enter database name (default: ${defaultDbName}):`,
132135
default: defaultDbName,
136+
}).catch((error) => {
137+
spinner.stop();
138+
throw error;
133139
});
134140

135141
let success = false;
@@ -146,13 +152,29 @@ export async function setupTurso(projectDir: string) {
146152
dbName = await input({
147153
message: "Please enter a different database name:",
148154
default: `${dbName}-${Math.floor(Math.random() * 1000)}`,
155+
}).catch((error) => {
156+
spinner.stop();
157+
throw error;
149158
});
150159
} else {
151160
throw error;
152161
}
153162
}
154163
}
155164
} catch (error) {
165+
spinner.stop();
166+
167+
if (
168+
error instanceof Error &&
169+
(error.name === "ExitPromptError" ||
170+
error.message.includes("User force closed"))
171+
) {
172+
logger.warn("\nTurso setup cancelled");
173+
await writeEnvFile(projectDir);
174+
displayManualSetupInstructions();
175+
return;
176+
}
177+
156178
logger.error("Error during Turso setup:", error);
157179
await writeEnvFile(projectDir);
158180
displayManualSetupInstructions();

apps/cli/src/index.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ import { generateReproducibleCommand } from "./utils/generate-reproducible-comma
1414
import { getVersion } from "./utils/get-version";
1515
import { logger } from "./utils/logger";
1616

17+
process.on("SIGINT", () => {
18+
console.log("\n");
19+
logger.warn("Operation cancelled");
20+
process.exit(0);
21+
});
22+
1723
const program = new Command();
1824

1925
async function gatherConfig(
@@ -143,20 +149,19 @@ async function main() {
143149
logger.info("\n📋 To reproduce this setup, run:");
144150
logger.success(chalk.cyan(generateReproducibleCommand(config)));
145151
} catch (error) {
146-
if (error instanceof Error && error.message.includes("User force closed")) {
152+
if (
153+
error instanceof Error &&
154+
(error.name === "ExitPromptError" ||
155+
error.message.includes("User force closed"))
156+
) {
147157
console.log("\n");
148-
logger.warn("Operation cancelled by user");
158+
logger.warn("Operation cancelled");
149159
process.exit(0);
150160
}
161+
151162
logger.error("An unexpected error occurred:", error);
152163
process.exit(1);
153164
}
154165
}
155166

156-
process.on("SIGINT", () => {
157-
console.log("\n");
158-
logger.warn("Operation cancelled by user");
159-
process.exit(0);
160-
});
161-
162167
main();

0 commit comments

Comments
 (0)