astro-ghostcms/.pnpm-store/v3/files/43/ddf1ae23f0544d810c4196b2ffe...

110 lines
3.2 KiB
Plaintext
Raw Normal View History

2024-02-14 14:10:47 +00:00
import { ChangelogFunctions, NewChangesetWithCommit } from "@changesets/types";
import { ModCompWithPackage } from "@changesets/types";
import startCase from "lodash.startcase";
import { shouldUpdateDependencyBasedOnConfig } from "./utils";
type ChangelogLines = {
major: Array<Promise<string>>;
minor: Array<Promise<string>>;
patch: Array<Promise<string>>;
};
async function generateChangesForVersionTypeMarkdown(
obj: ChangelogLines,
type: keyof ChangelogLines
) {
let releaseLines = await Promise.all(obj[type]);
releaseLines = releaseLines.filter((x) => x);
if (releaseLines.length) {
return `### ${startCase(type)} Changes\n\n${releaseLines.join("\n")}\n`;
}
}
// release is the package and version we are releasing
export default async function getChangelogEntry(
release: ModCompWithPackage,
releases: ModCompWithPackage[],
changesets: NewChangesetWithCommit[],
changelogFuncs: ChangelogFunctions,
changelogOpts: any,
{
updateInternalDependencies,
onlyUpdatePeerDependentsWhenOutOfRange,
}: {
updateInternalDependencies: "patch" | "minor";
onlyUpdatePeerDependentsWhenOutOfRange: boolean;
}
) {
if (release.type === "none") return null;
const changelogLines: ChangelogLines = {
major: [],
minor: [],
patch: [],
};
// I sort of feel we can do better, as ComprehensiveReleases have an array
// of the relevant changesets but since we need the version type for the
// release in the changeset, I don't know if we can
// We can filter here, but that just adds another iteration over this list
changesets.forEach((cs) => {
const rls = cs.releases.find((r) => r.name === release.name);
if (rls && rls.type !== "none") {
changelogLines[rls.type].push(
changelogFuncs.getReleaseLine(cs, rls.type, changelogOpts)
);
}
});
let dependentReleases = releases.filter((rel) => {
const dependencyVersionRange = release.packageJson.dependencies?.[rel.name];
const peerDependencyVersionRange =
release.packageJson.peerDependencies?.[rel.name];
const versionRange = dependencyVersionRange || peerDependencyVersionRange;
return (
versionRange &&
shouldUpdateDependencyBasedOnConfig(
{ type: rel.type, version: rel.newVersion },
{
depVersionRange: versionRange,
depType: dependencyVersionRange ? "dependencies" : "peerDependencies",
},
{
minReleaseType: updateInternalDependencies,
onlyUpdatePeerDependentsWhenOutOfRange,
}
)
);
});
let relevantChangesetIds: Set<string> = new Set();
dependentReleases.forEach((rel) => {
rel.changesets.forEach((cs) => {
relevantChangesetIds.add(cs);
});
});
let relevantChangesets = changesets.filter((cs) =>
relevantChangesetIds.has(cs.id)
);
changelogLines.patch.push(
changelogFuncs.getDependencyReleaseLine(
relevantChangesets,
dependentReleases,
changelogOpts
)
);
return [
`## ${release.newVersion}`,
await generateChangesForVersionTypeMarkdown(changelogLines, "major"),
await generateChangesForVersionTypeMarkdown(changelogLines, "minor"),
await generateChangesForVersionTypeMarkdown(changelogLines, "patch"),
]
.filter((line) => line)
.join("\n");
}