1
1
import { Details } from '@docusaurus/theme-common/Details' ;
2
2
import React from 'react' ;
3
3
import ReactMarkdown from 'react-markdown' ;
4
+ import * as semver from 'semver' ;
4
5
5
6
import {
6
7
ApiHistory ,
@@ -27,47 +28,30 @@ function generateTableRow(
27
28
) {
28
29
const key = change [ 'pr-url' ] + '-' + type ;
29
30
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 ) ;
31
36
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.
32
40
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 } ` ) ;
67
43
}
68
44
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
+ ) ) ;
71
55
72
56
let changesJsx : JSX . Element | undefined ;
73
57
0 commit comments