src/installers/react-router.ts 1.8 K raw
1
import path from "node:path";
2
import fs from "fs-extra";
3
import type { ProjectOptions } from "@/types";
4
import yoctoSpinner from "yocto-spinner";
5
import pc from "picocolors";
6
import { consola } from "consola";
7
import { addPackageDependency } from "@/utils/add-package-dependency";
8
import { EXTRAS_DIR } from "@/utils";
9
import { nameGenerator } from "@/utils/name-generator";
10
11
export const reactRouterInstaller = async (
12
	options: Required<ProjectOptions>,
13
): Promise<boolean> => {
14
	const spinner = yoctoSpinner({
15
		text: "Setting up React Router...",
16
	}).start();
17
18
	try {
19
		const { projectName, rpc, shadcn, tailwind, tanstackQuery } = options;
20
21
		const projectPath = path.resolve(process.cwd(), projectName);
22
		spinner.text = "Installing React Router...";
23
		await addPackageDependency({
24
			dependencies: ["react-router"],
25
			target: "client",
26
			projectName,
27
		});
28
29
		const appTsxTemplate = nameGenerator("App.tsx", {
30
			reactRouter: true,
31
		});
32
33
		const appTsxSrc = path.join(
34
			EXTRAS_DIR,
35
			"client",
36
			"src",
37
			"App.tsx",
38
			appTsxTemplate,
39
		);
40
		const appTsxTarget = path.join(projectPath, "client", "src", "App.tsx");
41
		fs.copySync(appTsxSrc, appTsxTarget);
42
43
		const homeTsxTemplate = nameGenerator("Home.tsx", {
44
			rpc,
45
			shadcn,
46
			tailwind,
47
			tanstackQuery,
48
		});
49
50
		const homeTsxSrc = path.join(
51
			EXTRAS_DIR,
52
			"client",
53
			"src",
54
			"components",
55
			"Home.tsx",
56
			homeTsxTemplate,
57
		);
58
		const homeTsxTarget = path.join(
59
			projectPath,
60
			"client",
61
			"src",
62
			"components",
63
			"Home.tsx",
64
		);
65
		fs.copySync(homeTsxSrc, homeTsxTarget);
66
67
		spinner.success("React Router setup completed");
68
		return true;
69
	} catch (err: unknown) {
70
		spinner.error("Failed to set up React Router");
71
		if (err instanceof Error) {
72
			consola.error(pc.red("Error:"), err.message);
73
		} else {
74
			consola.error(pc.red("Error: Unknown error"));
75
		}
76
		return false;
77
	}
78
};