From 0ee1c1ec809ebacb243ac557cd7dfc262895af33 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Mon, 27 Apr 2020 13:02:25 +0200 Subject: [PATCH 1/3] Added the possibility to register plugins with promises --- src/components/pluginManager.js | 124 ++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 53 deletions(-) diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 2126d73b3..28677178f 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -1,4 +1,4 @@ -define(['events'], function (events) { +define(['events', 'globalize', 'appRouter'], function (events, globalize, appRouter) { 'use strict'; // TODO: replace with each plugin version @@ -25,68 +25,86 @@ define(['events'], function (events) { this.pluginsList = []; } - PluginManager.prototype.loadPlugin = function (url) { + PluginManager.prototype.loadPlugin = function(pluginSpec) { - console.debug('Loading plugin: ' + url); var instance = this; - return new Promise(function (resolve, reject) { + function registerPlugin(plugin) { + instance.register(plugin); - require([url, 'globalize', 'appRouter'], function (pluginFactory, globalize, appRouter) { - - var plugin = new pluginFactory(); - - // See if it's already installed - var existing = instance.pluginsList.filter(function (p) { - return p.id === plugin.id; - })[0]; - - if (existing) { - resolve(url); - return; - } - - plugin.installUrl = url; - - var urlLower = url.toLowerCase(); - if (urlLower.indexOf('http:') === -1 && urlLower.indexOf('https:') === -1 && urlLower.indexOf('file:') === -1) { - if (url.indexOf(appRouter.baseUrl()) !== 0) { - - url = appRouter.baseUrl() + '/' + url; - } - } - - var separatorIndex = Math.max(url.lastIndexOf('/'), url.lastIndexOf('\\')); - plugin.baseUrl = url.substring(0, separatorIndex); - - var paths = {}; - paths[plugin.id] = plugin.baseUrl; - - requirejs.config({ - waitSeconds: 0, - paths: paths + if (plugin.getRoutes) { + plugin.getRoutes().forEach(function (route) { + definePluginRoute(instance, route, plugin); }); + } - instance.register(plugin); + if (plugin.type === 'skin') { - if (plugin.getRoutes) { - plugin.getRoutes().forEach(function (route) { - definePluginRoute(instance, route, plugin); + // translations won't be loaded for skins until needed + return Promise.resolve(plugin); + } else { + return new Promise((resolve, reject) => { + loadStrings(plugin, globalize) + .then(function () { + resolve(plugin); + }) + .catch(reject); + }); + } + } + + if (typeof pluginSpec === "string") { + console.debug('Loading plugin: ' + pluginSpec); + + return new Promise(function (resolve, reject) { + require([pluginSpec], (pluginFactory) => { + var plugin = new pluginFactory(); + + // See if it's already installed + var existing = instance.pluginsList.filter(function (p) { + return p.id === plugin.id; + })[0]; + + if (existing) { + resolve(pluginSpec); + } + + plugin.installUrl = pluginSpec; + + var urlLower = pluginSpec.toLowerCase(); + if (urlLower.indexOf('http:') === -1 && urlLower.indexOf('https:') === -1 && urlLower.indexOf('file:') === -1) { + if (pluginSpec.indexOf(appRouter.baseUrl()) !== 0) { + + pluginSpec = appRouter.baseUrl() + '/' + pluginSpec; + } + } + + var separatorIndex = Math.max(pluginSpec.lastIndexOf('/'), pluginSpec.lastIndexOf('\\')); + plugin.baseUrl = pluginSpec.substring(0, separatorIndex); + + var paths = {}; + paths[plugin.id] = plugin.baseUrl; + + requirejs.config({ + waitSeconds: 0, + paths: paths }); - } - if (plugin.type === 'skin') { - - // translations won't be loaded for skins until needed - resolve(plugin); - } else { - - loadStrings(plugin, globalize).then(function () { - resolve(plugin); - }, reject); - } + registerPlugin(plugin).then(resolve).catch(reject); + }); }); - }); + } else if (pluginSpec.then) { + return pluginSpec.then(pluginBuilder => { + const pluginHelper = {}; // TODO: Advance this + return pluginBuilder(pluginHelper); + }).then(plugin => { + return registerPlugin(plugin); + }); + } else { + const err = new Error("Plugins have to be a Promise that resolves to a plugin builder function or a requirejs urls (deprecated)"); + console.error(err); + return Promise.reject(err); + } }; // In lieu of automatic discovery, plugins will register dynamic objects From 3b5e5cf7cff2d7e76bd3b1089203cd0e4c51df14 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Mon, 27 Apr 2020 14:20:32 +0200 Subject: [PATCH 2/3] Fixed code smell and removed plugin helper --- src/components/pluginManager.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 28677178f..c87dc003e 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -4,7 +4,7 @@ define(['events', 'globalize', 'appRouter'], function (events, globalize, appRou // TODO: replace with each plugin version var cacheParam = new Date().getTime(); - function loadStrings(plugin, globalize) { + function loadStrings(plugin) { var strings = plugin.getTranslations ? plugin.getTranslations() : []; return globalize.loadStrings({ name: plugin.id || plugin.packageName, @@ -44,7 +44,7 @@ define(['events', 'globalize', 'appRouter'], function (events, globalize, appRou return Promise.resolve(plugin); } else { return new Promise((resolve, reject) => { - loadStrings(plugin, globalize) + loadStrings(plugin) .then(function () { resolve(plugin); }) @@ -95,8 +95,7 @@ define(['events', 'globalize', 'appRouter'], function (events, globalize, appRou }); } else if (pluginSpec.then) { return pluginSpec.then(pluginBuilder => { - const pluginHelper = {}; // TODO: Advance this - return pluginBuilder(pluginHelper); + return pluginBuilder(); }).then(plugin => { return registerPlugin(plugin); }); From 84a22e9c3f4562a9c58d4309e752a413d8fe0428 Mon Sep 17 00:00:00 2001 From: Cromefire_ Date: Thu, 30 Apr 2020 00:31:34 +0200 Subject: [PATCH 3/3] Added more debug logging --- src/components/pluginManager.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index c87dc003e..9f3d70c06 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -54,7 +54,7 @@ define(['events', 'globalize', 'appRouter'], function (events, globalize, appRou } if (typeof pluginSpec === "string") { - console.debug('Loading plugin: ' + pluginSpec); + console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); return new Promise(function (resolve, reject) { require([pluginSpec], (pluginFactory) => { @@ -97,6 +97,7 @@ define(['events', 'globalize', 'appRouter'], function (events, globalize, appRou return pluginSpec.then(pluginBuilder => { return pluginBuilder(); }).then(plugin => { + console.debug(`Plugin loaded: ${plugin.id}`); return registerPlugin(plugin); }); } else {