diff options
-rw-r--r-- | CHANGES.md | 6 | ||||
-rw-r--r-- | lib/cli/server.js | 23 | ||||
-rw-r--r-- | lib/models/plugin.js | 15 | ||||
-rw-r--r-- | lib/models/pluginDependency.js | 20 | ||||
-rw-r--r-- | lib/plugins/__tests__/installPlugin.js | 29 | ||||
-rw-r--r-- | lib/plugins/__tests__/installPlugins.js | 30 | ||||
-rw-r--r-- | lib/plugins/installPlugin.js | 47 | ||||
-rw-r--r-- | lib/plugins/installPlugins.js | 43 | ||||
-rw-r--r-- | package.json | 4 |
9 files changed, 160 insertions, 57 deletions
@@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 3.0.3 +- Fix redirection in `gitbook serve` when accessing a folder without trailing slash +- Fix links/annotations for glossary not being correctly resolved +- Fix regression for supporting uppercase filenames in structure files +- Fix `gitbook install` when using Git URLs for plugins + ## 3.0.2 - Fix crash for anchor links diff --git a/lib/cli/server.js b/lib/cli/server.js index 555bbb7..752f867 100644 --- a/lib/cli/server.js +++ b/lib/cli/server.js @@ -71,11 +71,18 @@ Server.prototype.start = function(dir, port) { // Redirect to directory's index.html function redirect() { + var resultURL = urlTransform(req.url, function(parsed) { + parsed.pathname += '/'; + return parsed; + }); + res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); + res.setHeader('Location', resultURL); + res.end('Redirecting to ' + resultURL); } + res.setHeader('X-Current-Location', req.url); + // Send file send(req, url.parse(req.url).pathname, { root: dir @@ -106,4 +113,16 @@ Server.prototype.start = function(dir, port) { }); }; +/** + urlTransform is a helper function that allows a function to transform + a url string in it's parsed form and returns the new url as a string + + @param {String} uri + @param {Function} fn + @return {String} +*/ +function urlTransform(uri, fn) { + return url.format(fn(url.parse(uri))); +} + module.exports = Server; diff --git a/lib/models/plugin.js b/lib/models/plugin.js index 23019aa..e3d6c4d 100644 --- a/lib/models/plugin.js +++ b/lib/models/plugin.js @@ -1,9 +1,10 @@ var Immutable = require('immutable'); var TemplateBlock = require('./templateBlock'); -var PREFIX = require('../constants/pluginPrefix'); var DEFAULT_VERSION = '*'; +var PluginDependency = require('./pluginDependency'); + var Plugin = Immutable.Record({ name: String(), @@ -53,7 +54,7 @@ Plugin.prototype.getDepth = function() { @return {String} */ Plugin.prototype.getNpmID = function() { - return Plugin.nameToNpmID(this.getName()); + return PluginDependency.nameToNpmID(this.getName()); }; /** @@ -152,14 +153,6 @@ Plugin.createFromDep = function(dep) { }); }; -/** - Return NPM id for a plugin name - - @param {String} - @return {String} -*/ -Plugin.nameToNpmID = function(s) { - return PREFIX + s; -}; +Plugin.nameToNpmID = PluginDependency.nameToNpmID; module.exports = Plugin; diff --git a/lib/models/pluginDependency.js b/lib/models/pluginDependency.js index e5deef0..f668013 100644 --- a/lib/models/pluginDependency.js +++ b/lib/models/pluginDependency.js @@ -2,6 +2,7 @@ var is = require('is'); var semver = require('semver'); var Immutable = require('immutable'); +var PREFIX = require('../constants/pluginPrefix'); var DEFAULT_VERSION = '*'; /* @@ -31,6 +32,15 @@ PluginDependency.prototype.isEnabled = function() { }; /** + Return NPM ID for the dependency + + @return {String} +*/ +PluginDependency.prototype.getNpmID = function() { + return PluginDependency.nameToNpmID(this.getName()); +}; + +/** Is the plugin using a git dependency @return {Boolean} @@ -140,4 +150,14 @@ PluginDependency.listToArray = function(list) { .toJS(); }; +/** + Return NPM id for a plugin name + + @param {String} + @return {String} +*/ +PluginDependency.nameToNpmID = function(s) { + return PREFIX + s; +}; + module.exports = PluginDependency; diff --git a/lib/plugins/__tests__/installPlugin.js b/lib/plugins/__tests__/installPlugin.js new file mode 100644 index 0000000..0c1a346 --- /dev/null +++ b/lib/plugins/__tests__/installPlugin.js @@ -0,0 +1,29 @@ +var path = require('path'); + +var PluginDependency = require('../../models/pluginDependency'); +var Book = require('../../models/book'); +var NodeFS = require('../../fs/node'); +var installPlugin = require('../installPlugin'); + +var Parse = require('../../parse'); + +describe('installPlugin', function() { + var book; + + this.timeout(30000); + + before(function() { + var fs = NodeFS(path.resolve(__dirname, '../../../')); + var baseBook = Book.createForFS(fs); + + return Parse.parseConfig(baseBook) + .then(function(_book) { + book = _book; + }); + }); + + it('must install a plugin from NPM', function() { + var dep = PluginDependency.createFromString('ga'); + return installPlugin(book, dep); + }); +}); diff --git a/lib/plugins/__tests__/installPlugins.js b/lib/plugins/__tests__/installPlugins.js new file mode 100644 index 0000000..1a66f90 --- /dev/null +++ b/lib/plugins/__tests__/installPlugins.js @@ -0,0 +1,30 @@ +var path = require('path'); + +var Book = require('../../models/book'); +var NodeFS = require('../../fs/node'); +var installPlugins = require('../installPlugins'); + +var Parse = require('../../parse'); + +describe('installPlugins', function() { + var book; + + this.timeout(30000); + + before(function() { + var fs = NodeFS(path.resolve(__dirname, '../../../')); + var baseBook = Book.createForFS(fs); + + return Parse.parseConfig(baseBook) + .then(function(_book) { + book = _book; + }); + }); + + it('must install all plugins from NPM', function() { + return installPlugins(book) + .then(function(n) { + expect(n).toBe(2); + }); + }); +}); diff --git a/lib/plugins/installPlugin.js b/lib/plugins/installPlugin.js new file mode 100644 index 0000000..37852df --- /dev/null +++ b/lib/plugins/installPlugin.js @@ -0,0 +1,47 @@ +var npmi = require('npmi'); + +var Promise = require('../utils/promise'); +var resolveVersion = require('./resolveVersion'); + +/** + Install a plugin for a book + + @param {Book} + @param {PluginDependency} + @return {Promise} +*/ +function installPlugin(book, plugin) { + var logger = book.getLogger(); + + var installFolder = book.getRoot(); + var name = plugin.getName(); + var requirement = plugin.getVersion(); + + logger.info.ln(''); + logger.info.ln('installing plugin "' + name + '"'); + + // Find a version to install + return resolveVersion(plugin) + .then(function(version) { + if (!version) { + throw new Error('Found no satisfactory version for plugin "' + name + '" with requirement "' + requirement + '"'); + } + + logger.info.ln('install plugin "' + name +'" (' + requirement + ') from NPM with version', version); + return Promise.nfcall(npmi, { + 'name': plugin.getNpmID(), + 'version': version, + 'path': installFolder, + 'npmLoad': { + 'loglevel': 'silent', + 'loaded': true, + 'prefix': installFolder + } + }); + }) + .then(function() { + logger.info.ok('plugin "' + name + '" installed with success'); + }); +} + +module.exports = installPlugin; diff --git a/lib/plugins/installPlugins.js b/lib/plugins/installPlugins.js index 3137a0a..a0365b3 100644 --- a/lib/plugins/installPlugins.js +++ b/lib/plugins/installPlugins.js @@ -3,48 +3,7 @@ var npmi = require('npmi'); var pkg = require('../../package.json'); var DEFAULT_PLUGINS = require('../constants/defaultPlugins'); var Promise = require('../utils/promise'); -var resolveVersion = require('./resolveVersion'); - -/** - Install a plugin for a book - - @param {Book} - @param {PluginDependency} - @return {Promise} -*/ -function installPlugin(book, plugin) { - var logger = book.getLogger(); - - var installFolder = book.getRoot(); - var name = plugin.getName(); - var requirement = plugin.getVersion(); - - logger.info.ln(''); - logger.info.ln('installing plugin "' + name + '"'); - - // Find a version to install - return resolveVersion(plugin) - .then(function(version) { - if (!version) { - throw new Error('Found no satisfactory version for plugin "' + name + '" with requirement "' + requirement + '"'); - } - - logger.info.ln('install plugin "' + name +'" (' + requirement + ') from NPM with version', version); - return Promise.nfcall(npmi, { - 'name': plugin.getNpmID(), - 'version': version, - 'path': installFolder, - 'npmLoad': { - 'loglevel': 'silent', - 'loaded': true, - 'prefix': installFolder - } - }); - }) - .then(function() { - logger.info.ok('plugin "' + name + '" installed with success'); - }); -} +var installPlugin = require('./installPlugin'); /** diff --git a/package.json b/package.json index 71e3695..65d03a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gitbook", - "version": "3.0.2", + "version": "3.0.3", "homepage": "https://www.gitbook.com", "description": "Library and cmd utility to generate GitBooks", "main": "lib/index.js", @@ -29,7 +29,7 @@ "gitbook-plugin-lunr": "1.1.0", "gitbook-plugin-search": "2.2.1", "gitbook-plugin-sharing": "1.0.2", - "gitbook-plugin-theme-default": "1.0.2", + "gitbook-plugin-theme-default": "1.0.3", "github-slugid": "1.0.1", "graceful-fs": "4.1.4", "i18n-t": "1.0.0", |