From 82d4779367154ded012cc41d48fb8959180543a0 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Sun, 25 Jun 2017 10:45:20 -0400 Subject: [PATCH] feat(filter): filter out prerelease tags, close #98 --- .../filter-allowed-spec.js.snap-shot | 22 +++++++++++++++++++ src/filter-allowed-spec.js | 10 ++++++++- src/filter-allowed-updates.js | 8 ++++++- src/utils.js | 13 ++++++++++- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/__snapshots__/filter-allowed-spec.js.snap-shot b/__snapshots__/filter-allowed-spec.js.snap-shot index 3f0b076..72b8875 100644 --- a/__snapshots__/filter-allowed-spec.js.snap-shot +++ b/__snapshots__/filter-allowed-spec.js.snap-shot @@ -96,3 +96,25 @@ exports['can custom filter 1'] = { ] } +exports['detects prerelease 1'] = { + "name": "isPrerelease", + "behavior": [ + { + "given": "3.0.0-alpha", + "expect": true + }, + { + "given": "3.0.0", + "expect": false + }, + { + "given": "0.1.0", + "expect": false + }, + { + "given": "10.0.0-beta.2", + "expect": true + } + ] +} + diff --git a/src/filter-allowed-spec.js b/src/filter-allowed-spec.js index fcc1ec4..074ae81 100644 --- a/src/filter-allowed-spec.js +++ b/src/filter-allowed-spec.js @@ -2,20 +2,28 @@ const la = require('lazy-ass') const snapShot = require('snap-shot') const filter = require('./filter-allowed-updates') const {clone, equals} = require('ramda') +const {isPrerelease} = require('./utils') /* global describe, it, afterEach */ describe('filter allowed', () => { const current = { q: { name: 'q', version: '1.1.1', type: 'dev' } } - const available = [ { name: 'q', versions: [ '1.3.0', '2.0.2', '3.0.0' ] } ] + const available = [ { name: 'q', + versions: [ '1.3.0', '2.0.2', '3.0.0', '3.0.0-alpha', '3.0.0-rc0' ] } ] const copy = clone(available) afterEach(() => { + // sanity check to make sure we are not + // mutating the input objects la(equals(available, copy), 'original available list is unchanged', available, copy) }) + it('detects prerelease', () => { + snapShot(isPrerelease, '3.0.0-alpha', '3.0.0', '0.1.0', '10.0.0-beta.2') + }) + it('allows major', () => { const options = { allowed: 'major' diff --git a/src/filter-allowed-updates.js b/src/filter-allowed-updates.js index 8d4d9c2..7bf5297 100644 --- a/src/filter-allowed-updates.js +++ b/src/filter-allowed-updates.js @@ -4,6 +4,7 @@ var semver = require('semver') var _ = require('lodash') const R = require('ramda') const debug = require('debug')('next-update') +const {isPrerelease} = require('./utils') la(check.fn(semver.diff), 'semver missing diff method', semver) @@ -105,7 +106,12 @@ function filterAllowedUpdates (current, available, options) { var versions = availableUpdate.versions la(check.array(versions), 'missing versions in update', availableUpdate) - var filteredVersions = versions.filter(_.partial(filterVersions, fromVersion)) + const filterByUpgradeType = _.partial(filterVersions, fromVersion) + const notPrerelease = R.complement(isPrerelease) + + var filteredVersions = versions + .filter(notPrerelease) + .filter(filterByUpgradeType) availableUpdate.versions = filteredVersions return availableUpdate.versions.length > 0 } diff --git a/src/utils.js b/src/utils.js index 9b29aab..13da2d8 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,6 +1,8 @@ const la = require('lazy-ass') const is = require('check-more-types') const R = require('ramda') +const semver = require('semver') +const debug = require('debug')('next-update') const name = 'next-update' @@ -44,11 +46,20 @@ const stringify = (x) => JSON.stringify(x, null, 2) const errorObject = (x) => (new Error(stringify(x))) +function isPrerelease (version) { + la(is.unemptyString(version), 'expected version string', version) + // https://github.com/npm/node-semver#functions + const prereleaseComponents = semver.prerelease(version) + debug('version %s prerelease components %j', version, prereleaseComponents) + return is.array(prereleaseComponents) && is.not.empty(prereleaseComponents) +} + module.exports = { name, getConfig, getSkippedModules, getTestCommand, stringify, - errorObject + errorObject, + isPrerelease }