@@ -137,6 +137,48 @@ function readPackageJSONAtRef(ref) {
137137 return JSON . parse ( packageJSONAtRef ) ;
138138}
139139
140+ function getReleaseDistTag ( version , latestVersion ) {
141+ const { major, prerelease } = parseSemVer ( version ) ;
142+ if ( prerelease != null ) {
143+ return getPrereleaseDistTag ( prerelease ) ;
144+ }
145+
146+ return major >= parseSemVer ( latestVersion ) . major
147+ ? 'latest'
148+ : `latest-${ major } ` ;
149+ }
150+
151+ function isLatestReleaseVersion ( version , latestVersion ) {
152+ const { major, prerelease } = parseSemVer ( version ) ;
153+ return prerelease == null && major >= parseSemVer ( latestVersion ) . major ;
154+ }
155+
156+ function isPrereleaseVersion ( version ) {
157+ return parseSemVer ( version ) . prerelease != null ;
158+ }
159+
160+ function parseSemVer ( version ) {
161+ const versionMatch =
162+ / ^ (?< major > \d + ) \. \d + \. \d + (?: - (?< prerelease > [ 0 - 9 A - Z a - z - ] + (?: \. [ 0 - 9 A - Z a - z - ] + ) * ) ) ? (?: \+ [ 0 - 9 A - Z a - z - ] + (?: \. [ 0 - 9 A - Z a - z - ] + ) * ) ? $ / . exec (
163+ version ,
164+ ) ;
165+ if ( versionMatch ?. groups == null ) {
166+ throw new Error ( 'Version does not match semver spec: ' + version ) ;
167+ }
168+
169+ const { major, prerelease } = versionMatch . groups ;
170+ return {
171+ major : Number ( major ) ,
172+ prerelease : prerelease ?? null ,
173+ } ;
174+ }
175+
176+ function getPrereleaseDistTag ( prerelease ) {
177+ const splittedTag = prerelease . split ( '.' ) ;
178+ // Note: `experimental-*` take precedence over `alpha`, `beta` or `rc`.
179+ return splittedTag [ 2 ] ?? splittedTag [ 0 ] ;
180+ }
181+
140182function tagExists ( tag ) {
141183 const result = childProcess . spawnSync (
142184 'git' ,
@@ -148,6 +190,9 @@ function tagExists(tag) {
148190
149191module . exports = {
150192 exec,
193+ getReleaseDistTag,
194+ isLatestReleaseVersion,
195+ isPrereleaseVersion,
151196 spawn,
152197 spawnOutput,
153198 readdirRecursive,
0 commit comments