UNPKG

@tianyio/quality-helper

Version:

A comprehensive quality helper tool for project scaffolding and management

3 lines (2 loc) 7.35 kB
"use strict";const t=require("path"),i=require("./core-file-ops-CkY4H0C_.cjs");class e{static async getAvailableConfigFiles(t,i,s){const r=[];return await e.scanTemplateDirectories(t,i,r,s),r}static applyFilters(t,i){const{includeOnly:e=[],excludeGitHooks:s,excludeStaticFiles:r,excludeScripts:n}=i??{},o=e.length>0;return o||s||r||n?t.filter(({dir:t})=>{const[,i]=t.split("/");return o?e.includes(i):(!s||"git-hooks"!==i)&&((!r||"static-files"!==i)&&(!n||"scripts"!==i))}):t}static async scanTemplateDirectories(s,r,n,o){const c=[{dir:"configs/rules",targetDir:"rules",priority:11},{dir:"configs/env",targetDir:"env",priority:10},{dir:"configs/static-files",targetDir:"",priority:9},{dir:"configs/types",targetDir:"types",priority:8},{dir:"configs/develop-tools",targetDir:"",priority:7},{dir:"configs/build-tools",targetDir:"",priority:6},{dir:"configs/scripts",targetDir:"scripts",priority:5},{dir:"configs/npm",targetDir:"",priority:4},{dir:"configs/git-hooks",targetDir:".husky",priority:3},{dir:"configs/git-config",targetDir:"",priority:2},{dir:"configs/docs",targetDir:"",priority:1}],a=e.applyFilters(c,o);for(const{dir:l,targetDir:p,priority:d}of a){const c=t.join(s,l);try{const t=await i.FileOperations.readDir(c);await e.processTemplateFiles(t,c,p,d,l,r,n,o)}catch{continue}}}static async processTemplateFiles(i,s,r,n,o,c,a,l){for(const p of i){if(e.shouldSkipFile(p,l))continue;const i=t.join(s,p),{finalTargetPath:d,displayName:g}=e.resolveFilePaths(p,r,c);if(!a.some(t=>t.name===g)){const t=e.determineFileGroup(o),[s,r]=e.getCommentFix(g),c={name:g,path:d,templatePath:i,description:e.getFileDescription(g),commentPrefix:s,commentSuffix:r,group:t,priority:n};a.push(c)}}}static shouldSkipFile(t,i){if(".vscode"===t)return!0;if(i?.excludeNpmrc&&"npmrc"===t)return!0;if([/^\.DS_Store$/,/^Thumbs\.db$/,/^node_modules$/,/^dist$/,/^build$/,/^\.cache/,/^\.temp/,/^\.tmp/,/~$/,/\.bak$/,/\.swp$/,/\.swo$/].some(i=>i.test(t)))return!0;return["apps","libs","single","monorepo"].includes(t)}static resolveFilePaths(i,e,s){let r,n;return"vite.svg"===i?(r=t.join(s,"public",i),n=i):["browserslistrc","editorconfig","lintstagedrc","prettierignore","gitattributes","gitconfig","gitignore","npmrc","pnpmrc"].includes(i)?(r=t.join(s,`.${i}`),n=`.${i}`):(r=e?t.join(s,e,i):t.join(s,i),n=i),{finalTargetPath:r,displayName:n}}static determineFileGroup(t){return"configs/types"===t?"types":"configs/rules"===t?"rules":"configs/env"===t?"env":"configs/git-hooks"===t?"git-hooks":"configs/npm"===t?"npm":"configs/develop-tools"===t?"develop-tools":"configs/git-config"===t?"git-config":t.includes("configs/build-tools")?"build-tools":t.includes("configs/docs")?"docs":"configs/static-files"===t?"static-files":"configs/scripts"===t?"scripts":"other"}static getFileDescription(t){const i={eslint:"ESLint 代码质量检查配置",prettier:"Prettier 代码格式化配置",".editorconfig":"EditorConfig 编辑器配置",".gitignore":"Git 忽略文件配置",".gitattributes":"Git 属性配置","package.json":"Node.js 项目配置文件","tsconfig.json":"TypeScript 编译配置","vite.config":"Vite 构建工具配置",".npmrc":"npm 包管理器配置",".pnpmrc":"pnpm 包管理器配置",".env":"环境变量配置文件","base.d.ts":"TypeScript 环境变量类型定义","pre-commit":"Git 提交前钩子","commit-msg":"Git 提交信息钩子","vite.svg":"Vite 项目图标","babel.config":"Babel编译配置(预设、插件)",".browserslistrc":"浏览器兼容性配置文件","commitlint.config":"CommitLint 规范提交信息",lintstage:"LintStaged 提交前代码检查"};for(const e in i)if(t.includes(e))return i[e];return`${t} 配置文件`}static getCommentFix(t){if(t.endsWith(".js")||t.endsWith(".ts")||t.endsWith(".jsx")||t.endsWith(".tsx"))return["//",""];if(t.endsWith(".css")||t.endsWith(".scss")||t.endsWith(".sass")||t.endsWith(".less"))return["/*","*/"];if(t.endsWith(".html")||t.endsWith(".xml")||t.endsWith(".svg")||t.endsWith(".vue"))return["\x3c!--","--\x3e"];if(t.endsWith(".sh")||t.endsWith(".bash")||t.endsWith(".zsh"))return["#",""];if(t.endsWith(".py")||t.endsWith(".rb")||t.endsWith(".php"))return["#",""];if(t.endsWith(".yaml")||t.endsWith(".yml"))return["#",""];return t.startsWith(".env")||[".browserslistrc",".editorconfig",".gitattributes",".gitconfig",".gitignore",".lintstagedrc",".npmrc",".pnpmrc",".prettierignore"].includes(t)?["#",""]:["//",""]}static async isMonorepoRoot(e){try{const s=["pnpm-workspace.yaml","lerna.json","rush.json"];for(const o of s)if(await i.FileOperations.exists(t.join(e,o)))return!0;const r=t.join(e,"package.json"),n=await i.FileOperations.readFile(r);return!!JSON.parse(n).workspaces}catch{return!1}}static async findProjectRoot(s=process.cwd()){let r=s,n=null,o=null;for(;r!==t.dirname(r);){const s=t.join(r,"package.json");if(await i.FileOperations.exists(s)){n??=r,o=r;if(await e.isMonorepoRoot(r))return{projectPath:n,rootPath:r}}r=t.dirname(r)}return{projectPath:n,rootPath:o}}static async findPackageJsonFiles(e){const s=[],r=async e=>{const n=await i.FileOperations.readDirWithFileTypes(e);for(const i of n){const n=t.join(e,i.name);"package.json"===i.name&&i.isFile()?s.push(n):i.isDirectory()&&!i.name.startsWith(".")&&"node_modules"!==i.name&&await r(n)}};return await r(e),s}static async detectArchitectureType(t){return await e.isMonorepoRoot(t)?"monorepo":"single"}static async detectProjectType(s){try{const r=t.join(s,"package.json");if(!(await i.FileOperations.exists(r)))return"app";if("monorepo"===await e.detectArchitectureType(s)){if(await e.isMonorepoRoot(s))return"root"}const n=await i.FileOperations.readFile(r),o=JSON.parse(n);let c=0;const a=!!o.exports,l=!!o.main,p=!!o.module,d=!!(o.types??o.typings),g=!!o.files;a&&(c+=3),l&&(c+=2),p&&(c+=2),d&&(c+=2),g&&(c+=1);const u=o.keywords??[],f=["library","component","util","tool","helper","sdk","api","framework","module","package","plugin","extension","widget","ui","esm","cjs"];u.some(t=>f.includes(t.toLowerCase()))&&(c+=2);const m=o.devDependencies??{},h=["jest","vitest","mocha","karma","vite-plugin-dts"];Object.keys(m).some(t=>h.some(i=>t.includes(i)))&&(c+=2);return!!o.publishConfig&&(c+=1),c>=5?"lib":"app"}catch(r){return console.warn("⚠️ 项目类型检测失败,使用默认类型:",r),"app"}}static async updatePackageJsonScripts(s){const r=t.join(s,"package.json");try{const t=JSON.parse(await i.FileOperations.readFile(r)),n={build:"vue-tsc --noEmit && vite build",preview:"vite preview"},o=await e.generateEnvBuildScripts(s);t.scripts={...n,...t.scripts,...o},await i.FileOperations.writeFile(r,JSON.stringify(t,null,2))}catch(n){console.warn("⚠️ package.json脚本更新失败:",n)}}static async generateEnvBuildScripts(s){const r={};try{const n=t.join(s,"env"),o=await e.scanEnvFilesInDirectory(await i.FileOperations.exists(n)?n:s);for(const t of o){const i=e.extractModeFromEnvFile(t);i&&(r[`build:${i}`]=`vite build --mode ${i}`)}}catch(n){console.warn("⚠️ 生成环境构建脚本失败:",n)}return r}static async scanEnvFilesInDirectory(t){try{return(await i.FileOperations.readDir(t)).filter(t=>t.startsWith(".env.")&&!t.endsWith(".example")&&!t.endsWith(".local"))}catch{return[]}}static extractModeFromEnvFile(t){const i=t.replace(/^\.env\./,"");return/^[a-zA-Z0-9.-]+$/.test(i)&&i.length>0?i:null}}exports.Discovery=e; //# sourceMappingURL=core-discovery-DoUt3gJ3.cjs.map