blob: 9ed83a13d0a757122342bb97bf1420e6535319d5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
var path = require('path');
var resolve = require('resolve');
var Immutable = require('immutable');
var Promise = require('../utils/promise');
var error = require('../utils/error');
var timing = require('../utils/timing');
var validatePlugin = require('./validatePlugin');
// Return true if an error is a "module not found"
// Wait on https://github.com/substack/node-resolve/pull/81 to be merged
function isModuleNotFound(err) {
return err.code == 'MODULE_NOT_FOUND' || err.message.indexOf('Cannot find module') >= 0;
}
/**
Load a plugin in a book
@param {Book} book
@param {Plugin} plugin
@param {String} pkgPath (optional)
@return {Promise<Plugin>}
*/
function loadPlugin(book, plugin) {
var logger = book.getLogger();
var name = plugin.getName();
var pkgPath = plugin.getPath();
// Try loading plugins from different location
var p = Promise()
.then(function() {
var packageContent;
var packageMain;
var content;
// Locate plugin and load package.json
try {
var res = resolve.sync('./package.json', { basedir: pkgPath });
pkgPath = path.dirname(res);
packageContent = require(res);
} catch (err) {
if (!isModuleNotFound(err)) throw err;
packageContent = undefined;
content = undefined;
return;
}
// Locate the main package
try {
var indexJs = path.normalize(packageContent.main || 'index.js');
packageMain = resolve.sync('./' + indexJs, { basedir: pkgPath });
} catch (err) {
if (!isModuleNotFound(err)) throw err;
packageMain = undefined;
}
// Load plugin JS content
if (packageMain) {
try {
content = require(packageMain);
} catch(err) {
throw new error.PluginError(err, {
plugin: name
});
}
}
// Update plugin
return plugin.merge({
'package': Immutable.fromJS(packageContent),
'content': Immutable.fromJS(content || {})
});
})
.then(validatePlugin);
p = timing.measure('plugin.load', p);
logger.info('loading plugin "' + name + '"... ');
return logger.info.promise(p);
}
module.exports = loadPlugin;
|