UNPKG

@tianyio/quality-helper

Version:

A comprehensive quality helper tool for project scaffolding and management

193 lines (189 loc) 6.46 kB
import { readFile } from "fs/promises"; import { execSync } from "child_process"; class GitService { static execCommand(command) { try { const output = execSync(command, { stdio: "pipe", encoding: "utf8", timeout: 5e3 // 5秒超时 }).toString().trim(); return { success: true, output }; } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; return { success: false, output: "", error: errorMessage }; } } /** * 获取所有 Git 信息 */ static getAllGitInfo() { const gitCommands = { commitHash: "git rev-parse HEAD", commitShort: "git rev-parse --short HEAD", branch: "git rev-parse --abbrev-ref HEAD", tag: 'git describe --tags --exact-match 2>/dev/null || echo ""', commitCount: "git rev-list --count HEAD", commitDate: "git log -1 --format=%ci", commitMessage: "git log -1 --format=%s", author: "git log -1 --format=%an", email: "git log -1 --format=%ae", dirty: "git diff --quiet; echo $?" }; return Object.entries(gitCommands).reduce( (acc, [key, command]) => { const result = this.execCommand(command); acc[key] = result.success ? result.output : ""; return acc; }, {} ); } } const pad = (num, length) => { return String(num).padStart(length, "0"); }; const defaultTimeFormatter = (timeStamp) => { const year = timeStamp.getFullYear(); const month = pad(timeStamp.getMonth() + 1, 2); const day = pad(timeStamp.getDate(), 2); const hours = pad(timeStamp.getHours(), 2); const minutes = pad(timeStamp.getMinutes(), 2); const seconds = pad(timeStamp.getSeconds(), 2); const milliseconds = pad(timeStamp.getMilliseconds(), 3); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`; }; class VersionInfoService { /** * 生成版本信息 */ static async generateVersionInfo(options = {}) { const { includeGitInfo = true, includeBuildTime = true, timeFormatter = defaultTimeFormatter } = options; const versionInfo = {}; if (includeBuildTime) { const now = /* @__PURE__ */ new Date(); versionInfo.buildTime = timeFormatter(now); versionInfo.buildTimestamp = now.getTime(); } if (includeGitInfo) { Object.assign(versionInfo, GitService.getAllGitInfo()); } return versionInfo; } /** * 从 package.json 获取基本信息 */ static async getPackageInfo(root) { try { const packageJsonPath = `${root}/package.json`; const packageContent = await readFile(packageJsonPath, "utf-8"); const pkg = JSON.parse(packageContent); return { name: pkg["name"], version: pkg["version"] }; } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; throw new Error(`无法读取 package.json: ${errorMessage}`); } } } class Logger { needPrint; constructor(needPrint) { this.needPrint = needPrint; } info(message) { if (this.needPrint) console.log(message); } warn(message) { if (this.needPrint) console.warn(message); } error(message) { if (this.needPrint) console.error(message); } } function versionInfoPlugin(options = {}) { const virtualModuleId = "virtual:version-info"; const logger = new Logger(process.env["NODE_ENV"] === "development"); let versionInfo = {}; const resolvedVirtualModuleId = `\0${virtualModuleId}`; return { name: "version-info", async configResolved(config) { try { try { await VersionInfoService.getPackageInfo(config.root); } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; logger.warn(`⚠️ ${errorMessage}`); } versionInfo = { // ...packageInfo, ...await VersionInfoService.generateVersionInfo(options) }; logger.info("\n📦 版本信息:"); logger.info(` 项目名称: ${versionInfo.name ?? "未知"}`); logger.info(` 版本号: ${versionInfo.version ?? "未知"}`); logger.info(` 构建时间: ${versionInfo.buildTime}`); logger.info(` Git 分支: ${versionInfo.gitBranch}`); logger.info(` Git 提交: ${versionInfo.gitCommitShort}`); logger.info(` Git 标签: ${versionInfo.gitTag}`); logger.info(""); } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; logger.error(`⚠️ 版本信息生成失败: ${errorMessage}`); versionInfo = {}; } }, resolveId(id) { if (id === virtualModuleId) { return resolvedVirtualModuleId; } return null; }, load(id) { if (id === resolvedVirtualModuleId) { return ` // 版本信息虚拟模块 // 由 @tcsl/quality-helper 自动生成 export const versionInfo = ${JSON.stringify(versionInfo, null, 2)} // 导出各个字段以便按需使用 export const name = ${JSON.stringify(versionInfo.name)} export const version = ${JSON.stringify(versionInfo.version)} export const buildTime = ${JSON.stringify(versionInfo.buildTime)} export const buildTimestamp = ${JSON.stringify(versionInfo.buildTimestamp)} export const gitCommitHash = ${JSON.stringify(versionInfo.gitCommitHash)} export const gitCommitShort = ${JSON.stringify(versionInfo.gitCommitShort)} export const gitBranch = ${JSON.stringify(versionInfo.gitBranch)} export const gitTag = ${JSON.stringify(versionInfo.gitTag)} export const gitCommitCount = ${JSON.stringify(versionInfo.gitCommitCount)} export const gitCommitDate = ${JSON.stringify(versionInfo.gitCommitDate)} export const gitCommitMessage = ${JSON.stringify(versionInfo.gitCommitMessage)} export const gitAuthor = ${JSON.stringify(versionInfo.gitAuthor)} export const gitEmail = ${JSON.stringify(versionInfo.gitEmail)} export const gitDirty = ${JSON.stringify(versionInfo.gitDirty)} // 默认导出完整的版本信息 export default versionInfo `; } return null; } }; } export { versionInfoPlugin }; //# sourceMappingURL=version-plugin.js.map