megawac/SemVish

View on GitHub
index.js

Summary

Maintainability
A
25 mins
Test Coverage
/* jshint eqnull:true */
'use strict';

var _ = require('underscore');
var SemVer = require('semver');
var naturalCmp = require('underscore.string/naturalCmp');
var trim = require('underscore.string/trim');

function interpretVersion(version) {
    // Handle pre-releases
    var preRelease = '';
    var preReleaseIndex = version.indexOf('-');

    // Handle pre-releases without the dash (poor format)
    if (preReleaseIndex < 0 && (preReleaseIndex = version.search(/[a-z]/i)) >= 0) {
        preRelease = '-' + version.slice(preReleaseIndex);
        version = preReleaseIndex === 0 ? '0' : version.slice(0, Math.max(0, preReleaseIndex));
    }
    else if (preReleaseIndex >= 0) {
        preRelease = '-' + version.slice(preReleaseIndex + 1);
        version = version.slice(0, preReleaseIndex);
    }

    // Handle <Max>.<Min> versioning schemes
    var split = version.split('.');
    while (split.length < 3) {
        split.push(0);
    }

    return split.join('.') + preRelease;
}

function SemVish(version, loose) {
    if (version instanceof SemVish) return version;
    if (!(this instanceof SemVer)) return new SemVish(version, loose);
    return _.assign(this, new SemVer(SemVish.clean(version), loose));
}

SemVish.prototype = _.create(SemVer.prototype, {
    compare: function(other) {
        other = new SemVish(other);
        return this.compareMain(other) || this.comparePre(other);
    },
    compareMain: function(other) {
        return SemVer.prototype.compareMain.call(this, new SemVish(other));
    },
    comparePre: function(other) {
        other = new SemVish(other);
        if (!this.prerelease.length || !other.prerelease.length) {
            return !!other.prerelease.length - !!this.prerelease.length;
        }
        return naturalCmp(this.prerelease.join('.'), other.prerelease.join('.'));
    }
});

_.each(['compare', 'rcompare', 'gt', 'lt', 'eq', 'neq', 'gte', 'lte'], function(semverFunc) {
    SemVish[semverFunc] = function(a, b, loose) {
        return SemVer[semverFunc](SemVish(a, loose), SemVish(b, loose), loose);
    };
});

SemVish.cmp = function(a, op, b, loose) {
    return SemVer.cmp(SemVish(a, loose), op, SemVish(b, loose), loose);
};

SemVish.clean = function(version, loose) {
    try {
        version = trim(version).replace(/^[=\-_\s]*(v(ersion)?)?[=\-_\s.]*/i, '');
        return SemVer(interpretVersion(version), loose).version;
    } catch(o_O) {
        return null;
    }
};

SemVish.valid = function(version, loose) {
    return SemVish.clean(version, loose) != null;
};

SemVish.satisfies = function satisfies(version, range, loose) {
  return SemVer.satisfies(new SemVish(version, loose), range, loose);
};

module.exports = SemVish;