Skip to content

Commit 53b5213

Browse files
committed
Fix #3294 - handle invalid semver strings in crates/:crate_id/versions
* Add a tooltip message and a new icon to components/version-list/row * Handle null returned from `semverParse` in models/version * Add `loose` option to `semverParse` (https://github.com/npm/node-semver#functions)
1 parent c28936d commit 53b5213

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

app/components/version-list/row.hbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
<div local-class="release-track">
1212
{{#if @version.yanked}}
1313
{{svg-jar "trash"}}
14+
{{else if @version.invalidSemver}}
15+
?
1416
{{else if @version.isFirst}}
1517
{{svg-jar "star"}}
1618
{{else}}

app/components/version-list/row.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ export default class VersionRow extends Component {
1010
if (version.yanked) {
1111
return 'This version was yanked';
1212
}
13+
if (version.invalidSemver) {
14+
return `Failed to parse version ${version.num}`;
15+
}
1316
if (version.isFirst) {
1417
return 'This is the first version that was released';
1518
}

app/models/version.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,40 @@ export default class Version extends Model {
4444
}
4545

4646
get semver() {
47-
return semverParse(this.num);
47+
return semverParse(this.num, { loose: true });
48+
}
49+
50+
get invalidSemver() {
51+
return this.semver === null;
4852
}
4953

5054
get isPrerelease() {
55+
if (this.invalidSemver) {
56+
return false;
57+
}
58+
5159
return this.semver.prerelease.length !== 0;
5260
}
5361

5462
get releaseTrack() {
63+
if (this.invalidSemver) {
64+
return null;
65+
}
66+
5567
let { semver } = this;
5668
return `${semver.major}.${semver.major === 0 ? semver.minor : 'x'}`;
5769
}
5870

5971
get isHighestOfReleaseTrack() {
60-
if (this.isPrerelease) {
72+
if (this.isPrerelease || this.invalidSemver) {
6173
return false;
6274
}
6375

6476
let { crate, semver, releaseTrack } = this;
6577
let { versions } = crate;
6678
// find all other non-prerelease versions on the same release track
6779
let sameTrackVersions = versions.filter(
68-
it => it !== this && !it.yanked && !it.isPrerelease && it.releaseTrack === releaseTrack,
80+
it => it !== this && !it.yanked && !it.isPrerelease && !it.invalidSemver && it.releaseTrack === releaseTrack,
6981
);
7082
// check if we're the "highest"
7183
return sameTrackVersions.every(it => it.semver.compare(semver) === -1);

0 commit comments

Comments
 (0)