pluginfw: Improve rendering of hook list
There are two main benefits: * HTML is no longer printed in the startup debug logs. * `require()` is no longer called on client-side files. This eliminates "Failed to load <file> for <plugin>: ReferenceError: window is not defined" errors when users visit `/admin/plugins/info`.
This commit is contained in:
parent
7e698baa80
commit
0aad3b74da
3 changed files with 43 additions and 11 deletions
|
@ -26,8 +26,8 @@ exports.expressCreateServer = (hookName, args, cb) => {
|
|||
epVersion,
|
||||
installedPlugins: `<pre>${plugins.formatPlugins().replace(/, /g, '\n')}</pre>`,
|
||||
installedParts: `<pre>${plugins.formatParts()}</pre>`,
|
||||
installedServerHooks: `<div>${plugins.formatHooks()}</div>`,
|
||||
installedClientHooks: `<div>${plugins.formatHooks('client_hooks')}</div>`,
|
||||
installedServerHooks: `<div>${plugins.formatHooks('hooks', true)}</div>`,
|
||||
installedClientHooks: `<div>${plugins.formatHooks('client_hooks', true)}</div>`,
|
||||
latestVersion: UpdateCheck.getLatestVersion(),
|
||||
req,
|
||||
}));
|
||||
|
|
|
@ -144,7 +144,7 @@ exports.start = async () => {
|
|||
.join(', ');
|
||||
logger.info(`Installed plugins: ${installedPlugins}`);
|
||||
logger.debug(`Installed parts:\n${plugins.formatParts()}`);
|
||||
logger.debug(`Installed hooks:\n${plugins.formatHooks()}`);
|
||||
logger.debug(`Installed server-side hooks:\n${plugins.formatHooks('hooks', false)}`);
|
||||
await hooks.aCallAll('loadSettings', {settings});
|
||||
await hooks.aCallAll('createServer');
|
||||
} catch (err) {
|
||||
|
|
|
@ -28,16 +28,48 @@ exports.formatPlugins = () => Object.keys(defs.plugins).join(', ');
|
|||
|
||||
exports.formatParts = () => defs.parts.map((part) => part.full_name).join('\n');
|
||||
|
||||
exports.formatHooks = (hookSetName) => {
|
||||
const res = [];
|
||||
const hooks = pluginUtils.extractHooks(defs.parts, hookSetName || 'hooks');
|
||||
for (const registeredHooks of Object.values(hooks)) {
|
||||
for (const hook of registeredHooks) {
|
||||
res.push(`<dt>${hook.hook_name}</dt><dd>${hook.hook_fn_name} ` +
|
||||
`from ${hook.part.full_name}</dd>`);
|
||||
exports.formatHooks = (hookSetName, html) => {
|
||||
let hooks = new Map();
|
||||
for (const [pluginName, def] of Object.entries(defs.plugins)) {
|
||||
for (const part of def.parts) {
|
||||
for (const [hookName, hookFnName] of Object.entries(part[hookSetName] || {})) {
|
||||
let hookEntry = hooks.get(hookName);
|
||||
if (!hookEntry) {
|
||||
hookEntry = new Map();
|
||||
hooks.set(hookName, hookEntry);
|
||||
}
|
||||
let pluginEntry = hookEntry.get(pluginName);
|
||||
if (!pluginEntry) {
|
||||
pluginEntry = new Map();
|
||||
hookEntry.set(pluginName, pluginEntry);
|
||||
}
|
||||
pluginEntry.set(part.name, hookFnName);
|
||||
}
|
||||
}
|
||||
}
|
||||
return `<dl>${res.join('\n')}</dl>`;
|
||||
const lines = [];
|
||||
const sortStringKeys = (a, b) => String(a[0]).localeCompare(b[0]);
|
||||
if (html) lines.push('<dl>');
|
||||
hooks = new Map([...hooks].sort(sortStringKeys));
|
||||
for (const [hookName, hookEntry] of hooks) {
|
||||
lines.push(html ? ` <dt>${hookName}:</dt><dd><dl>` : ` ${hookName}:`);
|
||||
const sortedHookEntry = new Map([...hookEntry].sort(sortStringKeys));
|
||||
hooks.set(hookName, sortedHookEntry);
|
||||
for (const [pluginName, pluginEntry] of sortedHookEntry) {
|
||||
lines.push(html ? ` <dt>${pluginName}:</dt><dd><dl>` : ` ${pluginName}:`);
|
||||
const sortedPluginEntry = new Map([...pluginEntry].sort(sortStringKeys));
|
||||
sortedHookEntry.set(pluginName, sortedPluginEntry);
|
||||
for (const [partName, hookFnName] of sortedPluginEntry) {
|
||||
lines.push(html
|
||||
? ` <dt>${partName}:</dt><dd>${hookFnName}</dd>`
|
||||
: ` ${partName}: ${hookFnName}`);
|
||||
}
|
||||
if (html) lines.push(' </dl></dd>');
|
||||
}
|
||||
if (html) lines.push(' </dl></dd>');
|
||||
}
|
||||
if (html) lines.push('</dl>');
|
||||
return lines.join('\n');
|
||||
};
|
||||
|
||||
const callInit = async () => {
|
||||
|
|
Loading…
Reference in a new issue