From 017af63fb05dfd265575c19cd87413d518d3e746 Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Thu, 1 Oct 2020 09:45:27 -0600
Subject: [PATCH] fix: #8686, deprecate `plugin.json/library` (#8705)
and also fix deprecated hooks with no alternative
---
src/plugins/hooks.js | 15 +++++++++------
src/plugins/index.js | 24 ++++++++++++++++++++++--
src/plugins/load.js | 11 ++---------
3 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js
index e6d7067df9..f1c16f3f0f 100644
--- a/src/plugins/hooks.js
+++ b/src/plugins/hooks.js
@@ -35,12 +35,15 @@ module.exports = function (Plugins) {
return;
}
- if (Plugins.deprecatedHooks[data.hook]) {
- winston.warn('[plugins/' + id + '] Hook `' + data.hook + '` is deprecated, ' +
- (Plugins.deprecatedHooks[data.hook] ?
- 'please use `' + Plugins.deprecatedHooks[data.hook] + '` instead.' :
- 'there is no alternative.'
- ));
+ // `hasOwnProperty` needed for hooks with no alternative (set to null)
+ if (Plugins.deprecatedHooks.hasOwnProperty(data.hook)) {
+ const deprecated = Plugins.deprecatedHooks[data.hook];
+
+ if (deprecated) {
+ winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, please use "${deprecated}" instead.`);
+ } else {
+ winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, there is no alternative.`);
+ }
}
data.id = id;
diff --git a/src/plugins/index.js b/src/plugins/index.js
index 4d7824b9b1..e8fe3443ac 100644
--- a/src/plugins/index.js
+++ b/src/plugins/index.js
@@ -41,8 +41,28 @@ Plugins.loadedPlugins = [];
Plugins.initialized = false;
-Plugins.requireLibrary = function (pluginID, libraryPath) {
- Plugins.libraries[pluginID] = require(libraryPath);
+Plugins.requireLibrary = function (pluginData) {
+ let libraryPath;
+ // attempt to load a plugin directly with `require("nodebb-plugin-*")`
+ // Plugins should define their entry point in the standard `main` property of `package.json`
+ try {
+ libraryPath = pluginData.path;
+ Plugins.libraries[pluginData.id] = require(libraryPath);
+ } catch (e) {
+ // DEPRECATED: @1.15.0, remove in version >=1.17
+ // for backwards compatibility
+ // if that fails, fall back to `pluginData.library`
+ if (pluginData.library) {
+ winston.warn(` [plugins/${pluginData.id}] The plugin.json field "library" is deprecated. Please use the package.json field "main" instead.`);
+ winston.verbose(`[plugins/${pluginData.id}] See https://github.com/NodeBB/NodeBB/issues/8686`);
+
+ libraryPath = path.join(pluginData.path, pluginData.library);
+ Plugins.libraries[pluginData.id] = require(libraryPath);
+ } else {
+ throw e;
+ }
+ }
+
Plugins.libraryPaths.push(libraryPath);
};
diff --git a/src/plugins/load.js b/src/plugins/load.js
index 78b0f76078..78c58b8db4 100644
--- a/src/plugins/load.js
+++ b/src/plugins/load.js
@@ -1,6 +1,5 @@
'use strict';
-const path = require('path');
const semver = require('semver');
const async = require('async');
const winston = require('winston');
@@ -156,22 +155,16 @@ module.exports = function (Plugins) {
}
function registerHooks(pluginData) {
- if (!pluginData.library) {
- return;
- }
-
- const libraryPath = path.join(pluginData.path, pluginData.library);
-
try {
if (!Plugins.libraries[pluginData.id]) {
- Plugins.requireLibrary(pluginData.id, libraryPath);
+ Plugins.requireLibrary(pluginData);
}
if (Array.isArray(pluginData.hooks)) {
pluginData.hooks.forEach(hook => Plugins.registerHook(pluginData.id, hook));
}
} catch (err) {
- winston.warn('[plugins] Unable to parse library for: ' + pluginData.id);
+ winston.warn('[plugins] Unable to load library for: ' + pluginData.id);
throw err;
}
}