From 3e918346ff91c67de39a585c2de4cf51a422fd63 Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 26 Oct 2022 23:34:19 +0800 Subject: [PATCH] core: add resolve check before addon add --- packages/hydrooj/bin/commands.ts | 10 +++++++++- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/entry/common.ts | 13 +++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/hydrooj/bin/commands.ts b/packages/hydrooj/bin/commands.ts index b9428eaad..63e1ab466 100644 --- a/packages/hydrooj/bin/commands.ts +++ b/packages/hydrooj/bin/commands.ts @@ -111,7 +111,15 @@ if (!argv.args[0] || argv.args[0] === 'cli') { } } - if (operation === 'add' && name) addons.push(name); + if (operation === 'add' && name) { + try { + require.resolve(`${name}/package.json`); + } catch (e) { + console.error(`Addon not found or not available: ${name}`); + return; + } + addons.push(name); + } addons = Array.from(new Set(addons)); console.log('Current Addons: ', addons); fs.writeFileSync(addonPath, JSON.stringify(addons, null, 2)); diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 38fc5069a..f7001d2de 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "4.2.11", + "version": "4.2.12", "bin": "bin/hydrooj.js", "main": "src/plugin-api", "module": "src/plugin-api", diff --git a/packages/hydrooj/src/entry/common.ts b/packages/hydrooj/src/entry/common.ts index 73467f115..5e7f0a926 100644 --- a/packages/hydrooj/src/entry/common.ts +++ b/packages/hydrooj/src/entry/common.ts @@ -8,6 +8,7 @@ import yaml from 'js-yaml'; import { Context } from '../context'; import i18n from '../lib/i18n'; import { Logger } from '../logger'; +import { PRIV } from '../model/builtin'; import * as bus from '../service/bus'; import { unwrapExports } from '../utils'; @@ -37,13 +38,18 @@ const getLoader = (type: LoadTask, filename: string) => async function loader(pe for (const i of pending) { const p = locateFile(i, [`${filename}.ts`, `${filename}.js`]); if (p && !fail.includes(i)) { + const name = type.replace(/^(.)/, (t) => t.toUpperCase()); try { const m = unwrapExports(require(p)); if (m.apply) ctx.loader.reloadPlugin(ctx, p, {}); - else logger.info(`${type.replace(/^(.)/, (t) => t.toUpperCase())} init: %s`, i); + else logger.info(`${name} init: %s`, i); } catch (e) { fail.push(i); - logger.info(`${type.replace(/^(.)/, (t) => t.toUpperCase())} load fail: %s`, i); + app.inject( + 'Notification', `${name} load fail: {0}`, + { args: [i] }, PRIV.PRIV_VIEW_SYSTEM_NOTIFICATION, + ); + logger.info(`${name} load fail: %s`, i); logger.error(e); } } @@ -82,6 +88,7 @@ export async function locale(pending: string[], fail: string[]) { logger.info('Locale init: %s', i); } catch (e) { fail.push(i); + app.inject('Notification', 'Locale load fail: {0}', { args: [i] }, PRIV.PRIV_VIEW_SYSTEM_NOTIFICATION); logger.error('Locale Load Fail: %s', i); logger.error(e); } @@ -123,6 +130,7 @@ export async function setting(pending: string[], fail: string[], modelSetting: t } logger.info('Config load: %s', i); } catch (e) { + app.inject('Notification', 'Config load fail: {0}', { args: [i] }, PRIV.PRIV_VIEW_SYSTEM_NOTIFICATION); logger.error('Config Load Fail: %s', i); logger.error(e); } @@ -144,6 +152,7 @@ export async function template(pending: string[], fail: string[]) { logger.info('Template init: %s', i); } catch (e) { fail.push(i); + app.inject('Notification', 'Template load fail: {0}', { args: [i] }, PRIV.PRIV_VIEW_SYSTEM_NOTIFICATION); logger.error('Template Load Fail: %s', i); logger.error(e); }