/**
 * The plugin options
 */
interface HtmlWebpackPluginOptions {
    /**
     * The title to use for the generated HTML document
     */
    title: string,
    /**
     * The `webpack` require path to the template.
     * @see https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md
     */
    template: string,
    /**
     * Allow to use a html string instead of reading from a file
     */
    templateContent:
      false // Use the template option instead to load a file
      | string
      | Promise<string>,
    /**
     * Allows to overwrite the parameters used in the template
     */
    templateParameters:
      false // Pass an empty object to the template function
      | ((compilation: any, assets, assetTags: { headTags: Array<HtmlTagObject>, bodyTags: Array<HtmlTagObject> }, options: HtmlWebpackPluginOptions) => {[option: string]: any})
      | ((compilation: any, assets, assetTags: { headTags: Array<HtmlTagObject>, bodyTags: Array<HtmlTagObject> }, options: HtmlWebpackPluginOptions) => Promise<{[option: string]: any}>)
      | {[option: string]: any}
    /**
     * The file to write the HTML to.
     * Defaults to `index.html`.
     * Supports subdirectories eg: `assets/admin.html`
     */
    filename: string,
    /**
     * If `true` then append a unique `webpack` compilation hash to all included scripts and CSS files.
     * This is useful for cache busting
     */
    hash: boolean,
    /**
     * Inject all assets into the given `template` or `templateContent`.
     */
    inject: false // Don't inject scripts
    | true    // Inject scripts into body
    | 'body'  // Inject scripts into body
    | 'head'  // Inject scripts into head
    /**
     * Path to the favicon icon
     */
    favicon: false | string,
    /**
     * HTML Minification options
     * @https://github.com/kangax/html-minifier#options-quick-reference
     */
    minify?: boolean | {},
    cache: boolean,
    /**
     * Render errors into the HTML page
     */
    showErrors: boolean,
    /**
     * List all entries which should be injected
     */
    chunks: 'all' | string[],
    /**
     * List all entries which should not be injeccted
     */
    excludeChunks: string[],
    chunksSortMode: 'auto' | 'manual' | (((entryNameA: string, entryNameB: string) => number)),
    /**
     * Inject meta tags
     */
    meta: false // Disable injection
      | {
          [name: string]: string|false // name content pair e.g. {viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no'}`
          | {[attributeName: string]: string|boolean} // custom properties e.g. { name:"viewport" content:"width=500, initial-scale=1" }
      },
    /**
     * Enforce self closing tags e.g. <link />
     */
    xhtml: boolean

    /**
     * In addition to the options actually used by this plugin, you can use this hash to pass arbitrary data through
     * to your template.
     */
    [option: string]: any;
}

/**
 * A tag element according to the htmlWebpackPlugin object notation
 */
interface HtmlTagObject {
  /**
   * Attributes of the html tag
   * E.g. `{'disabled': true, 'value': 'demo'}`
   */
  attributes: {
    [attributeName: string]: string|boolean
  },
  /**
   * Wether this html must not contain innerHTML
   * @see https://www.w3.org/TR/html5/syntax.html#void-elements
   */
  voidTag: boolean,
  /**
   * The tag name e.g. `'div'`
   */
  tagName: string,
  /**
   * Inner HTML The
   */
  innerHTML?: string
}

/**
 * The values which are available during template execution
 *
 * Please keep in mind that the `templateParameter` options allows to change them
 */
interface HtmlWebpackPluginTemplateParameter {
  compilation: any,
  webpackConfig: any
  htmlWebpackPlugin: {
    tags: {
      headTags: HtmlTagObject[],
      bodyTags: HtmlTagObject[]
    },
    files: {
      publicPath: string,
      js: Array<string>,
      css: Array<string>,
      manifest?: string,
      favicon?: string
    },
    options: HtmlWebpackPluginOptions
  }
}