UNPKG

create-bhvr

Version:

Create a new bhvr project

52 lines (51 loc) 2.61 kB
import path from "node:path"; import { consola } from "consola"; import { execa } from "execa"; import fs from "fs-extra"; import pc from "picocolors"; import yoctoSpinner from "yocto-spinner"; import { honoClientTemplate, honoRpcTemplate } from "@/utils/templates"; import { EXTRAS_DIR } from "@/utils"; import { nameGenerator } from "@/utils/name-generator"; export async function rpcInstaller(options) { const spinner = yoctoSpinner({ text: "Setting up RPC client..." }).start(); try { const { projectName, rpc, shadcn, tailwind } = options; const projectPath = path.resolve(process.cwd(), projectName); // 1. Update client package.json to ensure hono client is installed const clientPkgPath = path.join(projectPath, "client", "package.json"); const clientPkg = await fs.readJson(clientPkgPath); if (!clientPkg.dependencies.hono) { await execa("bun", ["install", "hono"], { cwd: projectPath }); } await fs.writeJson(clientPkgPath, clientPkg, { spaces: 2 }); // 2. Update server package.json dev script for RPC const serverPkgPath = path.join(projectPath, "server", "package.json"); const serverPkg = await fs.readJson(serverPkgPath); // Update the dev script to include TypeScript compilation serverPkg.scripts.dev = "bun --watch run src/index.ts && tsc --watch"; await fs.writeJson(serverPkgPath, serverPkg, { spaces: 2 }); // 3. Server modification for RPC export type (no client imports) const serverIndexPath = path.join(projectPath, "server", "src", "index.ts"); await fs.writeFile(serverIndexPath, honoRpcTemplate, "utf8"); // 4. Create separate client helper file const clientHelperPath = path.join(projectPath, "server", "src", "client.ts"); await fs.writeFile(clientHelperPath, honoClientTemplate, "utf8"); // 5. Update App.tsx based on template selection using switch statement const appTsxSrc = path.join(EXTRAS_DIR, "client", "src", "App.tsx", nameGenerator("App.tsx", { tailwind, shadcn, rpc })); const appTsxTarget = path.join(projectPath, "client", "src", "App.tsx"); fs.copySync(appTsxSrc, appTsxTarget); spinner.success("RPC client setup completed"); return true; } catch (err) { spinner.error("Failed to set up RPC client"); if (err instanceof Error) { consola.error(pc.red("Error:"), err.message); } else { consola.error(pc.red("Error: Unknown error")); } return false; } }