properly handling flattened dependencies in plugin scripts

v1.18.x
Julian Lam 9 years ago
parent c44c689ebf
commit 19b4679c0e

@ -153,22 +153,22 @@ module.exports = function(Plugins) {
} }
Plugins.clientScripts = Plugins.clientScripts.concat(pluginData.scripts.map(function(file) { Plugins.clientScripts = Plugins.clientScripts.concat(pluginData.scripts.map(function(file) {
return path.join(__dirname, '../../node_modules/', pluginData.id, file); return resolveModulePath(path.join(__dirname, '../../node_modules/', pluginData.id, file), file);
})); })).filter(Boolean);
} }
if (Array.isArray(pluginData.acpScripts)) { if (Array.isArray(pluginData.acpScripts)) {
if (global.env === 'development') { if (global.env === 'development') {
winston.verbose('[plugins] Found ' + pluginData.acpScripts.length + ' js file(s) for plugin ' + pluginData.id); winston.verbose('[plugins] Found ' + pluginData.acpScripts.length + ' ACP js file(s) for plugin ' + pluginData.id);
} }
Plugins.acpScripts = Plugins.acpScripts.concat(pluginData.acpScripts.map(function(file) { Plugins.acpScripts = Plugins.acpScripts.concat(pluginData.acpScripts.map(function(file) {
return path.join(__dirname, '../../node_modules/', pluginData.id, file); return resolveModulePath(path.join(__dirname, '../../node_modules/', pluginData.id, file), file);
})); })).filter(Boolean);
} }
callback(); callback();
}; }
function mapClientModules(pluginData, callback) { function mapClientModules(pluginData, callback) {
if (!pluginData.hasOwnProperty('modules')) { if (!pluginData.hasOwnProperty('modules')) {
@ -201,14 +201,16 @@ module.exports = function(Plugins) {
} }
for (var name in pluginData.modules) { for (var name in pluginData.modules) {
modules[name] = path.join('./node_modules/', pluginData.id, pluginData.modules[name]); if (pluginData.modules.hasOwnProperty(name)) {
modules[name] = path.join('./node_modules/', pluginData.id, pluginData.modules[name]);
}
} }
meta.js.scripts.modules = _.extend(meta.js.scripts.modules, modules); meta.js.scripts.modules = _.extend(meta.js.scripts.modules, modules);
} }
callback(); callback();
}; }
function loadLanguages(pluginData, callback) { function loadLanguages(pluginData, callback) {
if (typeof pluginData.languages !== 'string') { if (typeof pluginData.languages !== 'string') {
@ -265,6 +267,30 @@ module.exports = function(Plugins) {
}); });
} }
function resolveModulePath(fullPath, relPath) {
/**
* With npm@3, dependencies can become flattened, and appear at the root level.
* This method resolves these differences if it can.
*/
var atRootLevel = fullPath.match(/node_modules/g).length === 1;
try {
fs.statSync(fullPath);
winston.verbose('[plugins/load] File found: ' + fullPath);
return fullPath;
} catch (e) {
// File not visible to the calling process, ascend to root level if possible and try again
if (!atRootLevel && relPath) {
winston.verbose('[plugins/load] File not found: ' + fullPath + ' (Ascending)');
return resolveModulePath(path.join(__dirname, '../..', relPath));
} else {
// Already at root level, file was simply not found
winston.warn('[plugins/load] File not found: ' + fullPath + ' (Ignoring)');
return null;
}
}
}
Plugins.loadPluginInfo = function(pluginPath, callback) { Plugins.loadPluginInfo = function(pluginPath, callback) {
async.parallel({ async.parallel({
package: function(next) { package: function(next) {

Loading…
Cancel
Save