diff options
Diffstat (limited to 'node_modules/webpack')
41 files changed, 1962 insertions, 1651 deletions
diff --git a/node_modules/webpack/README.md b/node_modules/webpack/README.md index a8f844748..ce7962c3c 100644 --- a/node_modules/webpack/README.md +++ b/node_modules/webpack/README.md @@ -1,567 +1,716 @@ -<div align="center">
- <a href="https://github.com/webpack/webpack">
- <img width="200" heigth="200" src="https://webpack.js.org/assets/icon-square-big.svg">
- </a>
- <br>
- <br>
-
-[![npm][npm]][npm-url]
-
-[![node][node]][node-url]
-[![deps][deps]][deps-url]
-[![tests][tests]][tests-url]
-[![builds][builds]][builds-url]
-[![coverage][cover]][cover-url]
-[![licenses][licenses]][licenses-url]
-
- <br>
- <a href="https://npmjs.com/package/webpack">
- <img src="https://img.shields.io/npm/dm/webpack.svg">
- </a>
- <a href="https://opencollective.com/webpack#backer">
- <img src="https://opencollective.com/webpack/backers/badge.svg">
- </a>
- <a href="https://opencollective.com/webpack#sponsors">
- <img src="https://opencollective.com/webpack/sponsors/badge.svg">
- </a>
- <a href="https://gitter.im/webpack/webpack">
- <img src="https://badges.gitter.im/webpack/webpack.svg">
- </a>
- <h1>webpack</h1>
- <p>
- webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.
- <p>
-</div>
-
-<h2 align="center">Install</h2>
-
-Install with npm:
-
-```bash
-npm install --save-dev webpack
-```
-
-Install with yarn:
-
-```bash
-yarn add webpack --dev
-```
-
-<h2 align="center">Introduction</h2>
-
-> The README reflects webpack v2.x, webpack v1.x [documentation can be found here](https://webpack.github.io/docs/?utm_source=github&utm_medium=readme&utm_campaign=top).
-
-webpack is a bundler for modules. The main purpose is to bundle JavaScript
-files for usage in a browser, yet it is also capable of transforming, bundling,
-or packaging just about any resource or asset.
-
-**TL;DR**
-
-* Bundles [ES Modules](http://www.2ality.com/2014/09/es6-modules-final.html), [CommonJS](http://wiki.commonjs.org/) and [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules (even combined).
-* Can create a single bundle or multiple chunks that are asynchronously loaded at runtime (to reduce initial loading time).
-* Dependencies are resolved during compilation, reducing the runtime size.
-* Loaders can preprocess files while compiling, e.g. TypeScript to JavaScript, Handlebars strings to compiled functions, images to Base64, etc.
-* Highly modular plugin system to do whatever else your application requires.
-
-### Get Started
-
-Check out webpack's quick [**Get Started**](https://webpack.js.org/get-started/) guide and the [other guides](https://webpack.js.org/guides/).
-
-<h2 align="center">Concepts</h2>
-
-### [Plugins](https://webpack.js.org/plugins/)
-
-webpack has a [rich plugin
-interface](https://webpack.js.org/plugins/). Most of the features
-within webpack itself use this plugin interface. This makes webpack very
-**flexible**.
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|[common-chunks-webpack-plugin][common]|![common-npm]|Generates chunks of common modules shared between entry points and splits them into separate bundles (e.g vendor.bundle.js && app.bundle.js)|
-|[extract-text-webpack-plugin][extract]|![extract-npm]|Extracts Text (CSS) from your bundles into a separate file (app.bundle.css)|
-|[compression-webpack-plugin][compression]|![compression-npm]|Prepare compressed versions of assets to serve them with Content-Encoding|
-|[i18n-webpack-plugin][i18n]|![i18n-npm]|Adds i18n support to your bundles|
-|[html-webpack-plugin][html-plugin]|![html-plugin-npm]| Simplifies creation of HTML files (`index.html`) to serve your bundles|
-
-
-[common]: https://github.com/webpack/webpack/blob/master/lib/optimize/CommonsChunkPlugin.js
-[common-npm]: https://img.shields.io/npm/v/webpack.svg
-[extract]: https://github.com/webpack/extract-text-webpack-plugin
-[extract-npm]: https://img.shields.io/npm/v/extract-text-webpack-plugin.svg
-[component]: https://github.com/webpack/component-webpack-plugin
-[component-npm]: https://img.shields.io/npm/v/component-webpack-plugin.svg
-[compression]: https://github.com/webpack/compression-webpack-plugin
-[compression-npm]: https://img.shields.io/npm/v/compression-webpack-plugin.svg
-[i18n]: https://github.com/webpack/i18n-webpack-plugin
-[i18n-npm]: https://img.shields.io/npm/v/i18n-webpack-plugin.svg
-[html-plugin]: https://github.com/ampedandwired/html-webpack-plugin
-[html-plugin-npm]: https://img.shields.io/npm/v/html-webpack-plugin.svg
-
-### [Loaders](https://webpack.js.org/loaders/)
-
-webpack enables use of loaders to preprocess files. This allows you to bundle
-**any static resource** way beyond JavaScript. You can easily [write your own
-loaders](https://webpack.js.org/api/loaders/) using Node.js.
-
-Loaders are activated by using `loadername!` prefixes in `require()` statements,
-or are automatically applied via regex from your webpack configuration.
-
-#### Files
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|[raw-loader][raw]|![raw-npm]|Loads raw content of a file (utf-8)|
-|[val-loader][val]|![val-npm]|Executes code as module and consider exports as JS code|
-|[url-loader][url]|![url-npm]|Works like the file loader, but can return a Data Url if the file is smaller than a limit|
-|[file-loader][file]|![file-npm]|Emits the file into the output folder and returns the (relative) url|
-
-
-[raw]: https://github.com/webpack/raw-loader
-[raw-npm]: https://img.shields.io/npm/v/raw-loader.svg
-[val]: https://github.com/webpack/val-loader
-[val-npm]: https://img.shields.io/npm/v/val-loader.svg
-[url]: https://github.com/webpack/url-loader
-[url-npm]: https://img.shields.io/npm/v/url-loader.svg
-[file]: https://github.com/webpack/file-loader
-[file-npm]: https://img.shields.io/npm/v/file-loader.svg
-
-#### JSON
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|<a href="https://github.com/webpack/json-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/json.svg"></a>|![json-npm]|Loads a JSON file (included by default)|
-|<a href="https://github.com/webpack/json5-loader"><img width="48" height="10.656" src="https://cdn.rawgit.com/json5/json5-logo/master/json5-logo.svg"></a>|![json5-npm]|Loads and transpiles a JSON 5 file|
-|<a href="https://github.com/awnist/cson-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/coffeescript.svg"></a>|![cson-npm]|Loads and transpiles a CSON file|
-
-
-[json-npm]: https://img.shields.io/npm/v/json-loader.svg
-[json5-npm]: https://img.shields.io/npm/v/json5-loader.svg
-[cson-npm]: https://img.shields.io/npm/v/cson-loader.svg
-
-#### Transpiling
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|<a href="https://github.com/webpack/script-loader">`<script>`</a>|![script-npm]|Executes a JavaScript file once in global context (like in script tag), requires are not parsed|
-|<a href="https://github.com/babel/babel-loader"><img width="48" height="48" title="babel-loader" src="https://worldvectorlogo.com/logos/babel-10.svg"></a>|![babel-npm]|Loads ES2015+ code and transpiles to ES5 using <a href="https://github.com/babel/babel">Babel</a>|
-|<a href="https://github.com/jupl/traceur-loader"><img width="48" height="48" src="https://google.github.com/traceur-compiler/logo/tc.svg"></a>|![traceur-npm]|Loads ES2015+ code and transpiles to ES5 using [Traceur](https://github.com/google/traceur-compiler)|
-|<a href="https://github.com/TypeStrong/ts-loader"><img width="48" height="48" src="https://cdn.rawgit.com/Microsoft/TypeScript/master/doc/logo.svg"></a>|![type-npm]|Loads TypeScript like JavaScript|
-|<a href="https://github.com/webpack/coffee-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/coffeescript.svg"></a>|![coffee-npm]|Loads CoffeeScript like JavaScript|
-
-
-[script-npm]: https://img.shields.io/npm/v/script-loader.svg
-[babel-npm]: https://img.shields.io/npm/v/babel-loader.svg
-[traceur-npm]: https://img.shields.io/npm/v/traceur-loader.svg
-[coffee-npm]: https://img.shields.io/npm/v/coffee-loader.svg
-[type-npm]: https://img.shields.io/npm/v/ts-loader.svg
-
-#### Templating
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|<a href="https://github.com/webpack/html-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/html5.svg"></a>|![html-npm]|Exports HTML as string, require references to static resources|
-|<a href="https://github.com/pugjs/pug-loader"><img width="48" height="48" src="https://cdn.rawgit.com/pugjs/pug-logo/master/SVG/pug-final-logo-_-colour-128.svg"></a>|![pug-npm]|Loads Pug templates and returns a function|
-|<a href="https://github.com/webpack/jade-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/jade-3.svg"></a>|![jade-npm]|Loads Jade templates and returns a function|
-|<a href="https://github.com/peerigon/markdown-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/markdown.svg"></a>|![md-npm]|Compiles Markdown to HTML|
-|<a href="https://github.com/posthtml/posthtml-loader"><img width="48" height="48" src="http://posthtml.github.io/posthtml/logo.svg"></a>|![posthtml-npm]|Loads and transforms a HTML file using [PostHTML](https://github.com/posthtml/posthtml)|
-|<a href="https://github.com/altano/handlebars-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/handlebars-1.svg"></a>|![hbs-npm]| Compiles Handlebars to HTML|
-
-
-[html-npm]: https://img.shields.io/npm/v/html-loader.svg
-[pug-npm]: https://img.shields.io/npm/v/pug-loader.svg
-[jade-npm]: https://img.shields.io/npm/v/jade-loader.svg
-[md-npm]: https://img.shields.io/npm/v/markdown-loader.svg
-[posthtml-npm]: https://img.shields.io/npm/v/posthtml-loader.svg
-[hbs-npm]: https://img.shields.io/npm/v/handlebars-loader.svg
-
-#### Styling
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|<a href="https://github.com/webpack/style-loader">`<style>`|![style-npm]|Add exports of a module as style to DOM|
-|<a href="https://github.com/webpack/css-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/css-3.svg"></a>|![css-npm]|Loads CSS file with resolved imports and returns CSS code|
-|<a href="https://github.com/webpack/less-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/less-63.svg"></a>|![less-npm]|Loads and compiles a LESS file|
-|<a href="https://github.com/jtangelder/sass-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/sass-1.svg"></a>|![sass-npm]|Loads and compiles a SASS/SCSS file|
-|<a href="https://github.com/shama/stylus-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/stylus.svg"></a>|![stylus-npm]|Loads and compiles a Stylus file|
-|<a href="https://github.com/postcss/postcss-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/postcss.svg"></a>|![postcss-npm]|Loads and transforms a CSS/SSS file using [PostCSS](http://postcss.org)|
-
-
-[style-npm]: https://img.shields.io/npm/v/style-loader.svg
-[css-npm]: https://img.shields.io/npm/v/css-loader.svg
-[less-npm]: https://img.shields.io/npm/v/less-loader.svg
-[sass-npm]: https://img.shields.io/npm/v/sass-loader.svg
-[stylus-npm]: https://img.shields.io/npm/v/stylus-loader.svg
-[postcss-npm]: https://img.shields.io/npm/v/postcss-loader.svg
-
-#### Linting & Testing
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|<a href="https://github.com/webpack/mocha-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/mocha.svg"></a>|![mocha-npm]|Tests with mocha (Browser/NodeJS)|
-|<a href="https://github.com/MoOx/eslint-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/eslint.svg"></a>|![eslint-npm]|PreLoader for linting code using ESLint|
-|<a href="https://github.com/webpack-contrib/jshint-loader"><img width="48" height="20.64" src="http://jshint.com/res/jshint-dark.png"></a>|![jshint-npm]|PreLoader for linting code using JSHint|
-
-[mocha-npm]: https://img.shields.io/npm/v/mocha-loader.svg
-[eslint-npm]: https://img.shields.io/npm/v/eslint-loader.svg
-[jshint-npm]: https://img.shields.io/npm/v/jshint-loader.svg
-[jscs-npm]: https://img.shields.io/npm/v/jscs-loader.svg
-
-#### Frameworks
-
-|Name|Status|Description|
-|:--:|:----:|:----------|
-|<a href="https://github.com/vuejs/vue-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/vue-9.svg"></a>|![vue-npm]|Loads and compiles Vue Components|
-|<a href="https://github.com/JonDum/polymer-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/polymer.svg"></a>|![polymer-npm]|Process HTML & CSS with preprocessor of choice and `require()` Web Components like first-class modules|
-|<a href="https://github.com/TheLarkInn/angular2-template-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/angular-icon-1.svg"></a>|![angular-npm]| Loads and compiles Angular 2 Components|
-|<a href="https://github.com/riot/tag-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/riot.svg"></a>|![riot-npm]| Riot official webpack loader|
-
-
-
-[vue-npm]: https://img.shields.io/npm/v/vue-loader.svg
-[polymer-npm]: https://img.shields.io/npm/v/polymer-loader.svg
-[angular-npm]: https://img.shields.io/npm/v/angular2-template-loader.svg
-[riot-npm]: https://img.shields.io/npm/v/riot-tag-loader.svg
-
-### Performance
-
-webpack uses async I/O and has multiple caching levels. This makes webpack fast
-and incredibly **fast** on incremental compilations.
-
-### Module Formats
-
-webpack supports ES2015+, CommonJS and AMD modules **out of the box**. It performs clever static
-analysis on the AST of your code. It even has an evaluation engine to evaluate
-simple expressions. This allows you to **support most existing libraries** out of the box.
-
-### [Code Splitting](https://webpack.js.org/guides/code-splitting/)
-
-webpack allows you to split your codebase into multiple chunks. Chunks are
-loaded asynchronously at runtime. This reduces the initial loading time.
-
-### [Optimizations](https://webpack.js.org/guides/production-build/)
-
-webpack can do many optimizations to **reduce the output size of your
-JavaScript** by deduplicating frequently used modules, minifying, and giving
-you full control of what is loaded initially and what is loaded at runtime
-through code splitting. It can also make your code chunks **cache
-friendly** by using hashes.
-
-<h2 align="center">Contributing</h2>
-
-**We want contributing to webpack to be fun, enjoyable, and educational for anyone, and everyone.** We have a [vibrant ecosystem](https://medium.com/webpack/contributors-guide/home) that spans beyond this single repo. We welcome you to check out any of the repositories in [our organization](http://github.com/webpack) or [webpack-contrib organization](http://github.com/webpack-contrib) which houses all of our loaders and plugins.
-
-Contributions go far beyond pull requests and commits. Although we love giving you the opportunity to put your stamp on webpack, we also are thrilled to receive a variety of other contributions including:
-
-* [Documentation](https://github.com/webpack/webpack.js.org) updates, enhancements, designs, or bugfixes
-* Spelling or grammar fixes
-* README.md corrections or redesigns
-* Adding unit, or functional tests
-* Triaging GitHub issues -- especially determining whether an issue still persists or is reproducible.
-* [Searching #webpack on twitter](https://twitter.com/search?q=webpack) and helping someone else who needs help
-* Teaching others how to contribute to one of the many webpack repo's!
-* [Blogging, speaking about, or creating tutorials](https://github.com/webpack-contrib/awesome-webpack) about one of webpack's many features.
-* Helping others in our webpack [gitter channel](https://gitter.im/webpack/webpack).
-
-If you are worried or don't know where to start, you can **always** reach out to [Sean Larkin (@TheLarkInn) on Twitter](https://twitter.com/thelarkinn) or simply submit an issue and a maintainer can help give you guidance!
-
-We have also started a series on our [Medium Publication](https://medium.com/webpack) called [The Contributor's Guide to webpack](https://medium.com/webpack/contributors-guide/home). We welcome you to read it and post any questions or responses if you still need help.
-
-_Looking to speak about webpack?_ We'd **love** to review your talk abstract/CFP! You can email it to webpack [at] opencollective [dot] com and we can give pointers or tips!!!
-
-<h3 align="center">Creating your own plugins and loaders</h3>
-
-If you create a loader or plugin, we would <3 for you to open source it, and put it on npm. We follow the `x-loader`, `x-webpack-plugin` naming convention.
-
-<h2 align="center">Support</h2>
-
-We consider webpack to be a low-level tool used not only individually but also layered beneath other awesome tools. Because of it's flexibility, webpack isn't always the _easiest_ entry-level solution, however we do believe it is the most powerful. That said, we're always looking for ways improve and simplify the tool without compromising functionality. If you have any ideas on ways to accomplish this, we're all ears!
-
-If you're just getting started, take a look at [our new docs and concepts page](https://webpack.js.org/concepts/). This has a high level overview that is great for beginners!!
-
-If you want to discuss something or just need help, [here is our Gitter room](https://gitter.im/webpack/webpack) where there are always individuals looking to help out!
-
-If you are still having difficulty, we would love for you to post
-a question to [StackOverflow with the webpack tag](https://stackoverflow.com/tags/webpack). It is much easier to answer questions that include your webpack.config.js and relevant files! So if you can provide them, we'd be extremely grateful (and more likely to help you find the answer!)
-
-If you are twitter savvy you can tweet #webpack with your question and someone should be able to reach out and help also.
-
-If you have discovered a đ or have a feature suggestion, feel free to create an issue on Github.
-
-### License
-
-[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fwebpack%2Fwebpack?ref=badge_large)
-
-<h2 align="center">Core Team</h2>
-
-<table>
- <tbody>
- <tr>
- <td align="center" valign="top">
- <img width="150" height="150" src="https://github.com/sokra.png?s=150">
- <br>
- <a href="https://github.com/sokra">Tobias Koppers</a>
- <p>Core</p>
- <br>
- <p>Founder of webpack</p>
- </td>
- <td align="center" valign="top">
- <img width="150" height="150" src="https://github.com/jhnns.png?s=150">
- <br>
- <a href="https://github.com/jhnns">Johannes Ewald</a>
- <p>Loaders & Plugins</p>
- <br>
- <p>Early adopter of webpack</p>
- </td>
- <td align="center" width="20%" valign="top">
- <img width="150" height="150" src="https://github.com/TheLarkInn.png?s=150">
- <br>
- <a href="https://github.com/TheLarkInn">Sean T. Larkin</a>
- <p>Public Relations</p>
- <br>
- <p>Founder of the core team</p>
- </td>
- <td align="center" valign="top">
- <img width="150" height="150" src="https://github.com/bebraw.png?s=150">
- <br>
- <a href="https://github.com/bebraw">Juho Vepsäläinen</a>
- <p>Documentation</p>
- <br>
- <p>Author</p>
- <a href="https://leanpub.com/survivejs-webpack">
- <img height="15" src="https://cloud.githubusercontent.com/assets/1365881/20286923/93e325c0-aac9-11e6-964d-cabe218c584c.png">
- </a>
- <br>
- </td>
- <td align="center" valign="top">
- <img width="150" height="150" src="https://github.com/spacek33z.png?s=150">
- <br>
- <a href="https://github.com/spacek33z">Kees Kluskens</a>
- <p>Development</p>
- <br>
- <p>Sponsor<p>
- <a href="https://codeyellow.nl/">
- <img height="15px" src="https://cloud.githubusercontent.com/assets/1365881/20286583/ad62eb04-aac7-11e6-9c14-a0fef35b9b56.png">
- </a>
- <br>
- </td>
- </tr>
- </tbody>
-</table>
-
-<h2 align="center">Sponsoring</h2>
-
-Most of the core team members, webpack contributors and contributors in the ecosystem do this open source work in their free time. If you use webpack for a serious task, and you'd like us to invest more time on it, please donate. This project increases your income/productivity too. It makes development and applications faster and it reduces the required bandwidth.
-
-This is how we use the donations:
-
-* Allow the core team to work on webpack
-* Thank contributors if they invested a large amount of time in contributing
-* Support projects in the ecosystem that are of great value for users
-* Support projects that are voted most (work in progress)
-* Infrastructure cost
-* Fees for money handling
-
-
-<h2 align="center">Premium Partners</h2>
-
-<div align="center">
-
-<a href="https://www.ag-grid.com/?utm_source=webpack&utm_medium=banner&utm_campaign=sponsorship" target="_blank"><img align="center" src="https://raw.githubusercontent.com/webpack/media/2b399d58/horiz-banner-ad-ag-grid.png">
-</a>
-
-</div>
-
-<h2 align="center">Other Backers and Sponsors</h2>
-
-Before we started using OpenCollective, donations were made anonymously. Now that we have made the switch, we would like to acknowledge these sponsors (and the ones who continue to donate using OpenCollective). If we've missed someone, please send us a PR, and we'll add you to this list.
-
-<div align="center">
-
-[Google Angular Team](https://angular.io/), [Architects.io](http://architects.io/),
-<a href="https://moonmail.io" target="_blank" title="Email Marketing Software"><img
-src="https://static.moonmail.io/moonmail-logo.svg" height="30" alt="MoonMail"></a>
-<a href="https://monei.net" target="_blank" title="Best payment gateway rates"><img
-src="https://static.monei.net/monei-logo.svg" height="30" alt="MONEI"></a>
-
-</div>
-
-<h2 align="center">Sponsors</h2>
-
-[Become a sponsor](https://opencollective.com/webpack#sponsor) and get your logo on our README on Github with a link to your site.
-
-<div align="center">
-
-<a href="https://opencollective.com/webpack/sponsor/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/0/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/1/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/2/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/3/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/4/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/5/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/6/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/7/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/8/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/9/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/10/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/11/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/11/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/12/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/12/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/13/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/13/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/14/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/14/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/15/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/15/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/16/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/16/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/17/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/17/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/18/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/18/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/19/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/19/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/20/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/20/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/21/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/21/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/22/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/22/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/23/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/23/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/24/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/24/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/25/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/25/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/26/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/26/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/27/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/27/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/28/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/28/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/sponsor/29/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/29/avatar.svg?requireActive=false"></a>
-
-</div>
-
-<h2 align="center">Backers</h2>
-
-[Become a backer](https://opencollective.com/webpack#backer) and get your image on our README on Github with a link to your site.
-
-<a href="https://opencollective.com/webpack/backer/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/0/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/1/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/2/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/3/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/4/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/5/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/6/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/7/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/8/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/9/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/10/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/11/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/11/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/12/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/12/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/13/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/13/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/14/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/14/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/15/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/15/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/16/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/16/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/17/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/17/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/18/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/18/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/19/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/19/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/20/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/20/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/21/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/21/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/22/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/22/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/23/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/23/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/24/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/24/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/25/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/25/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/26/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/26/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/27/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/27/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/28/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/28/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/29/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/29/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/30/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/30/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/31/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/31/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/32/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/32/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/33/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/33/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/34/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/34/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/35/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/35/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/36/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/36/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/37/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/37/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/38/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/38/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/39/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/39/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/40/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/40/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/41/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/41/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/42/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/42/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/43/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/43/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/44/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/44/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/45/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/45/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/46/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/46/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/47/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/47/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/48/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/48/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/49/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/49/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/50/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/50/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/51/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/51/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/52/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/52/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/53/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/53/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/54/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/54/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/55/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/55/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/56/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/56/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/57/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/57/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/58/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/58/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/59/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/59/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/60/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/60/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/61/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/61/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/62/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/62/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/63/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/63/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/64/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/64/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/65/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/65/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/66/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/66/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/67/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/67/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/68/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/68/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/69/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/69/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/70/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/70/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/71/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/71/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/72/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/72/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/73/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/73/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/74/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/74/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/75/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/75/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/76/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/76/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/77/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/77/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/78/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/78/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/79/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/79/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/80/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/80/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/81/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/81/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/82/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/82/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/83/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/83/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/84/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/84/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/85/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/85/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/86/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/86/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/87/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/87/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/88/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/88/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/89/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/89/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/90/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/90/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/91/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/91/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/92/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/92/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/93/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/93/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/94/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/94/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/95/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/95/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/96/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/96/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/97/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/97/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/98/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/98/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/99/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/99/avatar.svg?requireActive=false"></a>
-<a href="https://opencollective.com/webpack/backer/100/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/100/avatar.svg?requireActive=false"></a>
-
-<h2 align="center">Thanks to</h2>
-<p align="center">(In chronological order)</p>
-
-* @google for [Google Web Toolkit (GWT)](https://code.google.com/archive/p/google-web-toolkit), which aims to compile Java to JavaScript. It features a similar [Code Splitting](http://www.gwtproject.org/doc/latest/DevGuideCodeSplitting.html) as webpack.
-* @medikoo for [modules-webmake](https://github.com/medikoo/modules-webmake), which is a similar project. webpack was born because I wanted Code Splitting for modules-webmake. Interestingly the [Code Splitting issue is still open](https://github.com/medikoo/modules-webmake/issues/7) (thanks also to @Phoscur for the discussion).
-* @substack for [browserify](http://browserify.org/), which is a similar project and source for many ideas.
-* @jrburke for [require.js](http://requirejs.org/), which is a similar project and source for many ideas.
-* @defunctzombie for the [browser-field spec](https://gist.github.com/defunctzombie/4339901), which makes modules available for node.js, browserify and webpack.
-* Every early webpack user, which contributed to webpack by writing issues or PRs. You influenced the direction...
-* @shama, @jhnns and @sokra for maintaining this project
-* Everyone who has written a loader for webpack. You are the ecosystem...
-* Everyone I forgot to mention here, but also influenced webpack.
-
-
-[npm]: https://img.shields.io/npm/v/webpack.svg
-[npm-url]: https://npmjs.com/package/webpack
-
-[node]: https://img.shields.io/node/v/webpack.svg
-[node-url]: https://nodejs.org
-
-[deps]: https://img.shields.io/david/webpack/webpack.svg
-[deps-url]: https://david-dm.org/webpack/webpack
-
-[tests]: https://img.shields.io/travis/webpack/webpack/master.svg
-[tests-url]: https://travis-ci.org/webpack/webpack
-
-[builds-url]: https://ci.appveyor.com/project/sokra/webpack/branch/master
-[builds]: https://ci.appveyor.com/api/projects/status/github/webpack/webpack?svg=true
-
-[licenses-url]: https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fwebpack%2Fwebpack?ref=badge_shield
-[licenses]: https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fwebpack%2Fwebpack.svg?type=shield
-
-[cover]: https://img.shields.io/coveralls/webpack/webpack.svg
-[cover-url]: https://coveralls.io/r/webpack/webpack/
+<div align="center"> + <a href="https://github.com/webpack/webpack"> + <img width="200" heigth="200" src="https://webpack.js.org/assets/icon-square-big.svg"> + </a> + <br> + <br> + +[![npm][npm]][npm-url] + +[![node][node]][node-url] +[![deps][deps]][deps-url] +[![tests][tests]][tests-url] +[![builds][builds]][builds-url] +[![coverage][cover]][cover-url] +[![licenses][licenses]][licenses-url] + + <br> + <a href="https://npmjs.com/package/webpack"> + <img src="https://img.shields.io/npm/dm/webpack.svg"> + </a> + <a href="https://opencollective.com/webpack#backer"> + <img src="https://opencollective.com/webpack/backers/badge.svg"> + </a> + <a href="https://opencollective.com/webpack#sponsors"> + <img src="https://opencollective.com/webpack/sponsors/badge.svg"> + </a> + <a href="https://gitter.im/webpack/webpack"> + <img src="https://badges.gitter.im/webpack/webpack.svg"> + </a> + <h1>webpack</h1> + <p> + webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset. + <p> +</div> + +<h2 align="center">Install</h2> + +Install with npm: + +```bash +npm install --save-dev webpack +``` + +Install with yarn: + +```bash +yarn add webpack --dev +``` + +<h2 align="center">Introduction</h2> + +> This README reflects Webpack v2.x and v3.x. The Webpack v1.x [documentation can be found here](https://webpack.github.io/docs/?utm_source=github&utm_medium=readme&utm_campaign=top). + +webpack is a bundler for modules. The main purpose is to bundle JavaScript +files for usage in a browser, yet it is also capable of transforming, bundling, +or packaging just about any resource or asset. + +**TL;DR** + +* Bundles [ES Modules](http://www.2ality.com/2014/09/es6-modules-final.html), [CommonJS](http://wiki.commonjs.org/) and [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules (even combined). +* Can create a single bundle or multiple chunks that are asynchronously loaded at runtime (to reduce initial loading time). +* Dependencies are resolved during compilation, reducing the runtime size. +* Loaders can preprocess files while compiling, e.g. TypeScript to JavaScript, Handlebars strings to compiled functions, images to Base64, etc. +* Highly modular plugin system to do whatever else your application requires. + +### Get Started + +Check out webpack's quick [**Get Started**](https://webpack.js.org/get-started/) guide and the [other guides](https://webpack.js.org/guides/). + +<h2 align="center">Concepts</h2> + +### [Plugins](https://webpack.js.org/plugins/) + +webpack has a [rich plugin +interface](https://webpack.js.org/plugins/). Most of the features +within webpack itself use this plugin interface. This makes webpack very +**flexible**. + +|Name|Status|Description| +|:--:|:----:|:----------| +|[common-chunks-webpack-plugin][common]|![common-npm]|Generates chunks of common modules shared between entry points and splits them into separate bundles (e.g vendor.bundle.js && app.bundle.js)| +|[extract-text-webpack-plugin][extract]|![extract-npm]|Extracts Text (CSS) from your bundles into a separate file (app.bundle.css)| +|[compression-webpack-plugin][compression]|![compression-npm]|Prepare compressed versions of assets to serve them with Content-Encoding| +|[i18n-webpack-plugin][i18n]|![i18n-npm]|Adds i18n support to your bundles| +|[html-webpack-plugin][html-plugin]|![html-plugin-npm]| Simplifies creation of HTML files (`index.html`) to serve your bundles| + + +[common]: https://github.com/webpack/webpack/blob/master/lib/optimize/CommonsChunkPlugin.js +[common-npm]: https://img.shields.io/npm/v/webpack.svg +[extract]: https://github.com/webpack/extract-text-webpack-plugin +[extract-npm]: https://img.shields.io/npm/v/extract-text-webpack-plugin.svg +[component]: https://github.com/webpack/component-webpack-plugin +[component-npm]: https://img.shields.io/npm/v/component-webpack-plugin.svg +[compression]: https://github.com/webpack/compression-webpack-plugin +[compression-npm]: https://img.shields.io/npm/v/compression-webpack-plugin.svg +[i18n]: https://github.com/webpack/i18n-webpack-plugin +[i18n-npm]: https://img.shields.io/npm/v/i18n-webpack-plugin.svg +[html-plugin]: https://github.com/ampedandwired/html-webpack-plugin +[html-plugin-npm]: https://img.shields.io/npm/v/html-webpack-plugin.svg + +### [Loaders](https://webpack.js.org/loaders/) + +webpack enables use of loaders to preprocess files. This allows you to bundle +**any static resource** way beyond JavaScript. You can easily [write your own +loaders](https://webpack.js.org/api/loaders/) using Node.js. + +Loaders are activated by using `loadername!` prefixes in `require()` statements, +or are automatically applied via regex from your webpack configuration. + +#### Files + +|Name|Status|Description| +|:--:|:----:|:----------| +|[raw-loader][raw]|![raw-npm]|Loads raw content of a file (utf-8)| +|[val-loader][val]|![val-npm]|Executes code as module and consider exports as JS code| +|[url-loader][url]|![url-npm]|Works like the file loader, but can return a Data Url if the file is smaller than a limit| +|[file-loader][file]|![file-npm]|Emits the file into the output folder and returns the (relative) url| + + +[raw]: https://github.com/webpack/raw-loader +[raw-npm]: https://img.shields.io/npm/v/raw-loader.svg +[val]: https://github.com/webpack/val-loader +[val-npm]: https://img.shields.io/npm/v/val-loader.svg +[url]: https://github.com/webpack/url-loader +[url-npm]: https://img.shields.io/npm/v/url-loader.svg +[file]: https://github.com/webpack/file-loader +[file-npm]: https://img.shields.io/npm/v/file-loader.svg + +#### JSON + +|Name|Status|Description| +|:--:|:----:|:----------| +|<a href="https://github.com/webpack/json-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/json.svg"></a>|![json-npm]|Loads a JSON file (included by default)| +|<a href="https://github.com/webpack/json5-loader"><img width="48" height="10.656" src="https://cdn.rawgit.com/json5/json5-logo/master/json5-logo.svg"></a>|![json5-npm]|Loads and transpiles a JSON 5 file| +|<a href="https://github.com/awnist/cson-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/coffeescript.svg"></a>|![cson-npm]|Loads and transpiles a CSON file| + + +[json-npm]: https://img.shields.io/npm/v/json-loader.svg +[json5-npm]: https://img.shields.io/npm/v/json5-loader.svg +[cson-npm]: https://img.shields.io/npm/v/cson-loader.svg + +#### Transpiling + +|Name|Status|Description| +|:--:|:----:|:----------| +|<a href="https://github.com/webpack/script-loader">`<script>`</a>|![script-npm]|Executes a JavaScript file once in global context (like in script tag), requires are not parsed| +|<a href="https://github.com/babel/babel-loader"><img width="48" height="48" title="babel-loader" src="https://worldvectorlogo.com/logos/babel-10.svg"></a>|![babel-npm]|Loads ES2015+ code and transpiles to ES5 using <a href="https://github.com/babel/babel">Babel</a>| +|<a href="https://github.com/jupl/traceur-loader"><img width="48" height="48" src="https://google.github.com/traceur-compiler/logo/tc.svg"></a>|![traceur-npm]|Loads ES2015+ code and transpiles to ES5 using [Traceur](https://github.com/google/traceur-compiler)| +|<a href="https://github.com/TypeStrong/ts-loader"><img width="48" height="48" src="https://cdn.rawgit.com/Microsoft/TypeScript/master/doc/logo.svg"></a>|![type-npm]|Loads TypeScript like JavaScript| +|<a href="https://github.com/webpack/coffee-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/coffeescript.svg"></a>|![coffee-npm]|Loads CoffeeScript like JavaScript| + + +[script-npm]: https://img.shields.io/npm/v/script-loader.svg +[babel-npm]: https://img.shields.io/npm/v/babel-loader.svg +[traceur-npm]: https://img.shields.io/npm/v/traceur-loader.svg +[coffee-npm]: https://img.shields.io/npm/v/coffee-loader.svg +[type-npm]: https://img.shields.io/npm/v/ts-loader.svg + +#### Templating + +|Name|Status|Description| +|:--:|:----:|:----------| +|<a href="https://github.com/webpack/html-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/html5.svg"></a>|![html-npm]|Exports HTML as string, require references to static resources| +|<a href="https://github.com/pugjs/pug-loader"><img width="48" height="48" src="https://cdn.rawgit.com/pugjs/pug-logo/master/SVG/pug-final-logo-_-colour-128.svg"></a>|![pug-npm]|Loads Pug templates and returns a function| +|<a href="https://github.com/webpack/jade-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/jade-3.svg"></a>|![jade-npm]|Loads Jade templates and returns a function| +|<a href="https://github.com/peerigon/markdown-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/markdown.svg"></a>|![md-npm]|Compiles Markdown to HTML| +|<a href="https://github.com/posthtml/posthtml-loader"><img width="48" height="48" src="http://posthtml.github.io/posthtml/logo.svg"></a>|![posthtml-npm]|Loads and transforms a HTML file using [PostHTML](https://github.com/posthtml/posthtml)| +|<a href="https://github.com/altano/handlebars-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/handlebars-1.svg"></a>|![hbs-npm]| Compiles Handlebars to HTML| + + +[html-npm]: https://img.shields.io/npm/v/html-loader.svg +[pug-npm]: https://img.shields.io/npm/v/pug-loader.svg +[jade-npm]: https://img.shields.io/npm/v/jade-loader.svg +[md-npm]: https://img.shields.io/npm/v/markdown-loader.svg +[posthtml-npm]: https://img.shields.io/npm/v/posthtml-loader.svg +[hbs-npm]: https://img.shields.io/npm/v/handlebars-loader.svg + +#### Styling + +|Name|Status|Description| +|:--:|:----:|:----------| +|<a href="https://github.com/webpack/style-loader">`<style>`|![style-npm]|Add exports of a module as style to DOM| +|<a href="https://github.com/webpack/css-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/css-3.svg"></a>|![css-npm]|Loads CSS file with resolved imports and returns CSS code| +|<a href="https://github.com/webpack/less-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/less-63.svg"></a>|![less-npm]|Loads and compiles a LESS file| +|<a href="https://github.com/jtangelder/sass-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/sass-1.svg"></a>|![sass-npm]|Loads and compiles a SASS/SCSS file| +|<a href="https://github.com/shama/stylus-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/stylus.svg"></a>|![stylus-npm]|Loads and compiles a Stylus file| +|<a href="https://github.com/postcss/postcss-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/postcss.svg"></a>|![postcss-npm]|Loads and transforms a CSS/SSS file using [PostCSS](http://postcss.org)| + + +[style-npm]: https://img.shields.io/npm/v/style-loader.svg +[css-npm]: https://img.shields.io/npm/v/css-loader.svg +[less-npm]: https://img.shields.io/npm/v/less-loader.svg +[sass-npm]: https://img.shields.io/npm/v/sass-loader.svg +[stylus-npm]: https://img.shields.io/npm/v/stylus-loader.svg +[postcss-npm]: https://img.shields.io/npm/v/postcss-loader.svg + +#### Linting & Testing + +|Name|Status|Description| +|:--:|:----:|:----------| +|<a href="https://github.com/webpack/mocha-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/mocha.svg"></a>|![mocha-npm]|Tests with mocha (Browser/NodeJS)| +|<a href="https://github.com/MoOx/eslint-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/eslint.svg"></a>|![eslint-npm]|PreLoader for linting code using ESLint| +|<a href="https://github.com/webpack-contrib/jshint-loader"><img width="48" height="20.64" src="http://jshint.com/res/jshint-dark.png"></a>|![jshint-npm]|PreLoader for linting code using JSHint| + +[mocha-npm]: https://img.shields.io/npm/v/mocha-loader.svg +[eslint-npm]: https://img.shields.io/npm/v/eslint-loader.svg +[jshint-npm]: https://img.shields.io/npm/v/jshint-loader.svg +[jscs-npm]: https://img.shields.io/npm/v/jscs-loader.svg + +#### Frameworks + +|Name|Status|Description| +|:--:|:----:|:----------| +|<a href="https://github.com/vuejs/vue-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/vue-9.svg"></a>|![vue-npm]|Loads and compiles Vue Components| +|<a href="https://github.com/JonDum/polymer-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/polymer.svg"></a>|![polymer-npm]|Process HTML & CSS with preprocessor of choice and `require()` Web Components like first-class modules| +|<a href="https://github.com/TheLarkInn/angular2-template-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/angular-icon-1.svg"></a>|![angular-npm]| Loads and compiles Angular 2 Components| +|<a href="https://github.com/riot/tag-loader"><img width="48" height="48" src="https://worldvectorlogo.com/logos/riot.svg"></a>|![riot-npm]| Riot official webpack loader| + + + +[vue-npm]: https://img.shields.io/npm/v/vue-loader.svg +[polymer-npm]: https://img.shields.io/npm/v/polymer-loader.svg +[angular-npm]: https://img.shields.io/npm/v/angular2-template-loader.svg +[riot-npm]: https://img.shields.io/npm/v/riot-tag-loader.svg + +### Performance + +webpack uses async I/O and has multiple caching levels. This makes webpack fast +and incredibly **fast** on incremental compilations. + +### Module Formats + +webpack supports ES2015+, CommonJS and AMD modules **out of the box**. It performs clever static +analysis on the AST of your code. It even has an evaluation engine to evaluate +simple expressions. This allows you to **support most existing libraries** out of the box. + +### [Code Splitting](https://webpack.js.org/guides/code-splitting/) + +webpack allows you to split your codebase into multiple chunks. Chunks are +loaded asynchronously at runtime. This reduces the initial loading time. + +### [Optimizations](https://webpack.js.org/guides/production-build/) + +webpack can do many optimizations to **reduce the output size of your +JavaScript** by deduplicating frequently used modules, minifying, and giving +you full control of what is loaded initially and what is loaded at runtime +through code splitting. It can also make your code chunks **cache +friendly** by using hashes. + +<h2 align="center">Contributing</h2> + +**We want contributing to webpack to be fun, enjoyable, and educational for anyone, and everyone.** We have a [vibrant ecosystem](https://medium.com/webpack/contributors-guide/home) that spans beyond this single repo. We welcome you to check out any of the repositories in [our organization](http://github.com/webpack) or [webpack-contrib organization](http://github.com/webpack-contrib) which houses all of our loaders and plugins. + +Contributions go far beyond pull requests and commits. Although we love giving you the opportunity to put your stamp on webpack, we also are thrilled to receive a variety of other contributions including: + +* [Documentation](https://github.com/webpack/webpack.js.org) updates, enhancements, designs, or bugfixes +* Spelling or grammar fixes +* README.md corrections or redesigns +* Adding unit, or functional tests +* Triaging GitHub issues -- especially determining whether an issue still persists or is reproducible. +* [Searching #webpack on twitter](https://twitter.com/search?q=webpack) and helping someone else who needs help +* Teaching others how to contribute to one of the many webpack repo's! +* [Blogging, speaking about, or creating tutorials](https://github.com/webpack-contrib/awesome-webpack) about one of webpack's many features. +* Helping others in our webpack [gitter channel](https://gitter.im/webpack/webpack). + +If you are worried or don't know where to start, you can **always** reach out to [Sean Larkin (@TheLarkInn) on Twitter](https://twitter.com/thelarkinn) or simply submit an issue and a maintainer can help give you guidance! + +We have also started a series on our [Medium Publication](https://medium.com/webpack) called [The Contributor's Guide to webpack](https://medium.com/webpack/contributors-guide/home). We welcome you to read it and post any questions or responses if you still need help. + +_Looking to speak about webpack?_ We'd **love** to review your talk abstract/CFP! You can email it to webpack [at] opencollective [dot] com and we can give pointers or tips!!! + +<h3 align="center">Creating your own plugins and loaders</h3> + +If you create a loader or plugin, we would <3 for you to open source it, and put it on npm. We follow the `x-loader`, `x-webpack-plugin` naming convention. + +<h2 align="center">Support</h2> + +We consider webpack to be a low-level tool used not only individually but also layered beneath other awesome tools. Because of it's flexibility, webpack isn't always the _easiest_ entry-level solution, however we do believe it is the most powerful. That said, we're always looking for ways improve and simplify the tool without compromising functionality. If you have any ideas on ways to accomplish this, we're all ears! + +If you're just getting started, take a look at [our new docs and concepts page](https://webpack.js.org/concepts/). This has a high level overview that is great for beginners!! + +If you want to discuss something or just need help, [here is our Gitter room](https://gitter.im/webpack/webpack) where there are always individuals looking to help out! + +If you are still having difficulty, we would love for you to post +a question to [StackOverflow with the webpack tag](https://stackoverflow.com/tags/webpack). It is much easier to answer questions that include your webpack.config.js and relevant files! So if you can provide them, we'd be extremely grateful (and more likely to help you find the answer!) + +If you are twitter savvy you can tweet #webpack with your question and someone should be able to reach out and help also. + +If you have discovered a đ or have a feature suggestion, feel free to create an issue on Github. + +### License + +[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fwebpack%2Fwebpack?ref=badge_large) + +<h2 align="center">Core Team</h2> + +<table> + <tbody> + <tr> + <td align="center" valign="top"> + <img width="150" height="150" src="https://github.com/sokra.png?s=150"> + <br> + <a href="https://github.com/sokra">Tobias Koppers</a> + <p>Core</p> + <br> + <p>Founder of webpack</p> + </td> + <td align="center" valign="top"> + <img width="150" height="150" src="https://github.com/jhnns.png?s=150"> + <br> + <a href="https://github.com/jhnns">Johannes Ewald</a> + <p>Loaders & Plugins</p> + <br> + <p>Early adopter of webpack</p> + </td> + <td align="center" width="20%" valign="top"> + <img width="150" height="150" src="https://github.com/TheLarkInn.png?s=150"> + <br> + <a href="https://github.com/TheLarkInn">Sean T. Larkin</a> + <p>Public Relations</p> + <br> + <p>Founder of the core team</p> + </td> + <td align="center" valign="top"> + <img width="150" height="150" src="https://github.com/bebraw.png?s=150"> + <br> + <a href="https://github.com/bebraw">Juho Vepsäläinen</a> + <p>Documentation</p> + <br> + <p>Author</p> + <a href="https://leanpub.com/survivejs-webpack"> + <img height="15" src="https://cloud.githubusercontent.com/assets/1365881/20286923/93e325c0-aac9-11e6-964d-cabe218c584c.png"> + </a> + <br> + </td> + <td align="center" valign="top"> + <img width="150" height="150" src="https://github.com/spacek33z.png?s=150"> + <br> + <a href="https://github.com/spacek33z">Kees Kluskens</a> + <p>Development</p> + <br> + <p>Sponsor<p> + <a href="https://codeyellow.nl/"> + <img height="15px" src="https://cloud.githubusercontent.com/assets/1365881/20286583/ad62eb04-aac7-11e6-9c14-a0fef35b9b56.png"> + </a> + <br> + </td> + </tr> + </tbody> +</table> + +<h2 align="center">Sponsoring</h2> + +Most of the core team members, webpack contributors and contributors in the ecosystem do this open source work in their free time. If you use webpack for a serious task, and you'd like us to invest more time on it, please donate. This project increases your income/productivity too. It makes development and applications faster and it reduces the required bandwidth. + +This is how we use the donations: + +* Allow the core team to work on webpack +* Thank contributors if they invested a large amount of time in contributing +* Support projects in the ecosystem that are of great value for users +* Support projects that are voted most (work in progress) +* Infrastructure cost +* Fees for money handling + + +<h2 align="center">Premium Partners</h2> + +<div align="center"> + +<a href="https://www.ag-grid.com/?utm_source=webpack&utm_medium=banner&utm_campaign=sponsorship" target="_blank"><img align="center" src="https://raw.githubusercontent.com/webpack/media/2b399d58/horiz-banner-ad-ag-grid.png"> +</a> + +</div> + +<h2 align="center">Other Backers and Sponsors</h2> + +Before we started using OpenCollective, donations were made anonymously. Now that we have made the switch, we would like to acknowledge these sponsors (and the ones who continue to donate using OpenCollective). If we've missed someone, please send us a PR, and we'll add you to this list. + +<div align="center"> + +[Google Angular Team](https://angular.io/), [Architects.io](http://architects.io/), +<a href="https://moonmail.io" target="_blank" title="Email Marketing Software"><img +src="https://static.moonmail.io/moonmail-logo.svg" height="30" alt="MoonMail"></a> +<a href="https://monei.net" target="_blank" title="Best payment gateway rates"><img +src="https://static.monei.net/monei-logo.svg" height="30" alt="MONEI"></a> + +</div> + +<h2 align="center">Gold Sponsors</h2> + +[Become a gold sponsor](https://opencollective.com/webpack#sponsor) and get your logo on our README on Github with a link to your site. + +<div align="center"> + +<a href="https://opencollective.com/webpack/goldsponsor/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/0/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/1/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/2/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/3/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/4/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/5/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/6/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/7/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/8/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/9/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/10/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/11/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/11/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/12/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/12/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/13/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/13/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/14/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/14/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/15/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/15/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/16/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/16/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/17/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/17/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/18/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/18/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/19/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/19/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/20/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/20/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/21/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/21/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/22/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/22/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/23/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/23/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/24/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/24/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/25/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/25/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/26/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/26/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/27/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/27/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/28/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/28/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/goldsponsor/29/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/goldsponsor/29/avatar.svg?requireActive=false"></a> + +</div> + +<h2 align="center">Silver Sponsors</h2> + +[Become a sliver sponsor](https://opencollective.com/webpack#sponsor) and get your logo on our README on Github with a link to your site. + +<div align="center"> + +<a href="https://opencollective.com/webpack/silversponsor/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/0/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/1/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/2/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/3/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/4/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/5/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/6/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/7/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/8/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/9/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/10/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/11/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/11/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/12/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/12/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/13/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/13/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/14/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/14/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/15/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/15/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/16/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/16/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/17/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/17/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/18/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/18/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/19/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/19/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/20/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/20/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/21/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/21/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/22/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/22/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/23/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/23/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/24/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/24/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/25/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/25/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/26/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/26/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/27/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/27/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/28/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/28/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/silversponsor/29/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/silversponsor/29/avatar.svg?requireActive=false"></a> + +</div> + +<h2 align="center">Bronze Sponsors</h2> + +[Become a bronze sponsor](https://opencollective.com/webpack#sponsor) and get your logo on our README on Github with a link to your site. + +<div align="center"> + +<a href="https://opencollective.com/webpack/sponsor/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/0/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/1/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/2/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/3/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/4/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/5/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/6/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/7/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/8/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/9/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/10/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/11/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/11/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/12/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/12/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/13/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/13/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/14/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/14/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/15/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/15/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/16/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/16/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/17/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/17/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/18/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/18/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/19/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/19/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/20/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/20/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/21/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/21/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/22/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/22/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/23/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/23/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/24/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/24/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/25/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/25/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/26/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/26/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/27/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/27/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/28/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/28/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/29/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/29/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/30/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/30/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/31/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/31/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/32/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/32/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/33/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/33/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/34/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/34/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/35/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/35/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/36/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/36/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/37/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/37/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/38/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/38/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/39/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/39/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/40/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/40/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/41/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/41/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/42/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/42/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/43/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/43/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/44/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/44/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/45/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/45/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/46/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/46/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/47/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/47/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/48/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/48/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/49/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/49/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/50/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/50/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/51/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/51/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/52/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/52/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/53/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/53/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/54/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/54/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/55/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/55/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/56/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/56/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/57/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/57/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/58/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/58/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/59/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/59/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/60/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/60/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/61/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/61/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/62/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/62/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/63/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/63/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/64/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/64/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/65/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/65/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/66/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/66/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/67/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/67/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/68/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/68/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/69/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/69/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/70/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/70/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/71/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/71/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/72/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/72/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/73/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/73/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/74/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/74/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/75/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/75/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/76/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/76/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/77/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/77/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/78/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/78/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/79/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/79/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/80/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/80/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/81/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/81/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/82/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/82/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/83/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/83/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/84/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/84/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/85/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/85/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/86/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/86/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/87/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/87/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/88/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/88/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/89/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/89/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/90/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/90/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/91/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/91/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/92/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/92/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/93/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/93/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/94/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/94/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/95/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/95/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/96/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/96/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/97/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/97/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/98/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/98/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/99/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/99/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/sponsor/100/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/sponsor/100/avatar.svg?requireActive=false"></a> + +</div> + +<h2 align="center">Backers</h2> + +[Become a backer](https://opencollective.com/webpack#backer) and get your image on our README on Github with a link to your site. + +<a href="https://opencollective.com/webpack/backer/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/0/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/1/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/2/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/3/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/4/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/5/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/6/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/7/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/8/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/9/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/10/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/11/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/11/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/12/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/12/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/13/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/13/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/14/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/14/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/15/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/15/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/16/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/16/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/17/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/17/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/18/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/18/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/19/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/19/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/20/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/20/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/21/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/21/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/22/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/22/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/23/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/23/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/24/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/24/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/25/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/25/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/26/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/26/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/27/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/27/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/28/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/28/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/29/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/29/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/30/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/30/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/31/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/31/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/32/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/32/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/33/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/33/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/34/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/34/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/35/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/35/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/36/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/36/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/37/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/37/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/38/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/38/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/39/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/39/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/40/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/40/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/41/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/41/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/42/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/42/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/43/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/43/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/44/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/44/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/45/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/45/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/46/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/46/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/47/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/47/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/48/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/48/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/49/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/49/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/50/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/50/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/51/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/51/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/52/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/52/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/53/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/53/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/54/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/54/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/55/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/55/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/56/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/56/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/57/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/57/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/58/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/58/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/59/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/59/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/60/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/60/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/61/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/61/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/62/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/62/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/63/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/63/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/64/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/64/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/65/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/65/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/66/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/66/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/67/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/67/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/68/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/68/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/69/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/69/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/70/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/70/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/71/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/71/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/72/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/72/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/73/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/73/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/74/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/74/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/75/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/75/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/76/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/76/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/77/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/77/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/78/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/78/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/79/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/79/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/80/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/80/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/81/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/81/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/82/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/82/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/83/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/83/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/84/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/84/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/85/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/85/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/86/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/86/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/87/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/87/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/88/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/88/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/89/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/89/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/90/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/90/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/91/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/91/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/92/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/92/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/93/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/93/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/94/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/94/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/95/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/95/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/96/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/96/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/97/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/97/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/98/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/98/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/99/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/99/avatar.svg?requireActive=false"></a> +<a href="https://opencollective.com/webpack/backer/100/website?requireActive=false" target="_blank"><img src="https://opencollective.com/webpack/backer/100/avatar.svg?requireActive=false"></a> + +<h2 align="center">Thanks to</h2> +<p align="center">(In chronological order)</p> + +* @google for [Google Web Toolkit (GWT)](http://www.gwtproject.org/), which aims to compile Java to JavaScript. It features a similar [Code Splitting](http://www.gwtproject.org/doc/latest/DevGuideCodeSplitting.html) as webpack. +* @medikoo for [modules-webmake](https://github.com/medikoo/modules-webmake), which is a similar project. webpack was born because I wanted Code Splitting for modules-webmake. Interestingly the [Code Splitting issue is still open](https://github.com/medikoo/modules-webmake/issues/7) (thanks also to @Phoscur for the discussion). +* @substack for [browserify](http://browserify.org/), which is a similar project and source for many ideas. +* @jrburke for [require.js](http://requirejs.org/), which is a similar project and source for many ideas. +* @defunctzombie for the [browser-field spec](https://gist.github.com/defunctzombie/4339901), which makes modules available for node.js, browserify and webpack. +* Every early webpack user, which contributed to webpack by writing issues or PRs. You influenced the direction... +* @shama, @jhnns and @sokra for maintaining this project +* Everyone who has written a loader for webpack. You are the ecosystem... +* Everyone I forgot to mention here, but also influenced webpack. + + +[npm]: https://img.shields.io/npm/v/webpack.svg +[npm-url]: https://npmjs.com/package/webpack + +[node]: https://img.shields.io/node/v/webpack.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/david/webpack/webpack.svg +[deps-url]: https://david-dm.org/webpack/webpack + +[tests]: https://img.shields.io/travis/webpack/webpack/master.svg +[tests-url]: https://travis-ci.org/webpack/webpack + +[builds-url]: https://ci.appveyor.com/project/sokra/webpack/branch/master +[builds]: https://ci.appveyor.com/api/projects/status/github/webpack/webpack?svg=true + +[licenses-url]: https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fwebpack%2Fwebpack?ref=badge_shield +[licenses]: https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fwebpack%2Fwebpack.svg?type=shield + +[cover]: https://img.shields.io/coveralls/webpack/webpack.svg +[cover-url]: https://coveralls.io/r/webpack/webpack/ diff --git a/node_modules/webpack/bin/config-yargs.js b/node_modules/webpack/bin/config-yargs.js index e7c166671..0f44fdebe 100644 --- a/node_modules/webpack/bin/config-yargs.js +++ b/node_modules/webpack/bin/config-yargs.js @@ -172,7 +172,7 @@ module.exports = function(yargs) { requiresArg: true }, "watch-poll": { - type: "boolean", + type: "string", describe: "The polling interval for watching (also enable polling)", group: ADVANCED_GROUP }, diff --git a/node_modules/webpack/bin/convert-argv.js b/node_modules/webpack/bin/convert-argv.js index 043ea2abb..db68f76a6 100644 --- a/node_modules/webpack/bin/convert-argv.js +++ b/node_modules/webpack/bin/convert-argv.js @@ -166,12 +166,12 @@ module.exports = function(yargs, argv, convertOptions) { options.watchOptions.aggregateTimeout = +argv["watch-aggregate-timeout"]; } - if(argv["watch-poll"]) { + if(typeof argv["watch-poll"] !== "undefined") { options.watchOptions = options.watchOptions || {}; - if(typeof argv["watch-poll"] !== "boolean") - options.watchOptions.poll = +argv["watch-poll"]; - else + if(argv["watch-poll"] === "true" || argv["watch-poll"] === "") options.watchOptions.poll = true; + else if(!isNaN(argv["watch-poll"])) + options.watchOptions.poll = +argv["watch-poll"]; } if(argv["watch-stdin"]) { @@ -537,7 +537,7 @@ module.exports = function(yargs, argv, convertOptions) { if(i < 0 || (j >= 0 && j < i)) { var resolved = path.resolve(content); if(fs.existsSync(resolved)) { - addTo("main", resolved); + addTo("main", `${resolved}${fs.statSync(resolved).isDirectory() ? path.sep : ""}`); } else { addTo("main", content); } diff --git a/node_modules/webpack/lib/CachePlugin.js b/node_modules/webpack/lib/CachePlugin.js index 1b8d6a30e..9c19b8140 100644 --- a/node_modules/webpack/lib/CachePlugin.js +++ b/node_modules/webpack/lib/CachePlugin.js @@ -18,15 +18,31 @@ class CachePlugin { c.apply(new CachePlugin(this.cache[idx] = this.cache[idx] || {}));
});
} else {
- compiler.plugin("compilation", compilation => {
- if(!compilation.notCacheable) {
- compilation.cache = this.cache;
- } else if(this.watching) {
- compilation.warnings.push(
- new Error(`CachePlugin - Cache cannot be used because of: ${compilation.notCacheable}`)
- );
- }
- });
+ const registerCacheToCompiler = (compiler, cache) => {
+ compiler.plugin("this-compilation", compilation => {
+ // TODO remove notCacheable for webpack 4
+ if(!compilation.notCacheable) {
+ compilation.cache = cache;
+ compilation.plugin("child-compiler", (childCompiler, compilerName, compilerIndex) => {
+ if(cache) {
+ let childCache;
+ if(!cache.children) cache.children = {};
+ if(!cache.children[compilerName]) cache.children[compilerName] = [];
+ if(cache.children[compilerName][compilerIndex])
+ childCache = cache.children[compilerName][compilerIndex];
+ else
+ cache.children[compilerName].push(childCache = {});
+ registerCacheToCompiler(childCompiler, childCache);
+ }
+ });
+ } else if(this.watching) {
+ compilation.warnings.push(
+ new Error(`CachePlugin - Cache cannot be used because of: ${compilation.notCacheable}`)
+ );
+ }
+ });
+ };
+ registerCacheToCompiler(compiler, this.cache);
compiler.plugin("watch-run", (compiler, callback) => {
this.watching = true;
callback();
diff --git a/node_modules/webpack/lib/Compilation.js b/node_modules/webpack/lib/Compilation.js index b59c0eb53..72b195745 100644 --- a/node_modules/webpack/lib/Compilation.js +++ b/node_modules/webpack/lib/Compilation.js @@ -232,7 +232,10 @@ class Compilation extends Tapable { callback();
};
- _this.semaphore.acquire(() => {
+ const semaphore = _this.semaphore;
+ semaphore.acquire(() => {
+ if(_this === null) return semaphore.release();
+
const factory = item[0];
factory.create({
contextInfo: {
@@ -242,6 +245,8 @@ class Compilation extends Tapable { context: module.context,
dependencies: dependencies
}, function factoryCallback(err, dependentModule) {
+ if(_this === null) return semaphore.release();
+
let afterFactory;
function isOptional() {
@@ -265,11 +270,11 @@ class Compilation extends Tapable { }
if(err) {
- _this.semaphore.release();
+ semaphore.release();
return errorOrWarningAndCallback(new ModuleNotFoundError(module, err, dependencies));
}
if(!dependentModule) {
- _this.semaphore.release();
+ semaphore.release();
return process.nextTick(callback);
}
if(_this.profile) {
@@ -302,7 +307,7 @@ class Compilation extends Tapable { }
}
- _this.semaphore.release();
+ semaphore.release();
return process.nextTick(callback);
}
@@ -322,7 +327,7 @@ class Compilation extends Tapable { module.profile.building = afterBuilding - afterFactory;
}
- _this.semaphore.release();
+ semaphore.release();
if(recursive) {
return process.nextTick(_this.processModuleDependencies.bind(_this, dependentModule, callback));
} else {
@@ -335,8 +340,10 @@ class Compilation extends Tapable { iterationDependencies(dependencies);
_this.buildModule(dependentModule, isOptional(), module, dependencies, err => {
+ if(_this === null) return semaphore.release();
+
if(err) {
- _this.semaphore.release();
+ semaphore.release();
return errorOrWarningAndCallback(err);
}
@@ -345,7 +352,7 @@ class Compilation extends Tapable { dependentModule.profile.building = afterBuilding - afterFactory;
}
- _this.semaphore.release();
+ semaphore.release();
if(recursive) {
_this.processModuleDependencies(dependentModule, callback);
} else {
@@ -578,8 +585,8 @@ class Compilation extends Tapable { chunk.entryModule = module;
self.assignIndex(module);
self.assignDepth(module);
- self.processDependenciesBlockForChunk(module, chunk);
});
+ self.processDependenciesBlocksForChunks(self.chunks.slice());
self.sortModules(self.modules);
self.applyPlugins0("optimize");
@@ -846,62 +853,90 @@ class Compilation extends Tapable { }
}
- processDependenciesBlockForChunk(module, chunk) {
- let block = module;
- const initialChunk = chunk;
+ // This method creates the Chunk graph from the Module graph
+ processDependenciesBlocksForChunks(inputChunks) {
+ // Process is splitting into two parts:
+ // Part one traverse the module graph and builds a very basic chunks graph
+ // in chunkDependencies.
+ // Part two traverse every possible way through the basic chunk graph and
+ // tracks the available modules. While traversing it connects chunks with
+ // eachother and Blocks with Chunks. It stops traversing when all modules
+ // for a chunk are already available. So it doesn't connect unneeded chunks.
+
const chunkDependencies = new Map(); // Map<Chunk, Array<{Module, Chunk}>>
+ const allCreatedChunks = new Set();
+
+ // PART ONE
+ const blockChunks = new Map();
+
+ // Start with the provided modules/chunks
+ const queue = inputChunks.map(chunk => ({
+ block: chunk.entryModule,
+ chunk: chunk
+ }));
+
+ let block, chunk;
+
+ // For each async Block in graph
const iteratorBlock = b => {
- let c;
- if(!b.chunks) {
+ // 1. We create a chunk for this Block
+ // but only once (blockChunks map)
+ let c = blockChunks.get(b);
+ if(c === undefined) {
c = this.addChunk(b.chunkName, b.module, b.loc);
- b.chunks = [c];
- c.addBlock(b);
- } else {
- c = b.chunks[0];
+ blockChunks.set(b, c);
+ allCreatedChunks.add(c);
+ // We initialize the chunks property
+ // this is later filled with the chunk when needed
+ b.chunks = [];
}
+
+ // 2. We store the Block+Chunk mapping as dependency for the chunk
let deps = chunkDependencies.get(chunk);
if(!deps) chunkDependencies.set(chunk, deps = []);
deps.push({
- chunk: c,
- module
+ block: b,
+ chunk: c
});
+
+ // 3. We enqueue the DependenciesBlock for traversal
queue.push({
block: b,
- module: null,
chunk: c
});
};
+ // For each Dependency in the graph
const iteratorDependency = d => {
+ // We skip Dependencies without Module pointer
if(!d.module) {
return;
}
+ // We skip weak Dependencies
if(d.weak) {
return;
}
+ // We connect Module and Chunk when not already done
if(chunk.addModule(d.module)) {
d.module.addChunk(chunk);
+
+ // And enqueue the Module for traversal
queue.push({
block: d.module,
- module: d.module,
chunk
});
}
};
- const queue = [{
- block,
- module,
- chunk
- }];
-
+ // Iterative traversal of the Module graph
+ // Recursive would be simpler to write but could result in Stack Overflows
while(queue.length) {
const queueItem = queue.pop();
block = queueItem.block;
- module = queueItem.module;
chunk = queueItem.chunk;
+ // Traverse all variables, Dependencies and Blocks
if(block.variables) {
iterationBlockVariable(block.variables, iteratorDependency);
}
@@ -915,46 +950,108 @@ class Compilation extends Tapable { }
}
- chunk = initialChunk;
- let chunks = new Set();
- const queue2 = [{
+ // PART TWO
+
+ let availableModules;
+ let newAvailableModules;
+ const queue2 = inputChunks.map(chunk => ({
chunk,
- chunks
- }];
+ availableModules: new Set()
+ }));
- const filterFn = dep => {
- if(chunks.has(dep.chunk)) return false;
- for(const chunk of chunks) {
- if(chunk.containsModule(dep.module))
+ // Helper function to check if all modules of a chunk are available
+ const areModulesAvailable = (chunk, availableModules) => {
+ for(const module of chunk.modulesIterable) {
+ if(!availableModules.has(module))
return false;
}
return true;
};
+ // For each edge in the basic chunk graph
+ const filterFn = dep => {
+ // Filter egdes that are not needed because all modules are already available
+ // This also filters circular dependencies in the chunks graph
+ const depChunk = dep.chunk;
+ if(areModulesAvailable(depChunk, newAvailableModules))
+ return false; // break all modules are already available
+ return true;
+ };
+
+ const minAvailableModulesMap = new Map();
+
+ // Iterative traversing of the basic chunk graph
while(queue2.length) {
const queueItem = queue2.pop();
chunk = queueItem.chunk;
- chunks = queueItem.chunks;
+ availableModules = queueItem.availableModules;
+
+ // 1. Get minimal available modules
+ // It doesn't make sense to traverse a chunk again with more available modules.
+ // This step calculates the minimal available modules and skips traversal when
+ // the list didn't shrink.
+ let minAvailableModules = minAvailableModulesMap.get(chunk);
+ if(minAvailableModules === undefined) {
+ minAvailableModulesMap.set(chunk, new Set(availableModules));
+ } else {
+ let deletedModules = false;
+ for(const m of minAvailableModules) {
+ if(!availableModules.has(m)) {
+ minAvailableModules.delete(m);
+ deletedModules = true;
+ }
+ }
+ if(!deletedModules)
+ continue;
+ }
+ // 2. Get the edges at this point of the graph
const deps = chunkDependencies.get(chunk);
if(!deps) continue;
+ if(deps.length === 0) continue;
- const depsFiltered = deps.filter(filterFn);
+ // 3. Create a new Set of available modules at this points
+ newAvailableModules = new Set(availableModules);
+ for(const m of chunk.modulesIterable)
+ newAvailableModules.add(m);
- for(let i = 0; i < depsFiltered.length; i++) {
- const dep = depsFiltered[i];
+ // 4. Filter edges with available modules
+ const filteredDeps = deps.filter(filterFn);
+
+ // 5. Foreach remaining edge
+ const nextChunks = new Set();
+ for(let i = 0; i < filteredDeps.length; i++) {
+ const dep = filteredDeps[i];
const depChunk = dep.chunk;
- chunk.addChunk(depChunk);
- depChunk.addParent(chunk);
+ const depBlock = dep.block;
+
+ // 6. Connnect block with chunk
+ if(depChunk.addBlock(depBlock)) {
+ depBlock.chunks.push(depChunk);
+ }
+
+ // 7. Connect chunk with parent
+ if(chunk.addChunk(depChunk)) {
+ depChunk.addParent(chunk);
+ }
- const newChunks = depsFiltered.length > 1 ? new Set(chunks) : chunks;
- newChunks.add(chunk);
+ nextChunks.add(depChunk);
+ }
+
+ // 8. Enqueue further traversal
+ for(const nextChunk of nextChunks) {
queue2.push({
- chunk: depChunk,
- chunks: newChunks
+ chunk: nextChunk,
+ availableModules: newAvailableModules
});
}
}
+
+ // Remove all unconnected chunks
+ for(const chunk of allCreatedChunks) {
+ if(chunk.parents.length === 0)
+ chunk.remove("unconnected");
+ }
}
removeChunkFromDependencies(block, chunk) {
diff --git a/node_modules/webpack/lib/Compiler.js b/node_modules/webpack/lib/Compiler.js index 8e3118a8c..943ae48a6 100644 --- a/node_modules/webpack/lib/Compiler.js +++ b/node_modules/webpack/lib/Compiler.js @@ -1,529 +1,523 @@ -/*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const path = require("path");
-const Tapable = require("tapable");
-
-const Compilation = require("./Compilation");
-const Stats = require("./Stats");
-const NormalModuleFactory = require("./NormalModuleFactory");
-const ContextModuleFactory = require("./ContextModuleFactory");
-
-const makePathsRelative = require("./util/identifier").makePathsRelative;
-
-class Watching {
- constructor(compiler, watchOptions, handler) {
- this.startTime = null;
- this.invalid = false;
- this.handler = handler;
- this.callbacks = [];
- this.closed = false;
- if(typeof watchOptions === "number") {
- this.watchOptions = {
- aggregateTimeout: watchOptions
- };
- } else if(watchOptions && typeof watchOptions === "object") {
- this.watchOptions = Object.assign({}, watchOptions);
- } else {
- this.watchOptions = {};
- }
- this.watchOptions.aggregateTimeout = this.watchOptions.aggregateTimeout || 200;
- this.compiler = compiler;
- this.running = true;
- this.compiler.readRecords(err => {
- if(err) return this._done(err);
-
- this._go();
- });
- }
-
- _go() {
- this.startTime = Date.now();
- this.running = true;
- this.invalid = false;
- this.compiler.applyPluginsAsync("watch-run", this, err => {
- if(err) return this._done(err);
- const onCompiled = (err, compilation) => {
- if(err) return this._done(err);
- if(this.invalid) return this._done();
-
- if(this.compiler.applyPluginsBailResult("should-emit", compilation) === false) {
- return this._done(null, compilation);
- }
-
- this.compiler.emitAssets(compilation, err => {
- if(err) return this._done(err);
- if(this.invalid) return this._done();
-
- this.compiler.emitRecords(err => {
- if(err) return this._done(err);
-
- if(compilation.applyPluginsBailResult("need-additional-pass")) {
- compilation.needAdditionalPass = true;
-
- const stats = new Stats(compilation);
- stats.startTime = this.startTime;
- stats.endTime = Date.now();
- this.compiler.applyPlugins("done", stats);
-
- this.compiler.applyPluginsAsync("additional-pass", err => {
- if(err) return this._done(err);
- this.compiler.compile(onCompiled);
- });
- return;
- }
- return this._done(null, compilation);
- });
- });
- };
- this.compiler.compile(onCompiled);
- });
- }
-
- _getStats(compilation) {
- const stats = new Stats(compilation);
- stats.startTime = this.startTime;
- stats.endTime = Date.now();
- return stats;
- }
-
- _done(err, compilation) {
- this.running = false;
- if(this.invalid) return this._go();
-
- const stats = compilation ? this._getStats(compilation) : null;
- if(err) {
- this.compiler.applyPlugins("failed", err);
- this.handler(err, stats);
- return;
- }
-
- this.compiler.applyPlugins("done", stats);
- this.handler(null, stats);
- if(!this.closed) {
- this.watch(compilation.fileDependencies, compilation.contextDependencies, compilation.missingDependencies);
- }
- this.callbacks.forEach(cb => cb());
- this.callbacks.length = 0;
- }
-
- watch(files, dirs, missing) {
- this.pausedWatcher = null;
- this.watcher = this.compiler.watchFileSystem.watch(files, dirs, missing, this.startTime, this.watchOptions, (err, filesModified, contextModified, missingModified, fileTimestamps, contextTimestamps) => {
- this.pausedWatcher = this.watcher;
- this.watcher = null;
- if(err) return this.handler(err);
-
- this.compiler.fileTimestamps = fileTimestamps;
- this.compiler.contextTimestamps = contextTimestamps;
- this.invalidate();
- }, (fileName, changeTime) => {
- this.compiler.applyPlugins("invalid", fileName, changeTime);
- });
- }
-
- invalidate(callback) {
- if(callback) {
- this.callbacks.push(callback);
- }
- if(this.watcher) {
- this.pausedWatcher = this.watcher;
- this.watcher.pause();
- this.watcher = null;
- }
- if(this.running) {
- this.invalid = true;
- return false;
- } else {
- this._go();
- }
- }
-
- close(callback) {
- if(callback === undefined) callback = function() {};
-
- this.closed = true;
- if(this.watcher) {
- this.watcher.close();
- this.watcher = null;
- }
- if(this.pausedWatcher) {
- this.pausedWatcher.close();
- this.pausedWatcher = null;
- }
- if(this.running) {
- this.invalid = true;
- this._done = () => {
- this.compiler.applyPlugins("watch-close");
- callback();
- };
- } else {
- this.compiler.applyPlugins("watch-close");
- callback();
- }
- }
-}
-
-class Compiler extends Tapable {
- constructor() {
- super();
- this.outputPath = "";
- this.outputFileSystem = null;
- this.inputFileSystem = null;
-
- this.recordsInputPath = null;
- this.recordsOutputPath = null;
- this.records = {};
-
- this.fileTimestamps = {};
- this.contextTimestamps = {};
-
- this.resolvers = {
- normal: null,
- loader: null,
- context: null
- };
- let deprecationReported = false;
- this.parser = {
- plugin: (hook, fn) => {
- if(!deprecationReported) {
- console.warn("webpack: Using compiler.parser is deprecated.\n" +
- "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.plugin(/* ... */); });\n}); instead. " +
- "It was called " + new Error().stack.split("\n")[2].trim() + ".");
- deprecationReported = true;
- }
- this.plugin("compilation", (compilation, data) => {
- data.normalModuleFactory.plugin("parser", parser => {
- parser.plugin(hook, fn);
- });
- });
- },
- apply: () => {
- const args = arguments;
- if(!deprecationReported) {
- console.warn("webpack: Using compiler.parser is deprecated.\n" +
- "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.apply(/* ... */); });\n}); instead. " +
- "It was called " + new Error().stack.split("\n")[2].trim() + ".");
- deprecationReported = true;
- }
- this.plugin("compilation", (compilation, data) => {
- data.normalModuleFactory.plugin("parser", parser => {
- parser.apply.apply(parser, args);
- });
- });
- }
- };
-
- this.options = {};
- }
-
- watch(watchOptions, handler) {
- this.fileTimestamps = {};
- this.contextTimestamps = {};
- const watching = new Watching(this, watchOptions, handler);
- return watching;
- }
-
- run(callback) {
- const startTime = Date.now();
-
- const onCompiled = (err, compilation) => {
- if(err) return callback(err);
-
- if(this.applyPluginsBailResult("should-emit", compilation) === false) {
- const stats = new Stats(compilation);
- stats.startTime = startTime;
- stats.endTime = Date.now();
- this.applyPlugins("done", stats);
- return callback(null, stats);
- }
-
- this.emitAssets(compilation, err => {
- if(err) return callback(err);
-
- if(compilation.applyPluginsBailResult("need-additional-pass")) {
- compilation.needAdditionalPass = true;
-
- const stats = new Stats(compilation);
- stats.startTime = startTime;
- stats.endTime = Date.now();
- this.applyPlugins("done", stats);
-
- this.applyPluginsAsync("additional-pass", err => {
- if(err) return callback(err);
- this.compile(onCompiled);
- });
- return;
- }
-
- this.emitRecords(err => {
- if(err) return callback(err);
-
- const stats = new Stats(compilation);
- stats.startTime = startTime;
- stats.endTime = Date.now();
- this.applyPlugins("done", stats);
- return callback(null, stats);
- });
- });
- };
-
- this.applyPluginsAsync("before-run", this, err => {
- if(err) return callback(err);
-
- this.applyPluginsAsync("run", this, err => {
- if(err) return callback(err);
-
- this.readRecords(err => {
- if(err) return callback(err);
-
- this.compile(onCompiled);
- });
- });
- });
- }
-
- runAsChild(callback) {
- this.compile((err, compilation) => {
- if(err) return callback(err);
-
- this.parentCompilation.children.push(compilation);
- Object.keys(compilation.assets).forEach(name => {
- this.parentCompilation.assets[name] = compilation.assets[name];
- });
-
- const entries = Object.keys(compilation.entrypoints).map(name => {
- return compilation.entrypoints[name].chunks;
- }).reduce((array, chunks) => {
- return array.concat(chunks);
- }, []);
-
- return callback(null, entries, compilation);
- });
- }
-
- purgeInputFileSystem() {
- if(this.inputFileSystem && this.inputFileSystem.purge)
- this.inputFileSystem.purge();
- }
-
- emitAssets(compilation, callback) {
- let outputPath;
-
- const emitFiles = (err) => {
- if(err) return callback(err);
-
- require("async").forEach(Object.keys(compilation.assets), (file, callback) => {
-
- let targetFile = file;
- const queryStringIdx = targetFile.indexOf("?");
- if(queryStringIdx >= 0) {
- targetFile = targetFile.substr(0, queryStringIdx);
- }
-
- const writeOut = (err) => {
- if(err) return callback(err);
- const targetPath = this.outputFileSystem.join(outputPath, targetFile);
- const source = compilation.assets[file];
- if(source.existsAt === targetPath) {
- source.emitted = false;
- return callback();
- }
- let content = source.source();
-
- if(!Buffer.isBuffer(content)) {
- content = new Buffer(content, "utf8"); // eslint-disable-line
- }
-
- source.existsAt = targetPath;
- source.emitted = true;
- this.outputFileSystem.writeFile(targetPath, content, callback);
- };
-
- if(targetFile.match(/\/|\\/)) {
- const dir = path.dirname(targetFile);
- this.outputFileSystem.mkdirp(this.outputFileSystem.join(outputPath, dir), writeOut);
- } else writeOut();
-
- }, err => {
- if(err) return callback(err);
-
- afterEmit.call(this);
- });
- };
-
- this.applyPluginsAsync("emit", compilation, err => {
- if(err) return callback(err);
- outputPath = compilation.getPath(this.outputPath);
- this.outputFileSystem.mkdirp(outputPath, emitFiles);
- });
-
- function afterEmit() {
- this.applyPluginsAsyncSeries1("after-emit", compilation, err => {
- if(err) return callback(err);
-
- return callback();
- });
- }
-
- }
-
- emitRecords(callback) {
- if(!this.recordsOutputPath) return callback();
- const idx1 = this.recordsOutputPath.lastIndexOf("/");
- const idx2 = this.recordsOutputPath.lastIndexOf("\\");
- let recordsOutputPathDirectory = null;
- if(idx1 > idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx1);
- if(idx1 < idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx2);
- if(!recordsOutputPathDirectory) return writeFile.call(this);
- this.outputFileSystem.mkdirp(recordsOutputPathDirectory, err => {
- if(err) return callback(err);
- writeFile.call(this);
- });
-
- function writeFile() {
- this.outputFileSystem.writeFile(this.recordsOutputPath, JSON.stringify(this.records, undefined, 2), callback);
- }
- }
-
- readRecords(callback) {
- if(!this.recordsInputPath) {
- this.records = {};
- return callback();
- }
- this.inputFileSystem.stat(this.recordsInputPath, err => {
- // It doesn't exist
- // We can ignore this.
- if(err) return callback();
-
- this.inputFileSystem.readFile(this.recordsInputPath, (err, content) => {
- if(err) return callback(err);
-
- try {
- this.records = JSON.parse(content.toString("utf-8"));
- } catch(e) {
- e.message = "Cannot parse records: " + e.message;
- return callback(e);
- }
-
- return callback();
- });
- });
- }
-
- createChildCompiler(compilation, compilerName, compilerIndex, outputOptions, plugins) {
- const childCompiler = new Compiler();
- if(Array.isArray(plugins)) {
- plugins.forEach(plugin => childCompiler.apply(plugin));
- }
- for(const name in this._plugins) {
- if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0)
- childCompiler._plugins[name] = this._plugins[name].slice();
- }
- childCompiler.name = compilerName;
- childCompiler.outputPath = this.outputPath;
- childCompiler.inputFileSystem = this.inputFileSystem;
- childCompiler.outputFileSystem = null;
- childCompiler.resolvers = this.resolvers;
- childCompiler.fileTimestamps = this.fileTimestamps;
- childCompiler.contextTimestamps = this.contextTimestamps;
-
- const relativeCompilerName = makePathsRelative(this.context, compilerName);
- if(!this.records[relativeCompilerName]) this.records[relativeCompilerName] = [];
- if(this.records[relativeCompilerName][compilerIndex])
- childCompiler.records = this.records[relativeCompilerName][compilerIndex];
- else
- this.records[relativeCompilerName].push(childCompiler.records = {});
-
- if(this.cache) {
- if(!this.cache.children) this.cache.children = {};
- if(!this.cache.children[compilerName]) this.cache.children[compilerName] = [];
- if(this.cache.children[compilerName][compilerIndex])
- childCompiler.cache = this.cache.children[compilerName][compilerIndex];
- else
- this.cache.children[compilerName].push(childCompiler.cache = {});
- }
-
- childCompiler.options = Object.create(this.options);
- childCompiler.options.output = Object.create(childCompiler.options.output);
- for(const name in outputOptions) {
- childCompiler.options.output[name] = outputOptions[name];
- }
- childCompiler.parentCompilation = compilation;
- return childCompiler;
- }
-
- isChild() {
- return !!this.parentCompilation;
- }
-
- createCompilation() {
- return new Compilation(this);
- }
-
- newCompilation(params) {
- const compilation = this.createCompilation();
- compilation.fileTimestamps = this.fileTimestamps;
- compilation.contextTimestamps = this.contextTimestamps;
- compilation.name = this.name;
- compilation.records = this.records;
- compilation.compilationDependencies = params.compilationDependencies;
- this.applyPlugins("this-compilation", compilation, params);
- this.applyPlugins("compilation", compilation, params);
- return compilation;
- }
-
- createNormalModuleFactory() {
- const normalModuleFactory = new NormalModuleFactory(this.options.context, this.resolvers, this.options.module || {});
- this.applyPlugins("normal-module-factory", normalModuleFactory);
- return normalModuleFactory;
- }
-
- createContextModuleFactory() {
- const contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem);
- this.applyPlugins("context-module-factory", contextModuleFactory);
- return contextModuleFactory;
- }
-
- newCompilationParams() {
- const params = {
- normalModuleFactory: this.createNormalModuleFactory(),
- contextModuleFactory: this.createContextModuleFactory(),
- compilationDependencies: []
- };
- return params;
- }
-
- compile(callback) {
- const params = this.newCompilationParams();
- this.applyPluginsAsync("before-compile", params, err => {
- if(err) return callback(err);
-
- this.applyPlugins("compile", params);
-
- const compilation = this.newCompilation(params);
-
- this.applyPluginsParallel("make", compilation, err => {
- if(err) return callback(err);
-
- compilation.finish();
-
- compilation.seal(err => {
- if(err) return callback(err);
-
- this.applyPluginsAsync("after-compile", compilation, err => {
- if(err) return callback(err);
-
- return callback(null, compilation);
- });
- });
- });
- });
- }
-}
-
-Compiler.Watching = Watching;
-module.exports = Compiler;
+/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +"use strict"; + +const path = require("path"); +const Tapable = require("tapable"); + +const Compilation = require("./Compilation"); +const Stats = require("./Stats"); +const NormalModuleFactory = require("./NormalModuleFactory"); +const ContextModuleFactory = require("./ContextModuleFactory"); + +const makePathsRelative = require("./util/identifier").makePathsRelative; + +class Watching { + constructor(compiler, watchOptions, handler) { + this.startTime = null; + this.invalid = false; + this.handler = handler; + this.callbacks = []; + this.closed = false; + if(typeof watchOptions === "number") { + this.watchOptions = { + aggregateTimeout: watchOptions + }; + } else if(watchOptions && typeof watchOptions === "object") { + this.watchOptions = Object.assign({}, watchOptions); + } else { + this.watchOptions = {}; + } + this.watchOptions.aggregateTimeout = this.watchOptions.aggregateTimeout || 200; + this.compiler = compiler; + this.running = true; + this.compiler.readRecords(err => { + if(err) return this._done(err); + + this._go(); + }); + } + + _go() { + this.startTime = Date.now(); + this.running = true; + this.invalid = false; + this.compiler.applyPluginsAsync("watch-run", this, err => { + if(err) return this._done(err); + const onCompiled = (err, compilation) => { + if(err) return this._done(err); + if(this.invalid) return this._done(); + + if(this.compiler.applyPluginsBailResult("should-emit", compilation) === false) { + return this._done(null, compilation); + } + + this.compiler.emitAssets(compilation, err => { + if(err) return this._done(err); + if(this.invalid) return this._done(); + + this.compiler.emitRecords(err => { + if(err) return this._done(err); + + if(compilation.applyPluginsBailResult("need-additional-pass")) { + compilation.needAdditionalPass = true; + + const stats = new Stats(compilation); + stats.startTime = this.startTime; + stats.endTime = Date.now(); + this.compiler.applyPlugins("done", stats); + + this.compiler.applyPluginsAsync("additional-pass", err => { + if(err) return this._done(err); + this.compiler.compile(onCompiled); + }); + return; + } + return this._done(null, compilation); + }); + }); + }; + this.compiler.compile(onCompiled); + }); + } + + _getStats(compilation) { + const stats = new Stats(compilation); + stats.startTime = this.startTime; + stats.endTime = Date.now(); + return stats; + } + + _done(err, compilation) { + this.running = false; + if(this.invalid) return this._go(); + + const stats = compilation ? this._getStats(compilation) : null; + if(err) { + this.compiler.applyPlugins("failed", err); + this.handler(err, stats); + return; + } + + this.compiler.applyPlugins("done", stats); + this.handler(null, stats); + if(!this.closed) { + this.watch(compilation.fileDependencies, compilation.contextDependencies, compilation.missingDependencies); + } + this.callbacks.forEach(cb => cb()); + this.callbacks.length = 0; + } + + watch(files, dirs, missing) { + this.pausedWatcher = null; + this.watcher = this.compiler.watchFileSystem.watch(files, dirs, missing, this.startTime, this.watchOptions, (err, filesModified, contextModified, missingModified, fileTimestamps, contextTimestamps) => { + this.pausedWatcher = this.watcher; + this.watcher = null; + if(err) return this.handler(err); + + this.compiler.fileTimestamps = fileTimestamps; + this.compiler.contextTimestamps = contextTimestamps; + this.invalidate(); + }, (fileName, changeTime) => { + this.compiler.applyPlugins("invalid", fileName, changeTime); + }); + } + + invalidate(callback) { + if(callback) { + this.callbacks.push(callback); + } + if(this.watcher) { + this.pausedWatcher = this.watcher; + this.watcher.pause(); + this.watcher = null; + } + if(this.running) { + this.invalid = true; + return false; + } else { + this._go(); + } + } + + close(callback) { + if(callback === undefined) callback = function() {}; + + this.closed = true; + if(this.watcher) { + this.watcher.close(); + this.watcher = null; + } + if(this.pausedWatcher) { + this.pausedWatcher.close(); + this.pausedWatcher = null; + } + if(this.running) { + this.invalid = true; + this._done = () => { + this.compiler.applyPlugins("watch-close"); + callback(); + }; + } else { + this.compiler.applyPlugins("watch-close"); + callback(); + } + } +} + +class Compiler extends Tapable { + constructor() { + super(); + this.outputPath = ""; + this.outputFileSystem = null; + this.inputFileSystem = null; + + this.recordsInputPath = null; + this.recordsOutputPath = null; + this.records = {}; + + this.fileTimestamps = {}; + this.contextTimestamps = {}; + + this.resolvers = { + normal: null, + loader: null, + context: null + }; + let deprecationReported = false; + this.parser = { + plugin: (hook, fn) => { + if(!deprecationReported) { + console.warn("webpack: Using compiler.parser is deprecated.\n" + + "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.plugin(/* ... */); });\n}); instead. " + + "It was called " + new Error().stack.split("\n")[2].trim() + "."); + deprecationReported = true; + } + this.plugin("compilation", (compilation, data) => { + data.normalModuleFactory.plugin("parser", parser => { + parser.plugin(hook, fn); + }); + }); + }, + apply: () => { + const args = arguments; + if(!deprecationReported) { + console.warn("webpack: Using compiler.parser is deprecated.\n" + + "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.apply(/* ... */); });\n}); instead. " + + "It was called " + new Error().stack.split("\n")[2].trim() + "."); + deprecationReported = true; + } + this.plugin("compilation", (compilation, data) => { + data.normalModuleFactory.plugin("parser", parser => { + parser.apply.apply(parser, args); + }); + }); + } + }; + + this.options = {}; + } + + watch(watchOptions, handler) { + this.fileTimestamps = {}; + this.contextTimestamps = {}; + const watching = new Watching(this, watchOptions, handler); + return watching; + } + + run(callback) { + const startTime = Date.now(); + + const onCompiled = (err, compilation) => { + if(err) return callback(err); + + if(this.applyPluginsBailResult("should-emit", compilation) === false) { + const stats = new Stats(compilation); + stats.startTime = startTime; + stats.endTime = Date.now(); + this.applyPlugins("done", stats); + return callback(null, stats); + } + + this.emitAssets(compilation, err => { + if(err) return callback(err); + + if(compilation.applyPluginsBailResult("need-additional-pass")) { + compilation.needAdditionalPass = true; + + const stats = new Stats(compilation); + stats.startTime = startTime; + stats.endTime = Date.now(); + this.applyPlugins("done", stats); + + this.applyPluginsAsync("additional-pass", err => { + if(err) return callback(err); + this.compile(onCompiled); + }); + return; + } + + this.emitRecords(err => { + if(err) return callback(err); + + const stats = new Stats(compilation); + stats.startTime = startTime; + stats.endTime = Date.now(); + this.applyPlugins("done", stats); + return callback(null, stats); + }); + }); + }; + + this.applyPluginsAsync("before-run", this, err => { + if(err) return callback(err); + + this.applyPluginsAsync("run", this, err => { + if(err) return callback(err); + + this.readRecords(err => { + if(err) return callback(err); + + this.compile(onCompiled); + }); + }); + }); + } + + runAsChild(callback) { + this.compile((err, compilation) => { + if(err) return callback(err); + + this.parentCompilation.children.push(compilation); + Object.keys(compilation.assets).forEach(name => { + this.parentCompilation.assets[name] = compilation.assets[name]; + }); + + const entries = Object.keys(compilation.entrypoints).map(name => { + return compilation.entrypoints[name].chunks; + }).reduce((array, chunks) => { + return array.concat(chunks); + }, []); + + return callback(null, entries, compilation); + }); + } + + purgeInputFileSystem() { + if(this.inputFileSystem && this.inputFileSystem.purge) + this.inputFileSystem.purge(); + } + + emitAssets(compilation, callback) { + let outputPath; + + const emitFiles = (err) => { + if(err) return callback(err); + + require("async").forEach(Object.keys(compilation.assets), (file, callback) => { + + let targetFile = file; + const queryStringIdx = targetFile.indexOf("?"); + if(queryStringIdx >= 0) { + targetFile = targetFile.substr(0, queryStringIdx); + } + + const writeOut = (err) => { + if(err) return callback(err); + const targetPath = this.outputFileSystem.join(outputPath, targetFile); + const source = compilation.assets[file]; + if(source.existsAt === targetPath) { + source.emitted = false; + return callback(); + } + let content = source.source(); + + if(!Buffer.isBuffer(content)) { + content = new Buffer(content, "utf8"); // eslint-disable-line + } + + source.existsAt = targetPath; + source.emitted = true; + this.outputFileSystem.writeFile(targetPath, content, callback); + }; + + if(targetFile.match(/\/|\\/)) { + const dir = path.dirname(targetFile); + this.outputFileSystem.mkdirp(this.outputFileSystem.join(outputPath, dir), writeOut); + } else writeOut(); + + }, err => { + if(err) return callback(err); + + afterEmit.call(this); + }); + }; + + this.applyPluginsAsync("emit", compilation, err => { + if(err) return callback(err); + outputPath = compilation.getPath(this.outputPath); + this.outputFileSystem.mkdirp(outputPath, emitFiles); + }); + + function afterEmit() { + this.applyPluginsAsyncSeries1("after-emit", compilation, err => { + if(err) return callback(err); + + return callback(); + }); + } + + } + + emitRecords(callback) { + if(!this.recordsOutputPath) return callback(); + const idx1 = this.recordsOutputPath.lastIndexOf("/"); + const idx2 = this.recordsOutputPath.lastIndexOf("\\"); + let recordsOutputPathDirectory = null; + if(idx1 > idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx1); + if(idx1 < idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx2); + if(!recordsOutputPathDirectory) return writeFile.call(this); + this.outputFileSystem.mkdirp(recordsOutputPathDirectory, err => { + if(err) return callback(err); + writeFile.call(this); + }); + + function writeFile() { + this.outputFileSystem.writeFile(this.recordsOutputPath, JSON.stringify(this.records, undefined, 2), callback); + } + } + + readRecords(callback) { + if(!this.recordsInputPath) { + this.records = {}; + return callback(); + } + this.inputFileSystem.stat(this.recordsInputPath, err => { + // It doesn't exist + // We can ignore this. + if(err) return callback(); + + this.inputFileSystem.readFile(this.recordsInputPath, (err, content) => { + if(err) return callback(err); + + try { + this.records = JSON.parse(content.toString("utf-8")); + } catch(e) { + e.message = "Cannot parse records: " + e.message; + return callback(e); + } + + return callback(); + }); + }); + } + + createChildCompiler(compilation, compilerName, compilerIndex, outputOptions, plugins) { + const childCompiler = new Compiler(); + if(Array.isArray(plugins)) { + plugins.forEach(plugin => childCompiler.apply(plugin)); + } + for(const name in this._plugins) { + if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0) + childCompiler._plugins[name] = this._plugins[name].slice(); + } + childCompiler.name = compilerName; + childCompiler.outputPath = this.outputPath; + childCompiler.inputFileSystem = this.inputFileSystem; + childCompiler.outputFileSystem = null; + childCompiler.resolvers = this.resolvers; + childCompiler.fileTimestamps = this.fileTimestamps; + childCompiler.contextTimestamps = this.contextTimestamps; + + const relativeCompilerName = makePathsRelative(this.context, compilerName); + if(!this.records[relativeCompilerName]) this.records[relativeCompilerName] = []; + if(this.records[relativeCompilerName][compilerIndex]) + childCompiler.records = this.records[relativeCompilerName][compilerIndex]; + else + this.records[relativeCompilerName].push(childCompiler.records = {}); + + childCompiler.options = Object.create(this.options); + childCompiler.options.output = Object.create(childCompiler.options.output); + for(const name in outputOptions) { + childCompiler.options.output[name] = outputOptions[name]; + } + childCompiler.parentCompilation = compilation; + + compilation.applyPlugins("child-compiler", childCompiler, compilerName, compilerIndex); + + return childCompiler; + } + + isChild() { + return !!this.parentCompilation; + } + + createCompilation() { + return new Compilation(this); + } + + newCompilation(params) { + const compilation = this.createCompilation(); + compilation.fileTimestamps = this.fileTimestamps; + compilation.contextTimestamps = this.contextTimestamps; + compilation.name = this.name; + compilation.records = this.records; + compilation.compilationDependencies = params.compilationDependencies; + this.applyPlugins("this-compilation", compilation, params); + this.applyPlugins("compilation", compilation, params); + return compilation; + } + + createNormalModuleFactory() { + const normalModuleFactory = new NormalModuleFactory(this.options.context, this.resolvers, this.options.module || {}); + this.applyPlugins("normal-module-factory", normalModuleFactory); + return normalModuleFactory; + } + + createContextModuleFactory() { + const contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem); + this.applyPlugins("context-module-factory", contextModuleFactory); + return contextModuleFactory; + } + + newCompilationParams() { + const params = { + normalModuleFactory: this.createNormalModuleFactory(), + contextModuleFactory: this.createContextModuleFactory(), + compilationDependencies: [] + }; + return params; + } + + compile(callback) { + const params = this.newCompilationParams(); + this.applyPluginsAsync("before-compile", params, err => { + if(err) return callback(err); + + this.applyPlugins("compile", params); + + const compilation = this.newCompilation(params); + + this.applyPluginsParallel("make", compilation, err => { + if(err) return callback(err); + + compilation.finish(); + + compilation.seal(err => { + if(err) return callback(err); + + this.applyPluginsAsync("after-compile", compilation, err => { + if(err) return callback(err); + + return callback(null, compilation); + }); + }); + }); + }); + } +} + +Compiler.Watching = Watching; +module.exports = Compiler; diff --git a/node_modules/webpack/lib/ContextExclusionPlugin.js b/node_modules/webpack/lib/ContextExclusionPlugin.js new file mode 100644 index 000000000..db6c81b27 --- /dev/null +++ b/node_modules/webpack/lib/ContextExclusionPlugin.js @@ -0,0 +1,17 @@ +"use strict";
+
+class ContextExclusionPlugin {
+ constructor(negativeMatcher) {
+ this.negativeMatcher = negativeMatcher;
+ }
+
+ apply(compiler) {
+ compiler.plugin("context-module-factory", (cmf) => {
+ cmf.plugin("context-module-files", (files) => {
+ return files.filter(filePath => !this.negativeMatcher.test(filePath));
+ });
+ });
+ }
+}
+
+module.exports = ContextExclusionPlugin;
diff --git a/node_modules/webpack/lib/ContextModuleFactory.js b/node_modules/webpack/lib/ContextModuleFactory.js index a5947064b..db4ba1022 100644 --- a/node_modules/webpack/lib/ContextModuleFactory.js +++ b/node_modules/webpack/lib/ContextModuleFactory.js @@ -18,7 +18,6 @@ module.exports = class ContextModuleFactory extends Tapable { }
create(data, callback) {
- const module = this;
const context = data.context;
const dependencies = data.dependencies;
const dependency = dependencies[0];
@@ -59,7 +58,7 @@ module.exports = class ContextModuleFactory extends Tapable { resource = request;
}
- const resolvers = module.resolvers;
+ const resolvers = this.resolvers;
asyncLib.parallel([
function(callback) {
@@ -79,14 +78,14 @@ module.exports = class ContextModuleFactory extends Tapable { ], (err, result) => {
if(err) return callback(err);
- module.applyPluginsAsyncWaterfall("after-resolve", {
+ this.applyPluginsAsyncWaterfall("after-resolve", {
loaders: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""),
resource: result[0],
recursive: recursive,
regExp: regExp,
async: asyncContext,
dependencies: dependencies,
- resolveDependencies: module.resolveDependencies.bind(module)
+ resolveDependencies: this.resolveDependencies.bind(this)
}, function(err, result) {
if(err) return callback(err);
@@ -100,11 +99,13 @@ module.exports = class ContextModuleFactory extends Tapable { }
resolveDependencies(fs, resource, recursive, regExp, callback) {
+ const cmf = this;
if(!regExp || !resource)
return callback(null, []);
(function addDirectory(directory, callback) {
fs.readdir(directory, (err, files) => {
if(err) return callback(err);
+ files = cmf.applyPluginsWaterfall("context-module-files", files);
if(!files || files.length === 0) return callback(null, []);
asyncLib.map(files.filter(function(p) {
return p.indexOf(".") !== 0;
diff --git a/node_modules/webpack/lib/DelegatedModule.js b/node_modules/webpack/lib/DelegatedModule.js index cd80a21ff..223d2c2a2 100644 --- a/node_modules/webpack/lib/DelegatedModule.js +++ b/node_modules/webpack/lib/DelegatedModule.js @@ -1,92 +1,98 @@ -/*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const Module = require("./Module");
-const OriginalSource = require("webpack-sources").OriginalSource;
-const RawSource = require("webpack-sources").RawSource;
-const WebpackMissingModule = require("./dependencies/WebpackMissingModule");
-const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
-const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency");
-
-class DelegatedModule extends Module {
- constructor(sourceRequest, data, type, userRequest, originalRequest) {
- super();
- this.sourceRequest = sourceRequest;
- this.request = data.id;
- this.meta = data.meta;
- this.type = type;
- this.originalRequest = originalRequest;
- this.userRequest = userRequest;
- this.built = false;
- this.delegated = true;
- this.delegateData = data;
- }
-
- libIdent(options) {
- return typeof this.originalRequest === "string" ? this.originalRequest : this.originalRequest.libIdent(options);
- }
-
- identifier() {
- return `delegated ${JSON.stringify(this.request)} from ${this.sourceRequest}`;
- }
-
- readableIdentifier() {
- return `delegated ${this.userRequest} from ${this.sourceRequest}`;
- }
-
- needRebuild() {
- return false;
- }
-
- build(options, compilation, resolver, fs, callback) {
- this.built = true;
- this.builtTime = Date.now();
- this.cacheable = true;
- this.dependencies.length = 0;
- this.addDependency(new DelegatedSourceDependency(this.sourceRequest));
- this.addDependency(new DelegatedExportsDependency(this, this.delegateData.exports || true));
- callback();
- }
-
- unbuild() {
- this.built = false;
- super.unbuild();
- }
-
- source() {
- const sourceModule = this.dependencies[0].module;
- let str;
-
- if(!sourceModule) {
- str = WebpackMissingModule.moduleCode(this.sourceRequest);
- } else {
- str = `module.exports = (__webpack_require__(${JSON.stringify(sourceModule.id)}))`;
-
- switch(this.type) {
- case "require":
- str += `(${JSON.stringify(this.request)})`;
- break;
- case "object":
- str += `[${JSON.stringify(this.request)}]`;
- break;
- }
-
- str += ";";
- }
-
- if(this.useSourceMap) {
- return new OriginalSource(str, this.identifier());
- } else {
- return new RawSource(str);
- }
- }
-
- size() {
- return 42;
- }
-}
-
-module.exports = DelegatedModule;
+/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +"use strict"; + +const Module = require("./Module"); +const OriginalSource = require("webpack-sources").OriginalSource; +const RawSource = require("webpack-sources").RawSource; +const WebpackMissingModule = require("./dependencies/WebpackMissingModule"); +const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency"); +const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency"); + +class DelegatedModule extends Module { + constructor(sourceRequest, data, type, userRequest, originalRequest) { + super(); + this.sourceRequest = sourceRequest; + this.request = data.id; + this.meta = data.meta; + this.type = type; + this.originalRequest = originalRequest; + this.userRequest = userRequest; + this.built = false; + this.delegated = true; + this.delegateData = data; + } + + libIdent(options) { + return typeof this.originalRequest === "string" ? this.originalRequest : this.originalRequest.libIdent(options); + } + + identifier() { + return `delegated ${JSON.stringify(this.request)} from ${this.sourceRequest}`; + } + + readableIdentifier() { + return `delegated ${this.userRequest} from ${this.sourceRequest}`; + } + + needRebuild() { + return false; + } + + build(options, compilation, resolver, fs, callback) { + this.built = true; + this.builtTime = Date.now(); + this.cacheable = true; + this.dependencies.length = 0; + this.addDependency(new DelegatedSourceDependency(this.sourceRequest)); + this.addDependency(new DelegatedExportsDependency(this, this.delegateData.exports || true)); + callback(); + } + + unbuild() { + this.built = false; + super.unbuild(); + } + + source() { + const sourceModule = this.dependencies[0].module; + let str; + + if(!sourceModule) { + str = WebpackMissingModule.moduleCode(this.sourceRequest); + } else { + str = `module.exports = (__webpack_require__(${JSON.stringify(sourceModule.id)}))`; + + switch(this.type) { + case "require": + str += `(${JSON.stringify(this.request)})`; + break; + case "object": + str += `[${JSON.stringify(this.request)}]`; + break; + } + + str += ";"; + } + + if(this.useSourceMap) { + return new OriginalSource(str, this.identifier()); + } else { + return new RawSource(str); + } + } + + size() { + return 42; + } + + updateHash(hash) { + hash.update(this.type); + hash.update(JSON.stringify(this.request)); + super.updateHash(hash); + } +} + +module.exports = DelegatedModule; diff --git a/node_modules/webpack/lib/ExternalModule.js b/node_modules/webpack/lib/ExternalModule.js index 2a8137ebc..45c183b1a 100644 --- a/node_modules/webpack/lib/ExternalModule.js +++ b/node_modules/webpack/lib/ExternalModule.js @@ -116,6 +116,13 @@ class ExternalModule extends Module { size() {
return 42;
}
+
+ updateHash(hash) {
+ hash.update(this.type);
+ hash.update(JSON.stringify(this.request));
+ hash.update(JSON.stringify(Boolean(this.optional)));
+ super.updateHash(hash);
+ }
}
module.exports = ExternalModule;
diff --git a/node_modules/webpack/lib/FunctionModuleTemplatePlugin.js b/node_modules/webpack/lib/FunctionModuleTemplatePlugin.js index 72e214808..234a840f5 100644 --- a/node_modules/webpack/lib/FunctionModuleTemplatePlugin.js +++ b/node_modules/webpack/lib/FunctionModuleTemplatePlugin.js @@ -28,11 +28,15 @@ class FunctionModuleTemplatePlugin { source.add("/*!****" + req.replace(/./g, "*") + "****!*\\\n");
source.add(" !*** " + req.replace(/\*\//g, "*_/") + " ***!\n");
source.add(" \\****" + req.replace(/./g, "*") + "****/\n");
- if(Array.isArray(module.providedExports))
+ if(Array.isArray(module.providedExports) && module.providedExports.length === 0)
+ source.add("/*! no exports provided */\n");
+ else if(Array.isArray(module.providedExports))
source.add("/*! exports provided: " + module.providedExports.join(", ") + " */\n");
else if(module.providedExports)
- source.add("/*! no static exports found */\n");
- if(Array.isArray(module.usedExports))
+ source.add("/*! dynamic exports provided */\n");
+ if(Array.isArray(module.usedExports) && module.usedExports.length === 0)
+ source.add("/*! no exports used */\n");
+ else if(Array.isArray(module.usedExports))
source.add("/*! exports used: " + module.usedExports.join(", ") + " */\n");
else if(module.usedExports)
source.add("/*! all exports used */\n");
diff --git a/node_modules/webpack/lib/HotModuleReplacement.runtime.js b/node_modules/webpack/lib/HotModuleReplacement.runtime.js index f537bfdd7..6db89aa2d 100644 --- a/node_modules/webpack/lib/HotModuleReplacement.runtime.js +++ b/node_modules/webpack/lib/HotModuleReplacement.runtime.js @@ -561,7 +561,8 @@ module.exports = function() { type: "self-accept-error-handler-errored",
moduleId: moduleId,
error: err2,
- orginalError: err
+ orginalError: err, // TODO remove in webpack 4
+ originalError: err
});
}
if(!options.ignoreErrored) {
diff --git a/node_modules/webpack/lib/JsonpMainTemplate.runtime.js b/node_modules/webpack/lib/JsonpMainTemplate.runtime.js index bd0e7ba3b..ed5fba098 100644 --- a/node_modules/webpack/lib/JsonpMainTemplate.runtime.js +++ b/node_modules/webpack/lib/JsonpMainTemplate.runtime.js @@ -2,7 +2,7 @@ MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
-/*globals hotAddUpdateChunk parentHotUpdateCallback document XMLHttpRequest $require$ $hotChunkFilename$ $hotMainFilename$ */
+/*globals hotAddUpdateChunk parentHotUpdateCallback document XMLHttpRequest $require$ $hotChunkFilename$ $hotMainFilename$ $crossOriginLoading$ */
module.exports = function() {
function webpackHotUpdateCallback(chunkId, moreModules) { // eslint-disable-line no-unused-vars
hotAddUpdateChunk(chunkId, moreModules);
@@ -15,6 +15,7 @@ module.exports = function() { script.type = "text/javascript";
script.charset = "utf-8";
script.src = $require$.p + $hotChunkFilename$;
+ $crossOriginLoading$;
head.appendChild(script);
}
diff --git a/node_modules/webpack/lib/JsonpMainTemplatePlugin.js b/node_modules/webpack/lib/JsonpMainTemplatePlugin.js index 9a80e099d..20cecd919 100644 --- a/node_modules/webpack/lib/JsonpMainTemplatePlugin.js +++ b/node_modules/webpack/lib/JsonpMainTemplatePlugin.js @@ -171,6 +171,7 @@ class JsonpMainTemplatePlugin { mainTemplate.plugin("hot-bootstrap", function(source, chunk, hash) {
const hotUpdateChunkFilename = this.outputOptions.hotUpdateChunkFilename;
const hotUpdateMainFilename = this.outputOptions.hotUpdateMainFilename;
+ const crossOriginLoading = this.outputOptions.crossOriginLoading;
const hotUpdateFunction = this.outputOptions.hotUpdateFunction;
const currentHotUpdateChunkFilename = this.applyPluginsWaterfall("asset-path", JSON.stringify(hotUpdateChunkFilename), {
hash: `" + ${this.renderCurrentHashCode(hash)} + "`,
@@ -186,6 +187,7 @@ class JsonpMainTemplatePlugin { const runtimeSource = Template.getFunctionContent(require("./JsonpMainTemplate.runtime.js"))
.replace(/\/\/\$semicolon/g, ";")
.replace(/\$require\$/g, this.requireFn)
+ .replace(/\$crossOriginLoading\$/g, crossOriginLoading ? `script.crossOrigin = ${JSON.stringify(crossOriginLoading)}` : "")
.replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename)
.replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename)
.replace(/\$hash\$/g, JSON.stringify(hash));
diff --git a/node_modules/webpack/lib/Module.js b/node_modules/webpack/lib/Module.js index 26977e63f..fb259d863 100644 --- a/node_modules/webpack/lib/Module.js +++ b/node_modules/webpack/lib/Module.js @@ -58,6 +58,7 @@ class Module extends DependenciesBlock { this.providedExports = null;
this._chunks.clear();
this._chunksDebugIdent = undefined;
+ this.optimizationBailout.length = 0;
super.disconnect();
}
@@ -73,6 +74,7 @@ class Module extends DependenciesBlock { setChunks(chunks) {
this._chunks = new SortableSet(chunks, sortById);
+ this._chunksDebugIdent = undefined;
}
addChunk(chunk) {
diff --git a/node_modules/webpack/lib/NormalModule.js b/node_modules/webpack/lib/NormalModule.js index d150fc767..c3288bf0d 100644 --- a/node_modules/webpack/lib/NormalModule.js +++ b/node_modules/webpack/lib/NormalModule.js @@ -34,12 +34,13 @@ function asString(buf) { function contextify(context, request) {
return request.split("!").map(function(r) {
- let rp = path.relative(context, r);
+ const splitPath = r.split("?");
+ splitPath[0] = path.relative(context, splitPath[0]);
if(path.sep === "\\")
- rp = rp.replace(/\\/g, "/");
- if(rp.indexOf("../") !== 0)
- rp = "./" + rp;
- return rp;
+ splitPath[0] = splitPath[0].replace(/\\/g, "/");
+ if(splitPath[0].indexOf("../") !== 0)
+ splitPath[0] = "./" + splitPath[0];
+ return splitPath.join("?");
}).join("!");
}
diff --git a/node_modules/webpack/lib/OptionsDefaulter.js b/node_modules/webpack/lib/OptionsDefaulter.js index f9bd0c00b..ee681b5a9 100644 --- a/node_modules/webpack/lib/OptionsDefaulter.js +++ b/node_modules/webpack/lib/OptionsDefaulter.js @@ -30,6 +30,7 @@ class OptionsDefaulter { }
process(options) {
+ // TODO: change this for webpack 4: options = Object.assign({}, options);
for(let name in this.defaults) {
switch(this.config[name]) {
case undefined:
@@ -55,6 +56,7 @@ class OptionsDefaulter { throw new Error("OptionsDefaulter cannot process " + this.config[name]);
}
}
+ // TODO: change this for webpack 4: return options;
}
set(name, config, def) {
diff --git a/node_modules/webpack/lib/Parser.js b/node_modules/webpack/lib/Parser.js index 88f9b65db..3150f847a 100644 --- a/node_modules/webpack/lib/Parser.js +++ b/node_modules/webpack/lib/Parser.js @@ -321,45 +321,76 @@ class Parser extends Tapable { }
return new BasicEvaluatedExpression().setString(result).setRange(expr.range);
});
+ });
- /**
- * @param {string} kind "cooked" | "raw"
- * @param {any[]} quasis quasis
- * @param {any[]} expressions expressions
- * @return {BasicEvaluatedExpression[]} Simplified template
- */
- function getSimplifiedTemplateResult(kind, quasis, expressions) {
- const parts = [];
-
- for(let i = 0; i < quasis.length; i++) {
- parts.push(new BasicEvaluatedExpression().setString(quasis[i].value[kind]).setRange(quasis[i].range));
-
- if(i > 0) {
- const prevExpr = parts[parts.length - 2],
- lastExpr = parts[parts.length - 1];
- const expr = this.evaluateExpression(expressions[i - 1]);
- if(!(expr.isString() || expr.isNumber())) continue;
-
- prevExpr.setString(prevExpr.string + (expr.isString() ? expr.string : expr.number) + lastExpr.string);
- prevExpr.setRange([prevExpr.range[0], lastExpr.range[1]]);
- parts.pop();
- }
+ /**
+ * @param {string} kind "cooked" | "raw"
+ * @param {any[]} quasis quasis
+ * @param {any[]} expressions expressions
+ * @return {BasicEvaluatedExpression[]} Simplified template
+ */
+ function getSimplifiedTemplateResult(kind, quasis, expressions) {
+ const parts = [];
+
+ for(let i = 0; i < quasis.length; i++) {
+ parts.push(new BasicEvaluatedExpression().setString(quasis[i].value[kind]).setRange(quasis[i].range));
+
+ if(i > 0) {
+ const prevExpr = parts[parts.length - 2],
+ lastExpr = parts[parts.length - 1];
+ const expr = this.evaluateExpression(expressions[i - 1]);
+ if(!(expr.isString() || expr.isNumber())) continue;
+
+ prevExpr.setString(prevExpr.string + (expr.isString() ? expr.string : expr.number) + lastExpr.string);
+ prevExpr.setRange([prevExpr.range[0], lastExpr.range[1]]);
+ parts.pop();
}
- return parts;
}
+ return parts;
+ }
- this.plugin("evaluate TemplateLiteral", function(node) {
- const parts = getSimplifiedTemplateResult.call(this, "cooked", node.quasis, node.expressions);
- if(parts.length === 1) {
- return parts[0].setRange(node.range);
+ this.plugin("evaluate TemplateLiteral", function(node) {
+ const parts = getSimplifiedTemplateResult.call(this, "cooked", node.quasis, node.expressions);
+ if(parts.length === 1) {
+ return parts[0].setRange(node.range);
+ }
+ return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range);
+ });
+ this.plugin("evaluate TaggedTemplateExpression", function(node) {
+ if(this.evaluateExpression(node.tag).identifier !== "String.raw") return;
+ const parts = getSimplifiedTemplateResult.call(this, "raw", node.quasi.quasis, node.quasi.expressions);
+ return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range);
+ });
+
+ this.plugin("evaluate CallExpression .concat", function(expr, param) {
+ if(!param.isString() && !param.isWrapped()) return;
+
+ let stringSuffix = null;
+ let hasUnknownParams = false;
+ for(let i = expr.arguments.length - 1; i >= 0; i--) {
+ const argExpr = this.evaluateExpression(expr.arguments[i]);
+ if(!argExpr.isString() && !argExpr.isNumber()) {
+ hasUnknownParams = true;
+ break;
}
- return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range);
- });
- this.plugin("evaluate TaggedTemplateExpression", function(node) {
- if(this.evaluateExpression(node.tag).identifier !== "String.raw") return;
- const parts = getSimplifiedTemplateResult.call(this, "raw", node.quasi.quasis, node.quasi.expressions);
- return new BasicEvaluatedExpression().setTemplateString(parts).setRange(node.range);
- });
+
+ const value = argExpr.isString() ? argExpr.string : "" + argExpr.number;
+
+ const newString = value + (stringSuffix ? stringSuffix.string : "");
+ const newRange = [argExpr.range[0], (stringSuffix || argExpr).range[1]];
+ stringSuffix = new BasicEvaluatedExpression().setString(newString).setRange(newRange);
+ }
+
+ if(hasUnknownParams) {
+ const prefix = param.isString() ? param : param.prefix;
+ return new BasicEvaluatedExpression().setWrapped(prefix, stringSuffix).setRange(expr.range);
+ } else if(param.isWrapped()) {
+ const postfix = stringSuffix || param.postfix;
+ return new BasicEvaluatedExpression().setWrapped(param.prefix, postfix).setRange(expr.range);
+ } else {
+ const newString = param.string + (stringSuffix ? stringSuffix.string : "");
+ return new BasicEvaluatedExpression().setString(newString).setRange(expr.range);
+ }
});
this.plugin("evaluate CallExpression .split", function(expr, param) {
if(!param.isString()) return;
diff --git a/node_modules/webpack/lib/SourceMapDevToolPlugin.js b/node_modules/webpack/lib/SourceMapDevToolPlugin.js index abd8d5ee3..7892cb8ac 100644 --- a/node_modules/webpack/lib/SourceMapDevToolPlugin.js +++ b/node_modules/webpack/lib/SourceMapDevToolPlugin.js @@ -96,7 +96,8 @@ class SourceMapDevToolPlugin { return module || source;
});
- for(const module of modules) {
+ for(let idx = 0; idx < modules.length; idx++) {
+ const module = modules[idx];
if(!moduleToSourceNameMapping.get(module)) {
moduleToSourceNameMapping.set(module, ModuleFilenameHelpers.createFilename(module, moduleFilenameTemplate, requestShortener));
}
@@ -121,7 +122,8 @@ class SourceMapDevToolPlugin { });
// find modules with conflicting source names
- for(const module of allModules) {
+ for(let idx = 0; idx < allModules.length; idx++) {
+ const module = allModules[idx];
let sourceName = moduleToSourceNameMapping.get(module);
let hasName = conflictDetectionSet.has(sourceName);
if(!hasName) {
diff --git a/node_modules/webpack/lib/Template.js b/node_modules/webpack/lib/Template.js index b3e17a823..57a8b9730 100644 --- a/node_modules/webpack/lib/Template.js +++ b/node_modules/webpack/lib/Template.js @@ -10,6 +10,12 @@ const ConcatSource = require("webpack-sources").ConcatSource; const START_LOWERCASE_ALPHABET_CODE = "a".charCodeAt(0);
const START_UPPERCASE_ALPHABET_CODE = "A".charCodeAt(0);
const DELTA_A_TO_Z = "z".charCodeAt(0) - START_LOWERCASE_ALPHABET_CODE + 1;
+const FUNCTION_CONTENT_REGEX = /^function\s?\(\)\s?\{\n?|\n?\}$/g;
+const INDENT_MULTILINE_REGEX = /^\t/mg;
+const IDENTIFIER_NAME_REPLACE_REGEX = /^[^a-zA-Z$_]/;
+const IDENTIFIER_ALPHA_NUMERIC_NAME_REPLACE_REGEX = /[^a-zA-Z0-9$_]/g;
+const PATH_NAME_NORMALIZE_REPLACE_REGEX = /[^a-zA-Z0-9_!§$()=\-^°]+/g;
+const MATCH_PADDED_HYPHENS_REPLACE_REGEX = /^-|-$/g;
module.exports = class Template extends Tapable {
constructor(outputOptions) {
@@ -18,17 +24,17 @@ module.exports = class Template extends Tapable { }
static getFunctionContent(fn) {
- return fn.toString().replace(/^function\s?\(\)\s?\{\n?|\n?\}$/g, "").replace(/^\t/mg, "");
+ return fn.toString().replace(FUNCTION_CONTENT_REGEX, "").replace(INDENT_MULTILINE_REGEX, "");
}
static toIdentifier(str) {
if(typeof str !== "string") return "";
- return str.replace(/^[^a-zA-Z$_]/, "_").replace(/[^a-zA-Z0-9$_]/g, "_");
+ return str.replace(IDENTIFIER_NAME_REPLACE_REGEX, "_").replace(IDENTIFIER_ALPHA_NUMERIC_NAME_REPLACE_REGEX, "_");
}
static toPath(str) {
if(typeof str !== "string") return "";
- return str.replace(/[^a-zA-Z0-9_!§$()=\-^°]+/g, "-").replace(/^-|-$/, "");
+ return str.replace(PATH_NAME_NORMALIZE_REPLACE_REGEX, "-").replace(MATCH_PADDED_HYPHENS_REPLACE_REGEX, "");
}
// map number to a single character a-z, A-Z or <_ + number> if number is too big
@@ -144,23 +150,27 @@ module.exports = class Template extends Tapable { } else {
// Render an object
source.add("{\n");
- allModules.sort(function(a, b) {
- var aId = a.id + "";
- var bId = b.id + "";
- if(aId < bId) return -1;
- if(aId > bId) return 1;
- return 0;
- }).forEach(function(module, idx) {
- if(idx !== 0) source.add(",\n");
- source.add("\n/***/ " + JSON.stringify(module.id) + ":\n");
- source.add(module.source);
- });
+ allModules
+ .sort(stringifyIdSortPredicate)
+ .forEach(function(module, idx) {
+ if(idx !== 0) source.add(",\n");
+ source.add(`\n/***/ ${JSON.stringify(module.id)}:\n`);
+ source.add(module.source);
+ });
source.add("\n\n" + prefix + "}");
}
return source;
}
};
+function stringifyIdSortPredicate(a, b) {
+ var aId = a.id + "";
+ var bId = b.id + "";
+ if(aId < bId) return -1;
+ if(aId > bId) return 1;
+ return 0;
+}
+
function moduleIdIsNumber(module) {
return typeof module.id === "number";
}
diff --git a/node_modules/webpack/lib/UmdMainTemplatePlugin.js b/node_modules/webpack/lib/UmdMainTemplatePlugin.js index 3ddb98d23..6f44e892e 100644 --- a/node_modules/webpack/lib/UmdMainTemplatePlugin.js +++ b/node_modules/webpack/lib/UmdMainTemplatePlugin.js @@ -42,7 +42,7 @@ class UmdMainTemplatePlugin { apply(compilation) {
const mainTemplate = compilation.mainTemplate;
compilation.templatesPlugin("render-with-entry", (source, chunk, hash) => {
- let externals = chunk.getModules().filter(m => m.external);
+ let externals = chunk.getModules().filter(m => m.external && (m.type === "umd" || m.type === "umd2"));
const optionalExternals = [];
let requiredExternals = [];
if(this.optionalAmdExternalAsGlobal) {
diff --git a/node_modules/webpack/lib/WebpackOptionsDefaulter.js b/node_modules/webpack/lib/WebpackOptionsDefaulter.js index 24bb42321..ff0cc8072 100644 --- a/node_modules/webpack/lib/WebpackOptionsDefaulter.js +++ b/node_modules/webpack/lib/WebpackOptionsDefaulter.js @@ -1,115 +1,129 @@ -/*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const OptionsDefaulter = require("./OptionsDefaulter");
-const Template = require("./Template");
-
-class WebpackOptionsDefaulter extends OptionsDefaulter {
- constructor() {
- super();
- this.set("devtool", false);
- this.set("cache", true);
-
- this.set("context", process.cwd());
- this.set("target", "web");
-
- this.set("module.unknownContextRequest", ".");
- this.set("module.unknownContextRegExp", false);
- this.set("module.unknownContextRecursive", true);
- this.set("module.unknownContextCritical", true);
- this.set("module.exprContextRequest", ".");
- this.set("module.exprContextRegExp", false);
- this.set("module.exprContextRecursive", true);
- this.set("module.exprContextCritical", true);
- this.set("module.wrappedContextRegExp", /.*/);
- this.set("module.wrappedContextRecursive", true);
- this.set("module.wrappedContextCritical", false);
- this.set("module.strictExportPresence", false);
- this.set("module.strictThisContextOnImports", false);
-
- this.set("module.unsafeCache", true);
-
- this.set("output", "call", (value, options) => {
- if(typeof value === "string") {
- return {
- filename: value
- };
- } else if(typeof value !== "object") {
- return {};
- } else {
- return value;
- }
- });
- this.set("output.filename", "[name].js");
- this.set("output.chunkFilename", "make", (options) => {
- const filename = options.output.filename;
- return filename.indexOf("[name]") >= 0 ? filename.replace("[name]", "[id]") : "[id]." + filename;
- });
- this.set("output.library", "");
- this.set("output.hotUpdateFunction", "make", (options) => {
- return Template.toIdentifier("webpackHotUpdate" + options.output.library);
- });
- this.set("output.jsonpFunction", "make", (options) => {
- return Template.toIdentifier("webpackJsonp" + options.output.library);
- });
- this.set("output.libraryTarget", "var");
- this.set("output.path", process.cwd());
- this.set("output.sourceMapFilename", "[file].map[query]");
- this.set("output.hotUpdateChunkFilename", "[id].[hash].hot-update.js");
- this.set("output.hotUpdateMainFilename", "[hash].hot-update.json");
- this.set("output.crossOriginLoading", false);
- this.set("output.chunkLoadTimeout", 120000);
- this.set("output.hashFunction", "md5");
- this.set("output.hashDigest", "hex");
- this.set("output.hashDigestLength", 20);
- this.set("output.devtoolLineToLine", false);
- this.set("output.strictModuleExceptionHandling", false);
-
- this.set("node", {});
- this.set("node.console", false);
- this.set("node.process", true);
- this.set("node.global", true);
- this.set("node.Buffer", true);
- this.set("node.setImmediate", true);
- this.set("node.__filename", "mock");
- this.set("node.__dirname", "mock");
-
- this.set("performance.maxAssetSize", 250000);
- this.set("performance.maxEntrypointSize", 250000);
- this.set("performance.hints", false);
-
- this.set("resolve", {});
- this.set("resolve.unsafeCache", true);
- this.set("resolve.modules", ["node_modules"]);
- this.set("resolve.extensions", [".js", ".json"]);
- this.set("resolve.mainFiles", ["index"]);
- this.set("resolve.aliasFields", "make", (options) => {
- if(options.target === "web" || options.target === "webworker")
- return ["browser"];
- else
- return [];
- });
- this.set("resolve.mainFields", "make", (options) => {
- if(options.target === "web" || options.target === "webworker")
- return ["browser", "module", "main"];
- else
- return ["module", "main"];
- });
- this.set("resolve.cacheWithContext", "make", (options) => {
- return Array.isArray(options.resolve.plugins) && options.resolve.plugins.length > 0;
- });
- this.set("resolveLoader", {});
- this.set("resolveLoader.unsafeCache", true);
- this.set("resolveLoader.mainFields", ["loader", "main"]);
- this.set("resolveLoader.extensions", [".js", ".json"]);
- this.set("resolveLoader.mainFiles", ["index"]);
- this.set("resolveLoader.cacheWithContext", "make", (options) => {
- return Array.isArray(options.resolveLoader.plugins) && options.resolveLoader.plugins.length > 0;
- });
- }
-}
-
-module.exports = WebpackOptionsDefaulter;
+/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +"use strict"; + +const OptionsDefaulter = require("./OptionsDefaulter"); +const Template = require("./Template"); + +class WebpackOptionsDefaulter extends OptionsDefaulter { + constructor() { + super(); + this.set("devtool", false); + this.set("cache", true); + + this.set("context", process.cwd()); + this.set("target", "web"); + + this.set("module", "call", value => Object.assign({}, value)); + this.set("module.unknownContextRequest", "."); + this.set("module.unknownContextRegExp", false); + this.set("module.unknownContextRecursive", true); + this.set("module.unknownContextCritical", true); + this.set("module.exprContextRequest", "."); + this.set("module.exprContextRegExp", false); + this.set("module.exprContextRecursive", true); + this.set("module.exprContextCritical", true); + this.set("module.wrappedContextRegExp", /.*/); + this.set("module.wrappedContextRecursive", true); + this.set("module.wrappedContextCritical", false); + this.set("module.strictExportPresence", false); + this.set("module.strictThisContextOnImports", false); + this.set("module.unsafeCache", true); + + this.set("output", "call", (value, options) => { + if(typeof value === "string") { + return { + filename: value + }; + } else if(typeof value !== "object") { + return {}; + } else { + return Object.assign({}, value); + } + }); + this.set("output.filename", "[name].js"); + this.set("output.chunkFilename", "make", (options) => { + const filename = options.output.filename; + return filename.indexOf("[name]") >= 0 ? filename.replace("[name]", "[id]") : "[id]." + filename; + }); + this.set("output.library", ""); + this.set("output.hotUpdateFunction", "make", (options) => { + return Template.toIdentifier("webpackHotUpdate" + options.output.library); + }); + this.set("output.jsonpFunction", "make", (options) => { + return Template.toIdentifier("webpackJsonp" + options.output.library); + }); + this.set("output.libraryTarget", "var"); + this.set("output.path", process.cwd()); + this.set("output.sourceMapFilename", "[file].map[query]"); + this.set("output.hotUpdateChunkFilename", "[id].[hash].hot-update.js"); + this.set("output.hotUpdateMainFilename", "[hash].hot-update.json"); + this.set("output.crossOriginLoading", false); + this.set("output.chunkLoadTimeout", 120000); + this.set("output.hashFunction", "md5"); + this.set("output.hashDigest", "hex"); + this.set("output.hashDigestLength", 20); + this.set("output.devtoolLineToLine", false); + this.set("output.strictModuleExceptionHandling", false); + + this.set("node", "call", value => { + if(typeof value === "boolean") { + return value; + } else { + return Object.assign({}, value); + } + }); + this.set("node.console", false); + this.set("node.process", true); + this.set("node.global", true); + this.set("node.Buffer", true); + this.set("node.setImmediate", true); + this.set("node.__filename", "mock"); + this.set("node.__dirname", "mock"); + + this.set("performance", "call", value => { + if(typeof value === "boolean") { + return value; + } else { + return Object.assign({}, value); + } + }); + this.set("performance.maxAssetSize", 250000); + this.set("performance.maxEntrypointSize", 250000); + this.set("performance.hints", false); + + this.set("resolve", "call", value => Object.assign({}, value)); + this.set("resolve.unsafeCache", true); + this.set("resolve.modules", ["node_modules"]); + this.set("resolve.extensions", [".js", ".json"]); + this.set("resolve.mainFiles", ["index"]); + this.set("resolve.aliasFields", "make", (options) => { + if(options.target === "web" || options.target === "webworker") + return ["browser"]; + else + return []; + }); + this.set("resolve.mainFields", "make", (options) => { + if(options.target === "web" || options.target === "webworker") + return ["browser", "module", "main"]; + else + return ["module", "main"]; + }); + this.set("resolve.cacheWithContext", "make", (options) => { + return Array.isArray(options.resolve.plugins) && options.resolve.plugins.length > 0; + }); + + this.set("resolveLoader", "call", value => Object.assign({}, value)); + this.set("resolveLoader.unsafeCache", true); + this.set("resolveLoader.mainFields", ["loader", "main"]); + this.set("resolveLoader.extensions", [".js", ".json"]); + this.set("resolveLoader.mainFiles", ["index"]); + this.set("resolveLoader.cacheWithContext", "make", (options) => { + return Array.isArray(options.resolveLoader.plugins) && options.resolveLoader.plugins.length > 0; + }); + } +} + +module.exports = WebpackOptionsDefaulter; diff --git a/node_modules/webpack/lib/dependencies/AMDDefineDependencyParserPlugin.js b/node_modules/webpack/lib/dependencies/AMDDefineDependencyParserPlugin.js index 8590162c6..b8a4668df 100644 --- a/node_modules/webpack/lib/dependencies/AMDDefineDependencyParserPlugin.js +++ b/node_modules/webpack/lib/dependencies/AMDDefineDependencyParserPlugin.js @@ -28,6 +28,10 @@ class AMDDefineDependencyParserPlugin { this.options = options;
}
+ newDefineDependency(range, arrayRange, functionRange, objectRange, namedModule) {
+ return new AMDDefineDependency(range, arrayRange, functionRange, objectRange, namedModule);
+ }
+
apply(parser) {
const options = this.options;
parser.plugin("call define", (expr) => {
@@ -156,7 +160,7 @@ class AMDDefineDependencyParserPlugin { parser.walkExpression(fn || obj);
}
- const dep = new AMDDefineDependency(
+ const dep = this.newDefineDependency(
expr.range,
array ? array.range : null,
fn ? fn.range : null,
diff --git a/node_modules/webpack/lib/dependencies/AMDRequireArrayDependency.js b/node_modules/webpack/lib/dependencies/AMDRequireArrayDependency.js index 666a887e3..ad77b0705 100644 --- a/node_modules/webpack/lib/dependencies/AMDRequireArrayDependency.js +++ b/node_modules/webpack/lib/dependencies/AMDRequireArrayDependency.js @@ -47,6 +47,8 @@ AMDRequireArrayDependency.Template = class AMDRequireArrayDependencyTemplate { if(dep.module) {
const stringifiedId = JSON.stringify(dep.module.id);
return `__webpack_require__(${comment}${stringifiedId})`;
+ } else if(dep.localModule) {
+ return dep.localModule.variableName();
}
return webpackMissingModuleModule(dep.request);
diff --git a/node_modules/webpack/lib/dependencies/AMDRequireContextDependency.js b/node_modules/webpack/lib/dependencies/AMDRequireContextDependency.js index 9248927e1..5305288cf 100644 --- a/node_modules/webpack/lib/dependencies/AMDRequireContextDependency.js +++ b/node_modules/webpack/lib/dependencies/AMDRequireContextDependency.js @@ -5,7 +5,6 @@ "use strict";
const ContextDependency = require("./ContextDependency");
-const CriticalDependencyWarning = require("./CriticalDependencyWarning");
class AMDRequireContextDependency extends ContextDependency {
constructor(request, recursive, regExp, range, valueRange) {
super(request, recursive, regExp);
@@ -16,14 +15,6 @@ class AMDRequireContextDependency extends ContextDependency { get type() {
return "amd require context";
}
-
- getWarnings() {
- if(this.critical) {
- return [
- new CriticalDependencyWarning(this.critical)
- ];
- }
- }
}
AMDRequireContextDependency.Template = require("./ContextDependencyTemplateAsRequireCall");
module.exports = AMDRequireContextDependency;
diff --git a/node_modules/webpack/lib/dependencies/CommonJsRequireContextDependency.js b/node_modules/webpack/lib/dependencies/CommonJsRequireContextDependency.js index 74822aebd..6e8e33f08 100644 --- a/node_modules/webpack/lib/dependencies/CommonJsRequireContextDependency.js +++ b/node_modules/webpack/lib/dependencies/CommonJsRequireContextDependency.js @@ -4,7 +4,6 @@ */
"use strict";
const ContextDependency = require("./ContextDependency");
-const CriticalDependencyWarning = require("./CriticalDependencyWarning");
const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
class CommonJsRequireContextDependency extends ContextDependency {
@@ -18,15 +17,6 @@ class CommonJsRequireContextDependency extends ContextDependency { return "cjs require context";
}
- getWarnings() {
- if(!this.critical) {
- return;
- }
-
- return [
- new CriticalDependencyWarning(this.critical)
- ];
- }
}
CommonJsRequireContextDependency.Template = ContextDependencyTemplateAsRequireCall;
diff --git a/node_modules/webpack/lib/dependencies/ContextDependency.js b/node_modules/webpack/lib/dependencies/ContextDependency.js index 7f8772a55..55bc9823c 100644 --- a/node_modules/webpack/lib/dependencies/ContextDependency.js +++ b/node_modules/webpack/lib/dependencies/ContextDependency.js @@ -4,6 +4,7 @@ */
"use strict";
const Dependency = require("../Dependency");
+const CriticalDependencyWarning = require("./CriticalDependencyWarning");
class ContextDependency extends Dependency {
constructor(request, recursive, regExp) {
@@ -13,6 +14,13 @@ class ContextDependency extends Dependency { this.recursive = recursive;
this.regExp = regExp;
this.async = false;
+
+ this.hadGlobalOrStickyRegExp = false;
+ if(this.regExp.global || this.regExp.sticky) {
+ this.regExp = null;
+ this.hadGlobalOrStickyRegExp = true;
+ }
+
}
isEqualResource(other) {
@@ -24,6 +32,18 @@ class ContextDependency extends Dependency { this.regExp === other.regExp &&
this.async === other.async;
}
+
+ getWarnings() {
+ let warnings = super.getWarnings() || [];
+ if(this.critical) {
+ warnings.push(new CriticalDependencyWarning(this.critical));
+ }
+ if(this.hadGlobalOrStickyRegExp) {
+ warnings.push(new CriticalDependencyWarning("Contexts can't use RegExps with the 'g' or 'y' flags."));
+ }
+ return warnings;
+ }
+
}
module.exports = ContextDependency;
diff --git a/node_modules/webpack/lib/dependencies/HarmonyExportDependencyParserPlugin.js b/node_modules/webpack/lib/dependencies/HarmonyExportDependencyParserPlugin.js index d6f37fce1..f7072ebac 100644 --- a/node_modules/webpack/lib/dependencies/HarmonyExportDependencyParserPlugin.js +++ b/node_modules/webpack/lib/dependencies/HarmonyExportDependencyParserPlugin.js @@ -39,9 +39,11 @@ module.exports = class HarmonyExportDependencyParserPlugin { parser.plugin("export specifier", (statement, id, name, idx) => {
const rename = parser.scope.renames[`$${id}`];
let dep;
+ const harmonyNamedExports = parser.state.harmonyNamedExports = parser.state.harmonyNamedExports || new Set();
+ harmonyNamedExports.add(name);
if(rename === "imported var") {
const settings = parser.state.harmonySpecifier[`$${id}`];
- dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, settings[0], settings[1], settings[2], name);
+ dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, settings[0], settings[1], settings[2], name, harmonyNamedExports, null);
} else {
const immutable = statement.declaration && isImmutableStatement(statement.declaration);
const hoisted = statement.declaration && isHoistedStatement(statement.declaration);
@@ -53,7 +55,17 @@ module.exports = class HarmonyExportDependencyParserPlugin { return true;
});
parser.plugin("export import specifier", (statement, source, id, name, idx) => {
- const dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, parser.state.lastHarmonyImport, HarmonyModulesHelpers.getModuleVar(parser.state, source), id, name);
+ const harmonyNamedExports = parser.state.harmonyNamedExports = parser.state.harmonyNamedExports || new Set();
+ let harmonyStarExports = null;
+ if(name) {
+ harmonyNamedExports.add(name);
+ } else {
+ harmonyStarExports = parser.state.harmonyStarExports = parser.state.harmonyStarExports || [];
+ }
+ const dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, parser.state.lastHarmonyImport, HarmonyModulesHelpers.getModuleVar(parser.state, source), id, name, harmonyNamedExports, harmonyStarExports && harmonyStarExports.slice());
+ if(harmonyStarExports) {
+ harmonyStarExports.push(dep);
+ }
dep.loc = Object.create(statement.loc);
dep.loc.index = idx;
parser.state.current.addDependency(dep);
diff --git a/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js b/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js index 17881438f..c2d90847b 100644 --- a/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js +++ b/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js @@ -22,13 +22,6 @@ class HarmonyExportExpressionDependency extends NullDependency { exports: ["default"]
};
}
-
- describeHarmonyExport() {
- return {
- exportedName: "default",
- precedence: 1,
- };
- }
}
HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTemplate {
diff --git a/node_modules/webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency.js b/node_modules/webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency.js index 114bd455a..cb1b892d2 100644 --- a/node_modules/webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +++ b/node_modules/webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency.js @@ -4,16 +4,17 @@ */
"use strict";
const NullDependency = require("./NullDependency");
-const HarmonyModulesHelpers = require("./HarmonyModulesHelpers");
class HarmonyExportImportedSpecifierDependency extends NullDependency {
- constructor(originModule, importDependency, importedVar, id, name) {
+ constructor(originModule, importDependency, importedVar, id, name, activeExports, otherStarExports) {
super();
this.originModule = originModule;
this.importDependency = importDependency;
this.importedVar = importedVar;
this.id = id;
this.name = name;
+ this.activeExports = activeExports;
+ this.otherStarExports = otherStarExports;
}
get type() {
@@ -23,14 +24,14 @@ class HarmonyExportImportedSpecifierDependency extends NullDependency { getReference() {
const name = this.name;
const used = this.originModule.isUsed(name);
- const active = HarmonyModulesHelpers.isActive(this.originModule, this);
const importedModule = this.importDependency.module;
- if(!importedModule || !used || !active) return null;
- if(!this.originModule.usedExports) return null;
+ if(!importedModule || !used || !this.originModule.usedExports) return null;
+
+ const hasUsedExports = Array.isArray(this.originModule.usedExports);
if(name) {
- const nameIsNotInUsedExports = Array.isArray(this.originModule.usedExports) && this.originModule.usedExports.indexOf(name) < 0;
+ const nameIsNotInUsedExports = hasUsedExports && this.originModule.usedExports.indexOf(name) < 0;
if(nameIsNotInUsedExports) return null;
// export { name as name }
@@ -48,36 +49,37 @@ class HarmonyExportImportedSpecifierDependency extends NullDependency { };
}
+ const hasProvidedExports = Array.isArray(importedModule.providedExports);
+ const activeFromOtherStarExports = this._discoverActiveExportsFromOtherStartExports();
+
// export *
- if(Array.isArray(this.originModule.usedExports)) {
+ if(hasUsedExports) {
// reexport * with known used exports
- var activeExports = HarmonyModulesHelpers.getActiveExports(this.originModule, this);
- if(Array.isArray(importedModule.providedExports)) {
- return {
- module: importedModule,
- importedNames: this.originModule.usedExports.filter((id) => {
- const notInActiveExports = activeExports.indexOf(id) < 0;
- const notDefault = id !== "default";
- const inProvidedExports = importedModule.providedExports.indexOf(id) >= 0;
- return notInActiveExports && notDefault && inProvidedExports;
- }),
- };
- }
+ const importedNames = this.originModule.usedExports.filter(id => {
+ if(id === "default") return false;
+ if(this.activeExports.has(id)) return false;
+ if(activeFromOtherStarExports.has(id)) return false;
+ if(hasProvidedExports && importedModule.providedExports.indexOf(id) < 0) return false;
+
+ return true;
+ });
return {
module: importedModule,
- importedNames: this.originModule.usedExports.filter(id => {
- const notInActiveExports = activeExports.indexOf(id) < 0;
- const notDefault = id !== "default";
- return notInActiveExports && notDefault;
- }),
+ importedNames
};
}
- if(Array.isArray(importedModule.providedExports)) {
+ if(hasProvidedExports) {
return {
module: importedModule,
- importedNames: importedModule.providedExports.filter(id => id !== "default"),
+ importedNames: importedModule.providedExports.filter(id => {
+ if(id === "default") return false;
+ if(this.activeExports.has(id)) return false;
+ if(activeFromOtherStarExports.has(id)) return false;
+
+ return true;
+ })
};
}
@@ -87,6 +89,21 @@ class HarmonyExportImportedSpecifierDependency extends NullDependency { };
}
+ _discoverActiveExportsFromOtherStartExports() {
+ if(!this.otherStarExports)
+ return new Set();
+ const result = new Set();
+ // try to learn impossible exports from other star exports with provided exports
+ for(const otherStarExport of this.otherStarExports) {
+ const otherImportedModule = otherStarExport.importDependency.module;
+ if(otherImportedModule && Array.isArray(otherImportedModule.providedExports)) {
+ for(const exportName of otherImportedModule.providedExports)
+ result.add(exportName);
+ }
+ }
+ return result;
+ }
+
getExports() {
if(this.name) {
return {
@@ -122,22 +139,6 @@ class HarmonyExportImportedSpecifierDependency extends NullDependency { };
}
- describeHarmonyExport() {
- const importedModule = this.importDependency.module;
- if(!this.name && importedModule && Array.isArray(importedModule.providedExports)) {
- // for a star export and when we know which exports are provided, we can tell so
- return {
- exportedName: importedModule.providedExports,
- precedence: 3
- };
- }
-
- return {
- exportedName: this.name,
- precedence: this.name ? 2 : 3
- };
- }
-
updateHash(hash) {
super.updateHash(hash);
const hashValue = this.getHashValue(this.importDependency.module);
@@ -167,7 +168,6 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS const name = dep.importedVar;
const used = dep.originModule.isUsed(dep.name);
const importedModule = dep.importDependency.module;
- const active = HarmonyModulesHelpers.isActive(dep.originModule, dep);
const importsExportsUnknown = !importedModule || !Array.isArray(importedModule.providedExports);
const getReexportStatement = this.reexportStatementCreator(dep.originModule, importsExportsUnknown, name);
@@ -177,11 +177,6 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS return "/* unused harmony reexport " + dep.name + " */\n";
}
- // we want to reexport something but another exports overrides this one
- if(!active) {
- return "/* inactive harmony reexport " + (dep.name || "namespace") + " */\n";
- }
-
// we want to reexport the default export from a non-hamory module
const isNotAHarmonyModule = !(importedModule && (!importedModule.meta || importedModule.meta.harmonyModule));
if(dep.name && dep.id === "default" && isNotAHarmonyModule) {
@@ -199,13 +194,17 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS return "/* harmony reexport (module object) */ " + getReexportStatement(JSON.stringify(used), "");
}
+ const hasProvidedExports = importedModule && Array.isArray(importedModule.providedExports);
+
+ const activeFromOtherStarExports = dep._discoverActiveExportsFromOtherStartExports();
+
// we know which exports are used
if(Array.isArray(dep.originModule.usedExports)) {
- const activeExports = HarmonyModulesHelpers.getActiveExports(dep.originModule, dep);
- const items = dep.originModule.usedExports.map(function(id) {
+ const items = dep.originModule.usedExports.map(id => {
if(id === "default") return;
- if(activeExports.indexOf(id) >= 0) return;
+ if(dep.activeExports.has(id)) return;
if(importedModule.isProvided(id) === false) return;
+ if(activeFromOtherStarExports.has(id)) return;
var exportUsed = dep.originModule.isUsed(id);
var idUsed = importedModule && importedModule.isUsed(id);
return [exportUsed, idUsed];
@@ -221,11 +220,11 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS }
// not sure which exports are used, but we know which are provided
- if(dep.originModule.usedExports && importedModule && Array.isArray(importedModule.providedExports)) {
- const activeExports = HarmonyModulesHelpers.getActiveExports(dep.originModule, dep);
- const items = importedModule.providedExports.map(function(id) {
+ if(dep.originModule.usedExports && importedModule && hasProvidedExports) {
+ const items = importedModule.providedExports.map(id => {
if(id === "default") return;
- if(activeExports.indexOf(id) >= 0) return;
+ if(dep.activeExports.has(id)) return;
+ if(activeFromOtherStarExports.has(id)) return;
var exportUsed = dep.originModule.isUsed(id);
var idUsed = importedModule && importedModule.isUsed(id);
return [exportUsed, idUsed];
@@ -242,7 +241,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS // not sure which exports are used and provided
if(dep.originModule.usedExports) {
- const activeExports = HarmonyModulesHelpers.getActiveExports(dep.originModule, dep);
+ const activeExports = Array.from(dep.activeExports).concat(Array.from(activeFromOtherStarExports));
let content = "/* harmony namespace reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in " + name + ") ";
// Filter out exports which are defined by other exports
diff --git a/node_modules/webpack/lib/dependencies/HarmonyExportSpecifierDependency.js b/node_modules/webpack/lib/dependencies/HarmonyExportSpecifierDependency.js index 024ceeb00..33c253f4b 100644 --- a/node_modules/webpack/lib/dependencies/HarmonyExportSpecifierDependency.js +++ b/node_modules/webpack/lib/dependencies/HarmonyExportSpecifierDependency.js @@ -4,7 +4,6 @@ */
"use strict";
const NullDependency = require("./NullDependency");
-const HarmonyModulesHelpers = require("./HarmonyModulesHelpers");
class HarmonyExportSpecifierDependency extends NullDependency {
constructor(originModule, id, name, position, immutable) {
@@ -25,13 +24,6 @@ class HarmonyExportSpecifierDependency extends NullDependency { exports: [this.name]
};
}
-
- describeHarmonyExport() {
- return {
- exportedName: this.name,
- precedence: 1
- };
- }
}
HarmonyExportSpecifierDependency.Template = class HarmonyExportSpecifierDependencyTemplate {
@@ -46,15 +38,10 @@ HarmonyExportSpecifierDependency.Template = class HarmonyExportSpecifierDependen getContent(dep) {
const used = dep.originModule.isUsed(dep.name);
- const active = HarmonyModulesHelpers.isActive(dep.originModule, dep);
if(!used) {
return `/* unused harmony export ${(dep.name || "namespace")} */\n`;
}
- if(!active) {
- return `/* inactive harmony export ${(dep.name || "namespace")} */\n`;
- }
-
const exportsName = dep.originModule.exportsArgument || "exports";
if(dep.immutable) {
return `/* harmony export (immutable) */ ${exportsName}[${JSON.stringify(used)}] = ${dep.id};\n`;
diff --git a/node_modules/webpack/lib/dependencies/HarmonyImportDependencyParserPlugin.js b/node_modules/webpack/lib/dependencies/HarmonyImportDependencyParserPlugin.js index d756688d2..3b867f616 100644 --- a/node_modules/webpack/lib/dependencies/HarmonyImportDependencyParserPlugin.js +++ b/node_modules/webpack/lib/dependencies/HarmonyImportDependencyParserPlugin.js @@ -56,6 +56,8 @@ module.exports = class HarmonyImportDependencyParserPlugin { if(this.strictThisContextOnImports) {
// only in case when we strictly follow the spec we need a special case here
parser.plugin("call imported var.*", (expr) => {
+ if(expr.callee.type !== "MemberExpression") return;
+ if(expr.callee.object.type !== "Identifier") return;
const name = expr.callee.object.name;
const settings = parser.state.harmonySpecifier[`$${name}`];
if(settings[2] !== null)
@@ -75,6 +77,7 @@ module.exports = class HarmonyImportDependencyParserPlugin { const args = expr.arguments;
const fullExpr = expr;
expr = expr.callee;
+ if(expr.type !== "Identifier") return;
const name = expr.name;
const settings = parser.state.harmonySpecifier[`$${name}`];
const dep = new HarmonyImportSpecifierDependency(settings[0], settings[1], settings[2], name, expr.range, this.strictExportPresence);
diff --git a/node_modules/webpack/lib/dependencies/HarmonyModulesHelpers.js b/node_modules/webpack/lib/dependencies/HarmonyModulesHelpers.js index 1f3387fe1..10ee7e27e 100644 --- a/node_modules/webpack/lib/dependencies/HarmonyModulesHelpers.js +++ b/node_modules/webpack/lib/dependencies/HarmonyModulesHelpers.js @@ -27,59 +27,6 @@ class HarmonyModulesHelpers { return null;
return this.getModuleVar(state, request);
}
-
- // checks if an harmony dependency is active in a module according to
- // precedence rules.
- static isActive(module, depInQuestion) {
- const desc = depInQuestion.describeHarmonyExport();
- if(!desc.exportedName) return true;
- let before = true;
- for(const moduleDependency of module.dependencies) {
- const dep = moduleDependency;
- if(dep === depInQuestion) {
- before = false;
- continue;
- }
- if(!dep.describeHarmonyExport) continue;
- const d = dep.describeHarmonyExport();
- if(!d || !d.exportedName) continue;
- if(d.exportedName === desc.exportedName) {
- if(d.precedence < desc.precedence) {
- return false;
- }
- if(d.precedence === desc.precedence && !before) {
- return false;
- }
- }
- }
- return true;
- }
-
- // get a list of named exports defined in a module
- // doesn't include * reexports.
- static getActiveExports(module, currentDependency) {
- const desc = currentDependency && currentDependency.describeHarmonyExport();
- var currentIndex = currentDependency ? module.dependencies.indexOf(currentDependency) : -1;
- return module.dependencies.map((dep, idx) => {
- return {
- dep: dep,
- idx: idx
- };
- }).reduce((arr, data) => {
- const dep = data.dep;
- if(!dep.describeHarmonyExport) return arr;
- const d = dep.describeHarmonyExport();
- if(!d) return arr;
- if(!desc || (d.precedence < desc.precedence) || (d.precedence === desc.precedence && data.idx < currentIndex)) {
- var names = [].concat(d.exportedName);
- names.forEach(function(name) {
- if(name && arr.indexOf(name) < 0)
- arr.push(name);
- });
- }
- return arr;
- }, []);
- }
}
module.exports = HarmonyModulesHelpers;
diff --git a/node_modules/webpack/lib/dependencies/ImportContextDependency.js b/node_modules/webpack/lib/dependencies/ImportContextDependency.js index 252bc75a0..d7f378c5c 100644 --- a/node_modules/webpack/lib/dependencies/ImportContextDependency.js +++ b/node_modules/webpack/lib/dependencies/ImportContextDependency.js @@ -4,7 +4,6 @@ */
"use strict";
const ContextDependency = require("./ContextDependency");
-const CriticalDependencyWarning = require("./CriticalDependencyWarning");
const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
class ImportContextDependency extends ContextDependency {
@@ -19,15 +18,6 @@ class ImportContextDependency extends ContextDependency { return "import() context";
}
- getWarnings() {
- if(!this.critical) {
- return;
- }
-
- return [
- new CriticalDependencyWarning(this.critical)
- ];
- }
}
ImportContextDependency.Template = ContextDependencyTemplateAsRequireCall;
diff --git a/node_modules/webpack/lib/dependencies/RequireResolveContextDependency.js b/node_modules/webpack/lib/dependencies/RequireResolveContextDependency.js index 161319e82..f53e94768 100644 --- a/node_modules/webpack/lib/dependencies/RequireResolveContextDependency.js +++ b/node_modules/webpack/lib/dependencies/RequireResolveContextDependency.js @@ -4,7 +4,6 @@ */
"use strict";
const ContextDependency = require("./ContextDependency");
-const CriticalDependencyWarning = require("./CriticalDependencyWarning");
const ContextDependencyTemplateAsId = require("./ContextDependencyTemplateAsId");
class RequireResolveContextDependency extends ContextDependency {
@@ -18,15 +17,6 @@ class RequireResolveContextDependency extends ContextDependency { return "amd require context";
}
- getWarnings() {
- if(!this.critical) {
- return;
- }
-
- return [
- new CriticalDependencyWarning(this.critical)
- ];
- }
}
RequireResolveContextDependency.Template = ContextDependencyTemplateAsId;
diff --git a/node_modules/webpack/lib/optimize/CommonsChunkPlugin.js b/node_modules/webpack/lib/optimize/CommonsChunkPlugin.js index 465b7ff7a..ab7b69f4a 100644 --- a/node_modules/webpack/lib/optimize/CommonsChunkPlugin.js +++ b/node_modules/webpack/lib/optimize/CommonsChunkPlugin.js @@ -4,6 +4,7 @@ */
"use strict";
let nextIdent = 0;
+
class CommonsChunkPlugin {
constructor(options) {
if(arguments.length > 1) {
@@ -31,6 +32,7 @@ The available options are: this.minChunks = normalizedOptions.minChunks;
this.selectedChunks = normalizedOptions.selectedChunks;
this.children = normalizedOptions.children;
+ this.deepChildren = normalizedOptions.deepChildren;
this.async = normalizedOptions.async;
this.minSize = normalizedOptions.minSize;
this.ident = __filename + (nextIdent++);
@@ -76,6 +78,7 @@ You can however specify the name of the async chunk by passing the desired strin minChunks: options.minChunks,
selectedChunks: options.chunks,
children: options.children,
+ deepChildren: options.deepChildren,
async: options.async,
minSize: options.minSize
};
@@ -211,6 +214,37 @@ You can however specify the name of the async chunk by passing the desired strin Take a look at the "name"/"names" or async/children option.`);
}
+ getAffectedUnnamedChunks(affectedChunks, targetChunk, asyncOption) {
+ let chunks = targetChunk.chunks;
+ chunks && chunks.forEach((chunk) => {
+ if(chunk.isInitial()) {
+ return;
+ }
+ // If all the parents of a chunk are either
+ // a) the target chunk we started with
+ // b) themselves affected chunks
+ // we can assume that this chunk is an affected chunk too, as there is no way a chunk that
+ // isn't only depending on the target chunk is a parent of the chunk tested
+ if(asyncOption || chunk.parents.every((parentChunk) => parentChunk === targetChunk || affectedChunks.has(parentChunk))) {
+ // This check not only dedupes the affectedChunks but also guarantees we avoid endless loops
+ if(!affectedChunks.has(chunk) || affectedChunks.values().next().value === chunk) {
+ // We mutate the affected chunks before going deeper, so the deeper levels and other branches
+ // Have the information of this chunk being affected for their assertion if a chunk should
+ // not be affected
+ affectedChunks.add(chunk);
+
+ // We recurse down to all the children of the chunk, applying the same assumption.
+ // This guarantees that if a chunk should be an affected chunk,
+ // at the latest the last connection to the same chunk meets the
+ // condition to add it to the affected chunks.
+ if(this.deepChildren === true) {
+ this.getAffectedUnnamedChunks(affectedChunks, chunk, asyncOption);
+ }
+ }
+ }
+ });
+ }
+
getAffectedChunks(compilation, allChunks, targetChunk, targetChunks, currentIndex, selectedChunks, asyncOption, children) {
const asyncOrNoSelectedChunk = children || asyncOption;
@@ -223,22 +257,9 @@ Take a look at the "name"/"names" or async/children option.`); }
if(asyncOrNoSelectedChunk) {
- // nothing to do here
- if(!targetChunk.chunks) {
- return [];
- }
-
- return targetChunk.chunks.filter((chunk) => {
- // we only are interested in on-demand chunks
- if(chunk.isInitial())
- return false;
-
- // we can only move modules from this chunk if the "commonChunk" is the only parent
- if(!asyncOption)
- return chunk.parents.length === 1;
-
- return true;
- });
+ let affectedChunks = new Set();
+ this.getAffectedUnnamedChunks(affectedChunks, targetChunk, asyncOption);
+ return Array.from(affectedChunks);
}
/**
diff --git a/node_modules/webpack/lib/optimize/ConcatenatedModule.js b/node_modules/webpack/lib/optimize/ConcatenatedModule.js index 6cb503f0d..8b201009a 100644 --- a/node_modules/webpack/lib/optimize/ConcatenatedModule.js +++ b/node_modules/webpack/lib/optimize/ConcatenatedModule.js @@ -17,7 +17,6 @@ const HarmonyExportSpecifierDependency = require("../dependencies/HarmonyExportS const HarmonyExportExpressionDependency = require("../dependencies/HarmonyExportExpressionDependency");
const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
const HarmonyCompatibilityDependency = require("../dependencies/HarmonyCompatibilityDependency");
-const HarmonyModulesHelpers = require("../dependencies/HarmonyModulesHelpers");
function ensureNsObjSource(info, moduleToInfoMap, requestShortener) {
if(!info.hasNamespaceObject) {
@@ -172,7 +171,7 @@ class ConcatenatedModule extends Module { this.built = modules.some(m => m.built);
this.cacheable = modules.every(m => m.cacheable);
const modulesSet = new Set(modules);
- this.reasons = rootModule.reasons.filter(reason => !modulesSet.has(reason.module));
+ this.reasons = rootModule.reasons.filter(reason => !(reason.dependency instanceof HarmonyImportDependency) || !modulesSet.has(reason.module));
this.meta = rootModule.meta;
this.moduleArgument = rootModule.moduleArgument;
this.exportsArgument = rootModule.exportsArgument;
@@ -193,7 +192,7 @@ class ConcatenatedModule extends Module { const m = info.module;
// populate dependencies
- m.dependencies.filter(dep => !modulesSet.has(dep.module))
+ m.dependencies.filter(dep => !(dep instanceof HarmonyImportDependency) || !modulesSet.has(dep.module))
.forEach(d => this.dependencies.push(d));
// populate dep warning
m.dependenciesWarnings.forEach(depWarning => this.dependenciesWarnings.push(depWarning));
@@ -308,35 +307,42 @@ class ConcatenatedModule extends Module { const reexportMap = new Map();
info.module.dependencies.forEach(dep => {
if(dep instanceof HarmonyExportSpecifierDependency) {
- exportMap.set(dep.name, dep.id);
+ if(!exportMap.has(dep.name))
+ exportMap.set(dep.name, dep.id);
} else if(dep instanceof HarmonyExportExpressionDependency) {
- exportMap.set("default", "__WEBPACK_MODULE_DEFAULT_EXPORT__");
+ if(!exportMap.has("default"))
+ exportMap.set("default", "__WEBPACK_MODULE_DEFAULT_EXPORT__");
} else if(dep instanceof HarmonyExportImportedSpecifierDependency) {
const exportName = dep.name;
const importName = dep.id;
const importedModule = dep.importDependency.module;
if(exportName && importName) {
- reexportMap.set(exportName, {
- module: importedModule,
- exportName: importName,
- dependency: dep
- });
+ if(!reexportMap.has(exportName)) {
+ reexportMap.set(exportName, {
+ module: importedModule,
+ exportName: importName,
+ dependency: dep
+ });
+ }
} else if(exportName) {
- reexportMap.set(exportName, {
- module: importedModule,
- exportName: true,
- dependency: dep
- });
- } else {
- var activeExports = new Set(HarmonyModulesHelpers.getActiveExports(dep.originModule, dep));
- importedModule.providedExports.forEach(name => {
- if(activeExports.has(name) || name === "default")
- return;
- reexportMap.set(name, {
+ if(!reexportMap.has(exportName)) {
+ reexportMap.set(exportName, {
module: importedModule,
- exportName: name,
+ exportName: true,
dependency: dep
});
+ }
+ } else if(importedModule) {
+ importedModule.providedExports.forEach(name => {
+ if(dep.activeExports.has(name) || name === "default")
+ return;
+ if(!reexportMap.has(name)) {
+ reexportMap.set(name, {
+ module: importedModule,
+ exportName: name,
+ dependency: dep
+ });
+ }
});
}
}
@@ -352,7 +358,6 @@ class ConcatenatedModule extends Module { internalNames: new Map(),
exportMap: exportMap,
reexportMap: reexportMap,
- needCompatibilityFlag: false,
hasNamespaceObject: false,
namespaceObjectSource: null
};
@@ -451,7 +456,7 @@ class ConcatenatedModule extends Module { const allUsedNames = new Set([
"__WEBPACK_MODULE_DEFAULT_EXPORT__", // avoid using this internal name
- "abstract", "arguments", "await", "boolean", "break", "byte", "case", "catch", "char", "class",
+ "abstract", "arguments", "async", "await", "boolean", "break", "byte", "case", "catch", "char", "class",
"const", "continue", "debugger", "default", "delete", "do", "double", "else", "enum", "eval",
"export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if",
"implements", "import", "in", "instanceof", "int", "interface", "let", "long", "native", "new",
@@ -576,7 +581,8 @@ class ConcatenatedModule extends Module { const result = new ConcatSource();
// add harmony compatibility flag (must be first because of possible circular dependencies)
- if(moduleToInfoMap.get(this.rootModule).needCompatibilityFlag) {
+ const usedExports = this.rootModule.usedExports;
+ if(usedExports === true) {
result.add(`Object.defineProperty(${this.exportsArgument || "exports"}, "__esModule", { value: true });\n`);
}
@@ -741,8 +747,6 @@ class HarmonyExportImportedSpecifierDependencyConcatenatedTemplate { }
getExports(dep) {
- const active = HarmonyModulesHelpers.isActive(dep.originModule, dep);
- if(!active) return [];
const importModule = dep.importDependency.module;
if(dep.id) {
// export { named } from "module"
@@ -761,8 +765,7 @@ class HarmonyExportImportedSpecifierDependencyConcatenatedTemplate { }];
}
// export * from "module"
- const activeExports = new Set(HarmonyModulesHelpers.getActiveExports(dep.originModule, dep));
- return importModule.providedExports.filter(exp => exp !== "default" && !activeExports.has(exp)).map(exp => {
+ return importModule.providedExports.filter(exp => exp !== "default" && !dep.activeExports.has(exp)).map(exp => {
return {
name: exp,
id: exp,
@@ -807,9 +810,7 @@ class HarmonyCompatibilityDependencyConcatenatedTemplate { }
apply(dep, source, outputOptions, requestShortener, dependencyTemplates) {
- if(dep.originModule === this.rootModule) {
- this.modulesMap.get(this.rootModule).needCompatibilityFlag = true;
- }
+ // do nothing
}
}
diff --git a/node_modules/webpack/lib/optimize/EnsureChunkConditionsPlugin.js b/node_modules/webpack/lib/optimize/EnsureChunkConditionsPlugin.js index 46324c4e9..2b291fdad 100644 --- a/node_modules/webpack/lib/optimize/EnsureChunkConditionsPlugin.js +++ b/node_modules/webpack/lib/optimize/EnsureChunkConditionsPlugin.js @@ -22,6 +22,7 @@ class EnsureChunkConditionsPlugin { chunk.parents.forEach((parent) => {
if(!usedChunks.has(parent)) {
parent.addModule(module);
+ module.addChunk(parent);
newChunks.push(parent);
}
});
diff --git a/node_modules/webpack/lib/optimize/ModuleConcatenationPlugin.js b/node_modules/webpack/lib/optimize/ModuleConcatenationPlugin.js index 9e797c75e..8a6a660cb 100644 --- a/node_modules/webpack/lib/optimize/ModuleConcatenationPlugin.js +++ b/node_modules/webpack/lib/optimize/ModuleConcatenationPlugin.js @@ -163,6 +163,7 @@ class ModuleConcatenationPlugin { }
chunks.forEach(chunk => {
chunk.addModule(newModule);
+ newModule.addChunk(chunk);
if(chunk.entryModule === concatConfiguration.rootModule)
chunk.entryModule = newModule;
});
diff --git a/node_modules/webpack/lib/webpack.js b/node_modules/webpack/lib/webpack.js index fb8c68b7f..81fc7d83f 100644 --- a/node_modules/webpack/lib/webpack.js +++ b/node_modules/webpack/lib/webpack.js @@ -22,6 +22,7 @@ function webpack(options, callback) { if(Array.isArray(options)) {
compiler = new MultiCompiler(options.map(options => webpack(options)));
} else if(typeof options === "object") {
+ // TODO webpack 4: process returns options
new WebpackOptionsDefaulter().process(options);
compiler = new Compiler();
@@ -72,6 +73,7 @@ exportPlugins(exports, { "DefinePlugin": () => require("./DefinePlugin"),
"NormalModuleReplacementPlugin": () => require("./NormalModuleReplacementPlugin"),
"ContextReplacementPlugin": () => require("./ContextReplacementPlugin"),
+ "ContextExclusionPlugin": () => require("./ContextExclusionPlugin"),
"IgnorePlugin": () => require("./IgnorePlugin"),
"WatchIgnorePlugin": () => require("./WatchIgnorePlugin"),
"BannerPlugin": () => require("./BannerPlugin"),
diff --git a/node_modules/webpack/package.json b/node_modules/webpack/package.json index 1cc78da0d..f0d5cc210 100644 --- a/node_modules/webpack/package.json +++ b/node_modules/webpack/package.json @@ -1,6 +1,6 @@ { "name": "webpack", - "version": "3.5.4", + "version": "3.7.1", "author": "Tobias Koppers @sokra", "description": "Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.", "dependencies": { @@ -106,7 +106,7 @@ "nsp": "nsp check --output summary", "benchmark": "mocha --max-old-space-size=4096 --harmony test/*.benchmark.js -R spec", "cover": "node --max-old-space-size=4096 --harmony ./node_modules/istanbul/lib/cli.js cover -x '**/*.runtime.js' node_modules/mocha/bin/_mocha -- test/*.test.js", - "cover:min": "node --max-old-space-size=4096 --harmony ./node_modules/.bin/istanbul cover -x '**/*.runtime.js' --report lcovonly node_modules/mocha/bin/_mocha -- test/*.test.js", + "cover:min": "node --max-old-space-size=4096 --harmony ./node_modules/istanbul/lib/cli.js cover -x '**/*.runtime.js' --report lcovonly node_modules/mocha/bin/_mocha -- test/*.test.js", "publish-patch": "npm run lint && npm run beautify-lint && mocha && npm version patch && git push && git push --tags && npm publish" } } |