}
type AlterableVideoConstant = 'language' | 'licence' | 'category'
-type VideoConstant = { [ key in number | string ]: string }
+type VideoConstant = { [key in number | string]: string }
type UpdatedVideoConstant = {
- [ name in AlterableVideoConstant ]: {
- [ npmName: string ]: {
- added: { key: number | string, label: string }[],
+ [name in AlterableVideoConstant]: {
+ [npmName: string]: {
+ added: { key: number | string, label: string }[]
deleted: { key: number | string, label: string }[]
}
}
}
type PluginLocalesTranslations = {
- [ locale: string ]: PluginTranslation
+ [locale: string]: PluginTranslation
}
export class PluginManager implements ServerHook {
private static instance: PluginManager
- private registeredPlugins: { [ name: string ]: RegisteredPlugin } = {}
- private settings: { [ name: string ]: RegisterServerSettingOptions[] } = {}
- private hooks: { [ name: string ]: HookInformationValue[] } = {}
+ private registeredPlugins: { [name: string]: RegisteredPlugin } = {}
+ private settings: { [name: string]: RegisterServerSettingOptions[] } = {}
+ private hooks: { [name: string]: HookInformationValue[] } = {}
private translations: PluginLocalesTranslations = {}
- private updatedVideoConstants: UpdatedVideoConstant = {
+ private readonly updatedVideoConstants: UpdatedVideoConstant = {
language: {},
licence: {},
category: {}
// ###################### Hooks ######################
- async runHook <T> (hookName: ServerHookName, result?: T, params?: any): Promise<T> {
+ async runHook<T> (hookName: ServerHookName, result?: T, params?: any): Promise<T> {
if (!this.hooks[hookName]) return Promise.resolve(result)
const hookType = getHookType(hookName)
// Remove hooks of this plugin
for (const key of Object.keys(this.hooks)) {
- this.hooks[key] = this.hooks[key].filter(h => h.pluginName !== npmName)
+ this.hooks[key] = this.hooks[key].filter(h => h.npmName !== npmName)
}
this.reinitVideoConstants(plugin.npmName)
const pluginName = PluginModel.normalizePluginName(npmName)
const packageJSON = await this.getPackageJSON(pluginName, pluginType)
- if (!isPackageJSONValid(packageJSON, pluginType)) {
- throw new Error('PackageJSON is invalid.')
- }
+
+ this.sanitizeAndCheckPackageJSONOrThrow(packageJSON, pluginType);
[ plugin ] = await PluginModel.upsert({
name: pluginName,
const packageJSON = await this.getPackageJSON(plugin.name, plugin.type)
const pluginPath = this.getPluginPath(plugin.name, plugin.type)
- if (!isPackageJSONValid(packageJSON, plugin.type)) {
- throw new Error('Package.JSON is invalid.')
- }
+ this.sanitizeAndCheckPackageJSONOrThrow(packageJSON, plugin.type)
let library: PluginLibrary
if (plugin.type === PluginType.PLUGIN) {
clientScripts[c.script] = c
}
- this.registeredPlugins[ npmName ] = {
+ this.registeredPlugins[npmName] = {
npmName,
name: plugin.name,
type: plugin.type,
const plugins: RegisteredPlugin[] = []
for (const npmName of Object.keys(this.registeredPlugins)) {
- const plugin = this.registeredPlugins[ npmName ]
+ const plugin = this.registeredPlugins[npmName]
if (plugin.type !== type) continue
plugins.push(plugin)
}
}
- private addConstant <T extends string | number> (parameters: {
- npmName: string,
- type: AlterableVideoConstant,
- obj: VideoConstant,
- key: T,
+ private addConstant<T extends string | number> (parameters: {
+ npmName: string
+ type: AlterableVideoConstant
+ obj: VideoConstant
+ key: T
label: string
}) {
const { npmName, type, obj, key, label } = parameters
return true
}
- private deleteConstant <T extends string | number> (parameters: {
- npmName: string,
- type: AlterableVideoConstant,
- obj: VideoConstant,
+ private deleteConstant<T extends string | number> (parameters: {
+ npmName: string
+ type: AlterableVideoConstant
+ obj: VideoConstant
key: T
}) {
const { npmName, type, obj, key } = parameters
}
}
+ private sanitizeAndCheckPackageJSONOrThrow (packageJSON: PluginPackageJson, pluginType: PluginType) {
+ if (!packageJSON.staticDirs) packageJSON.staticDirs = {}
+ if (!packageJSON.css) packageJSON.css = []
+ if (!packageJSON.clientScripts) packageJSON.clientScripts = []
+ if (!packageJSON.translations) packageJSON.translations = {}
+
+ const { result: packageJSONValid, badFields } = isPackageJSONValid(packageJSON, pluginType)
+ if (!packageJSONValid) {
+ const formattedFields = badFields.map(f => `"${f}"`)
+ .join(', ')
+
+ throw new Error(`PackageJSON is invalid (invalid fields: ${formattedFields}).`)
+ }
+ }
+
static get Instance () {
return this.instance || (this.instance = new this())
}