Improve plugin package.json error message

This commit is contained in:
Chocobozzz 2019-09-11 10:19:03 +02:00
parent 8d5e65349d
commit 9157d5981f
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
2 changed files with 77 additions and 17 deletions

View File

@ -84,17 +84,65 @@ function isThemeNameValid (name: string) {
} }
function isPackageJSONValid (packageJSON: PluginPackageJson, pluginType: PluginType) { function isPackageJSONValid (packageJSON: PluginPackageJson, pluginType: PluginType) {
return isNpmPluginNameValid(packageJSON.name) && let result = true
isPluginDescriptionValid(packageJSON.description) && const badFields: string[] = []
isPluginEngineValid(packageJSON.engine) &&
isPluginHomepage(packageJSON.homepage) && if (!isNpmPluginNameValid(packageJSON.name)) {
exists(packageJSON.author) && result = false
isPluginBugs(packageJSON.bugs) && badFields.push('name')
(pluginType === PluginType.THEME || isSafePath(packageJSON.library)) && }
areStaticDirectoriesValid(packageJSON.staticDirs) &&
areCSSPathsValid(packageJSON.css) && if (!isPluginDescriptionValid(packageJSON.description)) {
areClientScriptsValid(packageJSON.clientScripts) && result = false
areTranslationPathsValid(packageJSON.translations) badFields.push('description')
}
if (!isPluginEngineValid(packageJSON.engine)) {
result = false
badFields.push('engine')
}
if (!isPluginHomepage(packageJSON.homepage)) {
result = false
badFields.push('homepage')
}
if (!exists(packageJSON.author)) {
result = false
badFields.push('author')
}
if (!isPluginBugs(packageJSON.bugs)) {
result = false
badFields.push('bugs')
}
if (pluginType === PluginType.PLUGIN && !isSafePath(packageJSON.library)) {
result = false
badFields.push('library')
}
if (!areStaticDirectoriesValid(packageJSON.staticDirs)) {
result = false
badFields.push('staticDirs')
}
if (!areCSSPathsValid(packageJSON.css)) {
result = false
badFields.push('css')
}
if (!areClientScriptsValid(packageJSON.clientScripts)) {
result = false
badFields.push('clientScripts')
}
if (!areTranslationPathsValid(packageJSON.translations)) {
result = false
badFields.push('translations')
}
return { result, badFields }
} }
function isLibraryCodeValid (library: any) { function isLibraryCodeValid (library: any) {

View File

@ -222,9 +222,8 @@ export class PluginManager implements ServerHook {
const pluginName = PluginModel.normalizePluginName(npmName) const pluginName = PluginModel.normalizePluginName(npmName)
const packageJSON = await this.getPackageJSON(pluginName, pluginType) 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({ [ plugin ] = await PluginModel.upsert({
name: pluginName, name: pluginName,
@ -301,9 +300,7 @@ export class PluginManager implements ServerHook {
const packageJSON = await this.getPackageJSON(plugin.name, plugin.type) const packageJSON = await this.getPackageJSON(plugin.name, plugin.type)
const pluginPath = this.getPluginPath(plugin.name, plugin.type) const pluginPath = this.getPluginPath(plugin.name, plugin.type)
if (!isPackageJSONValid(packageJSON, plugin.type)) { this.sanitizeAndCheckPackageJSONOrThrow(packageJSON, plugin.type)
throw new Error('Package.JSON is invalid.')
}
let library: PluginLibrary let library: PluginLibrary
if (plugin.type === PluginType.PLUGIN) { if (plugin.type === PluginType.PLUGIN) {
@ -598,6 +595,21 @@ export class PluginManager implements ServerHook {
} }
} }
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 () { static get Instance () {
return this.instance || (this.instance = new this()) return this.instance || (this.instance = new this())
} }