Files
NodeBB/src/plugins/load.js

189 lines
5.1 KiB
JavaScript
Raw Normal View History

2014-12-26 18:54:20 -05:00
'use strict';
2019-07-22 00:30:47 -04:00
const path = require('path');
const semver = require('semver');
const async = require('async');
const winston = require('winston');
const nconf = require('nconf');
const _ = require('lodash');
2014-12-26 18:54:20 -05:00
2019-07-22 00:30:47 -04:00
const meta = require('../meta');
2014-12-26 18:54:20 -05:00
module.exports = function (Plugins) {
2019-07-22 00:30:47 -04:00
async function registerPluginAssets(pluginData, fields) {
2017-05-17 17:25:41 -06:00
function add(dest, arr) {
dest.push.apply(dest, arr || []);
}
2019-07-22 00:30:47 -04:00
const handlers = {
2017-05-17 17:25:41 -06:00
staticDirs: function (next) {
Plugins.data.getStaticDirectories(pluginData, next);
2016-11-19 14:24:37 -05:00
},
2017-05-17 17:25:41 -06:00
cssFiles: function (next) {
Plugins.data.getFiles(pluginData, 'css', next);
},
lessFiles: function (next) {
Plugins.data.getFiles(pluginData, 'less', next);
},
2017-08-21 17:48:58 -04:00
acpLessFiles: function (next) {
Plugins.data.getFiles(pluginData, 'acpLess', next);
},
2017-05-17 17:25:41 -06:00
clientScripts: function (next) {
Plugins.data.getScripts(pluginData, 'client', next);
},
acpScripts: function (next) {
Plugins.data.getScripts(pluginData, 'acp', next);
},
modules: function (next) {
Plugins.data.getModules(pluginData, next);
},
soundpack: function (next) {
Plugins.data.getSoundpack(pluginData, next);
},
languageData: function (next) {
Plugins.data.getLanguageData(pluginData, next);
},
2017-05-17 17:25:41 -06:00
};
2019-07-22 00:30:47 -04:00
var methods = {};
2017-05-17 17:25:41 -06:00
if (Array.isArray(fields)) {
2019-07-22 00:30:47 -04:00
fields.forEach(function (field) {
methods[field] = handlers[field];
});
2017-05-17 17:25:41 -06:00
} else {
methods = handlers;
}
2016-11-19 14:24:37 -05:00
2019-07-22 00:30:47 -04:00
const results = await async.parallel(methods);
Object.assign(Plugins.staticDirs, results.staticDirs || {});
add(Plugins.cssFiles, results.cssFiles);
add(Plugins.lessFiles, results.lessFiles);
add(Plugins.acpLessFiles, results.acpLessFiles);
add(Plugins.clientScripts, results.clientScripts);
add(Plugins.acpScripts, results.acpScripts);
Object.assign(meta.js.scripts.modules, results.modules || {});
if (results.soundpack) {
Plugins.soundpacks.push(results.soundpack);
}
if (results.languageData) {
Plugins.languageData.languages = _.union(Plugins.languageData.languages, results.languageData.languages);
Plugins.languageData.namespaces = _.union(Plugins.languageData.namespaces, results.languageData.namespaces);
}
Plugins.pluginsData[pluginData.id] = pluginData;
2017-05-17 17:25:41 -06:00
}
2016-11-19 14:24:37 -05:00
2019-07-22 00:30:47 -04:00
Plugins.prepareForBuild = async function (targets) {
const map = {
'plugin static dirs': ['staticDirs'],
'requirejs modules': ['modules'],
'client js bundle': ['clientScripts'],
'admin js bundle': ['acpScripts'],
'client side styles': ['cssFiles', 'lessFiles'],
2017-08-21 17:48:58 -04:00
'admin control panel styles': ['cssFiles', 'lessFiles', 'acpLessFiles'],
sounds: ['soundpack'],
languages: ['languageData'],
};
2019-07-22 00:30:47 -04:00
const fields = _.uniq(_.flatMap(targets, target => map[target] || []));
// clear old data before build
fix(style): updated code to follow new eslint recommendations Squashed commit of the following: commit f9ce878b269b3568f0d649309aae1af4dcfdfeef Author: Julian Lam <julian@nodebb.org> Date: Tue Aug 13 14:30:46 2019 -0400 fix(style): updated code to follow new eslint recommendations commit 80dd370e413f22badb96ff2138e7991dfff6d836 Author: Julian Lam <julian@nodebb.org> Date: Tue Aug 13 14:14:58 2019 -0400 fix(deps): update dependency sitemap to v4 Squashed commit of the following: commit f4dd9cabb21e26fdc21f8413be822ea7c64251f8 Author: Julian Lam <julian@nodebb.org> Date: Tue Aug 13 11:33:05 2019 -0400 fix: resolved breaking changes from sitemap v4 upgrade commit 9043415ee16dcc27a8dcc2e4479d1bc5e2d1b60e Merge: e3352b272 72590b346 Author: Julian Lam <julian@nodebb.org> Date: Tue Aug 13 11:09:55 2019 -0400 Merge branch 'master' into renovate/sitemap-4.x commit e3352b272eb9400bdb00774973181397803765e4 Author: Renovate Bot <bot@renovateapp.com> Date: Mon Aug 12 07:59:05 2019 +0000 fix(deps): update dependency sitemap to v4 commit 8e3c0cdcae22acc32d352be8bb72d60e7502dbc5 Author: Renovate Bot <bot@renovateapp.com> Date: Fri Aug 9 00:49:51 2019 +0000 fix(deps): update dependency commander to v3 commit 2104449d38818f2fa4d44b3a58a0a168781acbfb Author: Renovate Bot <bot@renovateapp.com> Date: Tue Aug 13 15:00:27 2019 +0000 fix(deps): update dependency mongodb to v3.3.0 commit d2937f446a21131c070ae5d0ff33d67cfe465b8c Author: Barış Soner Uşaklı <barisusakli@gmail.com> Date: Tue Aug 13 10:36:48 2019 -0400 feat: async/await admin/controllers commit 1b97e8b199f960dc24e5722702f27499ae049914 Author: Misty (Bot) <deploy@nodebb.org> Date: Tue Aug 13 09:28:39 2019 +0000 Latest translations and fallbacks commit 69a48957a2f0d23c4d194b664bda3a0431179c01 Author: Barış Soner Uşaklı <barisusakli@gmail.com> Date: Mon Aug 12 21:56:09 2019 -0400 feat: async/await commit b9b2a7e593a452de4bef6d0ab6abe368a3bdb8dd Author: Barış Soner Uşaklı <barisusakli@gmail.com> Date: Mon Aug 12 20:58:29 2019 -0400 feat: async/await refactor controllers/accounts commit a8d43a175974a0c8ae3dc132bf51a7ed9a4c6305 Author: Baris Usakli <barisusakli@gmail.com> Date: Mon Aug 12 14:49:40 2019 -0400 feat: async/await controllers/accounts commit 2f25aae57bf9dbe98d655276770e56bed9ec023b Author: Barış Soner Uşaklı <barisusakli@gmail.com> Date: Sun Aug 11 23:09:50 2019 -0400 fix: #7831, fix pagination convert to async/await commit c9e83f2374572264855a04156278eef256b0a20c Author: Barış Soner Uşaklı <barisusakli@gmail.com> Date: Sun Aug 11 00:14:35 2019 -0400 fix: remove empty line commit 30be91b26c4dd7583412c4e8d56e9c1688e48a44 Author: Barış Soner Uşaklı <barisusakli@gmail.com> Date: Sun Aug 11 00:13:41 2019 -0400 fix: remove useless catchs and empty line commit 2e4a71c0b6104738f15ffbfe3246105b922fdfb3 Author: Renovate Bot <bot@renovateapp.com> Date: Sat Aug 10 06:51:50 2019 +0000 chore(deps): update dependency eslint-config-airbnb-base to v14
2019-08-13 14:33:37 -04:00
fields.forEach(field => {
switch (field) {
case 'clientScripts':
case 'acpScripts':
case 'cssFiles':
case 'lessFiles':
case 'acpLessFiles':
Plugins[field].length = 0;
break;
case 'soundpack':
Plugins.soundpacks.length = 0;
break;
case 'languageData':
Plugins.languageData.languages = [];
Plugins.languageData.namespaces = [];
break;
// do nothing for modules and staticDirs
}
});
winston.verbose('[plugins] loading the following fields from plugin data: ' + fields.join(', '));
2019-07-22 00:30:47 -04:00
const plugins = await Plugins.data.getActive();
await Promise.all(plugins.map(p => registerPluginAssets(p, fields)));
2016-11-19 14:24:37 -05:00
};
2014-12-26 18:54:20 -05:00
2019-07-22 00:30:47 -04:00
const themeNamePattern = /(@.*?\/)?nodebb-theme-.*$/;
2018-06-09 16:26:28 -06:00
2019-07-22 00:30:47 -04:00
Plugins.loadPlugin = async function (pluginPath) {
let pluginData;
try {
pluginData = await Plugins.data.loadPluginInfo(pluginPath);
} catch (err) {
if (err.message === '[[error:parse-error]]') {
return;
}
if (!themeNamePattern.test(pluginPath)) {
throw err;
2014-12-26 18:54:20 -05:00
}
2019-07-22 00:30:47 -04:00
return;
}
checkVersion(pluginData);
2014-12-26 18:54:20 -05:00
2019-07-22 00:30:47 -04:00
try {
registerHooks(pluginData);
await registerPluginAssets(pluginData, ['soundpack']);
} catch (err) {
winston.error(err.stack);
winston.verbose('[plugins] Could not load plugin : ' + pluginData.id);
return;
}
if (!pluginData.private) {
Plugins.loadedPlugins.push({
id: pluginData.id,
version: pluginData.version,
2014-12-26 18:54:20 -05:00
});
2019-07-22 00:30:47 -04:00
}
winston.verbose('[plugins] Loaded plugin: ' + pluginData.id);
2014-12-26 18:54:20 -05:00
};
function checkVersion(pluginData) {
function add() {
if (!Plugins.versionWarning.includes(pluginData.id)) {
Plugins.versionWarning.push(pluginData.id);
}
2015-03-07 00:59:03 -05:00
}
if (pluginData.nbbpm && pluginData.nbbpm.compatibility && semver.validRange(pluginData.nbbpm.compatibility)) {
if (!semver.satisfies(nconf.get('version'), pluginData.nbbpm.compatibility)) {
add();
2015-03-07 00:59:03 -05:00
}
} else {
add();
2015-03-07 00:59:03 -05:00
}
}
2019-07-22 00:30:47 -04:00
function registerHooks(pluginData) {
2014-12-26 18:54:20 -05:00
if (!pluginData.library) {
2019-07-22 00:30:47 -04:00
return;
2014-12-26 18:54:20 -05:00
}
2019-07-22 00:30:47 -04:00
const libraryPath = path.join(pluginData.path, pluginData.library);
2014-12-26 18:54:20 -05:00
2015-01-12 23:24:19 -05:00
try {
2014-12-26 18:54:20 -05:00
if (!Plugins.libraries[pluginData.id]) {
2015-01-06 23:29:48 -05:00
Plugins.requireLibrary(pluginData.id, libraryPath);
2014-12-26 18:54:20 -05:00
}
2019-07-22 00:30:47 -04:00
if (Array.isArray(pluginData.hooks)) {
pluginData.hooks.forEach(hook => Plugins.registerHook(pluginData.id, hook));
2014-12-26 18:54:20 -05:00
}
} catch (err) {
winston.warn('[plugins] Unable to parse library for: ' + pluginData.id);
2019-07-22 00:30:47 -04:00
throw err;
2015-01-12 23:24:19 -05:00
}
2014-12-26 18:54:20 -05:00
}
};