diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-05-27 09:27:11 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-05-27 09:27:11 +0200 |
commit | 6def174b845d6dd392c2f1ef41e94b025b774bf8 (patch) | |
tree | c2c2825fbf2e504202367c4843fa8c63e5cc4d4e /lib/plugins/resolveVersion.js | |
parent | 346a18b4446060eeb53a0a697fa82f1d13ba6cd2 (diff) | |
parent | 465e8d6c0adfe69f696fafa7486541aac55298fe (diff) | |
download | gitbook-6def174b845d6dd392c2f1ef41e94b025b774bf8.zip gitbook-6def174b845d6dd392c2f1ef41e94b025b774bf8.tar.gz gitbook-6def174b845d6dd392c2f1ef41e94b025b774bf8.tar.bz2 |
Merge pull request #1334 from ryanswanson/master
Fixed two issues for handling git URLs for plugins
Diffstat (limited to 'lib/plugins/resolveVersion.js')
-rw-r--r-- | lib/plugins/resolveVersion.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lib/plugins/resolveVersion.js b/lib/plugins/resolveVersion.js new file mode 100644 index 0000000..a24c8a0 --- /dev/null +++ b/lib/plugins/resolveVersion.js @@ -0,0 +1,71 @@ +var npm = require('npm'); +var semver = require('semver'); +var Immutable = require('immutable'); + +var Promise = require('../utils/promise'); +var Plugin = require('../models/plugin'); +var gitbook = require('../gitbook'); + +var npmIsReady; + +/** + Initialize and prepare NPM + + @return {Promise} +*/ +function initNPM() { + if (npmIsReady) return npmIsReady; + + npmIsReady = Promise.nfcall(npm.load, { + silent: true, + loglevel: 'silent' + }); + + return npmIsReady; +} + +/** + Resolve a plugin to a version + + @param {Plugin} + @return {Promise<String>} +*/ +function resolveVersion(plugin) { + var npmId = Plugin.nameToNpmID(plugin.getName()); + var requiredVersion = plugin.getVersion(); + + if (!semver.validRange(requiredVersion)) { + return Promise.resolve(requiredVersion); + } + + return initNPM() + .then(function() { + return Promise.nfcall(npm.commands.view, [npmId + '@' + requiredVersion, 'engines'], true); + }) + .then(function(versions) { + versions = Immutable.Map(versions).entrySeq(); + + var result = versions + .map(function(entry) { + return { + version: entry[0], + gitbook: (entry[1].engines || {}).gitbook + }; + }) + .filter(function(v) { + return v.gitbook && gitbook.satisfies(v.gitbook); + }) + .sort(function(v1, v2) { + return semver.lt(v1.version, v2.version)? 1 : -1; + }) + .get(0); + + if (!result) { + return undefined; + } else { + return result.version; + } + }); +} + +module.exports = resolveVersion; |