src/installers/tanstack-query.ts 1.7 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 tanstackQueryInstaller = async (
12
	options: Required<ProjectOptions>,
13
): Promise<boolean> => {
14
	const spinner = yoctoSpinner({
15
		text: "Setting up TanStack Query...",
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 TanStack Query...";
23
		await addPackageDependency({
24
			dependencies: ["@tanstack/react-query"],
25
			target: "client",
26
			projectName,
27
		});
28
29
		const selectedTemplate = nameGenerator("App.tsx", {
30
			rpc,
31
			shadcn,
32
			tailwind,
33
			tanstackQuery,
34
		});
35
36
		const appTsxSrc = path.join(
37
			EXTRAS_DIR,
38
			"client",
39
			"src",
40
			"App.tsx",
41
			selectedTemplate,
42
		);
43
		const appTsxTarget = path.join(projectPath, "client", "src", "App.tsx");
44
		fs.copySync(appTsxSrc, appTsxTarget);
45
46
		const mainTsxSrc = path.join(
47
			EXTRAS_DIR,
48
			"client",
49
			"src",
50
			"main.tsx",
51
			nameGenerator("main.tsx", { tanstackQuery }),
52
		);
53
		const mainTsxTarget = path.join(projectPath, "client", "src", "main.tsx");
54
		fs.copySync(mainTsxSrc, mainTsxTarget);
55
56
		spinner.success("TanStack Query setup completed");
57
		return true;
58
	} catch (err: unknown) {
59
		spinner.error("Failed to set up TanStack Query");
60
		if (err instanceof Error) {
61
			consola.error(pc.red("Error:"), err.message);
62
		} else {
63
			consola.error(pc.red("Error: Unknown error"));
64
		}
65
		return false;
66
	}
67
};