@tianyio/quality-helper
Version:
A comprehensive quality helper tool for project scaffolding and management
193 lines (189 loc) • 6.46 kB
JavaScript
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