Files
fusion/scripts/lib/extract-version-notes.mjs
gsxdsm 901f7124f3 feat(changelog): U4 — wire distillation into local release path
Capture changeset entries before 'changeset version' deletes them,
distill deterministic notes post-version, and replace the version's
section in the root CHANGELOG with curated end-user notes.
2026-06-24 19:25:38 -07:00

73 lines
2.2 KiB
JavaScript

/**
* Extract the changelog section for a specific version from the root CHANGELOG.md content.
* @param {string} content - Full CHANGELOG.md content (as formatted by syncRootChangelog)
* @param {string} version - Bare version string (e.g. "0.16.0"), NOT "v"-prefixed
* @returns {string} Release notes body, or a fallback like "Release v{version}" if not found
*/
export function extractVersionNotes(content, version) {
const fallback = `Release v${version}`;
if (!content || !version) {
return fallback;
}
const lines = content.split(/\r?\n/);
const header = `## ${version}`;
const startIndex = lines.findIndex((line) => line.trim() === header);
if (startIndex === -1) {
return fallback;
}
let endIndex = lines.length;
for (let i = startIndex + 1; i < lines.length; i += 1) {
if (lines[i].startsWith("## ")) {
endIndex = i;
break;
}
}
const body = lines.slice(startIndex + 1, endIndex).join("\n").trim();
return body || fallback;
}
/**
* Replace the changelog section for a specific version with new content.
*
* FNXC:Changelog 2026-06-24-16:00:
* After syncRootChangelog aggregates per-package CHANGELOGs into the root
* CHANGELOG, the distilled end-user notes replace the raw per-package
* aggregate for the current version. Historical versions are preserved.
*
* @param {string} content - Full CHANGELOG.md content
* @param {string} version - Bare version string (e.g. "0.47.0")
* @param {string} newBody - New markdown body for the version section
* @returns {string} Updated CHANGELOG.md content, or original if version not found
*/
export function replaceVersionSection(content, version, newBody) {
if (!content || !version) {
return content;
}
const lines = content.split(/\r?\n/);
const header = `## ${version}`;
const startIndex = lines.findIndex((line) => line.trim() === header);
if (startIndex === -1) {
return content;
}
let endIndex = lines.length;
for (let i = startIndex + 1; i < lines.length; i += 1) {
if (lines[i].startsWith("## ")) {
endIndex = i;
break;
}
}
const before = lines.slice(0, startIndex + 1);
const after = lines.slice(endIndex);
return [...before, "", newBody.trim(), "", ...after].join("\n").replace(/\n{3,}/g, "\n\n");
}