import consola from "consola" import inquirer from "inquirer" import { ProjectType } from "@/constant/index" import { addAntd } from "./addAntd" import { addDependency } from "./addDependency" import { addEslint } from "./addEslint" import { addGitignore } from "./addGitignore" import { addPrettier } from "./addPrettier" import { addPrisma } from "./addPrisma" import { addTailwind } from "./addTailwind" import { createBrowserlistrc } from "./createBrowserlistrc" import { getPackageManager } from "./getPackageManager" import { installDependceny } from "./installDependceny" import { next } from "./next" import { readPackageJson } from "./readPackageJson" import { rsbuild } from "./rsbuild" import { setTsConfig } from "./setTsConfig" import { vite } from "./vite" export async function initProject() { consola.start("开始初始化项目") await createBrowserlistrc() await addEslint() const packageJson = await readPackageJson() const allDependcies = Object.keys(packageJson.dependencies || {}).concat(Object.keys(packageJson.devDependencies || {})) if (!allDependcies.includes("react") || !allDependcies.includes("react-dom")) { consola.error("仅支持 React 项目") return } let type: ProjectType if (allDependcies.some(item => item === "next")) type = ProjectType.next else { if (allDependcies.some(item => item === "@remix-run/react")) type = ProjectType.remix else { if (allDependcies.some(item => item === "vite")) type = ProjectType.vite else { if (allDependcies.some(item => item === "@rsbuild/core")) type = ProjectType.rsbuild else { consola.error("仅支持 Next、Remix、Vite、Rsbuild 项目") return } } } } await addGitignore() await addDependency({ package: ["@types/node"], type: "devDependencies", }) const manager = await getPackageManager() const isFullStack = type === ProjectType.next || type === ProjectType.remix const choices = isFullStack ? [ "antd", "@heroui/react", "@tanstack/react-form", "@tanstack/react-query", "dayjs", "deepsea-components", "deepsea-tools", "prisma", "tailwind", "zod", ] : ["antd", "@heroui/react", "@tanstack/react-form", "@tanstack/react-query", "dayjs", "deepsea-components", "deepsea-tools", "tailwind", "react-router"] const { modules } = await inquirer.prompt({ type: "checkbox", name: "modules", message: "请选择要添加的模块", choices, default: choices, }) const added: string[] = [] if (modules.includes("antd")) await addAntd() if (modules.includes("tailwind")) await addTailwind() else await addPrettier() if (modules.includes("@heroui/react")) added.push("@heroui/react", "soda-heroui") if (modules.includes("@tanstack/react-query")) added.push("@tanstack/react-query") if (modules.includes("@tanstack/react-form")) added.push("@tanstack/react-form", "soda-tanstack-form") if (modules.includes("dayjs")) added.push("dayjs") if (modules.includes("deepsea-components")) added.push("deepsea-components") if (modules.includes("deepsea-tools")) added.push("deepsea-tools") if (modules.includes("stable-hash")) added.push("stable-hash") if (modules.includes("zod")) added.push("zod") if (modules.includes("react-router")) added.push("react-router") if (modules.includes("stable-hash")) added.push("stable-hash") await addDependency({ package: added, type: "dependencies", }) switch (type) { case ProjectType.next: await next() break case ProjectType.remix: await vite() break case ProjectType.vite: await vite() break case ProjectType.rsbuild: await rsbuild() break } let installed = false if (modules.includes("prisma")) { await addPrisma(manager) installed = true } if (!installed) await installDependceny({ silent: true, manager }) await setTsConfig("noEmit", true) consola.success("项目初始化完成") }