semantic-release/lib/get-release-to-add.js
2022-11-23 16:02:51 -08:00

61 lines
1.9 KiB
JavaScript

import { intersection, uniqBy } from "lodash-es";
import semver from "semver";
import semverDiff from "semver-diff";
import getLastRelease from "./get-last-release.js";
import { getLowerBound, makeTag } from "./utils.js";
/**
* Find releases that have been merged from from a higher branch but not added on the channel of the current branch.
*
* @param {Object} context semantic-release context.
*
* @return {Array<Object>} Last release and next release to be added on the channel of the current branch.
*/
export default (context) => {
const {
branch,
branches,
options: { tagFormat },
} = context;
const higherChannels = branches
// Consider only releases of higher branches
.slice(branches.findIndex(({ name }) => name === branch.name) + 1)
// Exclude prerelease branches
.filter(({ type }) => type !== "prerelease")
.map(({ channel }) => channel || null);
const versiontoAdd = uniqBy(
branch.tags.filter(
({ channels, version }) =>
!channels.includes(branch.channel || null) &&
intersection(channels, higherChannels).length > 0 &&
(branch.type !== "maintenance" || semver.gte(version, getLowerBound(branch.mergeRange)))
),
"version"
).sort((a, b) => semver.compare(b.version, a.version))[0];
if (versiontoAdd) {
const { version, gitTag, channels } = versiontoAdd;
const lastRelease = getLastRelease(context, { before: version });
if (semver.gt(getLastRelease(context).version, version)) {
return;
}
const type = lastRelease.version ? semverDiff(lastRelease.version, version) : "major";
const name = makeTag(tagFormat, version);
return {
lastRelease,
currentRelease: { type, version, channels, gitTag, name, gitHead: gitTag },
nextRelease: {
type,
version,
channel: branch.channel || null,
gitTag: makeTag(tagFormat, version),
name,
gitHead: gitTag,
},
};
}
};