UNPKG

@tianyio/quality-helper

Version:

A comprehensive quality helper tool for project scaffolding and management

3 lines (2 loc) 6.73 kB
"use strict";const t=require("path"),e=require("url"),o=require("chalk"),i=require("ora"),a=require("./update-config-DZ2VgDK7.cjs"),s=require("./utils-CuBC1baf.cjs"),r=require("./core-file-ops-CkY4H0C_.cjs"),n=require("./services-BHKno3F_.cjs");var c="undefined"!=typeof document?document.currentScript:null;const p=e.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:c&&"SCRIPT"===c.tagName.toUpperCase()&&c.src||new URL("create-project-DoGtMe9J.cjs",document.baseURI).href),l=t.dirname(p);class h{options;constructor(t){this.options=t}async execute(){let t=0;const e=e=>{t++,console.log(o.gray(`[${t}/6] ${e}`))};console.log(o.blue("🚀 开始创建项目...")),console.log();try{e("创建项目结构"),await this.createProjectFolder(),e("复制模板文件"),await this.copyFrameworkFiles(),e("更新项目配置"),await this.updatePackageJsonDependencies(),await this.updateConfigFiles(),e("安装项目依赖"),await this.installDependencies(),e("初始化版本控制"),await this.initializeGitRepository(),await this.initializeHuskyHooks(),await this.copyGitHooksFiles(),e("格式化代码"),await this.formatProjectCode(),this.displayCompletionMessage()}catch(i){throw console.error(o.red("❌ 项目创建失败:"),i),i}}async createProjectFolder(){const e=i("创建项目文件夹...").start();try{const i=t.join(this.options.targetPath,this.options.projectName);await r.FileOperations.ensureDir(i),e.succeed(o.green("项目文件夹创建完成"))}catch(a){throw e.fail(o.red("项目文件夹创建失败")),a}}async copyFrameworkFiles(){const e=i("复制模板文件...").start();try{const i=t.join(this.options.targetPath,this.options.projectName),a=t.join(t.dirname(l),"templates","project-templates"),s="single"===this.options.architectureType?t.join(a,"base"):t.join(a,"monorepo");if(!(await r.FileOperations.exists(s)))throw new Error(`模板目录不存在: ${s}`);await this.copyDirectory(s,i),e.succeed(o.green("模板文件复制完成"))}catch(a){throw e.fail(o.red("模板文件复制失败")),a}}async updateConfigFiles(){const e=i("更新项目配置...").start();try{const i=t.join(this.options.targetPath,this.options.projectName);"single"===this.options.architectureType?await a.updateConfig({projectPath:i,rootPath:i,architectureType:"single",projectType:"app",excludeGitHooks:!0,excludeNpmrc:!0,excludeScripts:!0,silent:!0}):await this.updateMonorepoConfigs(i),e.succeed(o.green("项目配置更新完成"))}catch(s){throw e.fail(o.red("项目配置更新失败")),s}}async updateMonorepoConfigs(t){await a.updateConfig({projectPath:t,rootPath:t,architectureType:"monorepo",projectType:"root",excludeGitHooks:!0,excludeStaticFiles:!0,excludeNpmrc:!0,excludeScripts:!0,silent:!0}),await this.updateAppsConfigs(t),await this.updatePackagesConfigs(t)}async updateAppsConfigs(e){const o=t.join(e,"apps");try{const i=await r.FileOperations.readDirWithFileTypes(o);for(const s of i)if(s.isDirectory()){const i=t.join(o,s.name);await a.updateConfig({projectPath:i,rootPath:e,architectureType:"monorepo",projectType:"app",includeOnly:["build-tools","static-files","types"],silent:!0})}}catch(i){console.warn("无法读取apps目录:",i)}}async updatePackagesConfigs(e){const o=t.join(e,"tools");try{const i=await r.FileOperations.readDirWithFileTypes(o);for(const s of i)if(s.isDirectory()){const i=t.join(o,s.name);await a.updateConfig({projectPath:i,rootPath:e,architectureType:"monorepo",projectType:"lib",includeOnly:["build-tools","types"],silent:!0})}}catch(i){console.warn("无法读取packages目录:",i)}}async updatePackageJsonDependencies(){const e=i("更新项目依赖配置...").start(),a=t.join(this.options.targetPath,this.options.projectName);try{await s.createDependencyManager().updateToRecommendedVersions(a)}catch(r){throw e.fail(o.red(`依赖配置更新失败:${String(r)}`)),r}e.succeed(o.green("依赖配置更新完成"))}async installDependencies(){const e=t.join(this.options.targetPath,this.options.projectName),a=i("安装项目依赖...").start();try{await s.installProjectDependencies(e),a.succeed(o.green("项目依赖安装完成"))}catch(r){throw a.fail(o.red("依赖安装失败")),r}}async initializeGitRepository(){const e=t.join(this.options.targetPath,this.options.projectName),a=i("初始化Git仓库...").start();try{await s.initializeGit(e),a.succeed(o.green("Git仓库初始化完成"))}catch(r){throw a.fail(o.red("Git仓库初始化失败")),r}}async initializeHuskyHooks(){const e=t.join(this.options.targetPath,this.options.projectName),a=i("配置Git钩子...").start();try{await s.initializeHusky(e),a.succeed(o.green("Git钩子配置完成"))}catch{a.warn(o.yellow("Git钩子配置失败,已跳过"))}}async copyGitHooksFiles(){const e=t.join(this.options.targetPath,this.options.projectName),a=t.join(t.dirname(l),"templates"),s=i("复制Git钩子文件...").start();try{const i=t.join(a,"configs","git-hooks"),c=t.join(e,".husky");try{await r.FileOperations.ensureDir(c);const e=await r.FileOperations.readDir(i);for(const o of e){const e=t.join(i,o),a=t.join(c,o);await r.FileOperations.isFile(e)&&(await r.FileOperations.copyFile(e,a),await r.FileOperations.setExecutable(a,493))}}catch(n){console.warn("⚠️ Git钩子复制失败,请手动配置:",n)}s.succeed(o.green("Git钩子文件复制完成"))}catch(n){throw s.fail(o.red("Git钩子文件复制失败")),n}}async formatProjectCode(){const e=t.join(this.options.targetPath,this.options.projectName),a=i("格式化代码...").start();try{await s.formatProject(e,!1),a.succeed(o.green("代码格式化完成"))}catch{a.warn(o.yellow("代码格式化失败,可稍后手动执行"))}}displayCompletionMessage(){console.log(),console.log(o.green("🎉 项目创建成功!")),console.log(o.cyan(`🚀 下一步: cd ${this.options.projectName} && npm run dev`)),console.log();const t="single"===this.options.architectureType?"单体应用":"Monorepo",e="vue3"===this.options.framework?"Vue 3":this.options.framework??"Vue 3";console.log(o.blue(`📦 项目: ${this.options.projectName} (${t} - ${e})`))}async copyDirectory(e,o){await r.FileOperations.ensureDir(o);const i=await r.FileOperations.readDirWithFileTypes(e);for(const a of i){const i=t.join(e,a.name),s=t.join(o,a.name);a.isDirectory()?await this.copyDirectory(i,s):await this.copyFileWithTemplateReplacement(i,s)}}async copyFileWithTemplateReplacement(t,e){const o=(await r.FileOperations.readFile(t)).replace(/\{\{projectName\}\}/g,this.options.projectName);await r.FileOperations.writeFile(e,o)}}exports.createProject=async function(t,e={}){const o=new n.ProjectOptionsService,i=await o.getProjectOptions(t,e),a=new h(i);await a.execute()}; //# sourceMappingURL=create-project-DoGtMe9J.cjs.map