summaryrefslogtreecommitdiffstats
path: root/lib/plugins/resolveVersion.js
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-05-27 09:27:11 +0200
committerSamy Pessé <samypesse@gmail.com>2016-05-27 09:27:11 +0200
commit6def174b845d6dd392c2f1ef41e94b025b774bf8 (patch)
treec2c2825fbf2e504202367c4843fa8c63e5cc4d4e /lib/plugins/resolveVersion.js
parent346a18b4446060eeb53a0a697fa82f1d13ba6cd2 (diff)
parent465e8d6c0adfe69f696fafa7486541aac55298fe (diff)
downloadgitbook-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.js71
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;