From e503f20cf618ccb2e68bf702eec8a69ad26ba5ea Mon Sep 17 00:00:00 2001 From: Arno V Date: Sat, 31 Jan 2026 08:15:06 -0500 Subject: [PATCH] fix(bundlecheck): Ignore prerelease versions in trend selection Filter out semver prerelease versions (canary, alpha, beta, rc, etc.) when selecting versions for trend analysis. This adds an import of prerelease from semver and returns only stable versions before slicing to the requested count, preventing unstable releases from skewing trend results. --- .../bundlecheck/src/__tests__/trend.test.ts | 50 +++++++++++++++++++ packages/bundlecheck/src/trend.ts | 8 ++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/packages/bundlecheck/src/__tests__/trend.test.ts b/packages/bundlecheck/src/__tests__/trend.test.ts index 4c7bc1bf..01ec203c 100644 --- a/packages/bundlecheck/src/__tests__/trend.test.ts +++ b/packages/bundlecheck/src/__tests__/trend.test.ts @@ -48,6 +48,56 @@ describe("selectTrendVersions", () => { const result = selectTrendVersions([]); expect(result).toEqual([]); }); + + it("should filter out canary versions", () => { + const versions = [ + "19.3.0-canary-abc123", + "19.2.4", + "19.2.3", + "19.2.0-canary-xyz789", + "19.2.2", + ]; + const result = selectTrendVersions(versions, 3); + expect(result).toEqual(["19.2.4", "19.2.3", "19.2.2"]); + }); + + it("should filter out alpha versions", () => { + const versions = ["2.0.0-alpha.1", "1.2.0", "1.1.0-alpha.2", "1.0.0"]; + const result = selectTrendVersions(versions, 3); + expect(result).toEqual(["1.2.0", "1.0.0"]); + }); + + it("should filter out beta versions", () => { + const versions = ["3.0.0-beta.1", "2.0.0", "1.5.0-beta.2", "1.0.0"]; + const result = selectTrendVersions(versions, 3); + expect(result).toEqual(["2.0.0", "1.0.0"]); + }); + + it("should filter out rc versions", () => { + const versions = ["3.0.0-rc.1", "2.0.0", "1.5.0-rc.2", "1.0.0"]; + const result = selectTrendVersions(versions, 3); + expect(result).toEqual(["2.0.0", "1.0.0"]); + }); + + it("should filter out all prerelease types mixed together", () => { + const versions = [ + "5.0.0-canary.1", + "4.0.0-alpha.1", + "3.0.0-beta.1", + "2.0.0-rc.1", + "1.2.0", + "1.1.0", + "1.0.0", + ]; + const result = selectTrendVersions(versions, 3); + expect(result).toEqual(["1.2.0", "1.1.0", "1.0.0"]); + }); + + it("should return empty array if all versions are prereleases", () => { + const versions = ["2.0.0-canary.1", "1.5.0-alpha.1", "1.0.0-beta.1"]; + const result = selectTrendVersions(versions, 3); + expect(result).toEqual([]); + }); }); describe("renderTrendGraph", () => { diff --git a/packages/bundlecheck/src/trend.ts b/packages/bundlecheck/src/trend.ts index 5fa771a3..8d1ae634 100644 --- a/packages/bundlecheck/src/trend.ts +++ b/packages/bundlecheck/src/trend.ts @@ -1,5 +1,6 @@ import { Logger } from "@node-cli/logger"; import kleur from "kleur"; +import { prerelease } from "semver"; import { checkBundleSize, formatBytes } from "./bundler.js"; import { TREND_VERSION_COUNT } from "./defaults.js"; @@ -21,13 +22,16 @@ export type TrendOptions = { /** * Select versions for trend analysis - * Returns the most recent versions (newest first) + * Returns the most recent stable versions (newest first) + * Filters out prerelease versions (canary, alpha, beta, rc, etc.) */ export function selectTrendVersions( allVersions: string[], count: number = TREND_VERSION_COUNT, ): string[] { - return allVersions.slice(0, count); + // Filter out prerelease versions (canary, alpha, beta, rc, etc.) + const stableVersions = allVersions.filter((v) => !prerelease(v)); + return stableVersions.slice(0, count); } /**