}
function isPackageJSONValid (packageJSON: PluginPackageJson, pluginType: PluginType) {
- return isNpmPluginNameValid(packageJSON.name) &&
- isPluginDescriptionValid(packageJSON.description) &&
- isPluginEngineValid(packageJSON.engine) &&
- isPluginHomepage(packageJSON.homepage) &&
- exists(packageJSON.author) &&
- isPluginBugs(packageJSON.bugs) &&
- (pluginType === PluginType.THEME || isSafePath(packageJSON.library)) &&
- areStaticDirectoriesValid(packageJSON.staticDirs) &&
- areCSSPathsValid(packageJSON.css) &&
- areClientScriptsValid(packageJSON.clientScripts) &&
- areTranslationPathsValid(packageJSON.translations)
+ let result = true
+ const badFields: string[] = []
+
+ if (!isNpmPluginNameValid(packageJSON.name)) {
+ result = false
+ badFields.push('name')
+ }
+
+ if (!isPluginDescriptionValid(packageJSON.description)) {
+ result = false
+ 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) {
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) {
}
}
+ 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())
}