UNPKG

release-please

Version:

generate release PRs based on the conventionalcommits.org spec

151 lines 6.41 kB
"use strict"; // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); exports.PrereleaseVersioningStrategy = void 0; const default_1 = require("./default"); const version_1 = require("../version"); const versioning_strategy_1 = require("../versioning-strategy"); /** * Regex to match the last set of numbers in a string * Example: 1.2.3-beta01-01 -> 01 */ const PRERELEASE_NUMBER = /(?<number>\d+)(?=\D*$)/; class AbstractPrereleaseVersionUpdate { constructor(prereleaseType) { this.prereleaseType = prereleaseType; } /** * Returns the new bumped prerelease version * * That is, if the current version is 1.2.3-beta01, the next prerelease version * will be 1.2.3-beta02. If no number is found, the prerelease version will be * 1.2.3-beta. If multiple numbers are found, the last set of numbers will be * incremented, e.g. 1.2.3-beta01-01 -> 1.2.3-beta01-02. * * @param {prerelease} string The current version * @returns {Version} The bumped version */ bumpPrerelease(prerelease) { const match = prerelease.match(PRERELEASE_NUMBER); let nextPrerelease = `${prerelease}.1`; if (match === null || match === void 0 ? void 0 : match.groups) { const numberLength = match.groups.number.length; const nextPrereleaseNumber = Number(match.groups.number) + 1; const paddedNextPrereleaseNumber = `${nextPrereleaseNumber}`.padStart(numberLength, '0'); nextPrerelease = prerelease.replace(PRERELEASE_NUMBER, paddedNextPrereleaseNumber); } return nextPrerelease; } } class PrereleasePatchVersionUpdate extends AbstractPrereleaseVersionUpdate { /** * Returns the new bumped version * * @param {Version} version The current version * @returns {Version} The bumped version */ bump(version) { if (version.preRelease) { const nextPrerelease = this.bumpPrerelease(version.preRelease); return new version_1.Version(version.major, version.minor, version.patch, nextPrerelease, version.build); } return new version_1.Version(version.major, version.minor, version.patch + 1, this.prereleaseType, version.build); } } class PrereleaseMinorVersionUpdate extends AbstractPrereleaseVersionUpdate { /** * Returns the new bumped version * * @param {Version} version The current version * @returns {Version} The bumped version */ bump(version) { if (version.preRelease) { if (version.patch === 0) { const nextPrerelease = this.bumpPrerelease(version.preRelease); return new version_1.Version(version.major, version.minor, version.patch, nextPrerelease, version.build); } return new versioning_strategy_1.MinorVersionUpdate().bump(version); } return new version_1.Version(version.major, version.minor + 1, 0, this.prereleaseType, version.build); } } class PrereleaseMajorVersionUpdate extends AbstractPrereleaseVersionUpdate { /** * Returns the new bumped version * * @param {Version} version The current version * @returns {Version} The bumped version */ bump(version) { if (version.preRelease) { if (version.patch === 0 && version.minor === 0) { const nextPrerelease = this.bumpPrerelease(version.preRelease); return new version_1.Version(version.major, version.minor, version.patch, nextPrerelease, version.build); } return new versioning_strategy_1.MajorVersionUpdate().bump(version); } return new version_1.Version(version.major + 1, 0, 0, this.prereleaseType, version.build); } } /** * This versioning strategy will increment the pre-release number for patch * bumps if there is a pre-release number (preserving any leading 0s). * Example: 1.2.3-beta01 -> 1.2.3-beta02. */ class PrereleaseVersioningStrategy extends default_1.DefaultVersioningStrategy { constructor(options = {}) { super(options); this.prereleaseType = options.prereleaseType; } determineReleaseType(version, commits) { // iterate through list of commits and find biggest commit type let breaking = 0; let features = 0; for (const commit of commits) { const releaseAs = commit.notes.find(note => note.title === 'RELEASE AS'); if (releaseAs) { // commits are handled newest to oldest, so take the first one (newest) found this.logger.debug(`found Release-As: ${releaseAs.text}, forcing version`); return new versioning_strategy_1.CustomVersionUpdate(version_1.Version.parse(releaseAs.text).toString()); } if (commit.breaking) { breaking++; } else if (commit.type === 'feat' || commit.type === 'feature') { features++; } } if (breaking > 0) { if (version.isPreMajor && this.bumpMinorPreMajor) { return new PrereleaseMinorVersionUpdate(this.prereleaseType); } else { return new PrereleaseMajorVersionUpdate(this.prereleaseType); } } else if (features > 0) { if (version.isPreMajor && this.bumpPatchForMinorPreMajor) { return new PrereleasePatchVersionUpdate(this.prereleaseType); } else { return new PrereleaseMinorVersionUpdate(this.prereleaseType); } } return new PrereleasePatchVersionUpdate(this.prereleaseType); } } exports.PrereleaseVersioningStrategy = PrereleaseVersioningStrategy; //# sourceMappingURL=prerelease.js.map