first
This commit is contained in:
20
node_modules/html-webpack-plugin/LICENSE
generated
vendored
Normal file
20
node_modules/html-webpack-plugin/LICENSE
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
Copyright JS Foundation and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
665
node_modules/html-webpack-plugin/README.md
generated
vendored
Normal file
665
node_modules/html-webpack-plugin/README.md
generated
vendored
Normal file
@ -0,0 +1,665 @@
|
||||
[![npm][npm]][npm-url]
|
||||
[![node][node]][node-url]
|
||||

|
||||
[![tests][tests]][tests-url]
|
||||
[](#backers)
|
||||
[](#sponsors)
|
||||
|
||||
<div align="center">
|
||||
<img width="200" height="200" src="https://www.w3.org/html/logo/downloads/HTML5_Badge.svg">
|
||||
<a href="https://github.com/webpack/webpack">
|
||||
<img width="200" height="200"
|
||||
src="https://webpack.js.org/assets/icon-square-big.svg">
|
||||
</a>
|
||||
<div>
|
||||
<img width="100" height="100" title="Webpack Plugin" src="http://michael-ciniawsky.github.io/postcss-load-plugins/logo.svg">
|
||||
</div>
|
||||
<h1>HTML Webpack Plugin</h1>
|
||||
<p>Plugin that simplifies creation of HTML files to serve your bundles</p>
|
||||
</div>
|
||||
|
||||
<h2 align="center">Install</h2>
|
||||
|
||||
<h3>Webpack 5</h3>
|
||||
|
||||
```bash
|
||||
npm i --save-dev html-webpack-plugin
|
||||
```
|
||||
|
||||
```bash
|
||||
yarn add --dev html-webpack-plugin
|
||||
```
|
||||
|
||||
|
||||
<h3>Webpack 4</h3>
|
||||
|
||||
```bash
|
||||
npm i --save-dev html-webpack-plugin@4
|
||||
```
|
||||
|
||||
```bash
|
||||
yarn add --dev html-webpack-plugin@4
|
||||
```
|
||||
|
||||
|
||||
This is a [webpack](http://webpack.js.org/) plugin that simplifies creation of HTML files to serve your `webpack` bundles. This is especially useful for `webpack` bundles that include a hash in the filename which changes every compilation. You can either let the plugin generate an HTML file for you, supply
|
||||
your own template using `lodash` templates or use your own loader.
|
||||
|
||||
<h2 align="center">Sponsors</h2>
|
||||
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/0/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/1/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/2/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/3/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/4/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/5/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/6/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/7/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/8/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/sponsor/9/website" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/sponsor/9/avatar.svg"></a>
|
||||
|
||||
Thanks for supporting the ongoing improvements to the html-webpack-plugin!
|
||||
|
||||
<h2 align="center">Zero Config</h2>
|
||||
|
||||
The `html-webpack-plugin` works without configuration.
|
||||
It's a great addition to the [⚙️ webpack-config-plugins](https://github.com/namics/webpack-config-plugins/blob/master/README.md#zero-config-webpack-dev-server-example).
|
||||
|
||||
<h2 align="center">Plugins</h2>
|
||||
|
||||
The `html-webpack-plugin` provides [hooks](https://github.com/jantimon/html-webpack-plugin#events) to extend it to your needs. There are already some really powerful plugins which can be integrated with zero configuration
|
||||
|
||||
* [webpack-subresource-integrity](https://www.npmjs.com/package/webpack-subresource-integrity) for enhanced asset security
|
||||
* [appcache-webpack-plugin](https://github.com/lettertwo/appcache-webpack-plugin) for iOS and Android offline usage
|
||||
* [favicons-webpack-plugin](https://github.com/jantimon/favicons-webpack-plugin) which generates favicons and icons for iOS, Android and desktop browsers
|
||||
* [html-webpack-harddisk-plugin](https://github.com/jantimon/html-webpack-harddisk-plugin) can be used to always write to disk the html file, useful when webpack-dev-server / HMR are being used
|
||||
* [html-webpack-inline-svg-plugin](https://github.com/thegc/html-webpack-inline-svg-plugin) to inline SVGs in the resulting HTML file.
|
||||
* [html-webpack-exclude-assets-plugin](https://github.com/jamesjieye/html-webpack-exclude-assets-plugin) for excluding assets using regular expressions
|
||||
* [html-webpack-include-assets-plugin](https://github.com/jharris4/html-webpack-include-assets-plugin) for including lists of js or css file paths (such as those copied by the copy-webpack-plugin).
|
||||
* [html-webpack-injector](https://github.com/thearchitgarg/html-webpack-injector) to inject chunks in `head` or `body` (different locations ) of same html document.
|
||||
* [resource-hints-webpack-plugin](https://github.com/jantimon/resource-hints-webpack-plugin) to add resource hints for faster initial page loads using `<link rel='preload'>` and `<link rel='prefetch'>`
|
||||
* [link-media-html-webpack-plugin](https://github.com/yaycmyk/link-media-html-webpack-plugin) allows for injected stylesheet `<link />` tags to have their media attribute set automatically; useful for providing specific desktop/mobile/print etc. stylesheets that the browser will conditionally download
|
||||
* [html-webpack-inline-style-plugin](https://github.com/djaax/html-webpack-inline-style-plugin) for inlining styles to HTML elements using [juice](https://github.com/Automattic/juice). Useful for email generation automatisation.
|
||||
* [html-webpack-exclude-empty-assets-plugin](https://github.com/KnisterPeter/html-webpack-exclude-empty-assets-plugin) removes empty assets from being added to the html. This fixes some problems with extract-text-plugin with webpack 4.
|
||||
* [webpack-concat-plugin](https://github.com/hxlniada/webpack-concat-plugin) for concat and uglify files that needn't to be webpack bundles(for legacy files) and inject to html-webpack-plugin.
|
||||
* [html-webpack-link-type-plugin](https://github.com/steadyapp/html-webpack-link-type-plugin) adds a configurable mimetype to resources injected as links (such as adding type="text/css" to external stylesheets) for compatibility with "strict mode".
|
||||
* [csp-html-webpack-plugin](https://github.com/slackhq/csp-html-webpack-plugin) to add [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) meta tags to the HTML output
|
||||
* [strict-csp-html-webpack-plugin](https://github.com/google/strict-csp/tree/main/strict-csp-html-webpack-plugin) to add a [**strict** Content-Security-Policy (CSP)](https://web.dev) as a `meta` tag to the HTML output. A strict CSP is specifically efficient against XSS attacks.
|
||||
* [webpack-nomodule-plugin](https://github.com/swimmadude66/webpack-nomodule-plugin) allows you to add a `nomodule` attribute to specific injected scripts, which prevents the scripts from being loaded by newer browsers. Good for limiting loads of polyfills.
|
||||
* [html-webpack-skip-assets-plugin](https://github.com/swimmadude66/html-webpack-skip-assets-plugin) Skip adding certain output files to the html file. Built as a drop-in replacement for [html-webpack-exclude-assets-plugin](https://www.npmjs.com/package/html-webpack-exclude-assets-plugin) and works with newer [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin) versions
|
||||
* [html-webpack-inject-preload](https://github.com/principalstudio/html-webpack-inject-preload) allows to add preload links <link rel='preload'> anywhere you want.
|
||||
* [inject-body-webpack-plugin](https://github.com/Jaid/inject-body-webpack-plugin) is a simple method of injecting a custom HTML string into the body.
|
||||
* [html-webpack-plugin-django](https://github.com/TommasoAmici/html-webpack-plugin-django) a Webpack plugin to inject Django static tags.
|
||||
|
||||
|
||||
<h2 align="center">Usage</h2>
|
||||
|
||||
The plugin will generate an HTML5 file for you that includes all your `webpack`
|
||||
bundles in the head using `script` tags. Just add the plugin to your `webpack`
|
||||
config as follows:
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
|
||||
module.exports = {
|
||||
entry: 'index.js',
|
||||
output: {
|
||||
path: __dirname + '/dist',
|
||||
filename: 'index_bundle.js'
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin()
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
This will generate a file `dist/index.html` containing the following
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Webpack App</title>
|
||||
<script defer src="index_bundle.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
If you have multiple `webpack` entry points, they will all be included with `script` tags in the generated HTML.
|
||||
|
||||
If you have any CSS assets in webpack's output (for example, CSS extracted with the [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin))
|
||||
then these will be included with `<link>` tags in the HTML head.
|
||||
|
||||
If you have plugins that make use of it, `html-webpack-plugin` should be ordered first before any of the integrated Plugins.
|
||||
|
||||
<h2 align="center">Options</h2>
|
||||
|
||||
You can pass a hash of configuration options to `html-webpack-plugin`.
|
||||
Allowed values are as follows:
|
||||
|
||||
|Name|Type|Default|Description|
|
||||
|:--:|:--:|:-----:|:----------|
|
||||
|**`title`**|`{String}`|`Webpack App`|The title to use for the generated HTML document|
|
||||
|**`filename`**|`{String\|Function}`|`'index.html'`|The file to write the HTML to. Defaults to `index.html`. You can specify a subdirectory here too (eg: `assets/admin.html`). The `[name]` placeholder will be replaced with the entry name. Can also be a function e.g. `(entryName) => entryName + '.html'`. |
|
||||
|**`template`**|`{String}`|``|`webpack` relative or absolute path to the template. By default it will use `src/index.ejs` if it exists. Please see the [docs](https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md) for details|
|
||||
|**`templateContent`**|`{string\|Function\|false}`|false| Can be used instead of `template` to provide an inline template - please read the [Writing Your Own Templates](https://github.com/jantimon/html-webpack-plugin#writing-your-own-templates) section |
|
||||
|**`templateParameters`**|`{Boolean\|Object\|Function}`| `false`| Allows to overwrite the parameters used in the template - see [example](https://github.com/jantimon/html-webpack-plugin/tree/master/examples/template-parameters) |
|
||||
|**`inject`**|`{Boolean\|String}`|`true`|`true \|\| 'head' \|\| 'body' \|\| false` Inject all assets into the given `template` or `templateContent`. When passing `'body'` all javascript resources will be placed at the bottom of the body element. `'head'` will place the scripts in the head element. Passing `true` will add it to the head/body depending on the `scriptLoading` option. Passing `false` will disable automatic injections. - see the [inject:false example](https://github.com/jantimon/html-webpack-plugin/tree/master/examples/custom-insertion-position)|
|
||||
|**`publicPath`**|`{String\|'auto'}`|`'auto'`|The publicPath used for script and link tags|
|
||||
|**`scriptLoading`**|`{'blocking'\|'defer'\|'module'}`|`'defer'`| Modern browsers support non blocking javascript loading (`'defer'`) to improve the page startup performance. Setting to `'module'` adds attribute [`type="module"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#applying_the_module_to_your_html). This also implies "defer", since modules are automatically deferred. |
|
||||
|**`favicon`**|`{String}`|``|Adds the given favicon path to the output HTML|
|
||||
|**`meta`**|`{Object}`|`{}`|Allows to inject `meta`-tags. E.g. `meta: {viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no'}`|
|
||||
|**`base`**|`{Object\|String\|false}`|`false`|Inject a [`base`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base) tag. E.g. `base: "https://example.com/path/page.html`|
|
||||
|**`minify`**|`{Boolean\|Object}`|`true` if `mode` is `'production'`, otherwise `false`|Controls if and in what ways the output should be minified. See [minification](#minification) below for more details.|
|
||||
|**`hash`**|`{Boolean}`|`false`|If `true` then append a unique `webpack` compilation hash to all included scripts and CSS files. This is useful for cache busting|
|
||||
|**`cache`**|`{Boolean}`|`true`|Emit the file only if it was changed|
|
||||
|**`showErrors`**|`{Boolean}`|`true`|Errors details will be written into the HTML page|
|
||||
|**`chunks`**|`{?}`|`?`|Allows you to add only some chunks (e.g only the unit-test chunk)|
|
||||
|**`chunksSortMode`**|`{String\|Function}`|`auto`|Allows to control how chunks should be sorted before they are included to the HTML. Allowed values are `'none' \| 'auto' \| 'manual' \| {Function}`|
|
||||
|**`excludeChunks`**|`{Array.<string>}`|``|Allows you to skip some chunks (e.g don't add the unit-test chunk)|
|
||||
|**`xhtml`**|`{Boolean}`|`false`|If `true` render the `link` tags as self-closing (XHTML compliant)|
|
||||
|
||||
Here's an example webpack config illustrating how to use these options
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
{
|
||||
entry: 'index.js',
|
||||
output: {
|
||||
path: __dirname + '/dist',
|
||||
filename: 'index_bundle.js'
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
title: 'My App',
|
||||
filename: 'assets/admin.html'
|
||||
})
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Generating Multiple HTML Files
|
||||
|
||||
To generate more than one HTML file, declare the plugin more than
|
||||
once in your plugins array
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
{
|
||||
entry: 'index.js',
|
||||
output: {
|
||||
path: __dirname + '/dist',
|
||||
filename: 'index_bundle.js'
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin(), // Generates default index.html
|
||||
new HtmlWebpackPlugin({ // Also generate a test.html
|
||||
filename: 'test.html',
|
||||
template: 'src/assets/test.html'
|
||||
})
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Writing Your Own Templates
|
||||
|
||||
If the default generated HTML doesn't meet your needs you can supply
|
||||
your own template. The easiest way is to use the `template` option and pass a custom HTML file.
|
||||
The html-webpack-plugin will automatically inject all necessary CSS, JS, manifest
|
||||
and favicon files into the markup.
|
||||
|
||||
Details of other template loaders are [documented here](https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md).
|
||||
|
||||
```js
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
title: 'Custom template',
|
||||
// Load a custom template (lodash by default)
|
||||
template: 'index.html'
|
||||
})
|
||||
]
|
||||
```
|
||||
|
||||
**index.html**
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
If you already have a template loader, you can use it to parse the template.
|
||||
Please note that this will also happen if you specify the html-loader and use `.html` file as template.
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
module: {
|
||||
loaders: [
|
||||
{ test: /\.hbs$/, loader: "handlebars-loader" }
|
||||
]
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
title: 'Custom template using Handlebars',
|
||||
template: 'index.hbs'
|
||||
})
|
||||
]
|
||||
```
|
||||
|
||||
You can use the `lodash` syntax out of the box. If the `inject` feature doesn't fit your needs and you want full control over the asset placement use the [default template](https://github.com/jaketrent/html-webpack-template/blob/86f285d5c790a6c15263f5cc50fd666d51f974fd/index.html) of the [html-webpack-template project](https://github.com/jaketrent/html-webpack-template) as a starting point for writing your own.
|
||||
|
||||
The following variables are available in the template by default (you can extend them using the `templateParameters` option):
|
||||
|
||||
- `htmlWebpackPlugin`: data specific to this plugin
|
||||
|
||||
- `htmlWebpackPlugin.options`: the options hash that was passed to
|
||||
the plugin. In addition to the options actually used by this plugin,
|
||||
you can use this hash to pass arbitrary data through to your template.
|
||||
|
||||
- `htmlWebpackPlugin.tags`: the prepared `headTags` and `bodyTags` Array to render the `<base>`, `<meta>`, `<script>` and `<link>` tags.
|
||||
Can be used directly in templates and literals. For example:
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<%= htmlWebpackPlugin.tags.headTags %>
|
||||
</head>
|
||||
<body>
|
||||
<%= htmlWebpackPlugin.tags.bodyTags %>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
- `htmlWebpackPlugin.files`: direct access to the files used during the compilation.
|
||||
|
||||
```typescript
|
||||
publicPath: string;
|
||||
js: string[];
|
||||
css: string[];
|
||||
manifest?: string;
|
||||
favicon?: string;
|
||||
```
|
||||
|
||||
|
||||
- `webpackConfig`: the webpack configuration that was used for this compilation. This
|
||||
can be used, for example, to get the `publicPath` (`webpackConfig.output.publicPath`).
|
||||
|
||||
- `compilation`: the webpack [compilation object](https://webpack.js.org/api/compilation-object/).
|
||||
This can be used, for example, to get the contents of processed assets and inline them
|
||||
directly in the page, through `compilation.assets[...].source()`
|
||||
(see [the inline template example](examples/inline/template.pug)).
|
||||
|
||||
|
||||
The template can also be directly inlined directly into the options object.
|
||||
⚠️ **`templateContent` does not allow to use webpack loaders for your template and will not watch for template file changes**
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
new HtmlWebpackPlugin({
|
||||
templateContent: `
|
||||
<html>
|
||||
<body>
|
||||
<h1>Hello World</h1>
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
})
|
||||
```
|
||||
|
||||
The `templateContent` can also access all `templateParameters` values.
|
||||
⚠️ **`templateContent` does not allow to use webpack loaders for your template and will not watch for template file changes**
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
new HtmlWebpackPlugin({
|
||||
inject: false,
|
||||
templateContent: ({htmlWebpackPlugin}) => `
|
||||
<html>
|
||||
<head>
|
||||
${htmlWebpackPlugin.tags.headTags}
|
||||
</head>
|
||||
<body>
|
||||
<h1>Hello World</h1>
|
||||
${htmlWebpackPlugin.tags.bodyTags}
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
})
|
||||
```
|
||||
|
||||
### Filtering Chunks
|
||||
|
||||
To include only certain chunks you can limit the chunks being used
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
chunks: ['app']
|
||||
})
|
||||
]
|
||||
```
|
||||
|
||||
It is also possible to exclude certain chunks by setting the `excludeChunks` option
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
excludeChunks: [ 'dev-helper' ]
|
||||
})
|
||||
]
|
||||
```
|
||||
|
||||
### Minification
|
||||
|
||||
If the `minify` option is set to `true` (the default when webpack's `mode` is `'production'`),
|
||||
the generated HTML will be minified using [html-minifier-terser](https://github.com/DanielRuf/html-minifier-terser)
|
||||
and the following options:
|
||||
|
||||
```js
|
||||
{
|
||||
collapseWhitespace: true,
|
||||
keepClosingSlash: true,
|
||||
removeComments: true,
|
||||
removeRedundantAttributes: true,
|
||||
removeScriptTypeAttributes: true,
|
||||
removeStyleLinkTypeAttributes: true,
|
||||
useShortDoctype: true
|
||||
}
|
||||
```
|
||||
|
||||
To use custom [html-minifier options](https://github.com/DanielRuf/html-minifier-terser#options-quick-reference)
|
||||
pass an object to `minify` instead. This object will not be merged with the defaults above.
|
||||
|
||||
To disable minification during production mode set the `minify` option to `false`.
|
||||
|
||||
### Meta Tags
|
||||
|
||||
If the `meta` option is set the html-webpack-plugin will inject meta tags.
|
||||
For the default template the html-webpack-plugin will already provide a default for the `viewport` meta tag.
|
||||
|
||||
Please take a look at this well maintained list of almost all [possible meta tags](https://github.com/joshbuchea/HEAD#meta).
|
||||
|
||||
#### name/content meta tags
|
||||
|
||||
Most meta tags are configured by setting a `name` and a `content` attribute.
|
||||
To add those use a key/value pair:
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
'meta': {
|
||||
'viewport': 'width=device-width, initial-scale=1, shrink-to-fit=no',
|
||||
// Will generate: <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
'theme-color': '#4285f4'
|
||||
// Will generate: <meta name="theme-color" content="#4285f4">
|
||||
}
|
||||
})
|
||||
]
|
||||
```
|
||||
|
||||
#### Simulate http response headers
|
||||
|
||||
The **http-equiv** attribute is essentially used to simulate a HTTP response header.
|
||||
This format is supported using an object notation which allows you to add any attribute:
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
'meta': {
|
||||
'Content-Security-Policy': { 'http-equiv': 'Content-Security-Policy', 'content': 'default-src https:' },
|
||||
// Will generate: <meta http-equiv="Content-Security-Policy" content="default-src https:">
|
||||
// Which equals to the following http header: `Content-Security-Policy: default-src https:`
|
||||
'set-cookie': { 'http-equiv': 'set-cookie', content: 'name=value; expires=date; path=url' },
|
||||
// Will generate: <meta http-equiv="set-cookie" content="value; expires=date; path=url">
|
||||
// Which equals to the following http header: `set-cookie: value; expires=date; path=url`
|
||||
}
|
||||
})
|
||||
]
|
||||
```
|
||||
|
||||
### Base Tag
|
||||
|
||||
When the `base` option is used,
|
||||
html-webpack-plugin will inject a [base tag](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base).
|
||||
By default, a base tag will not be injected.
|
||||
|
||||
The following two are identical and will both insert `<base href="http://example.com/some/page.html">`:
|
||||
|
||||
```js
|
||||
new HtmlWebpackPlugin({
|
||||
'base': 'http://example.com/some/page.html'
|
||||
})
|
||||
```
|
||||
|
||||
```js
|
||||
new HtmlWebpackPlugin({
|
||||
'base': { 'href': 'http://example.com/some/page.html' }
|
||||
})
|
||||
```
|
||||
|
||||
The `target` can be specified with the corresponding key:
|
||||
|
||||
```js
|
||||
new HtmlWebpackPlugin({
|
||||
'base': {
|
||||
'href': 'http://example.com/some/page.html',
|
||||
'target': '_blank'
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
which will inject the element `<base href="http://example.com/some/page.html" target="_blank">`.
|
||||
|
||||
### Long Term Caching
|
||||
|
||||
For long term caching add `contenthash` to the filename.
|
||||
|
||||
**Example:**
|
||||
|
||||
```js
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.[contenthash].html'
|
||||
})
|
||||
]
|
||||
```
|
||||
|
||||
`contenthash` is the hash of the content of the output file.
|
||||
|
||||
Refer webpack's [Template Strings](https://webpack.js.org/configuration/output/#template-strings) for more details
|
||||
|
||||
### Events
|
||||
|
||||
To allow other [plugins](https://github.com/webpack/docs/wiki/plugins) to alter the HTML this plugin executes
|
||||
[tapable](https://github.com/webpack/tapable/tree/master) hooks.
|
||||
|
||||
The [lib/hooks.js](https://github.com/jantimon/html-webpack-plugin/blob/master/lib/hooks.js) contains all information
|
||||
about which values are passed.
|
||||
|
||||
[](https://github.com/jantimon/html-webpack-plugin/blob/master/flow.puml)
|
||||
|
||||
#### `beforeAssetTagGeneration` hook
|
||||
|
||||
```
|
||||
AsyncSeriesWaterfallHook<{
|
||||
assets: {
|
||||
publicPath: string,
|
||||
js: Array<{string}>,
|
||||
css: Array<{string}>,
|
||||
favicon?: string | undefined,
|
||||
manifest?: string | undefined
|
||||
},
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>
|
||||
```
|
||||
|
||||
#### `alterAssetTags` hook
|
||||
|
||||
```
|
||||
AsyncSeriesWaterfallHook<{
|
||||
assetTags: {
|
||||
scripts: Array<HtmlTagObject>,
|
||||
styles: Array<HtmlTagObject>,
|
||||
meta: Array<HtmlTagObject>,
|
||||
},
|
||||
publicPath: string,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>
|
||||
```
|
||||
|
||||
#### `alterAssetTagGroups` hook
|
||||
|
||||
```
|
||||
AsyncSeriesWaterfallHook<{
|
||||
headTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
bodyTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
publicPath: string,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>
|
||||
```
|
||||
|
||||
#### `afterTemplateExecution` hook
|
||||
|
||||
```
|
||||
AsyncSeriesWaterfallHook<{
|
||||
html: string,
|
||||
headTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
bodyTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin,
|
||||
}>
|
||||
```
|
||||
|
||||
#### `beforeEmit` hook
|
||||
|
||||
```
|
||||
AsyncSeriesWaterfallHook<{
|
||||
html: string,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin,
|
||||
}>
|
||||
```
|
||||
|
||||
#### `afterEmit` hook
|
||||
|
||||
```
|
||||
AsyncSeriesWaterfallHook<{
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>
|
||||
```
|
||||
|
||||
Example implementation: [webpack-subresource-integrity](https://www.npmjs.com/package/webpack-subresource-integrity)
|
||||
|
||||
**plugin.js**
|
||||
```js
|
||||
// If your plugin is direct dependent to the html webpack plugin:
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
// If your plugin is using html-webpack-plugin as an optional dependency
|
||||
// you can use https://github.com/tallesl/node-safe-require instead:
|
||||
const HtmlWebpackPlugin = require('safe-require')('html-webpack-plugin');
|
||||
|
||||
class MyPlugin {
|
||||
apply (compiler) {
|
||||
compiler.hooks.compilation.tap('MyPlugin', (compilation) => {
|
||||
console.log('The compiler is starting a new compilation...')
|
||||
|
||||
// Static Plugin interface |compilation |HOOK NAME | register listener
|
||||
HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync(
|
||||
'MyPlugin', // <-- Set a meaningful name here for stacktraces
|
||||
(data, cb) => {
|
||||
// Manipulate the content
|
||||
data.html += 'The Magic Footer'
|
||||
// Tell webpack to move on
|
||||
cb(null, data)
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = MyPlugin
|
||||
```
|
||||
|
||||
**webpack.config.js**
|
||||
```js
|
||||
plugins: [
|
||||
new MyPlugin({ options: '' })
|
||||
]
|
||||
```
|
||||
|
||||
Note that the callback must be passed the HtmlWebpackPluginData in order to pass this onto any other plugins listening on the same `beforeEmit` event
|
||||
|
||||
<h2 align="center">Maintainers</h2>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img width="150" height="150"
|
||||
src="https://avatars3.githubusercontent.com/u/4113649?v=3&s=150">
|
||||
</br>
|
||||
<a href="https://github.com/jantimon">Jan Nicklas</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img width="150" height="150"
|
||||
src="https://avatars2.githubusercontent.com/u/4112409?v=3&s=150">
|
||||
</br>
|
||||
<a href="https://github.com/mastilver">Thomas Sileghem</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tbody>
|
||||
</table>
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
Thank you to all our backers!
|
||||
If you want to support the project as well [become a sponsor](https://opencollective.com/html-webpack-plugin#sponsor) or a [a backer](https://opencollective.com/html-webpack-plugin#backer).
|
||||
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/0/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/1/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/2/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/3/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/4/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/5/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/6/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/7/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/8/avatar.svg?requireActive=false"></a>
|
||||
<a href="https://opencollective.com/html-webpack-plugin/backer/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/html-webpack-plugin/backer/9/avatar.svg?requireActive=false"></a>
|
||||
|
||||
|
||||
## Contributors
|
||||
|
||||
This project exists thanks to all the people who contribute.
|
||||
|
||||
You're free to contribute to this project by submitting [issues](https://github.com/jantimon/html-webpack-plugin/issues) and/or [pull requests](https://github.com/jantimon/html-webpack-plugin/pulls). This project is test-driven, so keep in mind that every change and new feature should be covered by tests.
|
||||
|
||||
This project uses the [semistandard code style](https://github.com/Flet/semistandard).
|
||||
|
||||
<a href="https://github.com/jantimon/html-webpack-plugin/graphs/contributors"><img src="https://opencollective.com/html-webpack-plugin/contributors.svg?width=890&button=false" /></a>
|
||||
|
||||
|
||||
[npm]: https://img.shields.io/npm/v/html-webpack-plugin.svg
|
||||
[npm-url]: https://npmjs.com/package/html-webpack-plugin
|
||||
|
||||
[node]: https://img.shields.io/node/v/html-webpack-plugin.svg
|
||||
[node-url]: https://nodejs.org
|
||||
|
||||
[tests]: https://github.com/jantimon/html-webpack-plugin/workflows/CI/badge.svg
|
||||
[tests-url]: https://github.com/jantimon/html-webpack-plugin/actions?query=workflow%3ACI
|
9
node_modules/html-webpack-plugin/default_index.ejs
generated
vendored
Normal file
9
node_modules/html-webpack-plugin/default_index.ejs
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
1178
node_modules/html-webpack-plugin/index.js
generated
vendored
Normal file
1178
node_modules/html-webpack-plugin/index.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
379
node_modules/html-webpack-plugin/lib/cached-child-compiler.js
generated
vendored
Normal file
379
node_modules/html-webpack-plugin/lib/cached-child-compiler.js
generated
vendored
Normal file
@ -0,0 +1,379 @@
|
||||
// @ts-check
|
||||
/**
|
||||
* @file
|
||||
* Helper plugin manages the cached state of the child compilation
|
||||
*
|
||||
* To optimize performance the child compilation is running asyncronously.
|
||||
* Therefore it needs to be started in the compiler.make phase and ends after
|
||||
* the compilation.afterCompile phase.
|
||||
*
|
||||
* To prevent bugs from blocked hooks there is no promise or event based api
|
||||
* for this plugin.
|
||||
*
|
||||
* Example usage:
|
||||
*
|
||||
* ```js
|
||||
const childCompilerPlugin = new PersistentChildCompilerPlugin();
|
||||
childCompilerPlugin.addEntry('./src/index.js');
|
||||
compiler.hooks.afterCompile.tapAsync('MyPlugin', (compilation, callback) => {
|
||||
console.log(childCompilerPlugin.getCompilationResult()['./src/index.js']));
|
||||
return true;
|
||||
});
|
||||
* ```
|
||||
*/
|
||||
|
||||
// Import types
|
||||
/** @typedef {import("webpack/lib/Compiler.js")} WebpackCompiler */
|
||||
/** @typedef {import("webpack/lib/Compilation.js")} WebpackCompilation */
|
||||
/** @typedef {{hash: string, entry: any, content: string }} ChildCompilationResultEntry */
|
||||
/** @typedef {import("./file-watcher-api").Snapshot} Snapshot */
|
||||
/** @typedef {{fileDependencies: string[], contextDependencies: string[], missingDependencies: string[]}} FileDependencies */
|
||||
/** @typedef {{
|
||||
dependencies: FileDependencies,
|
||||
compiledEntries: {[entryName: string]: ChildCompilationResultEntry}
|
||||
} | {
|
||||
dependencies: FileDependencies,
|
||||
error: Error
|
||||
}} ChildCompilationResult */
|
||||
'use strict';
|
||||
|
||||
const { HtmlWebpackChildCompiler } = require('./child-compiler');
|
||||
const fileWatcherApi = require('./file-watcher-api');
|
||||
|
||||
/**
|
||||
* This plugin is a singleton for performance reasons.
|
||||
* To keep track if a plugin does already exist for the compiler they are cached
|
||||
* in this map
|
||||
* @type {WeakMap<WebpackCompiler, PersistentChildCompilerSingletonPlugin>}}
|
||||
*/
|
||||
const compilerMap = new WeakMap();
|
||||
|
||||
class CachedChildCompilation {
|
||||
/**
|
||||
* @param {WebpackCompiler} compiler
|
||||
*/
|
||||
constructor (compiler) {
|
||||
/**
|
||||
* @private
|
||||
* @type {WebpackCompiler}
|
||||
*/
|
||||
this.compiler = compiler;
|
||||
// Create a singleton instance for the compiler
|
||||
// if there is none
|
||||
if (compilerMap.has(compiler)) {
|
||||
return;
|
||||
}
|
||||
const persistentChildCompilerSingletonPlugin = new PersistentChildCompilerSingletonPlugin();
|
||||
compilerMap.set(compiler, persistentChildCompilerSingletonPlugin);
|
||||
persistentChildCompilerSingletonPlugin.apply(compiler);
|
||||
}
|
||||
|
||||
/**
|
||||
* apply is called by the webpack main compiler during the start phase
|
||||
* @param {string} entry
|
||||
*/
|
||||
addEntry (entry) {
|
||||
const persistentChildCompilerSingletonPlugin = compilerMap.get(this.compiler);
|
||||
if (!persistentChildCompilerSingletonPlugin) {
|
||||
throw new Error(
|
||||
'PersistentChildCompilerSingletonPlugin instance not found.'
|
||||
);
|
||||
}
|
||||
persistentChildCompilerSingletonPlugin.addEntry(entry);
|
||||
}
|
||||
|
||||
getCompilationResult () {
|
||||
const persistentChildCompilerSingletonPlugin = compilerMap.get(this.compiler);
|
||||
if (!persistentChildCompilerSingletonPlugin) {
|
||||
throw new Error(
|
||||
'PersistentChildCompilerSingletonPlugin instance not found.'
|
||||
);
|
||||
}
|
||||
return persistentChildCompilerSingletonPlugin.getLatestResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the result for the given entry
|
||||
* @param {string} entry
|
||||
* @returns {
|
||||
| { mainCompilationHash: string, error: Error }
|
||||
| { mainCompilationHash: string, compiledEntry: ChildCompilationResultEntry }
|
||||
}
|
||||
*/
|
||||
getCompilationEntryResult (entry) {
|
||||
const latestResult = this.getCompilationResult();
|
||||
const compilationResult = latestResult.compilationResult;
|
||||
return 'error' in compilationResult ? {
|
||||
mainCompilationHash: latestResult.mainCompilationHash,
|
||||
error: compilationResult.error
|
||||
} : {
|
||||
mainCompilationHash: latestResult.mainCompilationHash,
|
||||
compiledEntry: compilationResult.compiledEntries[entry]
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
class PersistentChildCompilerSingletonPlugin {
|
||||
constructor () {
|
||||
/**
|
||||
* @private
|
||||
* @type {
|
||||
| {
|
||||
isCompiling: false,
|
||||
isVerifyingCache: false,
|
||||
entries: string[],
|
||||
compiledEntries: string[],
|
||||
mainCompilationHash: string,
|
||||
compilationResult: ChildCompilationResult
|
||||
}
|
||||
| Readonly<{
|
||||
isCompiling: false,
|
||||
isVerifyingCache: true,
|
||||
entries: string[],
|
||||
previousEntries: string[],
|
||||
previousResult: ChildCompilationResult
|
||||
}>
|
||||
| Readonly <{
|
||||
isVerifyingCache: false,
|
||||
isCompiling: true,
|
||||
entries: string[],
|
||||
}>
|
||||
} the internal compilation state */
|
||||
this.compilationState = {
|
||||
isCompiling: false,
|
||||
isVerifyingCache: false,
|
||||
entries: [],
|
||||
compiledEntries: [],
|
||||
mainCompilationHash: 'initial',
|
||||
compilationResult: {
|
||||
dependencies: {
|
||||
fileDependencies: [],
|
||||
contextDependencies: [],
|
||||
missingDependencies: []
|
||||
},
|
||||
compiledEntries: {}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* apply is called by the webpack main compiler during the start phase
|
||||
* @param {WebpackCompiler} compiler
|
||||
*/
|
||||
apply (compiler) {
|
||||
/** @type Promise<ChildCompilationResult> */
|
||||
let childCompilationResultPromise = Promise.resolve({
|
||||
dependencies: {
|
||||
fileDependencies: [],
|
||||
contextDependencies: [],
|
||||
missingDependencies: []
|
||||
},
|
||||
compiledEntries: {}
|
||||
});
|
||||
/**
|
||||
* The main compilation hash which will only be updated
|
||||
* if the childCompiler changes
|
||||
*/
|
||||
let mainCompilationHashOfLastChildRecompile = '';
|
||||
/** @typedef{Snapshot|undefined} */
|
||||
let previousFileSystemSnapshot;
|
||||
let compilationStartTime = new Date().getTime();
|
||||
|
||||
compiler.hooks.make.tapAsync(
|
||||
'PersistentChildCompilerSingletonPlugin',
|
||||
(mainCompilation, callback) => {
|
||||
if (this.compilationState.isCompiling || this.compilationState.isVerifyingCache) {
|
||||
return callback(new Error('Child compilation has already started'));
|
||||
}
|
||||
|
||||
// Update the time to the current compile start time
|
||||
compilationStartTime = new Date().getTime();
|
||||
|
||||
// The compilation starts - adding new templates is now not possible anymore
|
||||
this.compilationState = {
|
||||
isCompiling: false,
|
||||
isVerifyingCache: true,
|
||||
previousEntries: this.compilationState.compiledEntries,
|
||||
previousResult: this.compilationState.compilationResult,
|
||||
entries: this.compilationState.entries
|
||||
};
|
||||
|
||||
// Validate cache:
|
||||
const isCacheValidPromise = this.isCacheValid(previousFileSystemSnapshot, mainCompilation);
|
||||
|
||||
let cachedResult = childCompilationResultPromise;
|
||||
childCompilationResultPromise = isCacheValidPromise.then((isCacheValid) => {
|
||||
// Reuse cache
|
||||
if (isCacheValid) {
|
||||
return cachedResult;
|
||||
}
|
||||
// Start the compilation
|
||||
const compiledEntriesPromise = this.compileEntries(
|
||||
mainCompilation,
|
||||
this.compilationState.entries
|
||||
);
|
||||
// Update snapshot as soon as we know the filedependencies
|
||||
// this might possibly cause bugs if files were changed inbetween
|
||||
// compilation start and snapshot creation
|
||||
compiledEntriesPromise.then((childCompilationResult) => {
|
||||
return fileWatcherApi.createSnapshot(childCompilationResult.dependencies, mainCompilation, compilationStartTime);
|
||||
}).then((snapshot) => {
|
||||
previousFileSystemSnapshot = snapshot;
|
||||
});
|
||||
return compiledEntriesPromise;
|
||||
});
|
||||
|
||||
// Add files to compilation which needs to be watched:
|
||||
mainCompilation.hooks.optimizeTree.tapAsync(
|
||||
'PersistentChildCompilerSingletonPlugin',
|
||||
(chunks, modules, callback) => {
|
||||
const handleCompilationDonePromise = childCompilationResultPromise.then(
|
||||
childCompilationResult => {
|
||||
this.watchFiles(
|
||||
mainCompilation,
|
||||
childCompilationResult.dependencies
|
||||
);
|
||||
});
|
||||
handleCompilationDonePromise.then(() => callback(null, chunks, modules), callback);
|
||||
}
|
||||
);
|
||||
|
||||
// Store the final compilation once the main compilation hash is known
|
||||
mainCompilation.hooks.additionalAssets.tapAsync(
|
||||
'PersistentChildCompilerSingletonPlugin',
|
||||
(callback) => {
|
||||
const didRecompilePromise = Promise.all([childCompilationResultPromise, cachedResult]).then(
|
||||
([childCompilationResult, cachedResult]) => {
|
||||
// Update if childCompilation changed
|
||||
return (cachedResult !== childCompilationResult);
|
||||
}
|
||||
);
|
||||
|
||||
const handleCompilationDonePromise = Promise.all([childCompilationResultPromise, didRecompilePromise]).then(
|
||||
([childCompilationResult, didRecompile]) => {
|
||||
// Update hash and snapshot if childCompilation changed
|
||||
if (didRecompile) {
|
||||
mainCompilationHashOfLastChildRecompile = mainCompilation.hash;
|
||||
}
|
||||
this.compilationState = {
|
||||
isCompiling: false,
|
||||
isVerifyingCache: false,
|
||||
entries: this.compilationState.entries,
|
||||
compiledEntries: this.compilationState.entries,
|
||||
compilationResult: childCompilationResult,
|
||||
mainCompilationHash: mainCompilationHashOfLastChildRecompile
|
||||
};
|
||||
});
|
||||
handleCompilationDonePromise.then(() => callback(null), callback);
|
||||
}
|
||||
);
|
||||
|
||||
// Continue compilation:
|
||||
callback(null);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new entry to the next compile run
|
||||
* @param {string} entry
|
||||
*/
|
||||
addEntry (entry) {
|
||||
if (this.compilationState.isCompiling || this.compilationState.isVerifyingCache) {
|
||||
throw new Error(
|
||||
'The child compiler has already started to compile. ' +
|
||||
"Please add entries before the main compiler 'make' phase has started or " +
|
||||
'after the compilation is done.'
|
||||
);
|
||||
}
|
||||
if (this.compilationState.entries.indexOf(entry) === -1) {
|
||||
this.compilationState.entries = [...this.compilationState.entries, entry];
|
||||
}
|
||||
}
|
||||
|
||||
getLatestResult () {
|
||||
if (this.compilationState.isCompiling || this.compilationState.isVerifyingCache) {
|
||||
throw new Error(
|
||||
'The child compiler is not done compiling. ' +
|
||||
"Please access the result after the compiler 'make' phase has started or " +
|
||||
'after the compilation is done.'
|
||||
);
|
||||
}
|
||||
return {
|
||||
mainCompilationHash: this.compilationState.mainCompilationHash,
|
||||
compilationResult: this.compilationState.compilationResult
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify that the cache is still valid
|
||||
* @private
|
||||
* @param {Snapshot | undefined} snapshot
|
||||
* @param {WebpackCompilation} mainCompilation
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
isCacheValid (snapshot, mainCompilation) {
|
||||
if (!this.compilationState.isVerifyingCache) {
|
||||
return Promise.reject(new Error('Cache validation can only be done right before the compilation starts'));
|
||||
}
|
||||
// If there are no entries we don't need a new child compilation
|
||||
if (this.compilationState.entries.length === 0) {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
// If there are new entries the cache is invalid
|
||||
if (this.compilationState.entries !== this.compilationState.previousEntries) {
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
// Mark the cache as invalid if there is no snapshot
|
||||
if (!snapshot) {
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
return fileWatcherApi.isSnapShotValid(snapshot, mainCompilation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start to compile all templates
|
||||
*
|
||||
* @private
|
||||
* @param {WebpackCompilation} mainCompilation
|
||||
* @param {string[]} entries
|
||||
* @returns {Promise<ChildCompilationResult>}
|
||||
*/
|
||||
compileEntries (mainCompilation, entries) {
|
||||
const compiler = new HtmlWebpackChildCompiler(entries);
|
||||
return compiler.compileTemplates(mainCompilation).then((result) => {
|
||||
return {
|
||||
// The compiled sources to render the content
|
||||
compiledEntries: result,
|
||||
// The file dependencies to find out if a
|
||||
// recompilation is required
|
||||
dependencies: compiler.fileDependencies,
|
||||
// The main compilation hash can be used to find out
|
||||
// if this compilation was done during the current compilation
|
||||
mainCompilationHash: mainCompilation.hash
|
||||
};
|
||||
}, error => ({
|
||||
// The compiled sources to render the content
|
||||
error,
|
||||
// The file dependencies to find out if a
|
||||
// recompilation is required
|
||||
dependencies: compiler.fileDependencies,
|
||||
// The main compilation hash can be used to find out
|
||||
// if this compilation was done during the current compilation
|
||||
mainCompilationHash: mainCompilation.hash
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {WebpackCompilation} mainCompilation
|
||||
* @param {FileDependencies} files
|
||||
*/
|
||||
watchFiles (mainCompilation, files) {
|
||||
fileWatcherApi.watchFiles(mainCompilation, files);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
CachedChildCompilation
|
||||
};
|
206
node_modules/html-webpack-plugin/lib/child-compiler.js
generated
vendored
Normal file
206
node_modules/html-webpack-plugin/lib/child-compiler.js
generated
vendored
Normal file
@ -0,0 +1,206 @@
|
||||
// @ts-check
|
||||
/** @typedef {import("webpack/lib/Compilation.js")} WebpackCompilation */
|
||||
/** @typedef {import("webpack/lib/Compiler.js")} WebpackCompiler */
|
||||
/** @typedef {import("webpack/lib/Chunk.js")} WebpackChunk */
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @file
|
||||
* This file uses webpack to compile a template with a child compiler.
|
||||
*
|
||||
* [TEMPLATE] -> [JAVASCRIPT]
|
||||
*
|
||||
*/
|
||||
|
||||
let instanceId = 0;
|
||||
/**
|
||||
* The HtmlWebpackChildCompiler is a helper to allow reusing one childCompiler
|
||||
* for multiple HtmlWebpackPlugin instances to improve the compilation performance.
|
||||
*/
|
||||
class HtmlWebpackChildCompiler {
|
||||
/**
|
||||
*
|
||||
* @param {string[]} templates
|
||||
*/
|
||||
constructor (templates) {
|
||||
/** Id for this ChildCompiler */
|
||||
this.id = instanceId++;
|
||||
/**
|
||||
* @type {string[]} templateIds
|
||||
* The template array will allow us to keep track which input generated which output
|
||||
*/
|
||||
this.templates = templates;
|
||||
/**
|
||||
* @type {Promise<{[templatePath: string]: { content: string, hash: string, entry: WebpackChunk }}>}
|
||||
*/
|
||||
this.compilationPromise; // eslint-disable-line
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
this.compilationStartedTimestamp; // eslint-disable-line
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
this.compilationEndedTimestamp; // eslint-disable-line
|
||||
/**
|
||||
* All file dependencies of the child compiler
|
||||
* @type {{fileDependencies: string[], contextDependencies: string[], missingDependencies: string[]}}
|
||||
*/
|
||||
this.fileDependencies = { fileDependencies: [], contextDependencies: [], missingDependencies: [] };
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the childCompiler is currently compiling
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isCompiling () {
|
||||
return !this.didCompile() && this.compilationStartedTimestamp !== undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the childCompiler is done compiling
|
||||
*/
|
||||
didCompile () {
|
||||
return this.compilationEndedTimestamp !== undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will start the template compilation
|
||||
* once it is started no more templates can be added
|
||||
*
|
||||
* @param {import('webpack').Compilation} mainCompilation
|
||||
* @returns {Promise<{[templatePath: string]: { content: string, hash: string, entry: WebpackChunk }}>}
|
||||
*/
|
||||
compileTemplates (mainCompilation) {
|
||||
const webpack = mainCompilation.compiler.webpack;
|
||||
const Compilation = webpack.Compilation;
|
||||
|
||||
const NodeTemplatePlugin = webpack.node.NodeTemplatePlugin;
|
||||
const NodeTargetPlugin = webpack.node.NodeTargetPlugin;
|
||||
const LoaderTargetPlugin = webpack.LoaderTargetPlugin;
|
||||
const EntryPlugin = webpack.EntryPlugin;
|
||||
|
||||
// To prevent multiple compilations for the same template
|
||||
// the compilation is cached in a promise.
|
||||
// If it already exists return
|
||||
if (this.compilationPromise) {
|
||||
return this.compilationPromise;
|
||||
}
|
||||
|
||||
const outputOptions = {
|
||||
filename: '__child-[name]',
|
||||
publicPath: '',
|
||||
library: {
|
||||
type: 'var',
|
||||
name: 'HTML_WEBPACK_PLUGIN_RESULT'
|
||||
},
|
||||
scriptType: /** @type {'text/javascript'} */('text/javascript'),
|
||||
iife: true
|
||||
};
|
||||
const compilerName = 'HtmlWebpackCompiler';
|
||||
// Create an additional child compiler which takes the template
|
||||
// and turns it into an Node.JS html factory.
|
||||
// This allows us to use loaders during the compilation
|
||||
const childCompiler = mainCompilation.createChildCompiler(compilerName, outputOptions, [
|
||||
// Compile the template to nodejs javascript
|
||||
new NodeTargetPlugin(),
|
||||
new NodeTemplatePlugin(),
|
||||
new LoaderTargetPlugin('node'),
|
||||
new webpack.library.EnableLibraryPlugin('var')
|
||||
]);
|
||||
// The file path context which webpack uses to resolve all relative files to
|
||||
childCompiler.context = mainCompilation.compiler.context;
|
||||
|
||||
// Generate output file names
|
||||
const temporaryTemplateNames = this.templates.map((template, index) => `__child-HtmlWebpackPlugin_${index}-${this.id}`);
|
||||
|
||||
// Add all templates
|
||||
this.templates.forEach((template, index) => {
|
||||
new EntryPlugin(childCompiler.context, 'data:text/javascript,__webpack_public_path__ = __webpack_base_uri__ = htmlWebpackPluginPublicPath;', `HtmlWebpackPlugin_${index}-${this.id}`).apply(childCompiler);
|
||||
new EntryPlugin(childCompiler.context, template, `HtmlWebpackPlugin_${index}-${this.id}`).apply(childCompiler);
|
||||
});
|
||||
|
||||
// The templates are compiled and executed by NodeJS - similar to server side rendering
|
||||
// Unfortunately this causes issues as some loaders require an absolute URL to support ES Modules
|
||||
// The following config enables relative URL support for the child compiler
|
||||
childCompiler.options.module = { ...childCompiler.options.module };
|
||||
childCompiler.options.module.parser = { ...childCompiler.options.module.parser };
|
||||
childCompiler.options.module.parser.javascript = { ...childCompiler.options.module.parser.javascript,
|
||||
url: 'relative' };
|
||||
|
||||
this.compilationStartedTimestamp = new Date().getTime();
|
||||
this.compilationPromise = new Promise((resolve, reject) => {
|
||||
const extractedAssets = [];
|
||||
childCompiler.hooks.thisCompilation.tap('HtmlWebpackPlugin', (compilation) => {
|
||||
compilation.hooks.processAssets.tap(
|
||||
{
|
||||
name: 'HtmlWebpackPlugin',
|
||||
stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONS
|
||||
},
|
||||
(assets) => {
|
||||
temporaryTemplateNames.forEach((temporaryTemplateName) => {
|
||||
if (assets[temporaryTemplateName]) {
|
||||
extractedAssets.push(assets[temporaryTemplateName]);
|
||||
compilation.deleteAsset(temporaryTemplateName);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
childCompiler.runAsChild((err, entries, childCompilation) => {
|
||||
// Extract templates
|
||||
const compiledTemplates = entries
|
||||
? extractedAssets.map((asset) => asset.source())
|
||||
: [];
|
||||
// Extract file dependencies
|
||||
if (entries && childCompilation) {
|
||||
this.fileDependencies = { fileDependencies: Array.from(childCompilation.fileDependencies), contextDependencies: Array.from(childCompilation.contextDependencies), missingDependencies: Array.from(childCompilation.missingDependencies) };
|
||||
}
|
||||
// Reject the promise if the childCompilation contains error
|
||||
if (childCompilation && childCompilation.errors && childCompilation.errors.length) {
|
||||
const errorDetails = childCompilation.errors.map(error => {
|
||||
let message = error.message;
|
||||
if (error.stack) {
|
||||
message += '\n' + error.stack;
|
||||
}
|
||||
return message;
|
||||
}).join('\n');
|
||||
reject(new Error('Child compilation failed:\n' + errorDetails));
|
||||
return;
|
||||
}
|
||||
// Reject if the error object contains errors
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
if (!childCompilation || !entries) {
|
||||
reject(new Error('Empty child compilation'));
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* @type {{[templatePath: string]: { content: string, hash: string, entry: WebpackChunk }}}
|
||||
*/
|
||||
const result = {};
|
||||
compiledTemplates.forEach((templateSource, entryIndex) => {
|
||||
// The compiledTemplates are generated from the entries added in
|
||||
// the addTemplate function.
|
||||
// Therefore the array index of this.templates should be the as entryIndex.
|
||||
result[this.templates[entryIndex]] = {
|
||||
content: templateSource,
|
||||
hash: childCompilation.hash || 'XXXX',
|
||||
entry: entries[entryIndex]
|
||||
};
|
||||
});
|
||||
this.compilationEndedTimestamp = new Date().getTime();
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
|
||||
return this.compilationPromise;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
HtmlWebpackChildCompiler
|
||||
};
|
40
node_modules/html-webpack-plugin/lib/chunksorter.js
generated
vendored
Normal file
40
node_modules/html-webpack-plugin/lib/chunksorter.js
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
// @ts-check
|
||||
/** @typedef {import("webpack/lib/Compilation.js")} WebpackCompilation */
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @type {{[sortmode: string] : (entryPointNames: Array<string>, compilation, htmlWebpackPluginOptions) => Array<string> }}
|
||||
* This file contains different sort methods for the entry chunks names
|
||||
*/
|
||||
module.exports = {};
|
||||
|
||||
/**
|
||||
* Performs identity mapping (no-sort).
|
||||
* @param {Array} chunks the chunks to sort
|
||||
* @return {Array} The sorted chunks
|
||||
*/
|
||||
module.exports.none = chunks => chunks;
|
||||
|
||||
/**
|
||||
* Sort manually by the chunks
|
||||
* @param {string[]} entryPointNames the chunks to sort
|
||||
* @param {WebpackCompilation} compilation the webpack compilation
|
||||
* @param htmlWebpackPluginOptions the plugin options
|
||||
* @return {string[]} The sorted chunks
|
||||
*/
|
||||
module.exports.manual = (entryPointNames, compilation, htmlWebpackPluginOptions) => {
|
||||
const chunks = htmlWebpackPluginOptions.chunks;
|
||||
if (!Array.isArray(chunks)) {
|
||||
return entryPointNames;
|
||||
}
|
||||
// Remove none existing entries from
|
||||
// htmlWebpackPluginOptions.chunks
|
||||
return chunks.filter((entryPointName) => {
|
||||
return compilation.entrypoints.has(entryPointName);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines the default sorter.
|
||||
*/
|
||||
module.exports.auto = module.exports.none;
|
40
node_modules/html-webpack-plugin/lib/errors.js
generated
vendored
Normal file
40
node_modules/html-webpack-plugin/lib/errors.js
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
// @ts-nocheck
|
||||
'use strict';
|
||||
|
||||
let prettyError;
|
||||
|
||||
function getPrettyError () {
|
||||
if (!prettyError) {
|
||||
// lazily require to improve startup time since pretty-error is rather heavy package
|
||||
const PrettyError = require('pretty-error');
|
||||
prettyError = new PrettyError();
|
||||
prettyError.withoutColors();
|
||||
prettyError.skipPackage('html-plugin-evaluation');
|
||||
prettyError.skipNodeFiles();
|
||||
prettyError.skip(function (traceLine) {
|
||||
return traceLine.path === 'html-plugin-evaluation';
|
||||
});
|
||||
}
|
||||
return prettyError;
|
||||
}
|
||||
|
||||
module.exports = function (err, context) {
|
||||
return {
|
||||
toHtml: function () {
|
||||
return 'Html Webpack Plugin:\n<pre>\n' + this.toString() + '</pre>';
|
||||
},
|
||||
toJsonHtml: function () {
|
||||
return JSON.stringify(this.toHtml());
|
||||
},
|
||||
toString: function () {
|
||||
try {
|
||||
return getPrettyError().render(err).replace(/webpack:\/\/\/\./g, context);
|
||||
} catch (e) {
|
||||
// This can sometimes fail. We don't know why, but returning the
|
||||
// original error is better than returning the error thrown by
|
||||
// pretty-error.
|
||||
return err;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
71
node_modules/html-webpack-plugin/lib/file-watcher-api.js
generated
vendored
Normal file
71
node_modules/html-webpack-plugin/lib/file-watcher-api.js
generated
vendored
Normal file
@ -0,0 +1,71 @@
|
||||
// @ts-check
|
||||
/** @typedef {import("webpack/lib/Compilation.js")} WebpackCompilation */
|
||||
/** @typedef {import("webpack/lib/FileSystemInfo").Snapshot} Snapshot */
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {{fileDependencies: string[], contextDependencies: string[], missingDependencies: string[]}} fileDependencies
|
||||
* @param {WebpackCompilation} mainCompilation
|
||||
* @param {number} startTime
|
||||
*/
|
||||
function createSnapshot (fileDependencies, mainCompilation, startTime) {
|
||||
return new Promise((resolve, reject) => {
|
||||
mainCompilation.fileSystemInfo.createSnapshot(
|
||||
startTime,
|
||||
fileDependencies.fileDependencies,
|
||||
fileDependencies.contextDependencies,
|
||||
fileDependencies.missingDependencies,
|
||||
null,
|
||||
(err, snapshot) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
resolve(snapshot);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the files inside this snapshot
|
||||
* have not been changed
|
||||
*
|
||||
* @param {Snapshot} snapshot
|
||||
* @param {WebpackCompilation} mainCompilation
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
function isSnapShotValid (snapshot, mainCompilation) {
|
||||
return new Promise((resolve, reject) => {
|
||||
mainCompilation.fileSystemInfo.checkSnapshotValid(
|
||||
snapshot,
|
||||
(err, isValid) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
}
|
||||
resolve(isValid);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the files keep watched for changes
|
||||
* and will trigger a recompile
|
||||
*
|
||||
* @param {WebpackCompilation} mainCompilation
|
||||
* @param {{fileDependencies: string[], contextDependencies: string[], missingDependencies: string[]}} fileDependencies
|
||||
*/
|
||||
function watchFiles (mainCompilation, fileDependencies) {
|
||||
Object.keys(fileDependencies).forEach((depencyTypes) => {
|
||||
fileDependencies[depencyTypes].forEach(fileDependency => {
|
||||
mainCompilation[depencyTypes].add(fileDependency);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createSnapshot,
|
||||
isSnapShotValid,
|
||||
watchFiles
|
||||
};
|
108
node_modules/html-webpack-plugin/lib/hooks.js
generated
vendored
Normal file
108
node_modules/html-webpack-plugin/lib/hooks.js
generated
vendored
Normal file
@ -0,0 +1,108 @@
|
||||
// @ts-check
|
||||
/** @typedef {import("../typings").Hooks} HtmlWebpackPluginHooks */
|
||||
'use strict';
|
||||
/**
|
||||
* This file provides access to all public htmlWebpackPlugin hooks
|
||||
*/
|
||||
|
||||
/** @typedef {import("webpack/lib/Compilation.js")} WebpackCompilation */
|
||||
/** @typedef {import("../index.js")} HtmlWebpackPlugin */
|
||||
|
||||
const AsyncSeriesWaterfallHook = require('tapable').AsyncSeriesWaterfallHook;
|
||||
|
||||
// The following is the API definition for all available hooks
|
||||
// For the TypeScript definition, see the Hooks type in typings.d.ts
|
||||
/**
|
||||
beforeAssetTagGeneration:
|
||||
AsyncSeriesWaterfallHook<{
|
||||
assets: {
|
||||
publicPath: string,
|
||||
js: Array<string>,
|
||||
css: Array<string>,
|
||||
favicon?: string | undefined,
|
||||
manifest?: string | undefined
|
||||
},
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>,
|
||||
alterAssetTags:
|
||||
AsyncSeriesWaterfallHook<{
|
||||
assetTags: {
|
||||
scripts: Array<HtmlTagObject>,
|
||||
styles: Array<HtmlTagObject>,
|
||||
meta: Array<HtmlTagObject>,
|
||||
},
|
||||
publicPath: string,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>,
|
||||
alterAssetTagGroups:
|
||||
AsyncSeriesWaterfallHook<{
|
||||
headTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
bodyTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
publicPath: string,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>,
|
||||
afterTemplateExecution:
|
||||
AsyncSeriesWaterfallHook<{
|
||||
html: string,
|
||||
headTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
bodyTags: Array<HtmlTagObject | HtmlTagObject>,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin,
|
||||
}>,
|
||||
beforeEmit:
|
||||
AsyncSeriesWaterfallHook<{
|
||||
html: string,
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin,
|
||||
}>,
|
||||
afterEmit:
|
||||
AsyncSeriesWaterfallHook<{
|
||||
outputName: string,
|
||||
plugin: HtmlWebpackPlugin
|
||||
}>
|
||||
*/
|
||||
|
||||
/**
|
||||
* @type {WeakMap<WebpackCompilation, HtmlWebpackPluginHooks>}}
|
||||
*/
|
||||
const htmlWebpackPluginHooksMap = new WeakMap();
|
||||
|
||||
/**
|
||||
* Returns all public hooks of the html webpack plugin for the given compilation
|
||||
*
|
||||
* @param {WebpackCompilation} compilation
|
||||
* @returns {HtmlWebpackPluginHooks}
|
||||
*/
|
||||
function getHtmlWebpackPluginHooks (compilation) {
|
||||
let hooks = htmlWebpackPluginHooksMap.get(compilation);
|
||||
// Setup the hooks only once
|
||||
if (hooks === undefined) {
|
||||
hooks = createHtmlWebpackPluginHooks();
|
||||
htmlWebpackPluginHooksMap.set(compilation, hooks);
|
||||
}
|
||||
return hooks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add hooks to the webpack compilation object to allow foreign plugins to
|
||||
* extend the HtmlWebpackPlugin
|
||||
*
|
||||
* @returns {HtmlWebpackPluginHooks}
|
||||
*/
|
||||
function createHtmlWebpackPluginHooks () {
|
||||
return {
|
||||
beforeAssetTagGeneration: new AsyncSeriesWaterfallHook(['pluginArgs']),
|
||||
alterAssetTags: new AsyncSeriesWaterfallHook(['pluginArgs']),
|
||||
alterAssetTagGroups: new AsyncSeriesWaterfallHook(['pluginArgs']),
|
||||
afterTemplateExecution: new AsyncSeriesWaterfallHook(['pluginArgs']),
|
||||
beforeEmit: new AsyncSeriesWaterfallHook(['pluginArgs']),
|
||||
afterEmit: new AsyncSeriesWaterfallHook(['pluginArgs'])
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getHtmlWebpackPluginHooks
|
||||
};
|
99
node_modules/html-webpack-plugin/lib/html-tags.js
generated
vendored
Normal file
99
node_modules/html-webpack-plugin/lib/html-tags.js
generated
vendored
Normal file
@ -0,0 +1,99 @@
|
||||
// @ts-check
|
||||
/** @typedef {import("../typings").HtmlTagObject} HtmlTagObject */
|
||||
/**
|
||||
* @file
|
||||
* This file provides to helper to create html as a object representation as
|
||||
* those objects are easier to modify than pure string representations
|
||||
*
|
||||
* Usage:
|
||||
* ```
|
||||
* const element = createHtmlTagObject('h1', {class: 'demo'}, 'Hello World');
|
||||
* const html = htmlTagObjectToString(element);
|
||||
* console.log(html) // -> <h1 class="demo">Hello World</h1>
|
||||
* ```
|
||||
*/
|
||||
|
||||
/**
|
||||
* All html tag elements which must not contain innerHTML
|
||||
* @see https://www.w3.org/TR/html5/syntax.html#void-elements
|
||||
*/
|
||||
const voidTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
|
||||
|
||||
/**
|
||||
* Turn a tag definition into a html string
|
||||
* @param {HtmlTagObject} tagDefinition
|
||||
* A tag element according to the htmlWebpackPlugin object notation
|
||||
*
|
||||
* @param xhtml {boolean}
|
||||
* Whether the generated html should add closing slashes to be xhtml compliant
|
||||
*/
|
||||
function htmlTagObjectToString (tagDefinition, xhtml) {
|
||||
const attributes = Object.keys(tagDefinition.attributes || {})
|
||||
.filter(function (attributeName) {
|
||||
return tagDefinition.attributes[attributeName] === '' || tagDefinition.attributes[attributeName];
|
||||
})
|
||||
.map(function (attributeName) {
|
||||
if (tagDefinition.attributes[attributeName] === true) {
|
||||
return xhtml ? attributeName + '="' + attributeName + '"' : attributeName;
|
||||
}
|
||||
return attributeName + '="' + tagDefinition.attributes[attributeName] + '"';
|
||||
});
|
||||
return '<' + [tagDefinition.tagName].concat(attributes).join(' ') + (tagDefinition.voidTag && xhtml ? '/' : '') + '>' +
|
||||
(tagDefinition.innerHTML || '') +
|
||||
(tagDefinition.voidTag ? '' : '</' + tagDefinition.tagName + '>');
|
||||
}
|
||||
|
||||
/**
|
||||
* Static helper to create a tag object to be get injected into the dom
|
||||
*
|
||||
* @param {string} tagName
|
||||
* the name of the tag e.g. 'div'
|
||||
*
|
||||
* @param {{[attributeName: string]: string|boolean|null|undefined}} [attributes]
|
||||
* tag attributes e.g. `{ 'class': 'example', disabled: true }`
|
||||
*
|
||||
* @param {string} [innerHTML]
|
||||
*
|
||||
* @param {{[attributeName: string]: string|boolean|null|undefined}} [meta]
|
||||
* meta information about the tag e.g. `{ 'plugin': 'html-webpack-plugin' }`
|
||||
*
|
||||
* @returns {HtmlTagObject}
|
||||
*/
|
||||
function createHtmlTagObject (tagName, attributes, innerHTML, meta) {
|
||||
return {
|
||||
tagName: tagName,
|
||||
voidTag: voidTags.indexOf(tagName) !== -1,
|
||||
attributes: attributes || {},
|
||||
meta: meta || {},
|
||||
innerHTML: innerHTML
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* The `HtmlTagArray Array with a custom `.toString()` method.
|
||||
*
|
||||
* This allows the following:
|
||||
* ```
|
||||
* const tags = HtmlTagArray.from([tag1, tag2]);
|
||||
* const scriptTags = tags.filter((tag) => tag.tagName === 'script');
|
||||
* const html = scriptTags.toString();
|
||||
* ```
|
||||
*
|
||||
* Or inside a string literal:
|
||||
* ```
|
||||
* const tags = HtmlTagArray.from([tag1, tag2]);
|
||||
* const html = `<html><body>${tags.filter((tag) => tag.tagName === 'script')}</body></html>`;
|
||||
* ```
|
||||
*
|
||||
*/
|
||||
class HtmlTagArray extends Array {
|
||||
toString () {
|
||||
return this.join('');
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
HtmlTagArray: HtmlTagArray,
|
||||
createHtmlTagObject: createHtmlTagObject,
|
||||
htmlTagObjectToString: htmlTagObjectToString
|
||||
};
|
40
node_modules/html-webpack-plugin/lib/loader.js
generated
vendored
Normal file
40
node_modules/html-webpack-plugin/lib/loader.js
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
/* This loader renders the template with underscore if no other loader was found */
|
||||
// @ts-nocheck
|
||||
'use strict';
|
||||
const _ = require('lodash');
|
||||
|
||||
module.exports = function (source) {
|
||||
// Get templating options
|
||||
const options = this.getOptions();
|
||||
const force = options.force || false;
|
||||
|
||||
const allLoadersButThisOne = this.loaders.filter((loader) => loader.normal !== module.exports);
|
||||
|
||||
// This loader shouldn't kick in if there is any other loader (unless it's explicitly enforced)
|
||||
if (allLoadersButThisOne.length > 0 && !force) {
|
||||
return source;
|
||||
}
|
||||
|
||||
// Allow only one html-webpack-plugin loader to allow loader options in the webpack config
|
||||
const htmlWebpackPluginLoaders = this.loaders.filter((loader) => loader.normal === module.exports);
|
||||
const lastHtmlWebpackPluginLoader = htmlWebpackPluginLoaders[htmlWebpackPluginLoaders.length - 1];
|
||||
if (this.loaders[this.loaderIndex] !== lastHtmlWebpackPluginLoader) {
|
||||
return source;
|
||||
}
|
||||
|
||||
// Skip .js files (unless it's explicitly enforced)
|
||||
if (/\.(c|m)?js$/.test(this.resourcePath) && !force) {
|
||||
return source;
|
||||
}
|
||||
|
||||
// The following part renders the template with lodash as a minimalistic loader
|
||||
//
|
||||
const template = _.template(source, { interpolate: /<%=([\s\S]+?)%>/g, variable: 'data', ...options });
|
||||
// Use `eval("require")("lodash")` to enforce using the native nodejs require
|
||||
// during template execution
|
||||
return 'var _ = eval("require")(' + JSON.stringify(require.resolve('lodash')) + ');' +
|
||||
'module.exports = function (templateParams) { with(templateParams) {' +
|
||||
// Execute the lodash template
|
||||
'return (' + template.source + ')();' +
|
||||
'}}';
|
||||
};
|
15
node_modules/html-webpack-plugin/node_modules/.bin/html-minifier-terser
generated
vendored
Normal file
15
node_modules/html-webpack-plugin/node_modules/.bin/html-minifier-terser
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
||||
|
||||
case `uname` in
|
||||
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
||||
esac
|
||||
|
||||
if [ -x "$basedir/node" ]; then
|
||||
"$basedir/node" "$basedir/../../../html-minifier-terser/cli.js" "$@"
|
||||
ret=$?
|
||||
else
|
||||
node "$basedir/../../../html-minifier-terser/cli.js" "$@"
|
||||
ret=$?
|
||||
fi
|
||||
exit $ret
|
7
node_modules/html-webpack-plugin/node_modules/.bin/html-minifier-terser.cmd
generated
vendored
Normal file
7
node_modules/html-webpack-plugin/node_modules/.bin/html-minifier-terser.cmd
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
@IF EXIST "%~dp0\node.exe" (
|
||||
"%~dp0\node.exe" "%~dp0\..\..\..\html-minifier-terser\cli.js" %*
|
||||
) ELSE (
|
||||
@SETLOCAL
|
||||
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||
node "%~dp0\..\..\..\html-minifier-terser\cli.js" %*
|
||||
)
|
15
node_modules/html-webpack-plugin/node_modules/.bin/webpack
generated
vendored
Normal file
15
node_modules/html-webpack-plugin/node_modules/.bin/webpack
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
||||
|
||||
case `uname` in
|
||||
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
||||
esac
|
||||
|
||||
if [ -x "$basedir/node" ]; then
|
||||
"$basedir/node" "$basedir/../../../webpack/bin/webpack.js" "$@"
|
||||
ret=$?
|
||||
else
|
||||
node "$basedir/../../../webpack/bin/webpack.js" "$@"
|
||||
ret=$?
|
||||
fi
|
||||
exit $ret
|
7
node_modules/html-webpack-plugin/node_modules/.bin/webpack.cmd
generated
vendored
Normal file
7
node_modules/html-webpack-plugin/node_modules/.bin/webpack.cmd
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
@IF EXIST "%~dp0\node.exe" (
|
||||
"%~dp0\node.exe" "%~dp0\..\..\..\webpack\bin\webpack.js" %*
|
||||
) ELSE (
|
||||
@SETLOCAL
|
||||
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||
node "%~dp0\..\..\..\webpack\bin\webpack.js" %*
|
||||
)
|
122
node_modules/html-webpack-plugin/package.json
generated
vendored
Normal file
122
node_modules/html-webpack-plugin/package.json
generated
vendored
Normal file
@ -0,0 +1,122 @@
|
||||
{
|
||||
"_from": "html-webpack-plugin@^5.1.0",
|
||||
"_id": "html-webpack-plugin@5.5.3",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==",
|
||||
"_location": "/html-webpack-plugin",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "html-webpack-plugin@^5.1.0",
|
||||
"name": "html-webpack-plugin",
|
||||
"escapedName": "html-webpack-plugin",
|
||||
"rawSpec": "^5.1.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^5.1.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/@vue/cli-service"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz",
|
||||
"_shasum": "72270f4a78e222b5825b296e5e3e1328ad525a3e",
|
||||
"_spec": "html-webpack-plugin@^5.1.0",
|
||||
"_where": "C:\\Users\\zhouxueli\\Desktop\\scheduling-app\\node_modules\\@vue\\cli-service",
|
||||
"author": {
|
||||
"name": "Jan Nicklas",
|
||||
"email": "j.nicklas@me.com",
|
||||
"url": "https://github.com/jantimon"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/jantimon/html-webpack-plugin/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"config": {
|
||||
"commitizen": {
|
||||
"path": "./node_modules/cz-conventional-changelog"
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/html-minifier-terser": "^6.0.0",
|
||||
"html-minifier-terser": "^6.0.2",
|
||||
"lodash": "^4.17.21",
|
||||
"pretty-error": "^4.0.0",
|
||||
"tapable": "^2.0.0"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Simplifies creation of HTML files to serve your webpack bundles",
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.2.5",
|
||||
"commitizen": "^4.2.4",
|
||||
"css-loader": "5.0.1",
|
||||
"cz-conventional-changelog": "2.1.0",
|
||||
"dir-compare": "^3.3.0",
|
||||
"html-loader": "2.1.1",
|
||||
"jest": "^27.2.5",
|
||||
"mini-css-extract-plugin": "^1.6.0",
|
||||
"pug": "3.0.2",
|
||||
"pug-loader": "2.4.0",
|
||||
"raw-loader": "4.0.2",
|
||||
"rimraf": "2.6.3",
|
||||
"semistandard": "^13.0.1",
|
||||
"standard-version": "^9.3.0",
|
||||
"style-loader": "2.0.0",
|
||||
"typescript": "4.9.4",
|
||||
"webpack": "^5.86.0",
|
||||
"webpack-cli": "4.5.0",
|
||||
"webpack-recompilation-simulator": "3.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
},
|
||||
"files": [
|
||||
"lib/",
|
||||
"index.js",
|
||||
"default_index.ejs",
|
||||
"typings.d.ts"
|
||||
],
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/html-webpack-plugin"
|
||||
},
|
||||
"homepage": "https://github.com/jantimon/html-webpack-plugin",
|
||||
"jest": {
|
||||
"watchPathIgnorePatterns": [
|
||||
"<rootDir>/dist"
|
||||
],
|
||||
"testEnvironment": "node"
|
||||
},
|
||||
"keywords": [
|
||||
"webpack",
|
||||
"plugin",
|
||||
"html",
|
||||
"html-webpack-plugin"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"name": "html-webpack-plugin",
|
||||
"peerDependencies": {
|
||||
"webpack": "^5.20.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/jantimon/html-webpack-plugin.git"
|
||||
},
|
||||
"scripts": {
|
||||
"build-examples": "node examples/build-examples.js",
|
||||
"commit": "git-cz",
|
||||
"posttest": "tsc",
|
||||
"pretest": "semistandard",
|
||||
"puml": "npx puml generate flow.puml -o flow.png",
|
||||
"release": "standard-version",
|
||||
"test": "jest --runInBand --verbose --coverage",
|
||||
"test-watch": "jest --runInBand --watch"
|
||||
},
|
||||
"semistandard": {
|
||||
"ignore": [
|
||||
"examples/*/dist/**/*.*"
|
||||
]
|
||||
},
|
||||
"types": "typings.d.ts",
|
||||
"version": "5.5.3"
|
||||
}
|
292
node_modules/html-webpack-plugin/typings.d.ts
generated
vendored
Normal file
292
node_modules/html-webpack-plugin/typings.d.ts
generated
vendored
Normal file
@ -0,0 +1,292 @@
|
||||
import { AsyncSeriesWaterfallHook } from "tapable";
|
||||
import { Compiler, Compilation } from "webpack";
|
||||
import { Options as HtmlMinifierOptions } from "html-minifier-terser";
|
||||
|
||||
export = HtmlWebpackPlugin;
|
||||
|
||||
declare class HtmlWebpackPlugin {
|
||||
constructor(options?: HtmlWebpackPlugin.Options);
|
||||
|
||||
userOptions: HtmlWebpackPlugin.Options;
|
||||
|
||||
/** Current HtmlWebpackPlugin Major */
|
||||
version: number;
|
||||
|
||||
/**
|
||||
* Options after html-webpack-plugin has been initialized with defaults
|
||||
*/
|
||||
options?: HtmlWebpackPlugin.ProcessedOptions;
|
||||
|
||||
apply(compiler: Compiler): void;
|
||||
|
||||
static getHooks(compilation: Compilation): HtmlWebpackPlugin.Hooks;
|
||||
|
||||
/**
|
||||
* Static helper to create a tag object to be get injected into the dom
|
||||
*/
|
||||
static createHtmlTagObject(
|
||||
tagName: string,
|
||||
attributes?: { [attributeName: string]: string | boolean },
|
||||
innerHTML?: string
|
||||
): HtmlWebpackPlugin.HtmlTagObject;
|
||||
|
||||
static readonly version: number;
|
||||
}
|
||||
|
||||
declare namespace HtmlWebpackPlugin {
|
||||
type MinifyOptions = HtmlMinifierOptions;
|
||||
|
||||
interface Options {
|
||||
/**
|
||||
* Emit the file only if it was changed.
|
||||
* @default true
|
||||
*/
|
||||
cache?: boolean;
|
||||
/**
|
||||
* List all entries which should be injected
|
||||
*/
|
||||
chunks?: "all" | string[];
|
||||
/**
|
||||
* Allows to control how chunks should be sorted before they are included to the html.
|
||||
* @default 'auto'
|
||||
*/
|
||||
chunksSortMode?:
|
||||
| "auto"
|
||||
// `none` is deprecated and an alias for `auto` now.
|
||||
| "none"
|
||||
| "manual"
|
||||
| ((entryNameA: string, entryNameB: string) => number);
|
||||
/**
|
||||
* List all entries which should not be injected
|
||||
*/
|
||||
excludeChunks?: string[];
|
||||
/**
|
||||
* Path to the favicon icon
|
||||
*/
|
||||
favicon?: false | string;
|
||||
/**
|
||||
* The file to write the HTML to.
|
||||
* Supports subdirectories eg: `assets/admin.html`
|
||||
* [name] will be replaced by the entry name
|
||||
* Supports a function to generate the name
|
||||
*
|
||||
* @default 'index.html'
|
||||
*/
|
||||
filename?: string | ((entryName: string) => string);
|
||||
/**
|
||||
* By default the public path is set to `auto` - that way the html-webpack-plugin will try
|
||||
* to set the publicPath according to the current filename and the webpack publicPath setting
|
||||
*/
|
||||
publicPath?: string | "auto";
|
||||
/**
|
||||
* 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
|
||||
/**
|
||||
* Set up script loading
|
||||
* blocking will result in <script src="..."></script>
|
||||
* defer will result in <script defer src="..."></script>
|
||||
*
|
||||
* @default 'defer'
|
||||
*/
|
||||
scriptLoading?: "blocking" | "defer" | "module";
|
||||
/**
|
||||
* 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" }
|
||||
};
|
||||
/**
|
||||
* HTML Minification options accepts the following values:
|
||||
* - Set to `false` to disable minifcation
|
||||
* - Set to `'auto'` to enable minifcation only for production mode
|
||||
* - Set to custom minification according to
|
||||
* {@link https://github.com/kangax/html-minifier#options-quick-reference}
|
||||
*/
|
||||
minify?: "auto" | boolean | MinifyOptions;
|
||||
/**
|
||||
* Render errors into the HTML page
|
||||
*/
|
||||
showErrors?: boolean;
|
||||
/**
|
||||
* 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
|
||||
| ((templateParameters: {
|
||||
[option: string]: any;
|
||||
}) => string | Promise<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: {
|
||||
publicPath: string;
|
||||
js: Array<string>;
|
||||
css: Array<string>;
|
||||
manifest?: string;
|
||||
favicon?: string;
|
||||
},
|
||||
assetTags: {
|
||||
headTags: HtmlTagObject[];
|
||||
bodyTags: HtmlTagObject[];
|
||||
},
|
||||
options: ProcessedOptions
|
||||
) => { [option: string]: any } | Promise<{ [option: string]: any }>)
|
||||
| { [option: string]: any };
|
||||
/**
|
||||
* The title to use for the generated HTML document
|
||||
*/
|
||||
title?: string;
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin options after adding default values
|
||||
*/
|
||||
interface ProcessedOptions extends Required<Options> {
|
||||
filename: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* The values which are available during template execution
|
||||
*
|
||||
* Please keep in mind that the `templateParameter` options allows to change them
|
||||
*/
|
||||
interface TemplateParameter {
|
||||
compilation: any;
|
||||
htmlWebpackPlugin: {
|
||||
tags: {
|
||||
headTags: HtmlTagObject[];
|
||||
bodyTags: HtmlTagObject[];
|
||||
};
|
||||
files: {
|
||||
publicPath: string;
|
||||
js: Array<string>;
|
||||
css: Array<string>;
|
||||
manifest?: string;
|
||||
favicon?: string;
|
||||
};
|
||||
options: Options;
|
||||
};
|
||||
webpackConfig: any;
|
||||
}
|
||||
|
||||
interface Hooks {
|
||||
alterAssetTags: AsyncSeriesWaterfallHook<{
|
||||
assetTags: {
|
||||
scripts: HtmlTagObject[];
|
||||
styles: HtmlTagObject[];
|
||||
meta: HtmlTagObject[];
|
||||
};
|
||||
publicPath: string,
|
||||
outputName: string;
|
||||
plugin: HtmlWebpackPlugin;
|
||||
}>;
|
||||
|
||||
alterAssetTagGroups: AsyncSeriesWaterfallHook<{
|
||||
headTags: HtmlTagObject[];
|
||||
bodyTags: HtmlTagObject[];
|
||||
outputName: string;
|
||||
publicPath: string,
|
||||
plugin: HtmlWebpackPlugin;
|
||||
}>;
|
||||
|
||||
afterTemplateExecution: AsyncSeriesWaterfallHook<{
|
||||
html: string;
|
||||
headTags: HtmlTagObject[];
|
||||
bodyTags: HtmlTagObject[];
|
||||
outputName: string;
|
||||
plugin: HtmlWebpackPlugin;
|
||||
}>;
|
||||
|
||||
beforeAssetTagGeneration: AsyncSeriesWaterfallHook<{
|
||||
assets: {
|
||||
publicPath: string;
|
||||
js: Array<string>;
|
||||
css: Array<string>;
|
||||
favicon?: string;
|
||||
manifest?: string;
|
||||
};
|
||||
outputName: string;
|
||||
plugin: HtmlWebpackPlugin;
|
||||
}>;
|
||||
|
||||
beforeEmit: AsyncSeriesWaterfallHook<{
|
||||
html: string;
|
||||
outputName: string;
|
||||
plugin: HtmlWebpackPlugin;
|
||||
}>;
|
||||
|
||||
afterEmit: AsyncSeriesWaterfallHook<{
|
||||
outputName: string;
|
||||
plugin: HtmlWebpackPlugin;
|
||||
}>;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 | null | undefined;
|
||||
};
|
||||
/**
|
||||
* The tag name e.g. `'div'`
|
||||
*/
|
||||
tagName: string;
|
||||
/**
|
||||
* The inner HTML
|
||||
*/
|
||||
innerHTML?: string;
|
||||
/**
|
||||
* Whether this html must not contain innerHTML
|
||||
* @see https://www.w3.org/TR/html5/syntax.html#void-elements
|
||||
*/
|
||||
voidTag: boolean;
|
||||
/**
|
||||
* Meta information about the tag
|
||||
* E.g. `{'plugin': 'html-webpack-plugin'}`
|
||||
*/
|
||||
meta: {
|
||||
plugin?: string,
|
||||
[metaAttributeName: string]: any;
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user