From 9764ecb868b566057a4023bf10fda4c82793d3f2 Mon Sep 17 00:00:00 2001 From: Stefan Verhoeven Date: Fri, 10 Apr 2026 14:29:30 +0200 Subject: [PATCH 1/3] Do not show beta with same patch as latest stable Fixes #141 --- src/releaseStats.ts | 33 +++++++++++++------- src/releaseStats.unit.test.ts | 58 +++++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/releaseStats.ts b/src/releaseStats.ts index ce1128c..739c2a8 100644 --- a/src/releaseStats.ts +++ b/src/releaseStats.ts @@ -195,6 +195,9 @@ export function resolveReleaseStats( const installedIsPreRelease = installedVersion && isPreRelease(installedVersion); let latestVersionIs: ReleaseStats['latestVersionIs']; + const lasestPreReleaseSamePatchAsLatestStable = + !!latestStableReleaseVersion && + isSamePatchVersion(latestStableReleaseVersion, latestPreReleaseVersion); if (installedVersion) { latestVersionIs = 'installed'; if (canUpdateToStable && !latestPreReleaseIsNewerThanStable) { @@ -228,18 +231,26 @@ export function resolveReleaseStats( } if (options.allowPreRelease && preReleaseAsset && latestPreReleaseVersion) { if (!installedVersion) { - actions.push({ - type: 'install-pre-release', - asset: preReleaseAsset, - to: latestPreReleaseVersion, - }); + if (lasestPreReleaseSamePatchAsLatestStable) { + // do not offer pre-release with same patch version as stable + } else { + actions.push({ + type: 'install-pre-release', + asset: preReleaseAsset, + to: latestPreReleaseVersion, + }); + } } else if (canUpdateToPreRelease) { - actions.push({ - type: 'update-pre-release', - asset: preReleaseAsset, - to: latestPreReleaseVersion, - from: installedVersion, - }); + if (lasestPreReleaseSamePatchAsLatestStable) { + // do not offer pre-release with same patch version as stable + } else { + actions.push({ + type: 'update-pre-release', + asset: preReleaseAsset, + to: latestPreReleaseVersion, + from: installedVersion, + }); + } } } diff --git a/src/releaseStats.unit.test.ts b/src/releaseStats.unit.test.ts index 0498ba4..1585390 100644 --- a/src/releaseStats.unit.test.ts +++ b/src/releaseStats.unit.test.ts @@ -446,12 +446,6 @@ describe('resolveReleaseStats', () => { from: '1.0.0-beta.1', to: '1.0.0-release.0', }, - { - type: 'update-pre-release', - asset: preAsset, - from: '1.0.0-beta.1', - to: '1.0.0-beta.2', - }, { type: 'uninstall-pre-release', from: '1.0.0-beta.1', @@ -751,6 +745,58 @@ describe('resolveReleaseStats', () => { latestStableRelease: release('1.2.0-release.0', 'stable'), }, ], + [ + 'Pre same version as stable', + { + installed: undefined, + stableRelease: '0.96.1-release.12', + preRelease: '0.96.1-beta.1', + allowPreRelease: true, + removeable: true, + }, + { + actions: [ + { + type: 'install-stable', + asset: stableAsset, + to: '0.96.1-release.12', + }, + ], + latestVersionIs: 'stable', + installedVersion: undefined, + latestPreRelease: release('0.96.1-beta.1', 'pre-release'), + latestStableRelease: release('0.96.1-release.12', 'stable'), + }, + ], + [ + 'Pre same version as stable, older stable installed', + { + installed: '0.96.0-release.0', + stableRelease: '0.96.1-release.12', + preRelease: '0.96.1-beta.1', + allowPreRelease: true, + removeable: true, + }, + { + actions: [ + { + type: 'update-stable', + asset: stableAsset, + from: '0.96.0-release.0', + to: '0.96.1-release.12', + }, + { + type: 'uninstall', + from: '0.96.0-release.0', + moduleId: 'jaspAcceptanceSampling', + }, + ], + latestVersionIs: 'stable', + installedVersion: '0.96.0-release.0', + latestPreRelease: release('0.96.1-beta.1', 'pre-release'), + latestStableRelease: release('0.96.1-release.12', 'stable'), + }, + ], ])('$0', ([_summary, given, expected]) => { const repo: Repository = { id: 'jaspAcceptanceSampling', From 85a81461d056174c750c4de79ee13b3c1a5bab2b Mon Sep 17 00:00:00 2001 From: Stefan Verhoeven Date: Fri, 10 Apr 2026 14:37:22 +0200 Subject: [PATCH 2/3] Words are hard --- src/releaseStats.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/releaseStats.ts b/src/releaseStats.ts index 739c2a8..f81d94c 100644 --- a/src/releaseStats.ts +++ b/src/releaseStats.ts @@ -195,7 +195,7 @@ export function resolveReleaseStats( const installedIsPreRelease = installedVersion && isPreRelease(installedVersion); let latestVersionIs: ReleaseStats['latestVersionIs']; - const lasestPreReleaseSamePatchAsLatestStable = + const latestPreReleaseSamePatchAsLatestStable = !!latestStableReleaseVersion && isSamePatchVersion(latestStableReleaseVersion, latestPreReleaseVersion); if (installedVersion) { @@ -231,7 +231,7 @@ export function resolveReleaseStats( } if (options.allowPreRelease && preReleaseAsset && latestPreReleaseVersion) { if (!installedVersion) { - if (lasestPreReleaseSamePatchAsLatestStable) { + if (latestPreReleaseSamePatchAsLatestStable) { // do not offer pre-release with same patch version as stable } else { actions.push({ @@ -241,7 +241,7 @@ export function resolveReleaseStats( }); } } else if (canUpdateToPreRelease) { - if (lasestPreReleaseSamePatchAsLatestStable) { + if (latestPreReleaseSamePatchAsLatestStable) { // do not offer pre-release with same patch version as stable } else { actions.push({ From fded60b3d130aafa17b268027241620ad90429eb Mon Sep 17 00:00:00 2001 From: Stefan Verhoeven Date: Fri, 10 Apr 2026 14:47:04 +0200 Subject: [PATCH 3/3] More test cases and clearer titles --- src/releaseStats.unit.test.ts | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/releaseStats.unit.test.ts b/src/releaseStats.unit.test.ts index 1585390..a6b7254 100644 --- a/src/releaseStats.unit.test.ts +++ b/src/releaseStats.unit.test.ts @@ -430,7 +430,7 @@ describe('resolveReleaseStats', () => { }, ], [ - 'Pre→stable (newer pre available)', + 'Pre→stable (newer pre available + stable same patch version)', { installed: '1.0.0-beta.1', stableRelease: '1.0.0-release.0', @@ -746,7 +746,7 @@ describe('resolveReleaseStats', () => { }, ], [ - 'Pre same version as stable', + 'Latest pre same version as stable, nothing installed', { installed: undefined, stableRelease: '0.96.1-release.12', @@ -769,7 +769,7 @@ describe('resolveReleaseStats', () => { }, ], [ - 'Pre same version as stable, older stable installed', + 'Latest pre same version as stable, older stable installed', { installed: '0.96.0-release.0', stableRelease: '0.96.1-release.12', @@ -797,6 +797,35 @@ describe('resolveReleaseStats', () => { latestStableRelease: release('0.96.1-release.12', 'stable'), }, ], + [ + 'Latest pre same version as stable, older beta installed', + { + installed: '0.96.0-beta.0', + stableRelease: '0.96.1-release.12', + preRelease: '0.96.1-beta.1', + allowPreRelease: true, + removeable: true, + }, + { + actions: [ + { + type: 'update-stable', + asset: stableAsset, + from: '0.96.0-beta.0', + to: '0.96.1-release.12', + }, + { + type: 'uninstall-pre-release', + from: '0.96.0-beta.0', + moduleId: 'jaspAcceptanceSampling', + }, + ], + latestVersionIs: 'stable', + installedVersion: '0.96.0-beta.0', + latestPreRelease: release('0.96.1-beta.1', 'pre-release'), + latestStableRelease: release('0.96.1-release.12', 'stable'), + }, + ], ])('$0', ([_summary, given, expected]) => { const repo: Repository = { id: 'jaspAcceptanceSampling',