hyfcli 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of hyfcli might be problematic. Click here for more details.

package/bin/index.js CHANGED
@@ -9,8 +9,8 @@ var require_package = __commonJS({
9
9
  "package.json"(exports2, module2) {
10
10
  module2.exports = {
11
11
  name: "hyfcli",
12
- version: "1.0.0",
13
- description: "",
12
+ version: "1.0.1",
13
+ description: "\u4E00\u4E2A\u9879\u76EE\u5F00\u53D1\u811A\u624B\u67B6\u5DE5\u5177",
14
14
  main: "index.js",
15
15
  bin: {
16
16
  hyfcli: "./bin/index.js"
@@ -25,6 +25,10 @@ var require_package = __commonJS({
25
25
  "cli",
26
26
  "template"
27
27
  ],
28
+ files: [
29
+ "./bin",
30
+ "./lib"
31
+ ],
28
32
  author: "hyf",
29
33
  license: "ISC",
30
34
  packageManager: "pnpm@10.20.0",
@@ -39,6 +43,7 @@ var require_package = __commonJS({
39
43
  ora: "^4.1.1"
40
44
  },
41
45
  devDependencies: {
46
+ shx: "^0.4.0",
42
47
  tsup: "^8.5.1",
43
48
  typescript: "^6.0.3"
44
49
  }
package/bin/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../lib/core/help-options.js","../lib/utils/text-position.js","../lib/core/print-welcome.js","../lib/utils/checkDirExist.js","../lib/utils/exec-command.js","../lib/config/repo.js","../lib/utils/print-log.js","../lib/core/create-project.js","../lib/utils/ejs-render.js","../lib/utils/writeFile.js","../lib/core/actions.js","../lib/index.js"],"sourcesContent":["{\n \"name\": \"hyfcli\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"bin\": {\n \"hyfcli\": \"./bin/index.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"keywords\": [\n \"vue\",\n \"react\",\n \"cli\",\n \"template\"\n ],\n \"author\": \"hyf\",\n \"license\": \"ISC\",\n \"packageManager\": \"pnpm@10.20.0\",\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.5.2\",\n \"axios\": \"^1.18.0\",\n \"chalk\": \"4.1.2\",\n \"commander\": \"^15.0.0\",\n \"download-git-repo\": \"^3.0.2\",\n \"ejs\": \"^6.0.1\",\n \"figlet\": \"^1.11.0\",\n \"ora\": \"^4.1.1\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^6.0.3\"\n }\n}\n","const { program } = require(\"commander\");\r\nconst { version } = require(\"../../package.json\");\r\nfunction helpOptions() {\r\n program.option(\"-d, --dest <dest>\", \"指定目标文件夹\");\r\n program.option(\"-t, --type <type>\", \"指定组件类型\");\r\n}\r\n\r\nmodule.exports = helpOptions;\r\n","/**\r\n * 文本居中\r\n * @type {string} text\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerLine(text, width = process.stdout.columns || 80) {\r\n const pad = Math.max(0, Math.floor((width - text.length) / 2));\r\n\r\n return \" \".repeat(pad) + text;\r\n}\r\n\r\n/**\r\n * Figlet 文本居中\r\n * @type {string} figletText\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerFiglet(figletText, width = process.stdout.columns || 80) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n const pad = Math.max(0, Math.floor((width - trimmed.length) / 2));\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\n\r\n/**\r\n * 自定义文本位置\r\n * @param {string} figletText Figlet 文本\r\n * @param {number} pad 左侧空白\r\n * @returns {string}\r\n *\r\n */\r\nfunction positionFiglet(figletText, pad = 10) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\nmodule.exports = {\r\n centerLine,\r\n centerFiglet,\r\n positionFiglet,\r\n};\r\n","const chalk = require(\"chalk\");\r\nconst figlet = require(\"figlet\");\r\nconst { centerFiglet, positionFiglet } = require(\"../utils/text-position\");\r\nfunction generateBannerSync(text, font = \"Standard\") {\r\n try {\r\n return figlet.textSync(text, { font });\r\n } catch (err) {\r\n throw err;\r\n }\r\n}\r\n\r\nfunction printWelcome() {\r\n const { version, name } = require(\"../../package.json\");\r\n console.log(version, name);\r\n const banner = generateBannerSync(name);\r\n console.log(chalk.green(positionFiglet(banner)));\r\n}\r\n\r\nmodule.exports = printWelcome;\r\n","const fs = require(\"fs\");\r\n\r\nmodule.exports = function checkDirExist(dirName) {\r\n return new Promise((resolve, reject) => {\r\n fs.access(dirName, fs.constants.F_OK, (err) => {\r\n if (err) {\r\n resolve(false);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n};\r\n","const { spawn } = require(\"child_process\");\r\nconst checkDirExist = require(\"./checkDirExist\");\r\nmodule.exports = async function execCommand(...args) {\r\n return new Promise((resolve, reject) => {\r\n const childProcess = spawn(...args); // 启用 shell });\r\n childProcess.stdout.pipe(process.stdout);\r\n childProcess.stderr.pipe(process.stderr);\r\n childProcess.on(\"close\", (code) => {\r\n console.log(\"code::\", code);\r\n resolve();\r\n });\r\n });\r\n};\r\n","const REACT_REPO =\r\n \"direct:https://gitee.com/hyf120/react18--vite5---ts.git#master\";\r\nconst VUE_REPO =\r\n \"direct:https://gitee.com/hyf120/common_vue_template.git#master\";\r\nmodule.exports = {\r\n REACT_REPO,\r\n VUE_REPO,\r\n};\r\n","const chalk = require(\"chalk\");\r\nfunction printLogForInstall(projectName) {\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n console.log(\"\");\r\n console.log(chalk.green(` cd ${projectName}`));\r\n console.log(chalk.green(` pnpm install`));\r\n console.log(chalk.green(` pnpm run dev`));\r\n console.log(\"\");\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n process.exit(0);\r\n}\r\n\r\nmodule.exports = {\r\n printLogForInstall,\r\n};\r\n","const { promisify } = require(\"util\");\r\nconst fs = require(\"node:fs/promises\");\r\nconst download = promisify(require(\"download-git-repo\"));\r\nconst ora = require(\"ora\");\r\nconst chalk = require(\"chalk\");\r\nconst { select, input, confirm } = require(\"@inquirer/prompts\");\r\n\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { REACT_REPO, VUE_REPO } = require(\"../config/repo\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst { printLogForInstall } = require(\"../utils/print-log\");\r\nasync function getInitInfo(projectName, template) {\r\n if (!projectName) {\r\n projectName = await input({\r\n message: \"请输入项目名称\",\r\n required: true,\r\n name: \"projectName\",\r\n validate: (value) => {\r\n if (!value) {\r\n return \"项目名称不能为空\";\r\n }\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n // 选择模板\r\n if (template !== \"react\" && template !== \"vue\") {\r\n template = await select({\r\n message: \"请选择模板\",\r\n required: true,\r\n name: \"template\",\r\n choices: [\r\n { name: \" react\", value: REACT_REPO, description: \" react模板\" },\r\n { name: \" vue\", value: VUE_REPO, description: \" vue模板\" },\r\n ],\r\n });\r\n } else {\r\n // 当选择react或vue时,直接返回对应的模板\r\n template = { template_repo: template === \"react\" ? REACT_REPO : VUE_REPO };\r\n }\r\n return { projectName, template_repo: template };\r\n}\r\n\r\n/**\r\n * 判断是否需要覆盖文件夹\r\n * @param {string} dirPath 文件夹路径\r\n * @returns {Boolean} 是否需要覆盖\r\n */\r\nasync function coverDir(dirPath) {\r\n // 判断文件夹是否存在,存在则删除\r\n const isDirExist = await checkDirExist(dirPath);\r\n\r\n if (isDirExist) {\r\n const answer = await confirm({ message: \"文件夹已存在,是否覆盖?\" });\r\n\r\n // 如果选择覆盖,则删除文件夹\r\n if (answer) {\r\n await deleteDir(dirPath);\r\n } else {\r\n process.exit(0);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 删除文件夹\r\n * @param {string} dirPath 文件夹路径\r\n */\r\nasync function deleteDir(dirPath) {\r\n // 删除文件夹\r\n try {\r\n const spinner = ora(`请稍等...`).start();\r\n await fs.rm(dirPath, { recursive: true, force: true });\r\n spinner.succeed(\"覆盖文件夹成功\");\r\n } catch (error) {\r\n spinner.succeed(\"删除文件夹失败,请手动删除\");\r\n process.exit(0);\r\n }\r\n}\r\n\r\nasync function downloadTemplate(projectName, template_repo) {\r\n await coverDir(projectName);\r\n\r\n const spinner = ora(`正在下载模板...`).start();\r\n try {\r\n await download(template_repo, projectName, { clone: true });\r\n spinner.succeed(\"模板下载完成\");\r\n } catch (err) {\r\n spinner.fail(chalk.red(`模板下载失败: ${err.message}`));\r\n console.log(\"\");\r\n process.exit(1);\r\n }\r\n}\r\nasync function createProjectAction(projectName, template) {\r\n // 获取初始项目信息,包括项目名称和模板\r\n const initInfo = await getInitInfo(projectName, template);\r\n // 下载模板\r\n await downloadTemplate(initInfo.projectName, initInfo.template_repo);\r\n // 安装依赖\r\n await installDependencies(initInfo.projectName);\r\n}\r\n\r\n/**\r\n * 执行安装和启动命令\r\n * @param {string} projectName 项目名称\r\n */\r\nasync function installDependencies(projectName) {\r\n const answer = await confirm({ message: \"是否需要安装依赖?\" });\r\n\r\n if (!answer) {\r\n // 输出提示信息\r\n printLogForInstall(projectName);\r\n }\r\n\r\n const commandName = process.platform === \"win32\" ? \"pnpm.cmd\" : \"pnpm\";\r\n const options = {\r\n cwd: `./${projectName}`,\r\n shell: true,\r\n };\r\n await execCommand(commandName, [\"install\"], options);\r\n await execCommand(commandName, [\"run\", \"dev\"], options);\r\n}\r\n\r\nmodule.exports = createProjectAction;\r\n","const ejs = require(\"ejs\");\r\nconst path = require(\"path\");\r\nfunction renderEjs(template, data) {\r\n return new Promise((resolve, reject) => {\r\n const templatePath = `../template/${template}`;\r\n console.log(template);\r\n const absolutePath = path.resolve(__dirname, templatePath);\r\n\r\n ejs.renderFile(absolutePath, data, (err, str) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(str);\r\n }\r\n });\r\n });\r\n}\r\n\r\nmodule.exports = {\r\n renderEjs,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\n\r\nasync function writeFile(filePath, data) {\r\n try {\r\n await fs.writeFile(filePath, data, {\r\n encoding: \"utf-8\",\r\n });\r\n } catch (error) {\r\n console.log(\"创建文件失败:\", error);\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n writeFile,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\nconst { program } = require(\"commander\");\r\nconst ora = require(\"ora\");\r\nconst { select } = require(\"@inquirer/prompts\");\r\nconst chalk = require(\"chalk\");\r\nconst path = require(\"path\");\r\n\r\nconst createProjectAction = require(\"./create-project\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { renderEjs } = require(\"../utils/ejs-render\");\r\nconst { writeFile } = require(\"../utils/writeFile\");\r\n\r\nasync function addComponentAction(cnpName) {\r\n const type = program.opts().type;\r\n const componentName =\r\n type === \"react\" ? \"component.tsx.ejs\" : \"component.vue.ejs\";\r\n const templateRes = await renderEjs(componentName, {\r\n name: cnpName.toLowerCase(),\r\n });\r\n\r\n // 写入文件\r\n const destPath = program.opts().dest || `./src/views`;\r\n await createDir(destPath);\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n}\r\n\r\n/**\r\n * 根据传入的目录,创建文件夹\r\n * @param {string} dirPath\r\n * @returns\r\n */\r\nasync function createDir(dirPath) {\r\n if (!dirPath) return;\r\n const isDirExist = await checkDirExist(dirPath);\r\n // 如果文件夹存在,则不创建\r\n if (isDirExist) return;\r\n try {\r\n await fs.mkdir(dirPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"创建文件夹失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function copyFileAction(sourceDir, destPath) {\r\n try {\r\n await fs.cp(sourceDir, destPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"复制文件失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// async function addAxiosAction() {\r\n// const isWin32 = process.platform === \"win32\";\r\n// const answer = await select({\r\n// message: \"请选择安装axios的方式\",\r\n// choices: [\r\n// {\r\n// name: \"no\",\r\n// value: false,\r\n// },\r\n// {\r\n// name: \"pnpm\",\r\n// value: isWin32 ? \"pnpm.cmd\" : \"pnpm\",\r\n// },\r\n// {\r\n// name: \"npm\",\r\n// value: isWin32 ? \"npm.cmd\" : \"npm\",\r\n// },\r\n// ],\r\n// });\r\n\r\n// const dest = program.opts().dest ?? \"./src/request\";\r\n// // 拷贝axios封装库\r\n// await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n// if (!answer) {\r\n// // 选择不安装axios\r\n// process.exit(0);\r\n// }\r\n\r\n// const spinner = ora(`请稍等...`).start();\r\n// try {\r\n// // 安装axios库\r\n// await execCommand(answer, [\"install\", \"axios\"], {\r\n// cwd: `./`,\r\n// shell: true,\r\n// });\r\n\r\n// spinner.succeed(\"安装axios成功\");\r\n// } catch (error) {\r\n// console.log(error);\r\n// spinner.fail(\"安装axios失败\");\r\n// }\r\n// }\r\n\r\nasync function addAxiosAction() {\r\n const dest = program.opts().dest ?? \"./src/request\";\r\n // 拷贝axios封装库\r\n await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装axios依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addRouterAction() {\r\n const dest = program.opts().dest ?? \"./src/router\";\r\n await copyFileAction(path.join(__dirname, \"../modules/router\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装vue-router依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addStoreAction() {\r\n const dest = program.opts().dest ?? \"./src/store\";\r\n await copyFileAction(path.join(__dirname, \"../modules/store\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装pinia,pinia-plugin-persistedstate依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addPageAction(cnpName) {\r\n if (!cnpName) {\r\n console.log(chalk.red(\"请输入组件名称\"));\r\n process.exit(0);\r\n }\r\n\r\n // 写入page组件\r\n const destPath = `./src/views/${cnpName.toLowerCase()}`;\r\n const templateRes = await renderEjs(\"component.vue.ejs\", {\r\n name: cnpName.toLowerCase(),\r\n });\r\n await createDir(destPath);\r\n await createDir(destPath + \"/c-cnps\");\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n\r\n // 写入route配置\r\n const routerModulesPath = `./src/router/modules`;\r\n const routerRes = await renderEjs(\"router.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(routerModulesPath);\r\n await writeFile(\r\n `${routerModulesPath}/${cnpName.toLowerCase()}.ts`,\r\n routerRes,\r\n );\r\n\r\n // 写入store配置\r\n const storePath = `./src/store/${cnpName.toLowerCase()}`;\r\n const storeRes = await renderEjs(\"store.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(storePath);\r\n await writeFile(`${storePath}/index.ts`, storeRes);\r\n await writeFile(`${storePath}/types.ts`, \"// TODO: types\");\r\n}\r\nmodule.exports = {\r\n createProjectAction,\r\n addComponentAction,\r\n createDir,\r\n addAxiosAction,\r\n addRouterAction,\r\n addStoreAction,\r\n addPageAction,\r\n};\r\n","#!/usr/bin/env node\nconst { program } = require(\"commander\");\nconst helpOptions = require(\"./core/help-options\");\nconst { version } = require(\"../package.json\");\nconst printWelcome = require(\"./core/print-welcome\");\nconst {\n createProjectAction,\n addComponentAction,\n createDir,\n addAxiosAction,\n addRouterAction,\n addStoreAction,\n addPageAction,\n} = require(\"./core/actions\");\n\nhelpOptions();\nprintWelcome();\nprogram.name(\"hyfcli\").description(\"一个自定义的脚手架工具\").version(version);\nprogram\n .command(\"create [projectName] [template]\")\n .description(\"创建新项目,例如:hyfcli create my-project vue\")\n .action(createProjectAction);\n\nprogram\n .command(\"addcpn <name>\")\n .description(\n \"添加一个组件,例如:hyfcli addcpn Home -t vue|react 默认是vue模版,默认位置/src/views\",\n )\n .action(addComponentAction);\n\nprogram\n .command(\"createDir <dirPath> \")\n .description(\"创建一个文件夹,例如:hyfcli createDir src/components\")\n .action(createDir);\n\nprogram\n .command(\"add-axios\")\n .description(\"添加基于axios的请求库\")\n .action(addAxiosAction);\n\nprogram\n .command(\"addrouter\")\n .description(\"添加动态加载的路由配置\")\n .action(addRouterAction);\n\nprogram\n .command(\"addstore\")\n .description(\"添加pinia状态管理,以及持久化配置\")\n .action(addStoreAction);\n\nprogram\n .command(\"addpage <pageName>\")\n .description(\"添加page,生成路由、组件、页面\")\n .action(addPageAction);\nprogram.parse(process.argv);\n"],"mappings":"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","names":["exports","module","exports","module","program","version","helpOptions","exports","module","exports","module","printWelcome","version","exports","module","exports","module","exports","module","exports","module","exports","module","spinner","createProjectAction","exports","module","exports","module","exports","module","program","createProjectAction","addComponentAction","createDir","addAxiosAction","addRouterAction","addStoreAction","addPageAction"]}
1
+ {"version":3,"sources":["../package.json","../lib/core/help-options.js","../lib/utils/text-position.js","../lib/core/print-welcome.js","../lib/utils/checkDirExist.js","../lib/utils/exec-command.js","../lib/config/repo.js","../lib/utils/print-log.js","../lib/core/create-project.js","../lib/utils/ejs-render.js","../lib/utils/writeFile.js","../lib/core/actions.js","../lib/index.js"],"sourcesContent":["{\n \"name\": \"hyfcli\",\n \"version\": \"1.0.1\",\n \"description\": \"一个项目开发脚手架工具\",\n \"main\": \"index.js\",\n \"bin\": {\n \"hyfcli\": \"./bin/index.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"keywords\": [\n \"vue\",\n \"react\",\n \"cli\",\n \"template\"\n ],\n \"files\": [\n \"./bin\",\n \"./lib\"\n ],\n \"author\": \"hyf\",\n \"license\": \"ISC\",\n \"packageManager\": \"pnpm@10.20.0\",\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.5.2\",\n \"axios\": \"^1.18.0\",\n \"chalk\": \"4.1.2\",\n \"commander\": \"^15.0.0\",\n \"download-git-repo\": \"^3.0.2\",\n \"ejs\": \"^6.0.1\",\n \"figlet\": \"^1.11.0\",\n \"ora\": \"^4.1.1\"\n },\n \"devDependencies\": {\n \"shx\": \"^0.4.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^6.0.3\"\n }\n}\n","const { program } = require(\"commander\");\r\nconst { version } = require(\"../../package.json\");\r\nfunction helpOptions() {\r\n program.option(\"-d, --dest <dest>\", \"指定目标文件夹\");\r\n program.option(\"-t, --type <type>\", \"指定组件类型\");\r\n}\r\n\r\nmodule.exports = helpOptions;\r\n","/**\r\n * 文本居中\r\n * @type {string} text\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerLine(text, width = process.stdout.columns || 80) {\r\n const pad = Math.max(0, Math.floor((width - text.length) / 2));\r\n\r\n return \" \".repeat(pad) + text;\r\n}\r\n\r\n/**\r\n * Figlet 文本居中\r\n * @type {string} figletText\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerFiglet(figletText, width = process.stdout.columns || 80) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n const pad = Math.max(0, Math.floor((width - trimmed.length) / 2));\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\n\r\n/**\r\n * 自定义文本位置\r\n * @param {string} figletText Figlet 文本\r\n * @param {number} pad 左侧空白\r\n * @returns {string}\r\n *\r\n */\r\nfunction positionFiglet(figletText, pad = 10) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\nmodule.exports = {\r\n centerLine,\r\n centerFiglet,\r\n positionFiglet,\r\n};\r\n","const chalk = require(\"chalk\");\r\nconst figlet = require(\"figlet\");\r\nconst { centerFiglet, positionFiglet } = require(\"../utils/text-position\");\r\nfunction generateBannerSync(text, font = \"Standard\") {\r\n try {\r\n return figlet.textSync(text, { font });\r\n } catch (err) {\r\n throw err;\r\n }\r\n}\r\n\r\nfunction printWelcome() {\r\n const { version, name } = require(\"../../package.json\");\r\n console.log(version, name);\r\n const banner = generateBannerSync(name);\r\n console.log(chalk.green(positionFiglet(banner)));\r\n}\r\n\r\nmodule.exports = printWelcome;\r\n","const fs = require(\"fs\");\r\n\r\nmodule.exports = function checkDirExist(dirName) {\r\n return new Promise((resolve, reject) => {\r\n fs.access(dirName, fs.constants.F_OK, (err) => {\r\n if (err) {\r\n resolve(false);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n};\r\n","const { spawn } = require(\"child_process\");\r\nconst checkDirExist = require(\"./checkDirExist\");\r\nmodule.exports = async function execCommand(...args) {\r\n return new Promise((resolve, reject) => {\r\n const childProcess = spawn(...args); // 启用 shell });\r\n childProcess.stdout.pipe(process.stdout);\r\n childProcess.stderr.pipe(process.stderr);\r\n childProcess.on(\"close\", (code) => {\r\n console.log(\"code::\", code);\r\n resolve();\r\n });\r\n });\r\n};\r\n","const REACT_REPO =\r\n \"direct:https://gitee.com/hyf120/react18--vite5---ts.git#master\";\r\nconst VUE_REPO =\r\n \"direct:https://gitee.com/hyf120/common_vue_template.git#master\";\r\nmodule.exports = {\r\n REACT_REPO,\r\n VUE_REPO,\r\n};\r\n","const chalk = require(\"chalk\");\r\nfunction printLogForInstall(projectName) {\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n console.log(\"\");\r\n console.log(chalk.green(` cd ${projectName}`));\r\n console.log(chalk.green(` pnpm install`));\r\n console.log(chalk.green(` pnpm run dev`));\r\n console.log(\"\");\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n process.exit(0);\r\n}\r\n\r\nmodule.exports = {\r\n printLogForInstall,\r\n};\r\n","const { promisify } = require(\"util\");\r\nconst fs = require(\"node:fs/promises\");\r\nconst download = promisify(require(\"download-git-repo\"));\r\nconst ora = require(\"ora\");\r\nconst chalk = require(\"chalk\");\r\nconst { select, input, confirm } = require(\"@inquirer/prompts\");\r\n\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { REACT_REPO, VUE_REPO } = require(\"../config/repo\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst { printLogForInstall } = require(\"../utils/print-log\");\r\nasync function getInitInfo(projectName, template) {\r\n if (!projectName) {\r\n projectName = await input({\r\n message: \"请输入项目名称\",\r\n required: true,\r\n name: \"projectName\",\r\n validate: (value) => {\r\n if (!value) {\r\n return \"项目名称不能为空\";\r\n }\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n // 选择模板\r\n if (template !== \"react\" && template !== \"vue\") {\r\n template = await select({\r\n message: \"请选择模板\",\r\n required: true,\r\n name: \"template\",\r\n choices: [\r\n { name: \" react\", value: REACT_REPO, description: \" react模板\" },\r\n { name: \" vue\", value: VUE_REPO, description: \" vue模板\" },\r\n ],\r\n });\r\n } else {\r\n // 当选择react或vue时,直接返回对应的模板\r\n template = { template_repo: template === \"react\" ? REACT_REPO : VUE_REPO };\r\n }\r\n return { projectName, template_repo: template };\r\n}\r\n\r\n/**\r\n * 判断是否需要覆盖文件夹\r\n * @param {string} dirPath 文件夹路径\r\n * @returns {Boolean} 是否需要覆盖\r\n */\r\nasync function coverDir(dirPath) {\r\n // 判断文件夹是否存在,存在则删除\r\n const isDirExist = await checkDirExist(dirPath);\r\n\r\n if (isDirExist) {\r\n const answer = await confirm({ message: \"文件夹已存在,是否覆盖?\" });\r\n\r\n // 如果选择覆盖,则删除文件夹\r\n if (answer) {\r\n await deleteDir(dirPath);\r\n } else {\r\n process.exit(0);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 删除文件夹\r\n * @param {string} dirPath 文件夹路径\r\n */\r\nasync function deleteDir(dirPath) {\r\n // 删除文件夹\r\n try {\r\n const spinner = ora(`请稍等...`).start();\r\n await fs.rm(dirPath, { recursive: true, force: true });\r\n spinner.succeed(\"覆盖文件夹成功\");\r\n } catch (error) {\r\n spinner.succeed(\"删除文件夹失败,请手动删除\");\r\n process.exit(0);\r\n }\r\n}\r\n\r\nasync function downloadTemplate(projectName, template_repo) {\r\n await coverDir(projectName);\r\n\r\n const spinner = ora(`正在下载模板...`).start();\r\n try {\r\n await download(template_repo, projectName, { clone: true });\r\n spinner.succeed(\"模板下载完成\");\r\n } catch (err) {\r\n spinner.fail(chalk.red(`模板下载失败: ${err.message}`));\r\n console.log(\"\");\r\n process.exit(1);\r\n }\r\n}\r\nasync function createProjectAction(projectName, template) {\r\n // 获取初始项目信息,包括项目名称和模板\r\n const initInfo = await getInitInfo(projectName, template);\r\n // 下载模板\r\n await downloadTemplate(initInfo.projectName, initInfo.template_repo);\r\n // 安装依赖\r\n await installDependencies(initInfo.projectName);\r\n}\r\n\r\n/**\r\n * 执行安装和启动命令\r\n * @param {string} projectName 项目名称\r\n */\r\nasync function installDependencies(projectName) {\r\n const answer = await confirm({ message: \"是否需要安装依赖?\" });\r\n\r\n if (!answer) {\r\n // 输出提示信息\r\n printLogForInstall(projectName);\r\n }\r\n\r\n const commandName = process.platform === \"win32\" ? \"pnpm.cmd\" : \"pnpm\";\r\n const options = {\r\n cwd: `./${projectName}`,\r\n shell: true,\r\n };\r\n await execCommand(commandName, [\"install\"], options);\r\n await execCommand(commandName, [\"run\", \"dev\"], options);\r\n}\r\n\r\nmodule.exports = createProjectAction;\r\n","const ejs = require(\"ejs\");\r\nconst path = require(\"path\");\r\nfunction renderEjs(template, data) {\r\n return new Promise((resolve, reject) => {\r\n const templatePath = `../template/${template}`;\r\n console.log(template);\r\n const absolutePath = path.resolve(__dirname, templatePath);\r\n\r\n ejs.renderFile(absolutePath, data, (err, str) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(str);\r\n }\r\n });\r\n });\r\n}\r\n\r\nmodule.exports = {\r\n renderEjs,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\n\r\nasync function writeFile(filePath, data) {\r\n try {\r\n await fs.writeFile(filePath, data, {\r\n encoding: \"utf-8\",\r\n });\r\n } catch (error) {\r\n console.log(\"创建文件失败:\", error);\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n writeFile,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\nconst { program } = require(\"commander\");\r\nconst ora = require(\"ora\");\r\nconst { select } = require(\"@inquirer/prompts\");\r\nconst chalk = require(\"chalk\");\r\nconst path = require(\"path\");\r\n\r\nconst createProjectAction = require(\"./create-project\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { renderEjs } = require(\"../utils/ejs-render\");\r\nconst { writeFile } = require(\"../utils/writeFile\");\r\n\r\nasync function addComponentAction(cnpName) {\r\n const type = program.opts().type;\r\n const componentName =\r\n type === \"react\" ? \"component.tsx.ejs\" : \"component.vue.ejs\";\r\n const templateRes = await renderEjs(componentName, {\r\n name: cnpName.toLowerCase(),\r\n });\r\n\r\n // 写入文件\r\n const destPath = program.opts().dest || `./src/views`;\r\n await createDir(destPath);\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n}\r\n\r\n/**\r\n * 根据传入的目录,创建文件夹\r\n * @param {string} dirPath\r\n * @returns\r\n */\r\nasync function createDir(dirPath) {\r\n if (!dirPath) return;\r\n const isDirExist = await checkDirExist(dirPath);\r\n // 如果文件夹存在,则不创建\r\n if (isDirExist) return;\r\n try {\r\n await fs.mkdir(dirPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"创建文件夹失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function copyFileAction(sourceDir, destPath) {\r\n try {\r\n await fs.cp(sourceDir, destPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"复制文件失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// async function addAxiosAction() {\r\n// const isWin32 = process.platform === \"win32\";\r\n// const answer = await select({\r\n// message: \"请选择安装axios的方式\",\r\n// choices: [\r\n// {\r\n// name: \"no\",\r\n// value: false,\r\n// },\r\n// {\r\n// name: \"pnpm\",\r\n// value: isWin32 ? \"pnpm.cmd\" : \"pnpm\",\r\n// },\r\n// {\r\n// name: \"npm\",\r\n// value: isWin32 ? \"npm.cmd\" : \"npm\",\r\n// },\r\n// ],\r\n// });\r\n\r\n// const dest = program.opts().dest ?? \"./src/request\";\r\n// // 拷贝axios封装库\r\n// await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n// if (!answer) {\r\n// // 选择不安装axios\r\n// process.exit(0);\r\n// }\r\n\r\n// const spinner = ora(`请稍等...`).start();\r\n// try {\r\n// // 安装axios库\r\n// await execCommand(answer, [\"install\", \"axios\"], {\r\n// cwd: `./`,\r\n// shell: true,\r\n// });\r\n\r\n// spinner.succeed(\"安装axios成功\");\r\n// } catch (error) {\r\n// console.log(error);\r\n// spinner.fail(\"安装axios失败\");\r\n// }\r\n// }\r\n\r\nasync function addAxiosAction() {\r\n const dest = program.opts().dest ?? \"./src/request\";\r\n // 拷贝axios封装库\r\n await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装axios依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addRouterAction() {\r\n const dest = program.opts().dest ?? \"./src/router\";\r\n await copyFileAction(path.join(__dirname, \"../modules/router\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装vue-router依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addStoreAction() {\r\n const dest = program.opts().dest ?? \"./src/store\";\r\n await copyFileAction(path.join(__dirname, \"../modules/store\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装pinia,pinia-plugin-persistedstate依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addPageAction(cnpName) {\r\n if (!cnpName) {\r\n console.log(chalk.red(\"请输入组件名称\"));\r\n process.exit(0);\r\n }\r\n\r\n // 写入page组件\r\n const destPath = `./src/views/${cnpName.toLowerCase()}`;\r\n const templateRes = await renderEjs(\"component.vue.ejs\", {\r\n name: cnpName.toLowerCase(),\r\n });\r\n await createDir(destPath);\r\n await createDir(destPath + \"/c-cnps\");\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n\r\n // 写入route配置\r\n const routerModulesPath = `./src/router/modules`;\r\n const routerRes = await renderEjs(\"router.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(routerModulesPath);\r\n await writeFile(\r\n `${routerModulesPath}/${cnpName.toLowerCase()}.ts`,\r\n routerRes,\r\n );\r\n\r\n // 写入store配置\r\n const storePath = `./src/store/${cnpName.toLowerCase()}`;\r\n const storeRes = await renderEjs(\"store.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(storePath);\r\n await writeFile(`${storePath}/index.ts`, storeRes);\r\n await writeFile(`${storePath}/types.ts`, \"// TODO: types\");\r\n}\r\nmodule.exports = {\r\n createProjectAction,\r\n addComponentAction,\r\n createDir,\r\n addAxiosAction,\r\n addRouterAction,\r\n addStoreAction,\r\n addPageAction,\r\n};\r\n","#!/usr/bin/env node\nconst { program } = require(\"commander\");\nconst helpOptions = require(\"./core/help-options\");\nconst { version } = require(\"../package.json\");\nconst printWelcome = require(\"./core/print-welcome\");\nconst {\n createProjectAction,\n addComponentAction,\n createDir,\n addAxiosAction,\n addRouterAction,\n addStoreAction,\n addPageAction,\n} = require(\"./core/actions\");\n\nhelpOptions();\nprintWelcome();\nprogram.name(\"hyfcli\").description(\"一个自定义的脚手架工具\").version(version);\nprogram\n .command(\"create [projectName] [template]\")\n .description(\"创建新项目,例如:hyfcli create my-project vue\")\n .action(createProjectAction);\n\nprogram\n .command(\"addcpn <name>\")\n .description(\n \"添加一个组件,例如:hyfcli addcpn Home -t vue|react 默认是vue模版,默认位置/src/views\",\n )\n .action(addComponentAction);\n\nprogram\n .command(\"createDir <dirPath> \")\n .description(\"创建一个文件夹,例如:hyfcli createDir src/components\")\n .action(createDir);\n\nprogram\n .command(\"add-axios\")\n .description(\"添加基于axios的请求库\")\n .action(addAxiosAction);\n\nprogram\n .command(\"addrouter\")\n .description(\"添加动态加载的路由配置\")\n .action(addRouterAction);\n\nprogram\n .command(\"addstore\")\n .description(\"添加pinia状态管理,以及持久化配置\")\n .action(addStoreAction);\n\nprogram\n .command(\"addpage <pageName>\")\n .description(\"添加page,生成路由、组件、页面\")\n .action(addPageAction);\nprogram.parse(process.argv);\n"],"mappings":"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","names":["exports","module","exports","module","program","version","helpOptions","exports","module","exports","module","printWelcome","version","exports","module","exports","module","exports","module","exports","module","exports","module","spinner","createProjectAction","exports","module","exports","module","exports","module","program","createProjectAction","addComponentAction","createDir","addAxiosAction","addRouterAction","addStoreAction","addPageAction"]}
package/bin/index.mjs CHANGED
@@ -15,8 +15,8 @@ var require_package = __commonJS({
15
15
  "package.json"(exports, module) {
16
16
  module.exports = {
17
17
  name: "hyfcli",
18
- version: "1.0.0",
19
- description: "",
18
+ version: "1.0.1",
19
+ description: "\u4E00\u4E2A\u9879\u76EE\u5F00\u53D1\u811A\u624B\u67B6\u5DE5\u5177",
20
20
  main: "index.js",
21
21
  bin: {
22
22
  hyfcli: "./bin/index.js"
@@ -31,6 +31,10 @@ var require_package = __commonJS({
31
31
  "cli",
32
32
  "template"
33
33
  ],
34
+ files: [
35
+ "./bin",
36
+ "./lib"
37
+ ],
34
38
  author: "hyf",
35
39
  license: "ISC",
36
40
  packageManager: "pnpm@10.20.0",
@@ -45,6 +49,7 @@ var require_package = __commonJS({
45
49
  ora: "^4.1.1"
46
50
  },
47
51
  devDependencies: {
52
+ shx: "^0.4.0",
48
53
  tsup: "^8.5.1",
49
54
  typescript: "^6.0.3"
50
55
  }
package/bin/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../lib/core/help-options.js","../lib/utils/text-position.js","../lib/core/print-welcome.js","../lib/utils/checkDirExist.js","../lib/utils/exec-command.js","../lib/config/repo.js","../lib/utils/print-log.js","../lib/core/create-project.js","../lib/utils/ejs-render.js","../lib/utils/writeFile.js","../lib/core/actions.js","../lib/index.js"],"sourcesContent":["{\n \"name\": \"hyfcli\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"bin\": {\n \"hyfcli\": \"./bin/index.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"keywords\": [\n \"vue\",\n \"react\",\n \"cli\",\n \"template\"\n ],\n \"author\": \"hyf\",\n \"license\": \"ISC\",\n \"packageManager\": \"pnpm@10.20.0\",\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.5.2\",\n \"axios\": \"^1.18.0\",\n \"chalk\": \"4.1.2\",\n \"commander\": \"^15.0.0\",\n \"download-git-repo\": \"^3.0.2\",\n \"ejs\": \"^6.0.1\",\n \"figlet\": \"^1.11.0\",\n \"ora\": \"^4.1.1\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^6.0.3\"\n }\n}\n","const { program } = require(\"commander\");\r\nconst { version } = require(\"../../package.json\");\r\nfunction helpOptions() {\r\n program.option(\"-d, --dest <dest>\", \"指定目标文件夹\");\r\n program.option(\"-t, --type <type>\", \"指定组件类型\");\r\n}\r\n\r\nmodule.exports = helpOptions;\r\n","/**\r\n * 文本居中\r\n * @type {string} text\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerLine(text, width = process.stdout.columns || 80) {\r\n const pad = Math.max(0, Math.floor((width - text.length) / 2));\r\n\r\n return \" \".repeat(pad) + text;\r\n}\r\n\r\n/**\r\n * Figlet 文本居中\r\n * @type {string} figletText\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerFiglet(figletText, width = process.stdout.columns || 80) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n const pad = Math.max(0, Math.floor((width - trimmed.length) / 2));\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\n\r\n/**\r\n * 自定义文本位置\r\n * @param {string} figletText Figlet 文本\r\n * @param {number} pad 左侧空白\r\n * @returns {string}\r\n *\r\n */\r\nfunction positionFiglet(figletText, pad = 10) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\nmodule.exports = {\r\n centerLine,\r\n centerFiglet,\r\n positionFiglet,\r\n};\r\n","const chalk = require(\"chalk\");\r\nconst figlet = require(\"figlet\");\r\nconst { centerFiglet, positionFiglet } = require(\"../utils/text-position\");\r\nfunction generateBannerSync(text, font = \"Standard\") {\r\n try {\r\n return figlet.textSync(text, { font });\r\n } catch (err) {\r\n throw err;\r\n }\r\n}\r\n\r\nfunction printWelcome() {\r\n const { version, name } = require(\"../../package.json\");\r\n console.log(version, name);\r\n const banner = generateBannerSync(name);\r\n console.log(chalk.green(positionFiglet(banner)));\r\n}\r\n\r\nmodule.exports = printWelcome;\r\n","const fs = require(\"fs\");\r\n\r\nmodule.exports = function checkDirExist(dirName) {\r\n return new Promise((resolve, reject) => {\r\n fs.access(dirName, fs.constants.F_OK, (err) => {\r\n if (err) {\r\n resolve(false);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n};\r\n","const { spawn } = require(\"child_process\");\r\nconst checkDirExist = require(\"./checkDirExist\");\r\nmodule.exports = async function execCommand(...args) {\r\n return new Promise((resolve, reject) => {\r\n const childProcess = spawn(...args); // 启用 shell });\r\n childProcess.stdout.pipe(process.stdout);\r\n childProcess.stderr.pipe(process.stderr);\r\n childProcess.on(\"close\", (code) => {\r\n console.log(\"code::\", code);\r\n resolve();\r\n });\r\n });\r\n};\r\n","const REACT_REPO =\r\n \"direct:https://gitee.com/hyf120/react18--vite5---ts.git#master\";\r\nconst VUE_REPO =\r\n \"direct:https://gitee.com/hyf120/common_vue_template.git#master\";\r\nmodule.exports = {\r\n REACT_REPO,\r\n VUE_REPO,\r\n};\r\n","const chalk = require(\"chalk\");\r\nfunction printLogForInstall(projectName) {\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n console.log(\"\");\r\n console.log(chalk.green(` cd ${projectName}`));\r\n console.log(chalk.green(` pnpm install`));\r\n console.log(chalk.green(` pnpm run dev`));\r\n console.log(\"\");\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n process.exit(0);\r\n}\r\n\r\nmodule.exports = {\r\n printLogForInstall,\r\n};\r\n","const { promisify } = require(\"util\");\r\nconst fs = require(\"node:fs/promises\");\r\nconst download = promisify(require(\"download-git-repo\"));\r\nconst ora = require(\"ora\");\r\nconst chalk = require(\"chalk\");\r\nconst { select, input, confirm } = require(\"@inquirer/prompts\");\r\n\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { REACT_REPO, VUE_REPO } = require(\"../config/repo\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst { printLogForInstall } = require(\"../utils/print-log\");\r\nasync function getInitInfo(projectName, template) {\r\n if (!projectName) {\r\n projectName = await input({\r\n message: \"请输入项目名称\",\r\n required: true,\r\n name: \"projectName\",\r\n validate: (value) => {\r\n if (!value) {\r\n return \"项目名称不能为空\";\r\n }\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n // 选择模板\r\n if (template !== \"react\" && template !== \"vue\") {\r\n template = await select({\r\n message: \"请选择模板\",\r\n required: true,\r\n name: \"template\",\r\n choices: [\r\n { name: \" react\", value: REACT_REPO, description: \" react模板\" },\r\n { name: \" vue\", value: VUE_REPO, description: \" vue模板\" },\r\n ],\r\n });\r\n } else {\r\n // 当选择react或vue时,直接返回对应的模板\r\n template = { template_repo: template === \"react\" ? REACT_REPO : VUE_REPO };\r\n }\r\n return { projectName, template_repo: template };\r\n}\r\n\r\n/**\r\n * 判断是否需要覆盖文件夹\r\n * @param {string} dirPath 文件夹路径\r\n * @returns {Boolean} 是否需要覆盖\r\n */\r\nasync function coverDir(dirPath) {\r\n // 判断文件夹是否存在,存在则删除\r\n const isDirExist = await checkDirExist(dirPath);\r\n\r\n if (isDirExist) {\r\n const answer = await confirm({ message: \"文件夹已存在,是否覆盖?\" });\r\n\r\n // 如果选择覆盖,则删除文件夹\r\n if (answer) {\r\n await deleteDir(dirPath);\r\n } else {\r\n process.exit(0);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 删除文件夹\r\n * @param {string} dirPath 文件夹路径\r\n */\r\nasync function deleteDir(dirPath) {\r\n // 删除文件夹\r\n try {\r\n const spinner = ora(`请稍等...`).start();\r\n await fs.rm(dirPath, { recursive: true, force: true });\r\n spinner.succeed(\"覆盖文件夹成功\");\r\n } catch (error) {\r\n spinner.succeed(\"删除文件夹失败,请手动删除\");\r\n process.exit(0);\r\n }\r\n}\r\n\r\nasync function downloadTemplate(projectName, template_repo) {\r\n await coverDir(projectName);\r\n\r\n const spinner = ora(`正在下载模板...`).start();\r\n try {\r\n await download(template_repo, projectName, { clone: true });\r\n spinner.succeed(\"模板下载完成\");\r\n } catch (err) {\r\n spinner.fail(chalk.red(`模板下载失败: ${err.message}`));\r\n console.log(\"\");\r\n process.exit(1);\r\n }\r\n}\r\nasync function createProjectAction(projectName, template) {\r\n // 获取初始项目信息,包括项目名称和模板\r\n const initInfo = await getInitInfo(projectName, template);\r\n // 下载模板\r\n await downloadTemplate(initInfo.projectName, initInfo.template_repo);\r\n // 安装依赖\r\n await installDependencies(initInfo.projectName);\r\n}\r\n\r\n/**\r\n * 执行安装和启动命令\r\n * @param {string} projectName 项目名称\r\n */\r\nasync function installDependencies(projectName) {\r\n const answer = await confirm({ message: \"是否需要安装依赖?\" });\r\n\r\n if (!answer) {\r\n // 输出提示信息\r\n printLogForInstall(projectName);\r\n }\r\n\r\n const commandName = process.platform === \"win32\" ? \"pnpm.cmd\" : \"pnpm\";\r\n const options = {\r\n cwd: `./${projectName}`,\r\n shell: true,\r\n };\r\n await execCommand(commandName, [\"install\"], options);\r\n await execCommand(commandName, [\"run\", \"dev\"], options);\r\n}\r\n\r\nmodule.exports = createProjectAction;\r\n","const ejs = require(\"ejs\");\r\nconst path = require(\"path\");\r\nfunction renderEjs(template, data) {\r\n return new Promise((resolve, reject) => {\r\n const templatePath = `../template/${template}`;\r\n console.log(template);\r\n const absolutePath = path.resolve(__dirname, templatePath);\r\n\r\n ejs.renderFile(absolutePath, data, (err, str) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(str);\r\n }\r\n });\r\n });\r\n}\r\n\r\nmodule.exports = {\r\n renderEjs,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\n\r\nasync function writeFile(filePath, data) {\r\n try {\r\n await fs.writeFile(filePath, data, {\r\n encoding: \"utf-8\",\r\n });\r\n } catch (error) {\r\n console.log(\"创建文件失败:\", error);\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n writeFile,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\nconst { program } = require(\"commander\");\r\nconst ora = require(\"ora\");\r\nconst { select } = require(\"@inquirer/prompts\");\r\nconst chalk = require(\"chalk\");\r\nconst path = require(\"path\");\r\n\r\nconst createProjectAction = require(\"./create-project\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { renderEjs } = require(\"../utils/ejs-render\");\r\nconst { writeFile } = require(\"../utils/writeFile\");\r\n\r\nasync function addComponentAction(cnpName) {\r\n const type = program.opts().type;\r\n const componentName =\r\n type === \"react\" ? \"component.tsx.ejs\" : \"component.vue.ejs\";\r\n const templateRes = await renderEjs(componentName, {\r\n name: cnpName.toLowerCase(),\r\n });\r\n\r\n // 写入文件\r\n const destPath = program.opts().dest || `./src/views`;\r\n await createDir(destPath);\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n}\r\n\r\n/**\r\n * 根据传入的目录,创建文件夹\r\n * @param {string} dirPath\r\n * @returns\r\n */\r\nasync function createDir(dirPath) {\r\n if (!dirPath) return;\r\n const isDirExist = await checkDirExist(dirPath);\r\n // 如果文件夹存在,则不创建\r\n if (isDirExist) return;\r\n try {\r\n await fs.mkdir(dirPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"创建文件夹失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function copyFileAction(sourceDir, destPath) {\r\n try {\r\n await fs.cp(sourceDir, destPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"复制文件失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// async function addAxiosAction() {\r\n// const isWin32 = process.platform === \"win32\";\r\n// const answer = await select({\r\n// message: \"请选择安装axios的方式\",\r\n// choices: [\r\n// {\r\n// name: \"no\",\r\n// value: false,\r\n// },\r\n// {\r\n// name: \"pnpm\",\r\n// value: isWin32 ? \"pnpm.cmd\" : \"pnpm\",\r\n// },\r\n// {\r\n// name: \"npm\",\r\n// value: isWin32 ? \"npm.cmd\" : \"npm\",\r\n// },\r\n// ],\r\n// });\r\n\r\n// const dest = program.opts().dest ?? \"./src/request\";\r\n// // 拷贝axios封装库\r\n// await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n// if (!answer) {\r\n// // 选择不安装axios\r\n// process.exit(0);\r\n// }\r\n\r\n// const spinner = ora(`请稍等...`).start();\r\n// try {\r\n// // 安装axios库\r\n// await execCommand(answer, [\"install\", \"axios\"], {\r\n// cwd: `./`,\r\n// shell: true,\r\n// });\r\n\r\n// spinner.succeed(\"安装axios成功\");\r\n// } catch (error) {\r\n// console.log(error);\r\n// spinner.fail(\"安装axios失败\");\r\n// }\r\n// }\r\n\r\nasync function addAxiosAction() {\r\n const dest = program.opts().dest ?? \"./src/request\";\r\n // 拷贝axios封装库\r\n await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装axios依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addRouterAction() {\r\n const dest = program.opts().dest ?? \"./src/router\";\r\n await copyFileAction(path.join(__dirname, \"../modules/router\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装vue-router依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addStoreAction() {\r\n const dest = program.opts().dest ?? \"./src/store\";\r\n await copyFileAction(path.join(__dirname, \"../modules/store\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装pinia,pinia-plugin-persistedstate依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addPageAction(cnpName) {\r\n if (!cnpName) {\r\n console.log(chalk.red(\"请输入组件名称\"));\r\n process.exit(0);\r\n }\r\n\r\n // 写入page组件\r\n const destPath = `./src/views/${cnpName.toLowerCase()}`;\r\n const templateRes = await renderEjs(\"component.vue.ejs\", {\r\n name: cnpName.toLowerCase(),\r\n });\r\n await createDir(destPath);\r\n await createDir(destPath + \"/c-cnps\");\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n\r\n // 写入route配置\r\n const routerModulesPath = `./src/router/modules`;\r\n const routerRes = await renderEjs(\"router.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(routerModulesPath);\r\n await writeFile(\r\n `${routerModulesPath}/${cnpName.toLowerCase()}.ts`,\r\n routerRes,\r\n );\r\n\r\n // 写入store配置\r\n const storePath = `./src/store/${cnpName.toLowerCase()}`;\r\n const storeRes = await renderEjs(\"store.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(storePath);\r\n await writeFile(`${storePath}/index.ts`, storeRes);\r\n await writeFile(`${storePath}/types.ts`, \"// TODO: types\");\r\n}\r\nmodule.exports = {\r\n createProjectAction,\r\n addComponentAction,\r\n createDir,\r\n addAxiosAction,\r\n addRouterAction,\r\n addStoreAction,\r\n addPageAction,\r\n};\r\n","#!/usr/bin/env node\nconst { program } = require(\"commander\");\nconst helpOptions = require(\"./core/help-options\");\nconst { version } = require(\"../package.json\");\nconst printWelcome = require(\"./core/print-welcome\");\nconst {\n createProjectAction,\n addComponentAction,\n createDir,\n addAxiosAction,\n addRouterAction,\n addStoreAction,\n addPageAction,\n} = require(\"./core/actions\");\n\nhelpOptions();\nprintWelcome();\nprogram.name(\"hyfcli\").description(\"一个自定义的脚手架工具\").version(version);\nprogram\n .command(\"create [projectName] [template]\")\n .description(\"创建新项目,例如:hyfcli create my-project vue\")\n .action(createProjectAction);\n\nprogram\n .command(\"addcpn <name>\")\n .description(\n \"添加一个组件,例如:hyfcli addcpn Home -t vue|react 默认是vue模版,默认位置/src/views\",\n )\n .action(addComponentAction);\n\nprogram\n .command(\"createDir <dirPath> \")\n .description(\"创建一个文件夹,例如:hyfcli createDir src/components\")\n .action(createDir);\n\nprogram\n .command(\"add-axios\")\n .description(\"添加基于axios的请求库\")\n .action(addAxiosAction);\n\nprogram\n .command(\"addrouter\")\n .description(\"添加动态加载的路由配置\")\n .action(addRouterAction);\n\nprogram\n .command(\"addstore\")\n .description(\"添加pinia状态管理,以及持久化配置\")\n .action(addStoreAction);\n\nprogram\n .command(\"addpage <pageName>\")\n .description(\"添加page,生成路由、组件、页面\")\n .action(addPageAction);\nprogram.parse(process.argv);\n"],"mappings":"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","names":["program","version","helpOptions","printWelcome","version","spinner","createProjectAction","program","createProjectAction","addComponentAction","createDir","addAxiosAction","addRouterAction","addStoreAction","addPageAction"]}
1
+ {"version":3,"sources":["../package.json","../lib/core/help-options.js","../lib/utils/text-position.js","../lib/core/print-welcome.js","../lib/utils/checkDirExist.js","../lib/utils/exec-command.js","../lib/config/repo.js","../lib/utils/print-log.js","../lib/core/create-project.js","../lib/utils/ejs-render.js","../lib/utils/writeFile.js","../lib/core/actions.js","../lib/index.js"],"sourcesContent":["{\n \"name\": \"hyfcli\",\n \"version\": \"1.0.1\",\n \"description\": \"一个项目开发脚手架工具\",\n \"main\": \"index.js\",\n \"bin\": {\n \"hyfcli\": \"./bin/index.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"keywords\": [\n \"vue\",\n \"react\",\n \"cli\",\n \"template\"\n ],\n \"files\": [\n \"./bin\",\n \"./lib\"\n ],\n \"author\": \"hyf\",\n \"license\": \"ISC\",\n \"packageManager\": \"pnpm@10.20.0\",\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.5.2\",\n \"axios\": \"^1.18.0\",\n \"chalk\": \"4.1.2\",\n \"commander\": \"^15.0.0\",\n \"download-git-repo\": \"^3.0.2\",\n \"ejs\": \"^6.0.1\",\n \"figlet\": \"^1.11.0\",\n \"ora\": \"^4.1.1\"\n },\n \"devDependencies\": {\n \"shx\": \"^0.4.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^6.0.3\"\n }\n}\n","const { program } = require(\"commander\");\r\nconst { version } = require(\"../../package.json\");\r\nfunction helpOptions() {\r\n program.option(\"-d, --dest <dest>\", \"指定目标文件夹\");\r\n program.option(\"-t, --type <type>\", \"指定组件类型\");\r\n}\r\n\r\nmodule.exports = helpOptions;\r\n","/**\r\n * 文本居中\r\n * @type {string} text\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerLine(text, width = process.stdout.columns || 80) {\r\n const pad = Math.max(0, Math.floor((width - text.length) / 2));\r\n\r\n return \" \".repeat(pad) + text;\r\n}\r\n\r\n/**\r\n * Figlet 文本居中\r\n * @type {string} figletText\r\n * @param {number} width\r\n * @return {string}\r\n */\r\nfunction centerFiglet(figletText, width = process.stdout.columns || 80) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n const pad = Math.max(0, Math.floor((width - trimmed.length) / 2));\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\n\r\n/**\r\n * 自定义文本位置\r\n * @param {string} figletText Figlet 文本\r\n * @param {number} pad 左侧空白\r\n * @returns {string}\r\n *\r\n */\r\nfunction positionFiglet(figletText, pad = 10) {\r\n const lines = figletText.split(\"\\n\");\r\n return lines\r\n .map((line) => {\r\n const trimmed = line.trimEnd(); // 保留左侧空白,去除右侧多余空格\r\n return \" \".repeat(pad) + trimmed;\r\n })\r\n .join(\"\\n\");\r\n}\r\nmodule.exports = {\r\n centerLine,\r\n centerFiglet,\r\n positionFiglet,\r\n};\r\n","const chalk = require(\"chalk\");\r\nconst figlet = require(\"figlet\");\r\nconst { centerFiglet, positionFiglet } = require(\"../utils/text-position\");\r\nfunction generateBannerSync(text, font = \"Standard\") {\r\n try {\r\n return figlet.textSync(text, { font });\r\n } catch (err) {\r\n throw err;\r\n }\r\n}\r\n\r\nfunction printWelcome() {\r\n const { version, name } = require(\"../../package.json\");\r\n console.log(version, name);\r\n const banner = generateBannerSync(name);\r\n console.log(chalk.green(positionFiglet(banner)));\r\n}\r\n\r\nmodule.exports = printWelcome;\r\n","const fs = require(\"fs\");\r\n\r\nmodule.exports = function checkDirExist(dirName) {\r\n return new Promise((resolve, reject) => {\r\n fs.access(dirName, fs.constants.F_OK, (err) => {\r\n if (err) {\r\n resolve(false);\r\n } else {\r\n resolve(true);\r\n }\r\n });\r\n });\r\n};\r\n","const { spawn } = require(\"child_process\");\r\nconst checkDirExist = require(\"./checkDirExist\");\r\nmodule.exports = async function execCommand(...args) {\r\n return new Promise((resolve, reject) => {\r\n const childProcess = spawn(...args); // 启用 shell });\r\n childProcess.stdout.pipe(process.stdout);\r\n childProcess.stderr.pipe(process.stderr);\r\n childProcess.on(\"close\", (code) => {\r\n console.log(\"code::\", code);\r\n resolve();\r\n });\r\n });\r\n};\r\n","const REACT_REPO =\r\n \"direct:https://gitee.com/hyf120/react18--vite5---ts.git#master\";\r\nconst VUE_REPO =\r\n \"direct:https://gitee.com/hyf120/common_vue_template.git#master\";\r\nmodule.exports = {\r\n REACT_REPO,\r\n VUE_REPO,\r\n};\r\n","const chalk = require(\"chalk\");\r\nfunction printLogForInstall(projectName) {\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n console.log(\"\");\r\n console.log(chalk.green(` cd ${projectName}`));\r\n console.log(chalk.green(` pnpm install`));\r\n console.log(chalk.green(` pnpm run dev`));\r\n console.log(\"\");\r\n console.log(chalk.yellow(`--`.repeat(30)));\r\n process.exit(0);\r\n}\r\n\r\nmodule.exports = {\r\n printLogForInstall,\r\n};\r\n","const { promisify } = require(\"util\");\r\nconst fs = require(\"node:fs/promises\");\r\nconst download = promisify(require(\"download-git-repo\"));\r\nconst ora = require(\"ora\");\r\nconst chalk = require(\"chalk\");\r\nconst { select, input, confirm } = require(\"@inquirer/prompts\");\r\n\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { REACT_REPO, VUE_REPO } = require(\"../config/repo\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst { printLogForInstall } = require(\"../utils/print-log\");\r\nasync function getInitInfo(projectName, template) {\r\n if (!projectName) {\r\n projectName = await input({\r\n message: \"请输入项目名称\",\r\n required: true,\r\n name: \"projectName\",\r\n validate: (value) => {\r\n if (!value) {\r\n return \"项目名称不能为空\";\r\n }\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n // 选择模板\r\n if (template !== \"react\" && template !== \"vue\") {\r\n template = await select({\r\n message: \"请选择模板\",\r\n required: true,\r\n name: \"template\",\r\n choices: [\r\n { name: \" react\", value: REACT_REPO, description: \" react模板\" },\r\n { name: \" vue\", value: VUE_REPO, description: \" vue模板\" },\r\n ],\r\n });\r\n } else {\r\n // 当选择react或vue时,直接返回对应的模板\r\n template = { template_repo: template === \"react\" ? REACT_REPO : VUE_REPO };\r\n }\r\n return { projectName, template_repo: template };\r\n}\r\n\r\n/**\r\n * 判断是否需要覆盖文件夹\r\n * @param {string} dirPath 文件夹路径\r\n * @returns {Boolean} 是否需要覆盖\r\n */\r\nasync function coverDir(dirPath) {\r\n // 判断文件夹是否存在,存在则删除\r\n const isDirExist = await checkDirExist(dirPath);\r\n\r\n if (isDirExist) {\r\n const answer = await confirm({ message: \"文件夹已存在,是否覆盖?\" });\r\n\r\n // 如果选择覆盖,则删除文件夹\r\n if (answer) {\r\n await deleteDir(dirPath);\r\n } else {\r\n process.exit(0);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 删除文件夹\r\n * @param {string} dirPath 文件夹路径\r\n */\r\nasync function deleteDir(dirPath) {\r\n // 删除文件夹\r\n try {\r\n const spinner = ora(`请稍等...`).start();\r\n await fs.rm(dirPath, { recursive: true, force: true });\r\n spinner.succeed(\"覆盖文件夹成功\");\r\n } catch (error) {\r\n spinner.succeed(\"删除文件夹失败,请手动删除\");\r\n process.exit(0);\r\n }\r\n}\r\n\r\nasync function downloadTemplate(projectName, template_repo) {\r\n await coverDir(projectName);\r\n\r\n const spinner = ora(`正在下载模板...`).start();\r\n try {\r\n await download(template_repo, projectName, { clone: true });\r\n spinner.succeed(\"模板下载完成\");\r\n } catch (err) {\r\n spinner.fail(chalk.red(`模板下载失败: ${err.message}`));\r\n console.log(\"\");\r\n process.exit(1);\r\n }\r\n}\r\nasync function createProjectAction(projectName, template) {\r\n // 获取初始项目信息,包括项目名称和模板\r\n const initInfo = await getInitInfo(projectName, template);\r\n // 下载模板\r\n await downloadTemplate(initInfo.projectName, initInfo.template_repo);\r\n // 安装依赖\r\n await installDependencies(initInfo.projectName);\r\n}\r\n\r\n/**\r\n * 执行安装和启动命令\r\n * @param {string} projectName 项目名称\r\n */\r\nasync function installDependencies(projectName) {\r\n const answer = await confirm({ message: \"是否需要安装依赖?\" });\r\n\r\n if (!answer) {\r\n // 输出提示信息\r\n printLogForInstall(projectName);\r\n }\r\n\r\n const commandName = process.platform === \"win32\" ? \"pnpm.cmd\" : \"pnpm\";\r\n const options = {\r\n cwd: `./${projectName}`,\r\n shell: true,\r\n };\r\n await execCommand(commandName, [\"install\"], options);\r\n await execCommand(commandName, [\"run\", \"dev\"], options);\r\n}\r\n\r\nmodule.exports = createProjectAction;\r\n","const ejs = require(\"ejs\");\r\nconst path = require(\"path\");\r\nfunction renderEjs(template, data) {\r\n return new Promise((resolve, reject) => {\r\n const templatePath = `../template/${template}`;\r\n console.log(template);\r\n const absolutePath = path.resolve(__dirname, templatePath);\r\n\r\n ejs.renderFile(absolutePath, data, (err, str) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(str);\r\n }\r\n });\r\n });\r\n}\r\n\r\nmodule.exports = {\r\n renderEjs,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\n\r\nasync function writeFile(filePath, data) {\r\n try {\r\n await fs.writeFile(filePath, data, {\r\n encoding: \"utf-8\",\r\n });\r\n } catch (error) {\r\n console.log(\"创建文件失败:\", error);\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n writeFile,\r\n};\r\n","const fs = require(\"node:fs/promises\");\r\nconst { program } = require(\"commander\");\r\nconst ora = require(\"ora\");\r\nconst { select } = require(\"@inquirer/prompts\");\r\nconst chalk = require(\"chalk\");\r\nconst path = require(\"path\");\r\n\r\nconst createProjectAction = require(\"./create-project\");\r\nconst checkDirExist = require(\"../utils/checkDirExist\");\r\nconst execCommand = require(\"../utils/exec-command\");\r\nconst { renderEjs } = require(\"../utils/ejs-render\");\r\nconst { writeFile } = require(\"../utils/writeFile\");\r\n\r\nasync function addComponentAction(cnpName) {\r\n const type = program.opts().type;\r\n const componentName =\r\n type === \"react\" ? \"component.tsx.ejs\" : \"component.vue.ejs\";\r\n const templateRes = await renderEjs(componentName, {\r\n name: cnpName.toLowerCase(),\r\n });\r\n\r\n // 写入文件\r\n const destPath = program.opts().dest || `./src/views`;\r\n await createDir(destPath);\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n}\r\n\r\n/**\r\n * 根据传入的目录,创建文件夹\r\n * @param {string} dirPath\r\n * @returns\r\n */\r\nasync function createDir(dirPath) {\r\n if (!dirPath) return;\r\n const isDirExist = await checkDirExist(dirPath);\r\n // 如果文件夹存在,则不创建\r\n if (isDirExist) return;\r\n try {\r\n await fs.mkdir(dirPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"创建文件夹失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function copyFileAction(sourceDir, destPath) {\r\n try {\r\n await fs.cp(sourceDir, destPath, { recursive: true });\r\n } catch (error) {\r\n console.log(chalk.error(\"复制文件失败\"));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// async function addAxiosAction() {\r\n// const isWin32 = process.platform === \"win32\";\r\n// const answer = await select({\r\n// message: \"请选择安装axios的方式\",\r\n// choices: [\r\n// {\r\n// name: \"no\",\r\n// value: false,\r\n// },\r\n// {\r\n// name: \"pnpm\",\r\n// value: isWin32 ? \"pnpm.cmd\" : \"pnpm\",\r\n// },\r\n// {\r\n// name: \"npm\",\r\n// value: isWin32 ? \"npm.cmd\" : \"npm\",\r\n// },\r\n// ],\r\n// });\r\n\r\n// const dest = program.opts().dest ?? \"./src/request\";\r\n// // 拷贝axios封装库\r\n// await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n// if (!answer) {\r\n// // 选择不安装axios\r\n// process.exit(0);\r\n// }\r\n\r\n// const spinner = ora(`请稍等...`).start();\r\n// try {\r\n// // 安装axios库\r\n// await execCommand(answer, [\"install\", \"axios\"], {\r\n// cwd: `./`,\r\n// shell: true,\r\n// });\r\n\r\n// spinner.succeed(\"安装axios成功\");\r\n// } catch (error) {\r\n// console.log(error);\r\n// spinner.fail(\"安装axios失败\");\r\n// }\r\n// }\r\n\r\nasync function addAxiosAction() {\r\n const dest = program.opts().dest ?? \"./src/request\";\r\n // 拷贝axios封装库\r\n await copyFileAction(path.join(__dirname, \"../modules/request\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装axios依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addRouterAction() {\r\n const dest = program.opts().dest ?? \"./src/router\";\r\n await copyFileAction(path.join(__dirname, \"../modules/router\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装vue-router依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addStoreAction() {\r\n const dest = program.opts().dest ?? \"./src/store\";\r\n await copyFileAction(path.join(__dirname, \"../modules/store\"), dest);\r\n console.log(chalk.green(\"文件拷贝成功\"));\r\n console.log(chalk.yellow(\"请手动安装pinia,pinia-plugin-persistedstate依赖\"));\r\n process.exit(0);\r\n}\r\n\r\nasync function addPageAction(cnpName) {\r\n if (!cnpName) {\r\n console.log(chalk.red(\"请输入组件名称\"));\r\n process.exit(0);\r\n }\r\n\r\n // 写入page组件\r\n const destPath = `./src/views/${cnpName.toLowerCase()}`;\r\n const templateRes = await renderEjs(\"component.vue.ejs\", {\r\n name: cnpName.toLowerCase(),\r\n });\r\n await createDir(destPath);\r\n await createDir(destPath + \"/c-cnps\");\r\n await writeFile(`${destPath}/${cnpName}.vue`, templateRes);\r\n\r\n // 写入route配置\r\n const routerModulesPath = `./src/router/modules`;\r\n const routerRes = await renderEjs(\"router.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(routerModulesPath);\r\n await writeFile(\r\n `${routerModulesPath}/${cnpName.toLowerCase()}.ts`,\r\n routerRes,\r\n );\r\n\r\n // 写入store配置\r\n const storePath = `./src/store/${cnpName.toLowerCase()}`;\r\n const storeRes = await renderEjs(\"store.ejs\", {\r\n name: cnpName,\r\n });\r\n await createDir(storePath);\r\n await writeFile(`${storePath}/index.ts`, storeRes);\r\n await writeFile(`${storePath}/types.ts`, \"// TODO: types\");\r\n}\r\nmodule.exports = {\r\n createProjectAction,\r\n addComponentAction,\r\n createDir,\r\n addAxiosAction,\r\n addRouterAction,\r\n addStoreAction,\r\n addPageAction,\r\n};\r\n","#!/usr/bin/env node\nconst { program } = require(\"commander\");\nconst helpOptions = require(\"./core/help-options\");\nconst { version } = require(\"../package.json\");\nconst printWelcome = require(\"./core/print-welcome\");\nconst {\n createProjectAction,\n addComponentAction,\n createDir,\n addAxiosAction,\n addRouterAction,\n addStoreAction,\n addPageAction,\n} = require(\"./core/actions\");\n\nhelpOptions();\nprintWelcome();\nprogram.name(\"hyfcli\").description(\"一个自定义的脚手架工具\").version(version);\nprogram\n .command(\"create [projectName] [template]\")\n .description(\"创建新项目,例如:hyfcli create my-project vue\")\n .action(createProjectAction);\n\nprogram\n .command(\"addcpn <name>\")\n .description(\n \"添加一个组件,例如:hyfcli addcpn Home -t vue|react 默认是vue模版,默认位置/src/views\",\n )\n .action(addComponentAction);\n\nprogram\n .command(\"createDir <dirPath> \")\n .description(\"创建一个文件夹,例如:hyfcli createDir src/components\")\n .action(createDir);\n\nprogram\n .command(\"add-axios\")\n .description(\"添加基于axios的请求库\")\n .action(addAxiosAction);\n\nprogram\n .command(\"addrouter\")\n .description(\"添加动态加载的路由配置\")\n .action(addRouterAction);\n\nprogram\n .command(\"addstore\")\n .description(\"添加pinia状态管理,以及持久化配置\")\n .action(addStoreAction);\n\nprogram\n .command(\"addpage <pageName>\")\n .description(\"添加page,生成路由、组件、页面\")\n .action(addPageAction);\nprogram.parse(process.argv);\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,MACE,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,KAAO;AAAA,QACL,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAU;AAAA,MACV,SAAW;AAAA,MACX,gBAAkB;AAAA,MAClB,cAAgB;AAAA,QACd,qBAAqB;AAAA,QACrB,OAAS;AAAA,QACT,OAAS;AAAA,QACT,WAAa;AAAA,QACb,qBAAqB;AAAA,QACrB,KAAO;AAAA,QACP,QAAU;AAAA,QACV,KAAO;AAAA,MACT;AAAA,MACA,iBAAmB;AAAA,QACjB,KAAO;AAAA,QACP,MAAQ;AAAA,QACR,YAAc;AAAA,MAChB;AAAA,IACF;AAAA;AAAA;;;ACxCA;AAAA;AAAA,QAAM,EAAE,SAAAA,SAAQ,IAAI,UAAQ,WAAW;AACvC,QAAM,EAAE,SAAAC,SAAQ,IAAI;AACpB,aAASC,eAAc;AACrB,MAAAF,SAAQ,OAAO,qBAAqB,4CAAS;AAC7C,MAAAA,SAAQ,OAAO,qBAAqB,sCAAQ;AAAA,IAC9C;AAEA,WAAO,UAAUE;AAAA;AAAA;;;ACPjB;AAAA;AAMA,aAAS,WAAW,MAAM,QAAQ,QAAQ,OAAO,WAAW,IAAI;AAC9D,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC;AAE7D,aAAO,IAAI,OAAO,GAAG,IAAI;AAAA,IAC3B;AAQA,aAAS,aAAa,YAAY,QAAQ,QAAQ,OAAO,WAAW,IAAI;AACtE,YAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,aAAO,MACJ,IAAI,CAAC,SAAS;AACb,cAAM,UAAU,KAAK,QAAQ;AAC7B,cAAM,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,QAAQ,QAAQ,UAAU,CAAC,CAAC;AAChE,eAAO,IAAI,OAAO,GAAG,IAAI;AAAA,MAC3B,CAAC,EACA,KAAK,IAAI;AAAA,IACd;AASA,aAAS,eAAe,YAAY,MAAM,IAAI;AAC5C,YAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,aAAO,MACJ,IAAI,CAAC,SAAS;AACb,cAAM,UAAU,KAAK,QAAQ;AAC7B,eAAO,IAAI,OAAO,GAAG,IAAI;AAAA,MAC3B,CAAC,EACA,KAAK,IAAI;AAAA,IACd;AACA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACjDA;AAAA;AAAA,QAAM,QAAQ,UAAQ,OAAO;AAC7B,QAAM,SAAS,UAAQ,QAAQ;AAC/B,QAAM,EAAE,cAAc,eAAe,IAAI;AACzC,aAAS,mBAAmB,MAAM,OAAO,YAAY;AACnD,UAAI;AACF,eAAO,OAAO,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,MACvC,SAAS,KAAK;AACZ,cAAM;AAAA,MACR;AAAA,IACF;AAEA,aAASC,gBAAe;AACtB,YAAM,EAAE,SAAAC,UAAS,KAAK,IAAI;AAC1B,cAAQ,IAAIA,UAAS,IAAI;AACzB,YAAM,SAAS,mBAAmB,IAAI;AACtC,cAAQ,IAAI,MAAM,MAAM,eAAe,MAAM,CAAC,CAAC;AAAA,IACjD;AAEA,WAAO,UAAUD;AAAA;AAAA;;;AClBjB;AAAA;AAAA,QAAM,KAAK,UAAQ,IAAI;AAEvB,WAAO,UAAU,SAAS,cAAc,SAAS;AAC/C,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAG,OAAO,SAAS,GAAG,UAAU,MAAM,CAAC,QAAQ;AAC7C,cAAI,KAAK;AACP,oBAAQ,KAAK;AAAA,UACf,OAAO;AACL,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA;AAAA;;;ACZA;AAAA;AAAA,QAAM,EAAE,MAAM,IAAI,UAAQ,eAAe;AACzC,QAAM,gBAAgB;AACtB,WAAO,UAAU,eAAe,eAAe,MAAM;AACnD,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,eAAe,MAAM,GAAG,IAAI;AAClC,qBAAa,OAAO,KAAK,QAAQ,MAAM;AACvC,qBAAa,OAAO,KAAK,QAAQ,MAAM;AACvC,qBAAa,GAAG,SAAS,CAAC,SAAS;AACjC,kBAAQ,IAAI,UAAU,IAAI;AAC1B,kBAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA;AAAA;;;ACZA;AAAA;AAAA,QAAM,aACJ;AACF,QAAM,WACJ;AACF,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACPA;AAAA;AAAA,QAAM,QAAQ,UAAQ,OAAO;AAC7B,aAAS,mBAAmB,aAAa;AACvC,cAAQ,IAAI,MAAM,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;AACzC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,MAAM,MAAM,UAAU,WAAW,EAAE,CAAC;AAChD,cAAQ,IAAI,MAAM,MAAM,kBAAkB,CAAC;AAC3C,cAAQ,IAAI,MAAM,MAAM,kBAAkB,CAAC;AAC3C,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,MAAM,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,IACF;AAAA;AAAA;;;ACdA;AAAA;AAAA,QAAM,EAAE,UAAU,IAAI,UAAQ,MAAM;AACpC,QAAM,KAAK,UAAQ,aAAkB;AACrC,QAAM,WAAW,UAAU,UAAQ,mBAAmB,CAAC;AACvD,QAAM,MAAM,UAAQ,KAAK;AACzB,QAAM,QAAQ,UAAQ,OAAO;AAC7B,QAAM,EAAE,QAAQ,OAAO,QAAQ,IAAI,UAAQ,mBAAmB;AAE9D,QAAM,cAAc;AACpB,QAAM,EAAE,YAAY,SAAS,IAAI;AACjC,QAAM,gBAAgB;AACtB,QAAM,EAAE,mBAAmB,IAAI;AAC/B,mBAAe,YAAY,aAAa,UAAU;AAChD,UAAI,CAAC,aAAa;AAChB,sBAAc,MAAM,MAAM;AAAA,UACxB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,MAAM;AAAA,UACN,UAAU,CAAC,UAAU;AACnB,gBAAI,CAAC,OAAO;AACV,qBAAO;AAAA,YACT;AACA,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,aAAa,WAAW,aAAa,OAAO;AAC9C,mBAAW,MAAM,OAAO;AAAA,UACtB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,YACP,EAAE,MAAM,UAAU,OAAO,YAAY,aAAa,sBAAY;AAAA,YAC9D,EAAE,MAAM,QAAQ,OAAO,UAAU,aAAa,oBAAU;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,mBAAW,EAAE,eAAe,aAAa,UAAU,aAAa,SAAS;AAAA,MAC3E;AACA,aAAO,EAAE,aAAa,eAAe,SAAS;AAAA,IAChD;AAOA,mBAAe,SAAS,SAAS;AAE/B,YAAM,aAAa,MAAM,cAAc,OAAO;AAE9C,UAAI,YAAY;AACd,cAAM,SAAS,MAAM,QAAQ,EAAE,SAAS,sEAAe,CAAC;AAGxD,YAAI,QAAQ;AACV,gBAAM,UAAU,OAAO;AAAA,QACzB,OAAO;AACL,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAMA,mBAAe,UAAU,SAAS;AAEhC,UAAI;AACF,cAAME,WAAU,IAAI,uBAAQ,EAAE,MAAM;AACpC,cAAM,GAAG,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACrD,QAAAA,SAAQ,QAAQ,4CAAS;AAAA,MAC3B,SAAS,OAAO;AACd,gBAAQ,QAAQ,gFAAe;AAC/B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,mBAAe,iBAAiB,aAAa,eAAe;AAC1D,YAAM,SAAS,WAAW;AAE1B,YAAMA,WAAU,IAAI,yCAAW,EAAE,MAAM;AACvC,UAAI;AACF,cAAM,SAAS,eAAe,aAAa,EAAE,OAAO,KAAK,CAAC;AAC1D,QAAAA,SAAQ,QAAQ,sCAAQ;AAAA,MAC1B,SAAS,KAAK;AACZ,QAAAA,SAAQ,KAAK,MAAM,IAAI,yCAAW,IAAI,OAAO,EAAE,CAAC;AAChD,gBAAQ,IAAI,EAAE;AACd,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,mBAAeC,qBAAoB,aAAa,UAAU;AAExD,YAAM,WAAW,MAAM,YAAY,aAAa,QAAQ;AAExD,YAAM,iBAAiB,SAAS,aAAa,SAAS,aAAa;AAEnE,YAAM,oBAAoB,SAAS,WAAW;AAAA,IAChD;AAMA,mBAAe,oBAAoB,aAAa;AAC9C,YAAM,SAAS,MAAM,QAAQ,EAAE,SAAS,oDAAY,CAAC;AAErD,UAAI,CAAC,QAAQ;AAEX,2BAAmB,WAAW;AAAA,MAChC;AAEA,YAAM,cAAc,QAAQ,aAAa,UAAU,aAAa;AAChE,YAAM,UAAU;AAAA,QACd,KAAK,KAAK,WAAW;AAAA,QACrB,OAAO;AAAA,MACT;AACA,YAAM,YAAY,aAAa,CAAC,SAAS,GAAG,OAAO;AACnD,YAAM,YAAY,aAAa,CAAC,OAAO,KAAK,GAAG,OAAO;AAAA,IACxD;AAEA,WAAO,UAAUA;AAAA;AAAA;;;AC5HjB;AAAA;AAAA,QAAM,MAAM,UAAQ,KAAK;AACzB,QAAM,OAAO,UAAQ,MAAM;AAC3B,aAAS,UAAU,UAAU,MAAM;AACjC,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,eAAe,eAAe,QAAQ;AAC5C,gBAAQ,IAAI,QAAQ;AACpB,cAAM,eAAe,KAAK,QAAQ,WAAW,YAAY;AAEzD,YAAI,WAAW,cAAc,MAAM,CAAC,KAAK,QAAQ;AAC/C,cAAI,KAAK;AACP,mBAAO,GAAG;AAAA,UACZ,OAAO;AACL,oBAAQ,GAAG;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,IACF;AAAA;AAAA;;;ACpBA;AAAA;AAAA,QAAM,KAAK,UAAQ,aAAkB;AAErC,mBAAe,UAAU,UAAU,MAAM;AACvC,UAAI;AACF,cAAM,GAAG,UAAU,UAAU,MAAM;AAAA,UACjC,UAAU;AAAA,QACZ,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,IAAI,8CAAW,KAAK;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,IACF;AAAA;AAAA;;;ACdA;AAAA;AAAA,QAAM,KAAK,UAAQ,aAAkB;AACrC,QAAM,EAAE,SAAAC,SAAQ,IAAI,UAAQ,WAAW;AACvC,QAAM,MAAM,UAAQ,KAAK;AACzB,QAAM,EAAE,OAAO,IAAI,UAAQ,mBAAmB;AAC9C,QAAM,QAAQ,UAAQ,OAAO;AAC7B,QAAM,OAAO,UAAQ,MAAM;AAE3B,QAAMC,uBAAsB;AAC5B,QAAM,gBAAgB;AACtB,QAAM,cAAc;AACpB,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,EAAE,UAAU,IAAI;AAEtB,mBAAeC,oBAAmB,SAAS;AACzC,YAAM,OAAOF,SAAQ,KAAK,EAAE;AAC5B,YAAM,gBACJ,SAAS,UAAU,sBAAsB;AAC3C,YAAM,cAAc,MAAM,UAAU,eAAe;AAAA,QACjD,MAAM,QAAQ,YAAY;AAAA,MAC5B,CAAC;AAGD,YAAM,WAAWA,SAAQ,KAAK,EAAE,QAAQ;AACxC,YAAMG,WAAU,QAAQ;AACxB,YAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC3D;AAOA,mBAAeA,WAAU,SAAS;AAChC,UAAI,CAAC,QAAS;AACd,YAAM,aAAa,MAAM,cAAc,OAAO;AAE9C,UAAI,WAAY;AAChB,UAAI;AACF,cAAM,GAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7C,SAAS,OAAO;AACd,gBAAQ,IAAI,MAAM,MAAM,4CAAS,CAAC;AAClC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,mBAAe,eAAe,WAAW,UAAU;AACjD,UAAI;AACF,cAAM,GAAG,GAAG,WAAW,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MACtD,SAAS,OAAO;AACd,gBAAQ,IAAI,MAAM,MAAM,sCAAQ,CAAC;AACjC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AA6CA,mBAAeC,kBAAiB;AAC9B,YAAM,OAAOJ,SAAQ,KAAK,EAAE,QAAQ;AAEpC,YAAM,eAAe,KAAK,KAAK,WAAW,oBAAoB,GAAG,IAAI;AACrE,cAAQ,IAAI,MAAM,MAAM,sCAAQ,CAAC;AACjC,cAAQ,IAAI,MAAM,OAAO,iDAAc,CAAC;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,mBAAeK,mBAAkB;AAC/B,YAAM,OAAOL,SAAQ,KAAK,EAAE,QAAQ;AACpC,YAAM,eAAe,KAAK,KAAK,WAAW,mBAAmB,GAAG,IAAI;AACpE,cAAQ,IAAI,MAAM,MAAM,sCAAQ,CAAC;AACjC,cAAQ,IAAI,MAAM,OAAO,sDAAmB,CAAC;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,mBAAeM,kBAAiB;AAC9B,YAAM,OAAON,SAAQ,KAAK,EAAE,QAAQ;AACpC,YAAM,eAAe,KAAK,KAAK,WAAW,kBAAkB,GAAG,IAAI;AACnE,cAAQ,IAAI,MAAM,MAAM,sCAAQ,CAAC;AACjC,cAAQ,IAAI,MAAM,OAAO,6EAA0C,CAAC;AACpE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,mBAAeO,eAAc,SAAS;AACpC,UAAI,CAAC,SAAS;AACZ,gBAAQ,IAAI,MAAM,IAAI,4CAAS,CAAC;AAChC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,WAAW,eAAe,QAAQ,YAAY,CAAC;AACrD,YAAM,cAAc,MAAM,UAAU,qBAAqB;AAAA,QACvD,MAAM,QAAQ,YAAY;AAAA,MAC5B,CAAC;AACD,YAAMJ,WAAU,QAAQ;AACxB,YAAMA,WAAU,WAAW,SAAS;AACpC,YAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,QAAQ,WAAW;AAGzD,YAAM,oBAAoB;AAC1B,YAAM,YAAY,MAAM,UAAU,cAAc;AAAA,QAC9C,MAAM;AAAA,MACR,CAAC;AACD,YAAMA,WAAU,iBAAiB;AACjC,YAAM;AAAA,QACJ,GAAG,iBAAiB,IAAI,QAAQ,YAAY,CAAC;AAAA,QAC7C;AAAA,MACF;AAGA,YAAM,YAAY,eAAe,QAAQ,YAAY,CAAC;AACtD,YAAM,WAAW,MAAM,UAAU,aAAa;AAAA,QAC5C,MAAM;AAAA,MACR,CAAC;AACD,YAAMA,WAAU,SAAS;AACzB,YAAM,UAAU,GAAG,SAAS,aAAa,QAAQ;AACjD,YAAM,UAAU,GAAG,SAAS,aAAa,gBAAgB;AAAA,IAC3D;AACA,WAAO,UAAU;AAAA,MACf,qBAAAF;AAAA,MACA,oBAAAC;AAAA,MACA,WAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,eAAAC;AAAA,IACF;AAAA;AAAA;;;ACpKA,IAAM,EAAE,QAAQ,IAAI,UAAQ,WAAW;AACvC,IAAM,cAAc;AACpB,IAAM,EAAE,QAAQ,IAAI;AACpB,IAAM,eAAe;AACrB,IAAM;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAI;AAEJ,YAAY;AACZ,aAAa;AACb,QAAQ,KAAK,QAAQ,EAAE,YAAY,oEAAa,EAAE,QAAQ,OAAO;AACjE,QACG,QAAQ,iCAAiC,EACzC,YAAY,+EAAuC,EACnD,OAAO,mBAAmB;AAE7B,QACG,QAAQ,eAAe,EACvB;AAAA,EACC;AACF,EACC,OAAO,kBAAkB;AAE5B,QACG,QAAQ,sBAAsB,EAC9B,YAAY,mGAA4C,EACxD,OAAO,SAAS;AAEnB,QACG,QAAQ,WAAW,EACnB,YAAY,uDAAe,EAC3B,OAAO,cAAc;AAExB,QACG,QAAQ,WAAW,EACnB,YAAY,oEAAa,EACzB,OAAO,eAAe;AAEzB,QACG,QAAQ,UAAU,EAClB,YAAY,sFAAqB,EACjC,OAAO,cAAc;AAExB,QACG,QAAQ,oBAAoB,EAC5B,YAAY,+EAAmB,EAC/B,OAAO,aAAa;AACvB,QAAQ,MAAM,QAAQ,IAAI;","names":["program","version","helpOptions","printWelcome","version","spinner","createProjectAction","program","createProjectAction","addComponentAction","createDir","addAxiosAction","addRouterAction","addStoreAction","addPageAction"]}
@@ -0,0 +1,21 @@
1
+ let baseURL = 'http://localhost:3000';
2
+ const headers = {
3
+ 'Content-Type': 'application/json'
4
+ };
5
+ const timeout = 3000;
6
+
7
+ const env = import.meta.env.MODE;
8
+
9
+ if (env === 'prod') {
10
+ baseURL = import.meta.env.VITE_API_BASE_URL;
11
+ } else if (env === 'dev') {
12
+ baseURL = import.meta.env.VITE_API_BASE_URL;
13
+ } else if (env === 'test') {
14
+ baseURL = import.meta.env.VITE_API_BASE_URL;
15
+ } else if (env === 'mock') {
16
+ baseURL = import.meta.env.VITE_APP_MOCK_BASEURL;
17
+ } else {
18
+ baseURL = import.meta.env.VITE_API_BASE_URL;
19
+ }
20
+
21
+ export { baseURL, headers, timeout };
@@ -0,0 +1,113 @@
1
+ /**
2
+ * 文档说明:
3
+ * 通过axios封装的请求方法
4
+ */
5
+ import axios from 'axios';
6
+ import type { AxiosInstance, InternalAxiosRequestConfig, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
7
+ import { ElMessage } from 'element-plus';
8
+
9
+ import { baseURL, timeout, headers } from './config';
10
+ import { getStatusMessage } from './status';
11
+ import type { IResonse } from './types';
12
+
13
+ class HttpRequest {
14
+ // 实例化axios
15
+ private instence: AxiosInstance;
16
+ constructor(config: any) {
17
+ // 创建axios实例
18
+ this.instence = axios.create(config);
19
+
20
+ // 请求拦截器
21
+ this.instence.interceptors.request.use(
22
+ (req: InternalAxiosRequestConfig) => {
23
+ return req;
24
+ },
25
+ (err) => {
26
+ return Promise.reject(err);
27
+ }
28
+ );
29
+
30
+ // 响应拦截器
31
+ this.instence.interceptors.response.use(
32
+ (res: AxiosResponse) => {
33
+ if (res.status === 200) {
34
+ return res;
35
+ }
36
+ ElMessage.error(getStatusMessage(res.status));
37
+ return res;
38
+ },
39
+ (err: AxiosError) => {
40
+ const { response } = err;
41
+ if (response) {
42
+ ElMessage.error(getStatusMessage(response.status));
43
+ return Promise.reject(response.data);
44
+ }
45
+ ElMessage.error('网络连接错误,请检查网络连接');
46
+ }
47
+ );
48
+ }
49
+
50
+ async request<T = any>(config: AxiosRequestConfig): Promise<IResonse<T>> {
51
+ return new Promise((resolve, reject) => {
52
+ this.instence
53
+ .request(config)
54
+ .then((res: AxiosResponse<IResonse<T>>) => {
55
+ const data = res.data;
56
+ if (data.code === 0) {
57
+ resolve(data);
58
+ } else {
59
+ ElMessage.error(data.message);
60
+ reject(data);
61
+ }
62
+ })
63
+ .catch((err) => {
64
+ reject(err);
65
+ });
66
+ });
67
+ }
68
+
69
+ async get<T = any>(config: AxiosRequestConfig): Promise<any> {
70
+ return this.request<T>({
71
+ ...config,
72
+ method: 'get'
73
+ });
74
+ }
75
+
76
+ async post<T = any>(config: AxiosRequestConfig): Promise<any> {
77
+ return this.request<T>({
78
+ ...config,
79
+ method: 'post'
80
+ });
81
+ }
82
+
83
+ async patch(config: AxiosRequestConfig): Promise<any> {
84
+ return this.request({
85
+ ...config,
86
+ method: 'patch'
87
+ });
88
+ }
89
+
90
+ async del<T = any>(config: AxiosRequestConfig): Promise<any> {
91
+ return this.request<T>({
92
+ ...config,
93
+ method: 'delete'
94
+ });
95
+ }
96
+
97
+ async put<T = any>(config: InternalAxiosRequestConfig): Promise<any> {
98
+ return this.request<T>({
99
+ ...config,
100
+ method: 'put'
101
+ });
102
+ }
103
+ }
104
+
105
+ // 导出实例
106
+ export const httpRequest = new HttpRequest({
107
+ baseURL,
108
+ timeout,
109
+ headers
110
+ });
111
+
112
+ // 导出类
113
+ export default HttpRequest;
@@ -0,0 +1,22 @@
1
+ export function getStatusMessage(status: number): string {
2
+ switch (status) {
3
+ case 400:
4
+ return '请求参数错误(400)';
5
+ case 401:
6
+ return '未授权(401)';
7
+ case 403:
8
+ return '权限不足(403)';
9
+ case 404:
10
+ return '资源未找到(404)';
11
+ case 500:
12
+ return '服务器内部错误(500)';
13
+ case 502:
14
+ return '网关错误(502)';
15
+ case 503:
16
+ return '服务不可用(503)';
17
+ case 504:
18
+ return '网关超时(504)';
19
+ default:
20
+ return `未知错误${status}`;
21
+ }
22
+ }
@@ -0,0 +1,7 @@
1
+ // 定义返回数据格式
2
+ export interface IResonse<T = any> {
3
+ code: number; // 业务状态码
4
+ data: T; // 返回数据
5
+ message: string; // 返回信息
6
+ status?: number; // http状态码
7
+ }
@@ -0,0 +1,29 @@
1
+ import { createWebHashHistory, createRouter, RouteRecordRaw } from 'vue-router';
2
+ import Nprogress from 'nprogress';
3
+
4
+ const routes: Array<RouteRecordRaw> = [];
5
+
6
+ // 动态加载路由模块,需要在modules文件夹下新建文件即可
7
+ const modules: Record<string, any> = import.meta.glob('./modules/*.ts', {
8
+ eager: true
9
+ });
10
+ Object.keys(modules).forEach((key: string) => {
11
+ const module = modules[key].default;
12
+ routes.push(module);
13
+ });
14
+
15
+ const router = createRouter({
16
+ history: createWebHashHistory(),
17
+ routes
18
+ });
19
+
20
+ router.beforeEach((to, from, next) => {
21
+ Nprogress.start();
22
+ next();
23
+ });
24
+
25
+ router.afterEach(() => {
26
+ Nprogress.done();
27
+ });
28
+
29
+ export default router;
@@ -0,0 +1,9 @@
1
+ export default {
2
+ path: '/:pathMatch(.*)*',
3
+ name: 'NotFound',
4
+ component: () => import(/* webpackChunkName: "notFound" */ '@/views/404/404.vue'),
5
+ meta: {
6
+ title: '404',
7
+ hidden: true
8
+ }
9
+ };
@@ -0,0 +1,9 @@
1
+ export default {
2
+ path: '/about',
3
+ name: 'About',
4
+ component: () => import(/* webpackChunkName: "about" */ '@/views/about/About.vue'),
5
+ meta: {
6
+ title: '关于',
7
+ icon: 'el-icon-s-platform'
8
+ }
9
+ };
@@ -0,0 +1,10 @@
1
+ export default {
2
+ path: '/home',
3
+ name: 'Home',
4
+ component: () => import(/* webpackChunkName: "home" */ '@/views/home/Home.vue'),
5
+ meta: {
6
+ title: '首页',
7
+ icon: 'home',
8
+ keepAlive: true
9
+ }
10
+ };
@@ -0,0 +1,10 @@
1
+ export default {
2
+ path: '/login',
3
+ name: 'Login',
4
+ component: () => import(/* webpackChunkName: "login" */ '@/views/login/Login.vue'),
5
+ meta: {
6
+ title: '登录',
7
+ icon: 'login',
8
+ hidden: true
9
+ }
10
+ };
@@ -0,0 +1,4 @@
1
+ export default {
2
+ path: '/',
3
+ redirect: '/home'
4
+ };
@@ -0,0 +1,22 @@
1
+ import { defineStore } from 'pinia';
2
+ const useHomeStore = defineStore('home', {
3
+ // state: ():自定义类型 => ({}) 例如: state: (): IHomeState => ({})
4
+ state: () => ({
5
+ username: 'admin',
6
+ accessToken: '',
7
+ roles: []
8
+ }),
9
+ getters: {},
10
+
11
+ actions: {}
12
+ // 开启持久化存储
13
+ // persist: {
14
+ // key: "home", // 存储的key
15
+ // storage: sessionStorage, // 默认是localStorage
16
+ // // 默认情况下,Pinia 会将整个 state 保存到持久化存储中。
17
+ // // pick:[], 挑选出需要存储的state
18
+ // // omit: [], 排除不需要存储的state
19
+ // },
20
+ });
21
+
22
+ export default useHomeStore;
File without changes
@@ -0,0 +1,5 @@
1
+ import { createPinia } from 'pinia';
2
+ import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
3
+ const pinia = createPinia();
4
+ pinia.use(piniaPluginPersistedstate); // 使用pinia持久化插件
5
+ export default pinia;
@@ -0,0 +1,10 @@
1
+ import React, { memo} from "react";
2
+
3
+ const <%= name%> = memo(() => {
4
+
5
+ return (
6
+ <div>component</div>
7
+ );
8
+ });
9
+
10
+ export default <%= name%>;
@@ -0,0 +1,9 @@
1
+ <script setup lang="ts"></script>
2
+
3
+ <template>
4
+ <div class="<%= name %>"></div>
5
+ </template>
6
+
7
+ <style lang="less" scoped>
8
+ .<%=name %> {}
9
+ </style>
@@ -0,0 +1,8 @@
1
+ export default
2
+ {path: '<%=name.toLowerCase()%>', name: '<%=name%>',
3
+ component: () => import(/* webpackChunkName: "<%=name.toLowerCase()%>" */ '@/views/<%=name%>/<%=name.toLowerCase()%>.vue'),
4
+ meta: {
5
+
6
+ }
7
+
8
+ };
@@ -0,0 +1,22 @@
1
+ import { defineStore } from 'pinia';
2
+ const use<%=name%>Store = defineStore('<%=name.toLowerCase()%>', {
3
+ // state: ():自定义类型 => ({}) 例如: state: (): IHomeState => ({})
4
+ state: () => ({
5
+ username: 'admin',
6
+ accessToken: '',
7
+ roles: []
8
+ }),
9
+ getters: {},
10
+
11
+ actions: {}
12
+ // 开启持久化存储
13
+ // persist: {
14
+ // key: "home", // 存储的key
15
+ // storage: sessionStorage, // 默认是localStorage
16
+ // // 默认情况下,Pinia 会将整个 state 保存到持久化存储中。
17
+ // // pick:[], 挑选出需要存储的state
18
+ // // omit: [], 排除不需要存储的state
19
+ // },
20
+ });
21
+
22
+ export default use<%=name%>Store;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hyfcli",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "一个项目开发脚手架工具",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -34,6 +34,7 @@
34
34
  "ora": "^4.1.1"
35
35
  },
36
36
  "devDependencies": {
37
+ "shx": "^0.4.0",
37
38
  "tsup": "^8.5.1",
38
39
  "typescript": "^6.0.3"
39
40
  }