summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES.md6
-rw-r--r--lib/cli/server.js23
-rw-r--r--lib/models/plugin.js15
-rw-r--r--lib/models/pluginDependency.js20
-rw-r--r--lib/plugins/__tests__/installPlugin.js29
-rw-r--r--lib/plugins/__tests__/installPlugins.js30
-rw-r--r--lib/plugins/installPlugin.js47
-rw-r--r--lib/plugins/installPlugins.js43
-rw-r--r--package.json4
9 files changed, 160 insertions, 57 deletions
diff --git a/CHANGES.md b/CHANGES.md
index bb8e07b..af226aa 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -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",