UNPKG

kaven-utils

Version:

Utils for Node.js.

113 lines (112 loc) 5.26 kB
/******************************************************************** * @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"); } }