From bdc91793a8b1adb76448ebfeaae6e1adfb18926b Mon Sep 17 00:00:00 2001 From: Cameron Yick Date: Wed, 21 Jul 2021 20:27:46 -0400 Subject: [PATCH] feat(plugins/npm): exclude prelease versions when calculating monorepo project version --- plugins/npm/__tests__/npm.test.ts | 15 +++++++++++++++ plugins/npm/src/index.ts | 13 +++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/plugins/npm/__tests__/npm.test.ts b/plugins/npm/__tests__/npm.test.ts index 576868595..453b1cf7e 100644 --- a/plugins/npm/__tests__/npm.test.ts +++ b/plugins/npm/__tests__/npm.test.ts @@ -44,6 +44,16 @@ const monorepoPackagesResult = [ { path: "packages/d", name: "@packages/d", package: { version: "0.1.1" } }, ]; +const monorepoPackagesWithPrereleaseResult = [ + { path: "packages/a", name: "@packages/a", package: { version: "0.1.1" } }, + { path: "packages/b", name: "@packages/b", package: {} }, + { path: "packages/c", name: "@packages/c", package: { version: "0.1.2" } }, + { path: "packages/d", name: "@packages/d", package: { version: "0.1.1" } }, + // This can happen if a new module is published with a breaking version + { path: "packages/e", name: "@packages/e", package: { version: "1.0.0-next.0" } }, + { path: "packages/f", name: "@packages/f", package: { version: "1.0.0-next.0" } }, +]; + const packageTemplate = ({ path, name, @@ -143,6 +153,11 @@ describe("getMonorepoPackage", () => { monorepoPackages.mockReturnValueOnce(monorepoPackagesResult); expect(getMonorepoPackage()).toStrictEqual({ version: "0.1.2" }); }); + + test("should ignore versions from preleases", () => { + monorepoPackages.mockReturnValueOnce(monorepoPackagesWithPrereleaseResult); + expect(getMonorepoPackage()).toStrictEqual({ version: "0.1.2" }); + }); }); const prefixRelease = (str: string) => str; diff --git a/plugins/npm/src/index.ts b/plugins/npm/src/index.ts index 283857019..0cfa8cb50 100644 --- a/plugins/npm/src/index.ts +++ b/plugins/npm/src/index.ts @@ -25,7 +25,7 @@ import { DEFAULT_PRERELEASE_BRANCHES, } from "@auto-it/core"; import getPackages from "get-monorepo-packages"; -import { gt, gte, inc, ReleaseType } from "semver"; +import { gt, gte, inc, prerelease, ReleaseType } from "semver"; import { loadPackageJson, getRepo, @@ -146,6 +146,7 @@ export async function getChangedPackages({ return [...changed]; } + /** Get the package with the greatest version in a monorepo */ export function getMonorepoPackage() { const packages = getPackages(process.cwd()); @@ -154,7 +155,15 @@ export function getMonorepoPackage() { return {} as IPackageJSON; } - const monorepoPackage = packages.reduce((greatest, subPackage) => { + // Remove pre-releases so that released package versions take precedence + let releasedPackages = packages.filter(subPackage => prerelease(subPackage.package?.version || '') === null); + // If doing this would remove all packages, this means were not any @latest releases yet + // In that case, restore the original list of packages. + if (releasedPackages.length === 0) { + releasedPackages = packages; + } + + const monorepoPackage = releasedPackages.reduce((greatest, subPackage) => { if (subPackage.package.version) { if (!greatest.package.version) { return subPackage;