Improve plugin package.json error message
This commit is contained in:
		
							parent
							
								
									8d5e65349d
								
							
						
					
					
						commit
						9157d5981f
					
				
					 2 changed files with 77 additions and 17 deletions
				
			
		| 
						 | 
					@ -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) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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())
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue