Skip to content
This repository has been archived by the owner on Jun 12, 2024. It is now read-only.

Adjust version-sort for XX.XX.XX format #132

Merged
merged 4 commits into from
May 24, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## Master

- Use [`compare-versions`](https://www.npmjs.com/package/compare-versions) in the version-sort helper function. [#132](https://github.com/mapbox/dr-ui/pull/132)

## 0.12.2

- Debounce `Search` results. [#129](https://github.com/mapbox/dr-ui/pull/129)
Expand Down
19 changes: 19 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"babel-eslint": "^8.2.6",
"babelify": "^10.0.0",
"budo": "^11.6.0",
"compare-versions": "^3.4.0",
"cpy": "^7.0.1",
"cpy-cli": "^2.0.0",
"del": "^3.0.0",
Expand Down
65 changes: 35 additions & 30 deletions src/helpers/version-sort.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,48 @@
const compareVersions = require('compare-versions'); //eslint-disable-line

const sortBy = key => (a, b) =>
a[key] > b[key] ? 1 : b[key] > a[key] ? -1 : 0;

export function sortVersions(versions) {
const ordered = versions.reduce((arr, v) => {
const version = v.split('-')[0]; // remove beta or alpha flag
const num = parseInt(version.split('.').join('')); // parse version as number
arr.push({ version, num, v });
return arr;
}, []);

const allVersionsOrdered = [
...new Set( // make uniq
ordered
.sort(sortBy('num')) // sort by the integer
.reverse() // put in descending order
.map(a => a.v)
)
];

// make sure versions are in order
const allVersionsOrdered = versions.sort(compareVersions).reverse();
// get the latest stable version
const latestStable = allVersionsOrdered
.filter(version => {
return /alpha|beta|rc|pre/.test(version) === false;
})
.slice(0, 1)[0];
// create regex to find prereleases for latest version
const allLatestVersion = new RegExp(`^${latestStable}-.+`);
// check for latest prereleases
const latestVersionPreReleases = allVersionsOrdered.reduce((arr, version) => {
if (allLatestVersion.test(version)) {
arr.push({ version });
}
return arr;
}, []);
// check for any release greater than latesst
const laterThanLatest = allVersionsOrdered.reduce((arr, version) => {
if (compareVersions(version, latestStable) === 1) {
arr.push({ version });
}
return arr;
}, []);
// if there is any prerelease greater than latest use that
// else use the latest version's prereleases
// else do nothing
const sortPreReleases = laterThanLatest.length
? laterThanLatest
: latestVersionPreReleases.length
? latestVersionPreReleases
: [];

const allLatestVersion = new RegExp(`^${latestStable}.+`);

const newestPreRelease = allVersionsOrdered
.reduce((arr, version, index) => {
if (
index < allVersionsOrdered.indexOf(latestStable) &&
!allLatestVersion.test(version)
)
arr.push({ version });
return arr;
}, [])
.sort(sortBy('version'))
.reverse()
.map(v => v.version);
const newestPreRelease =
sortPreReleases &&
sortPreReleases
.sort(sortBy('version'))
.reverse()
.map(v => v.version);

const versionsToDisplay = allVersionsOrdered.filter(version => {
return !/^(\d|\.)+-(alpha|beta|rc|pre).+/.test(version);
Expand Down
16 changes: 16 additions & 0 deletions tests/sample/ios.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
[
"5.0.0-beta.1",
"5.0.0",
"4.12.0-beta.1",
"4.11.0",
"4.12.0-alpha.2",
"4.12.0-alpha.1",
"4.11.0-beta.2",
"4.11.0-beta.1",
"4.10.0",
"4.11.0-alpha.2",
"4.10.0-beta.3",
"4.11.0-alpha.1",
"4.10.0-beta.2",
"4.10.0-beta.1",
"4.10.0-alpha.2",
"4.10.0-alpha.1",
"4.9.0",
"4.9.0-beta.1",
"4.9.0-alpha.2",
Expand Down
95 changes: 58 additions & 37 deletions tests/version-sort.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ describe('pre-release', () => {

test(`allVersionsOrdered`, () => {
expect(sortVersions(arr).allVersionsOrdered).toEqual([
'4.9.0-alpha.1',
'4.9.0-alpha.2',
'4.9.0-beta.1',
'4.8.0-alpha.1',
'4.8.0-alpha.2',
'4.8.0-beta.1',
'4.9.0-alpha.2',
'4.9.0-alpha.1',
'4.8.0',
'4.8.0-beta.1',
'4.8.0-alpha.2',
'4.8.0-alpha.1',
'4.7.1'
]);
});
Expand All @@ -33,7 +33,7 @@ describe('pre-release', () => {
});

test(`allLatestVersion`, () => {
expect(sortVersions(arr).allLatestVersion).toEqual(/^4.8.0.+/);
expect(sortVersions(arr).allLatestVersion).toEqual(/^4.8.0-.+/);
});

test(`newestPreRelease`, () => {
Expand All @@ -52,21 +52,37 @@ describe('pre-release', () => {
describe('ios', () => {
test(`allVersionsOrdered`, () => {
expect(sortVersions(allIosVersions).allVersionsOrdered).toEqual([
'5.0.0',
'5.0.0-beta.1',
'4.12.0-beta.1',
'4.12.0-alpha.2',
'4.12.0-alpha.1',
'4.11.0',
'4.11.0-beta.2',
'4.11.0-beta.1',
'4.11.0-alpha.2',
'4.11.0-alpha.1',
'4.10.0',
'4.10.0-beta.3',
'4.10.0-beta.2',
'4.10.0-beta.1',
'4.10.0-alpha.2',
'4.10.0-alpha.1',
'4.9.0',
'4.9.0-beta.1',
'4.9.0-alpha.2',
'4.9.0-alpha.1',
'4.9.0-beta.1',
'4.8.0',
'4.8.0-beta.1',
'4.8.0-alpha.2',
'4.8.0-alpha.1',
'4.7.1',
'4.7.0-alpha.2',
'4.7.0',
'4.7.0-beta.2',
'4.7.0-beta.1',
'4.7.0-alpha.3',
'4.7.0-alpha.2',
'4.7.0-alpha.1',
'4.7.0',
'4.6.0',
'4.6.0-beta.1',
'4.6.0-alpha.2',
Expand All @@ -77,30 +93,30 @@ describe('ios', () => {
'4.5.0-alpha.1',
'4.4.1',
'4.4.0',
'4.4.0-alpha.1',
'4.4.0-beta.1',
'4.4.0-alpha.2',
'4.3.0-beta.1',
'4.4.0-alpha.1',
'4.3.0',
'4.3.0-beta.1',
'4.3.0-alpha.2',
'4.3.0-alpha.1',
'4.2.0',
'4.2.0-alpha.1',
'4.2.0-alpha.2',
'4.2.0-alpha.1',
'4.1.1',
'4.1.0-alpha.1',
'4.1.0-beta.1',
'4.1.0',
'4.1.0-beta.1',
'4.1.0-alpha.1',
'4.0.5',
'4.0.4',
'4.0.3',
'4.0.2',
'4.0.1',
'4.0.0',
'4.0.0-rc.1',
'4.0.0-beta.3',
'4.0.0-beta.1',
'4.0.0-beta.2',
'4.0.0',
'4.0.0-beta.1',
'3.7.8',
'3.7.7',
'3.7.6',
Expand All @@ -110,101 +126,106 @@ describe('ios', () => {
'3.7.2',
'3.7.1',
'3.7.0',
'3.7.0-alpha.1',
'3.7.0-beta.2',
'3.7.0-beta.1',
'3.7.0-rc.1',
'3.7.0-beta.4',
'3.7.0-beta.3',
'3.7.0-beta.2',
'3.7.0-beta.1',
'3.7.0-alpha.1',
'3.6.4',
'3.6.3',
'3.6.2',
'3.6.1',
'3.6.0',
'3.6.0-rc.1',
'3.6.0-beta.3',
'3.6.0-beta.2',
'3.6.0-beta.1',
'3.6.0-alpha.1',
'3.6.0',
'3.5.4',
'3.5.3',
'3.5.2',
'3.5.1',
'3.5.0',
'3.5.0-beta.1',
'3.5.0-rc.2',
'3.5.0-rc.1',
'3.5.0-beta.3',
'3.5.0-beta.2',
'3.5.0-rc.2',
'3.5.0-beta.1',
'3.4.2',
'3.4.1',
'3.4.0',
'3.4.0-rc.1',
'3.4.0-beta.7',
'3.4.0-alpha.3',
'3.4.0-beta.6',
'3.4.0-beta.5',
'3.4.0-beta.4',
'3.4.0-alpha.2',
'3.4.0-beta.3',
'3.4.0-alpha.1',
'3.4.0-beta.6',
'3.4.0-beta.2',
'3.4.0-beta.1',
'3.4.0-alpha.5',
'3.4.0-alpha.4',
'3.4.0-alpha.3',
'3.4.0-alpha.2',
'3.4.0-alpha.1',
'3.3.7',
'3.3.6',
'3.3.5',
'3.3.4',
'3.3.3',
'3.3.2',
'3.3.1',
'3.3.0-beta.2',
'3.3.0',
'3.3.0-rc.2',
'3.3.0-rc.1',
'3.3.0-beta.3',
'3.3.0-alpha.1',
'3.3.0-alpha.2',
'3.3.0-beta.2',
'3.3.0-beta.1',
'3.3.0-alpha.3',
'3.3.0-alpha.2',
'3.3.0-alpha.1',
'3.2.3',
'3.2.2',
'3.2.2-rc.1',
'3.2.1',
'3.2.0-pre.1',
'3.2.0',
'3.2.0-rc.1',
'3.2.0-pre.3',
'3.2.0-pre.2',
'3.2.0-pre.1',
'3.2.0-beta.3',
'3.2.0-beta.2',
'3.2.0-beta.1',
'3.2.0-pre.3',
'3.2.0-pre.2',
'3.1.2',
'3.1.1',
'3.1.1-pre.1',
'3.1.1-pre.2',
'3.1.0-pre.3',
'3.1.1-pre.1',
'3.1.0',
'3.1.0-pre.4',
'3.1.0-pre.3',
'3.1.0-pre.2',
'3.1.0-pre.1'
]);
});

test(`latestStable`, () => {
expect(sortVersions(allIosVersions).latestStable).toEqual('4.9.0');
expect(sortVersions(allIosVersions).latestStable).toEqual('5.0.0');
});

test(`allLatestVersion`, () => {
expect(sortVersions(allIosVersions).allLatestVersion).toEqual(/^4.9.0.+/);
expect(sortVersions(allIosVersions).allLatestVersion).toEqual(/^5.0.0-.+/);
});

test(`newestPreRelease`, () => {
expect(sortVersions(allIosVersions).newestPreRelease).toEqual([]);
expect(sortVersions(allIosVersions).newestPreRelease).toEqual([
'5.0.0-beta.1'
]);
});
test(`versionsToDisplay`, () => {
expect(sortVersions(allIosVersions).versionsToDisplay).toEqual([
'5.0.0',
'4.11.0',
'4.10.0',
'4.9.0',
'4.8.0',
'4.7.1',
Expand Down