From e61e7d6fee589a7a4b6dcede8664bc867bee6875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20P=C5=82aczek?= Date: Mon, 12 Aug 2024 00:39:56 +0100 Subject: [PATCH] refactor(api-history): better semver logic Co-authored-by: David Sanders Based-on-patch-by: David Sanders Reference: https://github.com/electron/website/pull/594#discussion_r1712450684 --- src/components/ApiHistoryTable.tsx | 58 +++++++++++------------------- 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/src/components/ApiHistoryTable.tsx b/src/components/ApiHistoryTable.tsx index c9db540e9..f5135a00c 100644 --- a/src/components/ApiHistoryTable.tsx +++ b/src/components/ApiHistoryTable.tsx @@ -1,6 +1,7 @@ import { Details } from '@docusaurus/theme-common/Details'; import React from 'react'; import ReactMarkdown from 'react-markdown'; +import * as semver from 'semver'; import { ApiHistory, @@ -27,47 +28,30 @@ function generateTableRow( ) { const key = change['pr-url'] + '-' + type; - const allVersions: Array = []; + // Map versions to semver syntax - use a caret unless it was released in + // an X.0.0 release, which gets >= since every release after that has it + const versionRanges: Array = semver + .rsort(prReleaseVersions?.backports ?? []) + .map((version) => (version.endsWith('.0.0') ? '>=' : '^') + version); + // Only include the main release if it wasn't backported and released in + // an X.0.0 release. This consolidates ranges like >=30.0.0 || >=29.0.0 + // into a single >=29.0.0 since that's more intuitive for developers. const release = prReleaseVersions?.release; - if (release) allVersions.push(release); - - const backports = prReleaseVersions?.backports; - if (backports) allVersions.push(...backports); - - // Sort by major version number e.g. 30.0.0 -> 30 in ascending order i.e. 29, 30, ... - allVersions.sort((a, b) => Number(a.split('.')[0]) - Number(b.split('.')[0])); - - const formattedVersions: JSX.Element[] = []; - - for (const version of allVersions) { - const [, minor, patch] = version.split('.'); - const isBackportMajor = - release !== version && minor === '0' && patch === '0'; - - const formattedVersion = ( - - {/* Semver shenanigans, feature backported to both ^7.1.0 and ^6.3.0 would not be present in 7.0.0 */} -
-          {release === version || isBackportMajor ? '>=' : '^'}
-          {version}
-        
-
- ); - - formattedVersions.push(formattedVersion); - - // If backport is a major (i.e. >=x.0.0), no need to include the release or any other backports - if (isBackportMajor) break; + if (release && !versionRanges.find((version) => version.startsWith('>='))) { + versionRanges.unshift(`>=${release}`); } - // Reverse the order of the versions so that the latest version is first i.e. 30, 29, ... - formattedVersions.reverse(); + const formattedVersions = versionRanges.map((version) => ( + +
{version}
+
+ )); let changesJsx: JSX.Element | undefined;