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

Commit

Permalink
adjust version-sort for XX.XX.XX format (#132)
Browse files Browse the repository at this point in the history
* adjust for middle numbers that are two digits

* use compare-version

* pretty

* update changelog
  • Loading branch information
Colleen McGinnis authored May 24, 2019
1 parent c584db0 commit 3ac20ef
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 67 deletions.
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

0 comments on commit 3ac20ef

Please sign in to comment.