mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-06 15:42:52 +01:00
Merge pull request #5821 from NodeBB/scoped-plugins
Support scoped plugin npm packages Also fix logging in VS Code with the inspector debugger
This commit is contained in:
17
app.js
17
app.js
@@ -37,6 +37,7 @@ var winston = require('winston');
|
||||
var path = require('path');
|
||||
var pkg = require('./package.json');
|
||||
var file = require('./src/file');
|
||||
var debug = require('./src/meta/debugParams')().execArgv.length;
|
||||
|
||||
global.env = process.env.NODE_ENV || 'production';
|
||||
|
||||
@@ -52,6 +53,22 @@ winston.add(winston.transports.Console, {
|
||||
stringify: (!!nconf.get('json-logging')),
|
||||
});
|
||||
|
||||
if (debug) {
|
||||
var winstonCommon = require('winston/lib/winston/common');
|
||||
// Override to use real console.log etc for VSCode debugger
|
||||
winston.transports.Console.prototype.log = function (level, message, meta, callback) {
|
||||
const output = winstonCommon.log(Object.assign({}, this, {
|
||||
level,
|
||||
message,
|
||||
meta,
|
||||
}));
|
||||
|
||||
console[level in console ? level : 'log'](output);
|
||||
|
||||
setImmediate(callback, null, true);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// Alternate configuration file support
|
||||
var configFile = path.join(__dirname, '/config.json');
|
||||
|
||||
@@ -20,7 +20,7 @@ define('admin/extend/plugins', ['jqueryui', 'translator'], function (jqueryui, t
|
||||
pluginsList.on('click', 'button[data-action="toggleActive"]', function () {
|
||||
var pluginEl = $(this).parents('li');
|
||||
pluginID = pluginEl.attr('data-plugin-id');
|
||||
var btn = $('#' + pluginID + ' [data-action="toggleActive"]');
|
||||
var btn = $('[id="' + pluginID + '"] [data-action="toggleActive"]');
|
||||
socket.emit('admin.plugins.toggleActive', pluginID, function (err, status) {
|
||||
if (err) {
|
||||
return app.alertError(err);
|
||||
@@ -30,7 +30,7 @@ define('admin/extend/plugins', ['jqueryui', 'translator'], function (jqueryui, t
|
||||
btn.toggleClass('btn-warning', status.active).toggleClass('btn-success', !status.active);
|
||||
|
||||
// clone it to active plugins tab
|
||||
if (status.active && !$('#active #' + pluginID).length) {
|
||||
if (status.active && !$('#active [id="' + pluginID + '"]').length) {
|
||||
$('#active ul').prepend(pluginEl.clone(true));
|
||||
}
|
||||
|
||||
|
||||
@@ -297,39 +297,76 @@ Plugins.normalise = function (apiReturn, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
Plugins.nodeModulesPath = path.join(__dirname, '../node_modules');
|
||||
|
||||
Plugins.showInstalled = function (callback) {
|
||||
var npmPluginPath = path.join(__dirname, '../node_modules');
|
||||
var pluginNamePattern = /^(@.*?\/)?nodebb-(theme|plugin|widget|rewards)-.*$/;
|
||||
|
||||
async.waterfall([
|
||||
async.apply(fs.readdir, npmPluginPath),
|
||||
|
||||
function (next) {
|
||||
fs.readdir(Plugins.nodeModulesPath, next);
|
||||
},
|
||||
function (dirs, next) {
|
||||
dirs = dirs.filter(function (dir) {
|
||||
return dir.startsWith('nodebb-plugin-') ||
|
||||
dir.startsWith('nodebb-widget-') ||
|
||||
dir.startsWith('nodebb-rewards-') ||
|
||||
dir.startsWith('nodebb-theme-');
|
||||
}).map(function (dir) {
|
||||
return path.join(npmPluginPath, dir);
|
||||
});
|
||||
var pluginPaths = [];
|
||||
|
||||
async.filter(dirs, function (dir, callback) {
|
||||
fs.stat(dir, function (err, stats) {
|
||||
if (err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
return callback(null, false);
|
||||
}
|
||||
return callback(err);
|
||||
}
|
||||
callback(null, stats.isDirectory());
|
||||
});
|
||||
}, next);
|
||||
async.each(dirs, function (dirname, next) {
|
||||
var dirPath = path.join(Plugins.nodeModulesPath, dirname);
|
||||
|
||||
async.waterfall([
|
||||
function (cb) {
|
||||
fs.stat(dirPath, function (err, stats) {
|
||||
if (err && err.code !== 'ENOENT') {
|
||||
return cb(err);
|
||||
}
|
||||
if (err || !stats.isDirectory()) {
|
||||
return next();
|
||||
}
|
||||
|
||||
if (pluginNamePattern.test(dirname)) {
|
||||
pluginPaths.push(dirname);
|
||||
return next();
|
||||
}
|
||||
|
||||
if (dirname[0] !== '@') {
|
||||
return next();
|
||||
}
|
||||
fs.readdir(dirPath, cb);
|
||||
});
|
||||
},
|
||||
function (subdirs, cb) {
|
||||
async.each(subdirs, function (subdir, next) {
|
||||
if (!pluginNamePattern.test(subdir)) {
|
||||
return next();
|
||||
}
|
||||
|
||||
var subdirPath = path.join(dirPath, subdir);
|
||||
fs.stat(subdirPath, function (err, stats) {
|
||||
if (err && err.code !== 'ENOENT') {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
if (err || !stats.isDirectory()) {
|
||||
return next();
|
||||
}
|
||||
|
||||
pluginPaths.push(dirname + '/' + subdir);
|
||||
next();
|
||||
});
|
||||
}, cb);
|
||||
},
|
||||
], next);
|
||||
}, function (err) {
|
||||
next(err, pluginPaths);
|
||||
});
|
||||
},
|
||||
|
||||
function (files, next) {
|
||||
function (dirs, next) {
|
||||
dirs = dirs.map(function (dir) {
|
||||
return path.join(Plugins.nodeModulesPath, dir);
|
||||
});
|
||||
var plugins = [];
|
||||
|
||||
async.each(files, function (file, next) {
|
||||
async.each(dirs, function (file, next) {
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
Plugins.loadPluginInfo(file, next);
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
test/mocks/plugin_modules/nodebb-plugin-xyz/package.json
Normal file
1
test/mocks/plugin_modules/nodebb-plugin-xyz/package.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
test/mocks/plugin_modules/nodebb-plugin-xyz/plugin.json
Normal file
1
test/mocks/plugin_modules/nodebb-plugin-xyz/plugin.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
test/mocks/plugin_modules/something-else/package.json
Normal file
1
test/mocks/plugin_modules/something-else/package.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
test/mocks/plugin_modules/something-else/plugin.json
Normal file
1
test/mocks/plugin_modules/something-else/plugin.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -94,6 +94,23 @@ describe('Plugins', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('should show installed plugins', function (done) {
|
||||
var nodeModulesPath = plugins.nodeModulesPath;
|
||||
plugins.nodeModulesPath = path.join(__dirname, './mocks/plugin_modules');
|
||||
|
||||
plugins.showInstalled(function (err, pluginsData) {
|
||||
assert.ifError(err);
|
||||
var paths = pluginsData.map(function (plugin) {
|
||||
return path.relative(plugins.nodeModulesPath, plugin.path).replace(/\\/g, '/');
|
||||
});
|
||||
assert(paths.indexOf('nodebb-plugin-xyz') > -1);
|
||||
assert(paths.indexOf('@nodebb/nodebb-plugin-abc') > -1);
|
||||
|
||||
plugins.nodeModulesPath = nodeModulesPath;
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
describe('install/activate/uninstall', function () {
|
||||
var latest;
|
||||
var pluginName = 'nodebb-plugin-imgur';
|
||||
|
||||
Reference in New Issue
Block a user