kaven-utils
Version:
Utils for Node.js.
113 lines (112 loc) • 5.26 kB
JavaScript
/********************************************************************
* @author: Kaven
* @email: kaven@wuwenkai.com
* @website: http://blog.kaven.xyz
* @file: [Kaven-Utils] /src/KavenUtility.CI.ts
* @create: 2023-11-25 09:29:51.862
* @modify: 2025-10-14 22:58:04.822
* @version: 6.1.0
* @times: 26
* @lines: 126
* @copyright: Copyright © 2023-2025 Kaven. All Rights Reserved.
* @description: [description]
* @license: [license]
********************************************************************/
import { ArrayInsert, DateTimeFormat, FindKeyValuePair, FormatDate, GetStringBetween, IsEqual, SplitStringByNewline, Strings_CR_LF } from "kaven-basic";
import { join } from "node:path";
import { TryParseVersionFromFile } from "./KavenUtility.js";
import { Execute } from "./KavenUtility.ChildProcess.js";
import { CopyDirectory, CopyToDirectory, DeleteDirectory, FindSubdirectoryByName, GetFileContent, IsDirectory, IsPathExistSync, MakeDirectory, SaveStringToFile } from "./KavenUtility.FileSystem.js";
/**
* @example
* - root
* - Kaven-Utils
* - docs(options.sourceDocumentFileOrDirectory)
* - dist
* - package.json
* - Kaven-Documents(options.targetRootDirectory)
* - kaven-utils(options.targetDirectoryName)
* - version
* - 5.0.4
* - 5.0.3
* - ...
* @since 5.0.5
* @version 2025-10-14
*/
export async function ContinuousIntegrationForDocuments(options) {
const result = await TryParseVersionFromFile(options.sourceVersionFile);
if (result?.version) {
const name = await FindSubdirectoryByName(options.targetRootDirectory, options.targetDirectoryName, true);
const projectName = name ?? options.targetDirectoryName;
const dest = join(options.targetRootDirectory, `${projectName}/${result.version}`);
if (IsPathExistSync(dest)) {
await DeleteDirectory(dest);
}
await MakeDirectory(dest);
if (await IsDirectory(options.sourceDocumentFileOrDirectory)) {
options.logger?.Info(`CopyDirectory: ${options.sourceDocumentFileOrDirectory} -> ${dest}`);
await CopyDirectory(options.sourceDocumentFileOrDirectory, dest);
}
else {
options.logger?.Info(`CopyToDirectory: ${options.sourceDocumentFileOrDirectory} -> ${dest}`);
await CopyToDirectory([options.sourceDocumentFileOrDirectory], dest);
}
if (options.updateReadmeFile) {
const readmeFileName = options.readmeFileName ?? "README.md";
const readmeFile = join(options.targetRootDirectory, `${projectName}/${readmeFileName}`);
const lines = SplitStringByNewline(await GetFileContent(readmeFile));
const index = lines.indexOf(options.readmeFileTableLine ?? "|---|---|");
if (index >= 0) {
const nextLine = lines[index + 1];
if (nextLine !== undefined) {
const version = GetStringBetween(nextLine, "[", "]")[0];
if (version === result.version) {
throw new Error(`version ${version} already exists`);
}
}
const now = new Date();
const newLine = `| [${result.version}](${result.version}) | [${FormatDate(now, DateTimeFormat.YearMonthDay)}](# "${now.toISOString()}") |`;
ArrayInsert(lines, index + 1, newLine);
await SaveStringToFile(lines.join(Strings_CR_LF), readmeFile);
}
else {
throw new Error("table not found");
}
}
if (options.gitCommit) {
const run = async (cmd) => {
options.logger?.Info(cmd);
await Execute(cmd, {
execOptions: {
cwd: options.targetRepositoryDirectory ?? options.targetRootDirectory,
},
});
};
await run("git add .");
await run(`git commit -m "${projectName}@${result.version}"`);
}
if (options?.commands) {
for (const item of options.commands) {
const placeholders = GetStringBetween(item.command, "${{", "}}");
for (const placeholder of placeholders) {
if (options.variables) {
const pair = FindKeyValuePair(options.variables, placeholder.trim(), true);
if (pair?.value !== undefined) {
item.command = item.command.replaceAll("${{" + placeholder + "}}", pair.value);
continue;
}
}
if (IsEqual(placeholder.trim(), "version")) {
item.command = item.command.replaceAll("${{" + placeholder + "}}", result.version);
continue;
}
options.logger?.Warn("`${{" + placeholder + "}}`" + " not found");
}
await Execute(item);
}
}
}
else {
throw new Error("parse version failed");
}
}