UNPKG

template-syncer

Version:

智能模板同步工具 - 让你的项目与模板仓库保持同步,支持智能合并、差异对比和交互式更新

201 lines (200 loc) 11.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Categorizer = void 0; const path = __importStar(require("path")); const minimatch_1 = require("minimatch"); /** * 默认分类规则 (按优先级排序) */ const DEFAULT_RULES = [ // 包管理 - 锁文件 { match: '**/package-lock.json', category: '包管理', icon: '🔒', priority: 100 }, { match: '**/yarn.lock', category: '包管理', icon: '🧶', priority: 100 }, { match: '**/pnpm-lock.yaml', category: '包管理', icon: '📦', priority: 100 }, { match: '**/bun.lockb', category: '包管理', icon: '🥟', priority: 100 }, { match: '**/Cargo.lock', category: '包管理', icon: '🦀', priority: 100 }, { match: '**/go.sum', category: '包管理', icon: '🐹', priority: 100 }, { match: '**/Gemfile.lock', category: '包管理', icon: '💎', priority: 100 }, { match: '**/poetry.lock', category: '包管理', icon: '🐍', priority: 100 }, { match: '**/Pipfile.lock', category: '包管理', icon: '🐍', priority: 100 }, { match: '**/composer.lock', category: '包管理', icon: '🐘', priority: 100 }, // 项目配置 { match: '**/package.json', category: '项目配置', icon: '📦', priority: 90 }, { match: '**/Cargo.toml', category: '项目配置', icon: '🦀', priority: 90 }, { match: '**/go.mod', category: '项目配置', icon: '🐹', priority: 90 }, { match: '**/pyproject.toml', category: '项目配置', icon: '🐍', priority: 90 }, { match: '**/composer.json', category: '项目配置', icon: '🐘', priority: 90 }, // TypeScript/JavaScript 配置 { match: '**/tsconfig*.json', category: 'TypeScript', icon: '🔷', priority: 85 }, { match: '**/jsconfig.json', category: 'JavaScript', icon: '🟨', priority: 85 }, // 构建工具 { match: '**/vite.config.*', category: '构建配置', icon: '⚡', priority: 80 }, { match: '**/webpack.config.*', category: '构建配置', icon: '📦', priority: 80 }, { match: '**/rollup.config.*', category: '构建配置', icon: '🎯', priority: 80 }, { match: '**/esbuild.config.*', category: '构建配置', icon: '⚡', priority: 80 }, { match: '**/turbo.json', category: '构建配置', icon: '🚀', priority: 80 }, // 框架配置 { match: '**/nuxt.config.*', category: '框架配置', icon: '💚', priority: 80 }, { match: '**/next.config.*', category: '框架配置', icon: '⚫', priority: 80 }, { match: '**/astro.config.*', category: '框架配置', icon: '🚀', priority: 80 }, { match: '**/svelte.config.*', category: '框架配置', icon: '🔥', priority: 80 }, { match: '**/angular.json', category: '框架配置', icon: '🅰️', priority: 80 }, // 代码质量 { match: '**/.eslintrc*', category: '代码质量', icon: '🔍', priority: 75 }, { match: '**/eslint.config.*', category: '代码质量', icon: '🔍', priority: 75 }, { match: '**/.prettierrc*', category: '代码格式化', icon: '💄', priority: 75 }, { match: '**/prettier.config.*', category: '代码格式化', icon: '💄', priority: 75 }, { match: '**/.stylelintrc*', category: '样式检查', icon: '🎨', priority: 75 }, { match: '**/biome.json', category: '代码质量', icon: '🌿', priority: 75 }, // 测试配置 { match: '**/jest.config.*', category: '测试配置', icon: '🃏', priority: 75 }, { match: '**/vitest.config.*', category: '测试配置', icon: '🧪', priority: 75 }, { match: '**/cypress.config.*', category: '测试配置', icon: '🌀', priority: 75 }, { match: '**/playwright.config.*', category: '测试配置', icon: '🎭', priority: 75 }, // 样式配置 { match: '**/tailwind.config.*', category: '样式配置', icon: '🌊', priority: 75 }, { match: '**/unocss.config.*', category: '样式配置', icon: '🎨', priority: 75 }, { match: '**/postcss.config.*', category: '样式配置', icon: '📮', priority: 75 }, // 容器化 { match: '**/Dockerfile*', category: '容器化', icon: '🐳', priority: 70 }, { match: '**/.dockerignore', category: '容器化', icon: '🐳', priority: 70 }, { match: '**/docker-compose*.y*ml', category: '容器化', icon: '🐳', priority: 70 }, { match: '**/compose*.y*ml', category: '容器化', icon: '🐳', priority: 70 }, // CI/CD { match: '**/.github/workflows/*.y*ml', category: 'CI/CD', icon: '🔄', priority: 70 }, { match: '**/.gitlab-ci.yml', category: 'CI/CD', icon: '🦊', priority: 70 }, { match: '**/Jenkinsfile', category: 'CI/CD', icon: '🔧', priority: 70 }, // Xcode/iOS { match: '**/*.xcodeproj/**', category: 'Xcode 项目', icon: '🍎', priority: 65 }, { match: '**/*.xcworkspace/**', category: 'Xcode 工作区', icon: '🍎', priority: 65 }, { match: '**/*.xcassets/**', category: '资源文件', icon: '🎨', priority: 60 }, { match: '**/Info.plist', category: 'iOS 配置', icon: '🍎', priority: 60 }, { match: '**/*.storyboard', category: 'iOS UI', icon: '📱', priority: 55 }, { match: '**/*.xib', category: 'iOS UI', icon: '📱', priority: 55 }, // 版本控制 { match: '**/.gitignore', category: '版本控制', icon: '📋', priority: 65 }, { match: '**/.gitattributes', category: '版本控制', icon: '📋', priority: 65 }, // 编辑器配置 { match: '**/.editorconfig', category: '编辑器配置', icon: '✏️', priority: 65 }, { match: '**/.vscode/**', category: 'VS Code', icon: '💙', priority: 65 }, // 环境配置 { match: '**/.nvmrc', category: '环境配置', icon: '🔧', priority: 60 }, { match: '**/.node-version', category: '环境配置', icon: '🔧', priority: 60 }, { match: '**/.tool-versions', category: '环境配置', icon: '🔧', priority: 60 }, { match: '**/.env*', category: '环境配置', icon: '🌍', priority: 60 }, // 部署配置 { match: '**/vercel.json', category: '部署配置', icon: '▲', priority: 60 }, { match: '**/netlify.toml', category: '部署配置', icon: '🌐', priority: 60 }, { match: '**/fly.toml', category: '部署配置', icon: '🪁', priority: 60 }, // 文档 { match: '**/README*', category: '文档', icon: '📖', priority: 50 }, { match: '**/CHANGELOG*', category: '文档', icon: '📋', priority: 50 }, { match: '**/LICENSE*', category: '许可证', icon: '📄', priority: 50 }, { match: '**/CONTRIBUTING*', category: '文档', icon: '🤝', priority: 50 }, { match: '**/*.md', category: '文档', icon: '📝', priority: 40 }, // 按扩展名分类 (低优先级) { match: '**/*.vue', category: 'Vue 组件', icon: '💚', priority: 30 }, { match: '**/*.tsx', category: 'React 组件', icon: '⚛️', priority: 30 }, { match: '**/*.jsx', category: 'React 组件', icon: '⚛️', priority: 30 }, { match: '**/*.svelte', category: 'Svelte 组件', icon: '🔥', priority: 30 }, { match: '**/*.ts', category: 'TypeScript', icon: '🔷', priority: 20 }, { match: '**/*.js', category: 'JavaScript', icon: '🟨', priority: 20 }, { match: '**/*.mjs', category: 'JavaScript', icon: '🟨', priority: 20 }, { match: '**/*.cjs', category: 'JavaScript', icon: '🟨', priority: 20 }, { match: '**/*.py', category: 'Python', icon: '🐍', priority: 20 }, { match: '**/*.go', category: 'Go', icon: '🐹', priority: 20 }, { match: '**/*.rs', category: 'Rust', icon: '🦀', priority: 20 }, { match: '**/*.java', category: 'Java', icon: '☕', priority: 20 }, { match: '**/*.rb', category: 'Ruby', icon: '💎', priority: 20 }, { match: '**/*.php', category: 'PHP', icon: '🐘', priority: 20 }, { match: '**/*.swift', category: 'Swift', icon: '🍎', priority: 20 }, { match: '**/*.m', category: 'Objective-C', icon: '🍎', priority: 20 }, { match: '**/*.mm', category: 'Objective-C++', icon: '🍎', priority: 20 }, { match: '**/*.h', category: 'Header', icon: '📋', priority: 20 }, { match: '**/*.css', category: '样式文件', icon: '🎨', priority: 20 }, { match: '**/*.scss', category: '样式文件', icon: '🎨', priority: 20 }, { match: '**/*.less', category: '样式文件', icon: '🎨', priority: 20 }, { match: '**/*.html', category: 'HTML', icon: '🌐', priority: 20 }, { match: '**/*.json', category: 'JSON', icon: '📊', priority: 10 }, { match: '**/*.y*ml', category: 'YAML', icon: '📄', priority: 10 }, { match: '**/*.toml', category: 'TOML', icon: '📄', priority: 10 }, { match: '**/*.xml', category: 'XML', icon: '📄', priority: 10 }, { match: '**/*.sh', category: 'Shell 脚本', icon: '🐚', priority: 10 }, { match: '**/*.bat', category: 'Windows 脚本', icon: '🪟', priority: 10 }, { match: '**/*.ps1', category: 'PowerShell', icon: '💙', priority: 10 }, ]; /** * 文件分类器 */ class Categorizer { constructor(customRules = []) { // 合并规则并按优先级排序 this.rules = [...customRules, ...DEFAULT_RULES] .sort((a, b) => (b.priority || 0) - (a.priority || 0)); } /** * 获取文件分类 */ categorize(filePath) { const normalizedPath = filePath.replace(/\\/g, '/'); for (const rule of this.rules) { if ((0, minimatch_1.minimatch)(normalizedPath, rule.match, { dot: true })) { return { category: rule.category, icon: rule.icon }; } } // 默认分类 return this.getDefaultCategory(filePath); } /** * 获取默认分类 */ getDefaultCategory(filePath) { const fileName = path.basename(filePath); // 隐藏文件 if (fileName.startsWith('.')) { return { category: '配置文件', icon: '⚙️' }; } return { category: '其他文件', icon: '📄' }; } /** * 添加自定义规则 */ addRule(rule) { this.rules.unshift(rule); this.rules.sort((a, b) => (b.priority || 0) - (a.priority || 0)); } } exports.Categorizer = Categorizer;