Skip to content

Commit e61e7d6

Browse files
piotrpdevdsanders11
andcommitted
refactor(api-history): better semver logic
Co-authored-by: David Sanders <[email protected]> Based-on-patch-by: David Sanders <[email protected]> Reference: #594 (comment)
1 parent 60f5457 commit e61e7d6

File tree

1 file changed

+21
-37
lines changed

1 file changed

+21
-37
lines changed

src/components/ApiHistoryTable.tsx

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Details } from '@docusaurus/theme-common/Details';
22
import React from 'react';
33
import ReactMarkdown from 'react-markdown';
4+
import * as semver from 'semver';
45

56
import {
67
ApiHistory,
@@ -27,47 +28,30 @@ function generateTableRow(
2728
) {
2829
const key = change['pr-url'] + '-' + type;
2930

30-
const allVersions: Array<string> = [];
31+
// Map versions to semver syntax - use a caret unless it was released in
32+
// an X.0.0 release, which gets >= since every release after that has it
33+
const versionRanges: Array<string> = semver
34+
.rsort(prReleaseVersions?.backports ?? [])
35+
.map((version) => (version.endsWith('.0.0') ? '>=' : '^') + version);
3136

37+
// Only include the main release if it wasn't backported and released in
38+
// an X.0.0 release. This consolidates ranges like >=30.0.0 || >=29.0.0
39+
// into a single >=29.0.0 since that's more intuitive for developers.
3240
const release = prReleaseVersions?.release;
33-
if (release) allVersions.push(release);
34-
35-
const backports = prReleaseVersions?.backports;
36-
if (backports) allVersions.push(...backports);
37-
38-
// Sort by major version number e.g. 30.0.0 -> 30 in ascending order i.e. 29, 30, ...
39-
allVersions.sort((a, b) => Number(a.split('.')[0]) - Number(b.split('.')[0]));
40-
41-
const formattedVersions: JSX.Element[] = [];
42-
43-
for (const version of allVersions) {
44-
const [, minor, patch] = version.split('.');
45-
const isBackportMajor =
46-
release !== version && minor === '0' && patch === '0';
47-
48-
const formattedVersion = (
49-
<a
50-
key={version}
51-
href={change['pr-url']}
52-
target="_blank"
53-
rel="noopener noreferrer"
54-
>
55-
{/* Semver shenanigans, feature backported to both ^7.1.0 and ^6.3.0 would not be present in 7.0.0 */}
56-
<pre>
57-
{release === version || isBackportMajor ? '>=' : '^'}
58-
{version}
59-
</pre>
60-
</a>
61-
);
62-
63-
formattedVersions.push(formattedVersion);
64-
65-
// If backport is a major (i.e. >=x.0.0), no need to include the release or any other backports
66-
if (isBackportMajor) break;
41+
if (release && !versionRanges.find((version) => version.startsWith('>='))) {
42+
versionRanges.unshift(`>=${release}`);
6743
}
6844

69-
// Reverse the order of the versions so that the latest version is first i.e. 30, 29, ...
70-
formattedVersions.reverse();
45+
const formattedVersions = versionRanges.map((version) => (
46+
<a
47+
key={version}
48+
href={change['pr-url']}
49+
target="_blank"
50+
rel="noopener noreferrer"
51+
>
52+
<pre>{version}</pre>
53+
</a>
54+
));
7155

7256
let changesJsx: JSX.Element | undefined;
7357

0 commit comments

Comments
 (0)