Code Monkey home page Code Monkey logo

prerender-loader's Introduction

prerender-loader

prerender-loader npm

Painless universal prerendering for Webpack. Works great with html-webpack-plugin.

๐Ÿง What is Prerendering?

Pre-rendering describes the process of rendering a client-side application at build time, producing useful static HTML that can be sent to the browser instead of an empty bootstrapping page.

Pre-rendering is like Server-Side Rendering, just done at build time to produce static files. Both techniques help get meaningful content onto the user's screen faster.

Features

  • Works entirely within Webpack
  • Integrates with html-webpack-plugin
  • Works with webpack-dev-server / webpack serve
  • Supports both DOM and String prerendering
  • Asynchronous rendering via async/await or Promises

How does it work?

prerender-loader renders your web application within Webpack during builds, producing static HTML. When the loader is applied to an HTML file, it creates a DOM structure from that HTML, compiles the application, runs it within the DOM and serializes the result back to HTML.


Installation

First, install prerender-loader as a development dependency:

npm i -D prerender-loader

Usage

In most cases, you'll want to apply the loader to your html-webpack-plugin template option:

// webpack.config.js
module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
-     template: 'index.html',
+     template: '!!prerender-loader?string!index.html',

      // any other options you'd normally set are still supported:
      compile: false,
      inject: true
    })
  ]
}

What does all that punctuation mean? Let's break the whole loader string down:

In Webpack, a module identifier beginning with !! will bypass any configured loaders from module.rules - here we're saying "don't do anything to index.html except what I've defined here

The ?string parameter tells prerender-loader to output an ES module exporting the prerendered HTML string, rather than returning the HTML directly.

Finally, everything up to the last ! in a module identifier is the inline loader definition (the transforms to apply to a given module). The filename of the module to load comes after the !.

Note: If you've already set up html-loader or raw-loader to handle .html files, you can skip both options and simply pass a template value of "prerender-loader!index.html"!

As with any loader, it is also possible to apply prerender-loader on-the-fly :

const html = require('prerender-loader?!./app.html');

... or in your Webpack configuration's module.rules section:

module.exports = {
  module: {
    rules: [
      {
        test: 'src/index.html',
        loader: 'prerender-loader?string'
      }
    ]
  }
}

Once you have prerender-loader in-place, prerendering is now turned on. During your build, the app will be executed, with any modifications it makes to index.html will be saved to disk. This is fine for the needs of many apps, but you can also take more explicit control over your prerendering: either using the DOM or by rendering to a String.

DOM Prerendering

During prerendering, your application gets compiled and run directly under NodeJS, but within a JSDOM container so that you can use the familiar browser globals like document and window.

Here's an example entry module that uses DOM prerendering:

import { render } from 'fancy-dom-library';
import App from './app';

export default () => {
  render(<App />, document.body);
};

In all cases, asynchronous functions and callbacks are supported:

import { mount } from 'other-fancy-library';
import app from './app';

export default async function prerender() {
  let res = await fetch('https://example.com');
  let data = await res.json();
  mount(app(data), document.getElementById('app'));
}

String Prerendering

It's also possible to export a function from your Webpack entry module, which gives you full control over prerendering: prerender-loader will call the function and its return value will be used as the static HTML. If the exported function returns a Promise, it will be awaited and the resolved value will be used.

import { renderToString } from 'react-dom';
import App from './app';

export default () => {
  const html = renderToString(<App />);
  // returned HTML will be injected into <body>:
  return html;
};

In addition to DOM and String prerendering, it's also possible to use a combination of the two. If an application's Webpack entry exports a prerender function that doesn't return a value, the default DOM serialization will kick in, just like in DOM prerendering. This means you can use your exported prerender function to trigger DOM manipulation ("client-side" rendering), and then just let prerender-loader handle generating the static HTML for whatever got rendered.

Here's an example that renders a Preact application and waits for DOM rendering to settle down before allowing prerender-loader to serialize the document to static HTML:

import { h, options } from 'preact';
import { renderToString } from 'preact';
import App from './app';

// we're done when there are no renders for 50ms:
const IDLE_TIMEOUT = 50;

export default () => new Promise(resolve => {
  let timer;
  // each time preact re-renders, reset our idle timer:
  options.debounceRendering = commit => {
    clearTimeout(timer);
    timer = setTimeout(resolve, IDLE_TIMEOUT);
    commit();
  };

  // render into <body> using normal client-side rendering:
  render(<App />, document.body);
});

Injecting content into the HTML

When applied to a .html file, prerender-loader will inject prerendered content at the end of <body> by default. If you want to place the content somewhere else, you can add a {{prerender}} field:

<html>
  <body>
    <div id="app_root">
      <!-- Inject any pre-rendered HTML here: -->
      {{prerender}}
    </div>
  </body>
</html>

This works well if you intend to provide a prerender function that only returns your application's HTML structure, not the full document's HTML.

Prerendering JavaScript Files

In addition to processing .html files, the loader can also directly pre-render .js scripts. The only difference is that the DOM used for prerender will be initially empty:

const prerenderedHtml = require('!prerender-loader?string!./app.js');

Options

All options are ... optional.

Option Type Default Description
string boolean false Output a JS module exporting an HTML String instead of the HTML itself
disabled boolean false Bypass the loader entirely (but still respect options.string)
documentUrl string 'http://localhost' Change the jsdom's URL (affects window.location, document.URL...)
params object null Options to pass to your prerender function
env object {} Environment variables to define when building JS for prerendering

License

Apache 2.0

This is not an official Google product.

prerender-loader's People

Contributors

developit avatar dunal avatar havenchyk avatar hugmanrique avatar itkrt2y avatar mayank23 avatar nirbenya avatar pimterry avatar qingwei-li avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

prerender-loader's Issues

SecurityError: localStorage is not available for opaque origins

I want to use prerender-loader in production build. Because my code used localStorage to store and get value data, I got that error.

According to this issue comment, in order to get value of window.localStorage object, you have to specify url value inside JSDOM constructor options. Maybe prerender-loader can provide additional options to set url value in the next release?

ReferenceError when external resources loaded

Error :

Module build failed (from ./node_modules/prerender-loader/dist/prerender-loader.js):
NonErrorEmittedError: (Emitted value instead of an instance of Error) ReferenceError: $ is not defined

In Index.html

<body>
	<div id="app"></div>
	<!-- jQuery -->
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
	<!-- jQuery Easing -->
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>
	<!-- Bootstrap -->
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
	<!-- Waypoints -->
	<script src="https://cdnjs.cloudflare.com/ajax/libs/waypoints/4.0.0/jquery.waypoints.min.js"></script>
	<!-- Stellar Parallax -->
	<script src="https://cdnjs.cloudflare.com/ajax/libs/stellar.js/0.6.2/jquery.stellar.min.js"></script>
	<!-- Easy PieChart -->
	<script src="https://cdnjs.cloudflare.com/ajax/libs/easy-pie-chart/2.1.6/jquery.easypiechart.js"></script>

	<!-- Global site tag (gtag.js) - Google Analytics -->
	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-146273121-1"> </script>
	<script>
	window.dataLayer = window.dataLayer || [];
	function gtag(){dataLayer.push(arguments);}
	gtag('js', new Date());

	gtag('config', 'UA-146273121-1');
	</script>
</body>

In my Component :

  public componentDidMount() {
    if (!isMobile.any()) {
      $(".js-fullheight").css("height", $(window).height());
      $(window).resize(() => {
        $(".js-fullheight").css("height", $(window).height());
      });
    }
  }

The problem is, I'm loading jquery from a <script> and it's not in node_modules. Then He's saying that $ is not defined

I'm using typescript

And in my index.d.ts

declare var $: any;

Presence of `{{prerender}}` inside html template causes error

My /src/template.html file looks like this:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <div id="app">
      {{prerender}}
    </div>
  </body>
</html>

And this is my webpack.config.js:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

const entry = {
  home: './src/Home.jsx',
  about: './src/About.jsx',
  subscribe: './src/Subscribe.jsx',
};

const prerenderPlugins = Object.keys(entry).map(key =>
  new HtmlWebpackPlugin({
    inject: false,
    chunks: [key],
    filename: `${key}.html`,
    template: `!!prerender-loader?string&entry=${entry[key]}!./src/template.html`,
  }),
);

module.exports = {
  entry,
  output: {
    path: path.resolve(__dirname, 'public'),
    filename: "assets/[name]/build/bundle.js",
  },
  plugins: [
    new CleanWebpackPlugin(['public']),
    ...prerenderPlugins,
  ],
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: [
          {
            // uses .babelrc as config
            loader: 'babel-loader'
          }
        ]
      },
    ],
  },
  resolve: {
    extensions: ['.js', '.jsx']
  }
};

That config leads to the Conflict: Multiple chunks emit assets to the same filename ssr-bundle.js found in a few other issues.

However, by removing the {{prerender}} part from the html template, npx webpack command completes successfully. The only problem is that inside the three generated html files, they all have [object Object] appearing right after the <div id="app"></div> and before the closing </body></html>.

For the HtmlWebpackPlugins template value, I made sure the include the entry=${entry[key]} part as suggested by the comment here, which must have worked for some people given the presence of two rocket emojis at the time of me writing this. Why might that not have worked here for me?

I uploaded the full example project I'm using to this repo. And these are the dependencies in use:

  "dependencies": {
    "react": "^16.13.1",
    "react-dom": "^16.13.1"
  },
  "devDependencies": {
    "@babel/cli": "^7.10.1",
    "@babel/core": "^7.10.2",
    "@babel/plugin-proposal-export-default-from": "^7.10.1",
    "@babel/plugin-syntax-dynamic-import": "^7.8.3",
    "@babel/preset-env": "^7.10.2",
    "@babel/preset-react": "^7.10.1",
    "@babel/register": "^7.10.1",
    "babel-loader": "^8.1.0",
    "babel-plugin-syntax-dynamic-import": "^6.18.0",
    "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
    "clean-webpack-plugin": "^1.0.1",
    "html-webpack-plugin": "^4.3.0",
    "prerender-loader": "^1.3.0",
    "webpack": "^4.43.0",
    "webpack-cli": "^3.3.11"
  }

Package.json description is from Critters

Very very minor issue but noticed that the description in package.json is the one for Critters

{
"description": "Webpack plugin to inline critical CSS and lazy-load the rest.",
}

ECONNREFUSED 127.0.0.1:80

I'm trying to set this up for a react+TS project. I have my main entry point set up like this:

import * as React from 'react'
import {render} from 'react-dom'

class App extends React.Component {
  componentDidMount() {
    document.dispatchEvent(new Event('prerender-ready'))
  }

  render() {
    ...
  }
}

render(<App/>, document.querySelector('#root'))

export default () => {
  await Promise((resolve) => {
    document.addEventListener('prerender-ready', () => resolve())
    render(<App/>, document.querySelector('#root'))
  })
}

And when trying to prerender I get the following error:

Error: Error: connect ECONNREFUSED 127.0.0.1:80
    at Object.dispatchError (/.../node_modules/prerender-loader/node_modules/jsdom/lib/jsdom/living/xhr-utils.js:65:19)
    at Request.client.on.err (/.../node_modules/prerender-loader/node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:676:20)
    at emitOne (events.js:121:20)
    at Request.emit (events.js:211:7)
    at Request.onRequestError (/.../node_modules/request/request.js:881:8)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at Socket.socketErrorListener (_http_client.js:387:9)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9) undefined

And my webpack.config.js looks like this:

...
plugins: [
  ...['/', ...].map(url => {
    return new HtmlWebpackPlugin({
      filename: `${url}/main.html`,
      template:
        '!!prerender-loader?' +
        encodeURIComponent(
          JSON.stringify({
            string: true,
            documentUrl: `http://localhost:3000${url}`,
          })
        ) +
        `!${paths.clientHtml}`,
    })
  }
  ...
]
...

I feel like it's really close to working for me, but I'm not sure where to look from here. My prod webpack config doesn't use webpack-dev-server/webpack-serve, not sure if that's needed. Any help would be greatly appreciated, thanks!

TypeError: document.getElementsByTagName(...)[0].insertAdjacentElement is not a function

I was trying to implement this loader by following the instruction provided in the readme but when trying to bundle in production I'm getting this error:

 ERROR in ./src/index.html (./node_modules/prerender-loader/dist/prerender-loader.js?string!./src/index.html)
    Module build failed: TypeError: document.getElementsByTagName(...)[0].insertAdjacentElement is not a function
        at u (eval at <anonymous> (/Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37), <anonymous>:57:7005)
        at Object.k7yg (eval at <anonymous> (/Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37), <anonymous>:57:124662)
        at r (eval at <anonymous> (/Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37), <anonymous>:1:138)
        at Object.0 (eval at <anonymous> (/Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37), <anonymous>:1:4410)
        at r (eval at <anonymous> (/Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37), <anonymous>:1:138)
        at PRERENDER_RESULT.+JVh (eval at <anonymous> (/Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37), <anonymous>:1:839)
        at eval (eval at <anonymous> (/Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37), <anonymous>:1:848)
        at eval (<anonymous>)
        at /Users/_myuser_/Developer/temp/node_modules/prerender-loader/dist/prerender-loader.js:206:37
        at <anonymous>

ES6 support

Hello.

I'm currently using webpack to generate a separate legacy bundle that transpiles to ES5 and a modern bundle that supports ES6 syntax without the need for transpiling code

As far as the build goes I run the same build two times with different browserslist configs by setting BROWSERSLIST_ENV variable.

I run a prerender function that uses async/Promise.

The build fails on the modern part with the following stack trace

Error: Child compilation failed:

  - util.js:33
    [react-boilerplate]/[prerender-loader]/src/util.js:33:23

  - Compiler.js:556 hooks.afterCompile.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compiler.js:556:14

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compiler.js:553 compilation.seal.err
    [react-boilerplate]/[webpack]/lib/Compiler.js:553:30

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1323 hooks.optimizeAssets.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compilation.js:1323:35

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1314 hooks.optimizeChunkAssets.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compilation.js:1314:32

  - index.js:319 taskRunner.run
    [react-boilerplate]/[uglifyjs-webpack-plugin]/dist/index.js:319:9

  - TaskRunner.js:83 step
    [react-boilerplate]/[uglifyjs-webpack-plugin]/dist/TaskRunner.js:83:9

  - TaskRunner.js:94 done
    [react-boilerplate]/[uglifyjs-webpack-plugin]/dist/TaskRunner.js:94:30

  - TaskRunner.js:99 boundWorkers
    [react-boilerplate]/[uglifyjs-webpack-plugin]/dist/TaskRunner.js:99:13

  - farm.js:191
    [react-boilerplate]/[worker-farm]/lib/farm.js:191:19

  - Error: Child compilation failed:

  - compiler.js:79 childCompiler.runAsChild
    [react-boilerplate]/[html-webpack-plugin]/lib/compiler.js:79:16

  - Compiler.js:300 compile
    [react-boilerplate]/[webpack]/lib/Compiler.js:300:11

  - Compiler.js:556 hooks.afterCompile.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compiler.js:556:14

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compiler.js:553 compilation.seal.err
    [react-boilerplate]/[webpack]/lib/Compiler.js:553:30

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1323 hooks.optimizeAssets.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compilation.js:1323:35

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1314 hooks.optimizeChunkAssets.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compilation.js:1314:32

  - index.js:319 taskRunner.run
    [react-boilerplate]/[uglifyjs-webpack-plugin]/dist/index.js:319:9

  - TaskRunner.js:44 TaskRunner.run
    [react-boilerplate]/[uglifyjs-webpack-plugin]/dist/TaskRunner.js:44:7

  - index.js:225 UglifyJsPlugin.optimizeFn
    [react-boilerplate]/[uglifyjs-webpack-plugin]/dist/index.js:225:18

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1309 hooks.additionalAssets.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compilation.js:1309:36

  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [react-boilerplate]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1305 hooks.optimizeTree.callAsync.err
    [react-boilerplate]/[webpack]/lib/Compilation.js:1305:32

I'm guessing that the file is being rendered with the modern settings in place so it uses the coresponding babel-preset-env config.

So my question is can I set a different babel config for the prerendered files ?

React v16.7.0-alpha, hooks

Something up with the latest react hooks stuff. I'm trying to narrow it down but no luck so far.

Error: Uncaught [TypeError: Cannot read property 'network' of null]

result = window.eval(output + '\nPRERENDER_RESULT');

'PRERENDER' in template.html

is there a way to access 'PRERENDER' env variable inside a regular template.html?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <script>
        if ('serviceWorker' in navigator) {
            navigator.serviceWorker.register('/service-worker.js');
        }
    </script>
    <title>Taco</title>
    <meta name="mobile-web-app-capable" content="yes" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <link rel="manifest" href="/manifest.json" />
</head>

<body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="portal"></div>
    <main id="root">{{prerender:./prerender.js}}</div>
</body>

</html>

Child compilation failed

entry: [
    "webpack-hot-middleware/client?reload=true&path=/__webpack_hmr", 
    "@babel/polyfill",
    "./src/index.js", 
    "./dll/vendor.dll.js"
  ],

new HtmlWebpackPlugin({
      filename: "index.html",
      favicon: "./public/favicon.png",
      template: `!!prerender-loader?string!${path.resolve(__dirname, "public", "index.ejs")}`, 
      inject: true,
      templateParameters: {
        dll: "<script src='/vendor.dll.js'></script>",
        manifest: ""
      }
    }),

Error Info


    ERROR in ./public/index.ejs (./node_modules/prerender-loader/dist/prerender-loader.js?string!./public/index.ejs)
    Module build failed (from ./node_modules/prerender-loader/dist/prerender-loader.js):
    Error: Child compilation failed:
    resolve './webpack-hot-middleware\client?reload=true&path=\__webpack_hmr' in 'E:\h-project\txz-web-admin-car-manger'
      using description file: E:\h-project\txz-web-admin-car-manger\package.json (relative path: .)
        Field 'browser' doesn't contain a valid alias configuration
        using description file: E:\h-project\txz-web-admin-car-manger\package.json (relative path: ./webpack-hot-middleware/client)
          no extension
            Field 'browser' doesn't contain a valid alias configuration

Error running npm build

> [email protected] build /.../prerender-loader
> microbundle -f cjs --no-compress --external all

Error: Plugin 'jsx' not found

I'm interested in creating a PR to not stub out requestAnimationFrame, as this prevents me using this with hyperapp, which uses requestAnimationFrame for rendering. However, I have been unable to build this with microbundle.

TypeError: Cannot read property 'hash' of undefined

Hey!
Awesome project!

I've been trying to setup the prerender, but i keep getting the following error:

/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compilation.js:2285
                        hash.update(child.hash);
                                          ^
TypeError: Cannot read property 'hash' of undefined
Show full error message

/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compilation.js:2285
                        hash.update(child.hash);
                                          ^

TypeError: Cannot read property 'hash' of undefined
    at Compilation.createHash (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compilation.js:2285:22)
    at hooks.optimizeTree.callAsync.err (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compilation.js:1288:9)
    at AsyncSeriesHook.eval [as callAsync] (eval at create (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
    at AsyncSeriesHook.lazyCompileHook (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/tapable/lib/Hook.js:154:20)
    at Compilation.seal (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compilation.js:1244:27)
    at hooks.make.callAsync.err (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compiler.js:624:17)
    at _err0 (eval at create (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:11:1)
    at _addModuleChain (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compilation.js:1095:12)
    at processModuleDependencies.err (/Users/madsthines/Workspace/Adapt/react_boilerplate/node_modules/react-scripts/node_modules/webpack/lib/Compilation.js:1007:9)
    at process._tickCallback (internal/process/next_tick.js:61:11)

My setup

I'm using CRA 3, Typescript and the Html Webpack Plugin.
I've installed the module with Yarn, and double checked it's in the package.json and in the actually node_modules folder.

// Use the correct index.html template.
new HtmlWebpackPlugin({
  inject: false,
  template: `!!prerender-loader?string&entry=./src/index.tsx!${paths.appHtml}`,
  favicon: `${paths.appPublic}/favicons/favicon.ico`,
  manifest: `/manifest.json`,
}),

I thought I might had the same issue as issue 25, but adding the entry, didn't help me.

Any thoughts on why I get this issue?

Injecting content doesn't work

Webpack config

// ...
mode: 'production',
rules: [
      {
        test: path.resolve(__dirname, 'public/index.html'),
        loader: 'prerender-loader?string'
      },
// ...
plugins: [
    new CleanWebpackPlugin(),
    new MiniCssExtractPlugin({
      filename: 'css/[name].css',
      chunkFilename: 'css/[name].css',
    }),
    new webpack.ProgressPlugin(),
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'public/index.html'),
    }),
  ],
// ...

Template

<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<noscript>
  You need to enable JavaScript to run this app.
</noscript>
<div id="root">
  {{prerender}}
</div>
</body>
</html>

Entrypoint

import React from 'react';
import ReactDOM from 'react-dom';
import ReactDOMServer from 'react-dom/server';
import './index.css';
import App from './App';

ReactDOM.hydrate(<App />, document.getElementById('root'));


export default () => {
  return ReactDOMServer.renderToString(<App />);
}

When I run webpack, get

    ERROR in ./public/index.html (./node_modules/html-webpack-plugin/lib/loader.js!./public/index.html)
    Module build failed (from ./node_modules/prerender-loader/dist/prerender-loader.js):
    NotFoundError: The object can not be found here.
        at HTMLDivElementImpl.insertBefore (/path/to/my/project/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:206:17)
        at HTMLDivElement.insertBefore (/path/to/my/project/node_modules/jsdom/lib/jsdom/living/generated/Node.js:264:45)
        at $If_2 (/path/to/my/project/node_modules/prerender-loader/dist/prerender-loader.js:237:36)
        at /path/to/my/project//node_modules/prerender-loader/dist/prerender-loader.js:249:30
        at <anonymous>

I changed the exported function to

export default () => {
  return ReactDOM.render(<App />, document.getElementById('root'));
}

The build completed without error. But I don't know if it's the right way to use this loader.

My repository is here if you need it.

is there a way to render content inside the HEAD of the template?

I was able to configure webpack to render multiple pages.

I just miss the chance to dynamically modify the HEAD tag to add, via React, the title, SEO tags and maybe additional custom tags like canonical and other stuffs (preload, fonts, etc.).

I don't want to do it manually in every html page but i wish to pre-render them as well.

Is there a way to accomplish this?

Don't run renderer when webpack in watch mode

Hello! I use something like

<div id="root">{{prerender:./src/AppPrerender}}</div>

And when I change something, HtmlWebpackPlugin don't run renderer.

Now I fix it with simple loader (source code)
And use:

{
  module: {
    rules: [
      {
        test: /[\\/]src[\\/]templates[\\/]index\.html$/,
        use: [{
          loader: path.resolve('./builder/cacheDependencyLoader.js'),
          options: {
            dependencies: [
              path.resolve('./src/AppPrerender')
            ]
          }
        }, {
          loader: 'prerender-loader',
          options: {
            string: true
          }
        }]
      },
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: './src/templates/index.html'
    }),
  ],
  ...
}

Not working "templateParameters" when prerender-loader used

Hi!
Properties from "templateParameters" do not appear in html when using "prerender-loader".

Minimal code to reproduce:

webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode: 'development',
    context: __dirname,
    entry: {
        bundle: './index.js',
    },
    output: {
        path: path.resolve(__dirname, 'build'),
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: `index_.html`,
            template: `!!prerender-loader?string!./index.html`,
            templateParameters: {
                injected: 'foo', // <--------
            },
        }),
    ],
};

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta property="x-injected" content="<%= injected %>">
</head>
<body></body>
</html>

html output

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <meta property="x-injected" content="<%= injected %>">
     <!--                                    ^^^^^^^  -->
</head>
<body>

<div>PRERENDERED CONTENT</div><script src="bundle.js"></script></body></html>```


Trying to write a script for a discord bot to play music

Hi, I'm still learning how to code so please bear with me. As the title reads, I'm having issues with a custom bot. It joins the voice channel when i provide a prefix and link but doesn't play the music, instead it sits idle and pops this error message in my terminal;
TypeError [ERR_INVALID_ARG_TYPE]: The "file" argument must be of type string. Received type object TypeError [ERR_INVALID_ARG_TYPE]: The "file" argument must be of type string. Received type object

This is most of the coding for it;
``function play(connection, message){
var server = servers[message.guild.id];

            server.dispatcher = connection.playStream(ytdl(server.queue[0], {filter: "audioonly"}));

            server.queue.shift();

            server.dispatcher.on("end", function(){
                if(server.queue[0]){
                    play(connection, message);
                }else {
                    connection.disconnect();
                }
            });


        }

        if(!args[1]){
            message.channel.send("You need to provide a link!");
            return;
        }

        if(!message.member.voiceChannel){
            message.channel.send("You must be in a channel to play the bot!");
            return;
        }

        if(!servers[message.guild.id]) servers[message.guild.id] = {
        queue: []
    }

    var server = servers[message.guild.id];
            
    server.queue.push(args[1]);
    
    if(!message.guild.voiceConnection) message.member.voiceChannel.join().then(function(connection){
        play(connection, message);
    })
break;   

I am also using ytdl-core as a module for it

SyntaxError: The URL 'http:/ sockjs-node' is invalid

Fails even if installled only (via yarn add --dev prerender-loader) and with following code (commented is really commented):

// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: {
    app: './src/index.js',
    // print: './src/print.js',
  },
  devtool: 'inline-source-map',
  devServer: {
    contentBase: './dist',
    writeToDisk: true,
    hot: true,
  },
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      template: 'src/index.html',
    })
  ],
  output: {
    filename: 'main.js',
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader',
        ],
      },
      {
        test: /\.s[ac]ss$/i,
        use: [
          'style-loader',
          'css-loader',
          'sass-loader',
        ],
      },
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: [
          'file-loader',
        ],
      },
      {
        test: /\.(woff(2)?|eot|ttf|otf)(\?v=\d+\.\d+\.\d+)?$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[ext]',
              outputPath: 'fonts/',
            },
          },
        ],
      },
      // {
      //   test: path.resolve(__dirname, 'src/index.html'),
      //   use: [
      //     { loader: 'prerender-loader?string',}
      //   ]
        
      // }
    ],
  },
  plugins: [
    // new HtmlWebpackPlugin({
    //   filename: 'index.html',
    //   template: '!!prerender-loader?string!src/index.html',
    //   // template: 'src/index.html',
    // }),
  ],
};

Produces error when webpack --mode production and open file in browser or webpack-dev-server --mode development and navigate to localhost:8080:

Error: Child compilation failed:
  Module build failed (from ./node_modules/prerender-loader/dist/prerender-loader.js):
  NonErrorEmittedError: (Emitted value instead of an instance of Error) SyntaxError: The URL 'http:/  sockjs-node' is invalid
  
  - NormalModule.js:313 
    [hw_new]/[webpack]/lib/NormalModule.js:313:13
  
  - LoaderRunner.js:367 
    [hw_new]/[loader-runner]/lib/LoaderRunner.js:367:11
  
  - LoaderRunner.js:233 
    [hw_new]/[loader-runner]/lib/LoaderRunner.js:233:18
  
  - LoaderRunner.js:111 context.callback
    [hw_new]/[loader-runner]/lib/LoaderRunner.js:111:13
  
  - prerender-loader.js:105 
    [hw_new]/[prerender-loader]/dist/prerender-loader.js:105:9
  
  - runMicrotasks
  
  
  - NonErrorEmittedError: (Emitted value instead of an instance of Error) SyntaxError: The URL 'http    :/sockjs-node' is invalid
  
  - compiler.js:79 
    [hw_new]/[html-webpack-plugin]/lib/compiler.js:79:16
  
  - Compiler.js:343 
    [hw_new]/[webpack]/lib/Compiler.js:343:11
  
  - Compiler.js:681 
    [hw_new]/[webpack]/lib/Compiler.js:681:15
  
  
  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [hw_new]/[tapable]/lib/Hook.js:154:20
  
  - Compiler.js:678 
    [hw_new]/[webpack]/lib/Compiler.js:678:31
  
  
  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [hw_new]/[tapable]/lib/Hook.js:154:20
  
  - Compilation.js:1423 
    [hw_new]/[webpack]/lib/Compilation.js:1423:35

Info

yarn info webpack

$ yarn info webpack
yarn info v1.19.1
{
  name: 'webpack',
  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.',
  'dist-tags': {
    latest: '4.41.2',
    legacy: '1.15.0',
    'webpack-2': '2.7.0',
    next: '5.0.0-beta.2',
    'webpack-3': '3.12.0'
  },
  versions: [
    '0.1.0',
    '0.1.1',
    '0.1.2',
    '0.1.3',
    '0.1.4',
    '0.1.5',
    '0.1.6',
    '0.2.0',
    '0.2.1',
    '0.2.2',
    '0.2.3',
    '0.2.4',
    '0.2.6',
    '0.2.7',
    '0.2.8',
    '0.3.0',
    '0.3.1',
    '0.3.2',
    '0.3.3',
    '0.3.4',
    '0.3.6',
    '0.3.7',
    '0.3.8',
    '0.3.9',
    '0.3.10',
    '0.3.11',
    '0.3.12',
    '0.3.13',
    '0.3.14',
    '0.3.15',
    '0.3.16',
    '0.3.17',
    '0.3.18',
    '0.3.19',
    '0.3.20',
    '0.4.0',
    '0.4.1',
    '0.4.2',
    '0.4.3',
    '0.4.4',
    '0.4.5',
    '0.4.6',
    '0.4.7',
    '0.4.8',
    '0.4.9',
    '0.4.10',
    '0.4.11',
    '0.4.12',
    '0.4.13',
    '0.4.14',
    '0.4.15',
    '0.4.16',
    '0.4.17',
    '0.4.18',
    '0.4.19',
    '0.4.20',
    '0.4.21',
    '0.4.23',
    '0.4.24',
    '0.4.25',
    '0.5.0',
    '0.5.1',
    '0.5.2',
    '0.5.3',
    '0.5.4',
    '0.5.5',
    '0.5.6',
    '0.5.7',
    '0.5.8',
    '0.5.10',
    '0.6.0',
    '0.6.1',
    '0.6.2',
    '0.7.0-beta',
    '0.7.0-beta2',
    '0.7.0-beta3',
    '0.7.0-beta4',
    '0.7.0-beta5',
    '0.7.0-beta6',
    '0.7.0-beta7',
    '0.7.0-beta8',
    '0.7.0',
    '0.7.1',
    '0.7.2',
    '0.7.3',
    '0.7.4',
    '0.7.5',
    '0.7.6',
    '0.7.7',
    '0.7.8',
    '0.7.9',
    '0.7.11',
    '0.7.12',
    '0.7.13',
    '0.7.14',
    '0.7.15',
    '0.7.16',
    '0.7.17',
    '0.8.0-beta1',
    '0.8.0-beta2',
    '0.8.0-beta3',
    '0.8.0-beta4',
    '0.8.0',
    '0.8.2',
    '0.8.3',
    '0.9.0-beta1',
    '0.9.0-beta10',
    '0.9.0-beta11',
    '0.9.0-beta12',
    '0.9.0-beta13',
    '0.9.0-beta14',
    '0.9.0-beta15',
    '0.9.0-beta16',
    '0.9.0-beta17',
    '0.9.0-beta18',
    '0.9.0-beta19',
    '0.9.0-beta2',
    '0.9.0-beta20',
    '0.9.0-beta21',
    '0.9.0-beta22',
    '0.9.0-beta23',
    '0.9.0-beta24',
    '0.9.0-beta25',
    '0.9.0-beta26',
    '0.9.0-beta27',
    '0.9.0-beta28',
    '0.9.0-beta29',
    '0.9.0-beta30',
    '0.9.0-beta31',
    '0.9.0-beta32',
    '0.9.0-beta33',
    '0.9.0-beta34',
    '0.9.0-beta35',
    '0.9.0-beta36',
    '0.9.0-beta37',
    '0.9.0-beta38',
    '0.9.0-beta4',
    '0.9.0-beta5',
    '0.9.0-beta6',
    '0.9.0-beta7',
    '0.9.0-beta8',
    '0.9.0-beta9',
    '0.9.0',
    '0.9.1',
    '0.9.2',
    '0.9.3',
    '0.10.0-beta10',
    '0.10.0-beta11',
    '0.10.0-beta12',
    '0.10.0-beta13',
    '0.10.0-beta14',
    '0.10.0-beta15',
    '0.10.0-beta16',
    '0.10.0-beta17',
    '0.10.0-beta18',
    '0.10.0-beta19',
    '0.10.0-beta2',
    '0.10.0-beta20',
    '0.10.0-beta21',
    '0.10.0-beta22',
    '0.10.0-beta23',
    '0.10.0-beta24',
    '0.10.0-beta25',
    '0.10.0-beta3',
    '0.10.0-beta5',
    '0.10.0-beta6',
    '0.10.0-beta7',
    '0.10.0-beta8',
    '0.10.0-beta9',
    '0.10.0',
    '0.11.0-beta1',
    '0.11.0-beta10',
    '0.11.0-beta11',
    '0.11.0-beta12',
    '0.11.0-beta13',
    '0.11.0-beta14',
    '0.11.0-beta15',
    '0.11.0-beta16',
    '0.11.0-beta17',
    '0.11.0-beta18',
    '0.11.0-beta19',
    '0.11.0-beta2',
    '0.11.0-beta20',
    '0.11.0-beta21',
    '0.11.0-beta22',
    '0.11.0-beta23',
    '0.11.0-beta24',
    '0.11.0-beta25',
    '0.11.0-beta26',
    '0.11.0-beta27',
    '0.11.0-beta28',
    '0.11.0-beta29',
    '0.11.0-beta3',
    '0.11.0-beta4',
    '0.11.0-beta5',
    '0.11.0-beta6',
    '0.11.0-beta7',
    '0.11.0-beta8',
    '0.11.0-beta9',
    '0.11.0',
    '0.11.1',
    '0.11.2',
    '0.11.3',
    '0.11.4',
    '0.11.5',
    '0.11.6',
    '0.11.7',
    '0.11.8',
    '0.11.9',
    '0.11.10',
    '0.11.11',
    '0.11.12',
    '0.11.13',
    '0.11.14',
    '0.11.15',
    '0.11.16',
    '0.11.17',
    '0.11.18',
    '1.0.0-beta1',
    '1.0.0-beta2',
    '1.0.0-beta3',
    '1.0.0-beta4',
    '1.0.0-beta5',
    '1.0.0-beta6',
    '1.0.0-beta7',
    '1.0.0-beta8',
    '1.0.0-beta9',
    '1.0.0-rc1',
    '1.0.0-rc11',
    '1.0.0-rc12',
    '1.0.0-rc2',
    '1.0.0-rc3',
    '1.0.0-rc4',
    '1.0.0-rc5',
    '1.0.0-rc7',
    '1.0.0-rc8',
    '1.0.0-rc9',
    '1.0.0',
    '1.0.1',
    '1.0.3',
    '1.0.4',
    '1.0.5',
    '1.1.0-beta1',
    '1.1.0-beta10',
    '1.1.0-beta12',
    '1.1.0-beta2',
    '1.1.0-beta3',
    '1.1.0-beta4',
    '1.1.0-beta5',
    '1.1.0-beta6',
    '1.1.0-beta7',
    '1.1.0-beta8',
    '1.1.0-beta9',
    '1.1.0',
    '1.1.1',
    '1.1.2',
    '1.1.3',
    '1.1.4',
    '1.1.5',
    '1.1.6',
    '1.1.7',
    '1.1.8',
    '1.1.9',
    '1.1.10',
    '1.1.11',
    '1.2.0-beta1',
    '1.2.0-beta2',
    '1.2.0-beta4',
    '1.2.0-beta5',
    '1.2.0-beta6',
    '1.3.0-beta1',
    '1.3.0-beta2',
    '1.3.0-beta3',
    '1.3.0-beta4',
    '1.3.0-beta5',
    '1.3.0-beta6',
    '1.3.0-beta7',
    '1.3.0-beta8',
    '1.3.0-beta9',
    '1.3.1-beta1',
    '1.3.1-beta2',
    '1.3.1-beta3',
    '1.3.1-beta4',
    '1.3.1-beta5',
    '1.3.1-beta6',
    '1.3.1-beta7',
    '1.3.1-beta8',
    '1.3.1-beta9',
    '1.3.2-beta1',
    '1.3.2-beta2',
    '1.3.2-beta3',
    '1.3.2-beta4',
    '1.3.2-beta5',
    '1.3.2-beta6',
    '1.3.2-beta7',
    '1.3.2-beta8',
    '1.3.2-beta9',
    '1.3.3-beta1',
    '1.3.3-beta2',
    '1.3.4',
    '1.3.5',
    '1.3.6',
    '1.3.7',
    '1.4.0-beta1',
    '1.4.0-beta10',
    '1.4.0-beta2',
    '1.4.0-beta3',
    '1.4.0-beta4',
    '1.4.0-beta5',
    '1.4.0-beta6',
    '1.4.0-beta7',
    '1.4.0-beta8',
    '1.4.0-beta9',
    '1.4.1-beta1',
    '1.4.2',
    '1.4.3',
    '1.4.4',
    '1.4.5',
    '1.4.6',
    '1.4.7',
    '1.4.8',
    '1.4.9',
    '1.4.10',
    '1.4.11',
    '1.4.12',
    '1.4.13',
    '1.4.14',
    '1.4.15',
    '1.5.0',
    '1.5.1',
    '1.5.2',
    '1.5.3',
    '1.6.0',
    '1.7.0',
    '1.7.1',
    '1.7.2',
    '1.7.3',
    '1.8.0',
    '1.8.1',
    '1.8.2',
    '1.8.3',
    '1.8.4',
    '1.8.5',
    '1.8.6',
    '1.8.7',
    '1.8.8',
    '1.8.9',
    '1.8.10',
    '1.8.11',
    '1.9.0',
    '1.9.1',
    '1.9.2',
    '1.9.3',
    '1.9.4',
    '1.9.5',
    '1.9.6',
    '1.9.7',
    '1.9.8',
    '1.9.9',
    '1.9.10',
    '1.9.11',
    '1.9.12',
    '1.9.13',
    '1.10.0',
    '1.10.1',
    '1.10.2',
    '1.10.3',
    '1.10.4',
    '1.10.5',
    '1.11.0',
    '1.12.0',
    '1.12.1',
    '1.12.2',
    '1.12.3',
    '1.12.4',
    '1.12.5',
    '1.12.6',
    '1.12.7',
    '1.12.8',
    '1.12.9',
    '1.12.10',
    '1.12.11',
    '1.12.12',
    '1.12.13',
    '1.12.14',
    '1.12.15',
    '1.13.0',
    '1.13.1',
    '1.13.2',
    '1.13.3',
    '1.14.0',
    '1.15.0',
    '2.0.0-beta',
    '2.0.1-beta',
    '2.0.2-beta',
    '2.0.4-beta',
    '2.0.5-beta',
    '2.0.6-beta',
    '2.0.7-beta',
    '2.1.0-beta.0',
    '2.1.0-beta.1',
    '2.1.0-beta.2',
    '2.1.0-beta.3',
    '2.1.0-beta.4',
    '2.1.0-beta.5',
    '2.1.0-beta.6',
    '2.1.0-beta.7',
    '2.1.0-beta.8',
    '2.1.0-beta.9',
    '2.1.0-beta.10',
    '2.1.0-beta.11',
    '2.1.0-beta.12',
    '2.1.0-beta.13',
    '2.1.0-beta.14',
    '2.1.0-beta.15',
    '2.1.0-beta.16',
    '2.1.0-beta.17',
    '2.1.0-beta.18',
    '2.1.0-beta.19',
    '2.1.0-beta.20',
    '2.1.0-beta.21',
    '2.1.0-beta.22',
    '2.1.0-beta.23',
    '2.1.0-beta.24',
    '2.1.0-beta.25',
    '2.1.0-beta.26',
    '2.1.0-beta.27',
    '2.1.0-beta.28',
    '2.2.0-rc.0',
    '2.2.0-rc.1',
    '2.2.0-rc.2',
    '2.2.0-rc.3',
    '2.2.0-rc.4',
    '2.2.0-rc.5',
    '2.2.0-rc.6',
    '2.2.0-rc.7',
    '2.2.0-rc.8',
    '2.2.0',
    '2.2.1',
    '2.3.0',
    '2.3.1',
    '2.3.2',
    '2.3.3',
    '2.4.0',
    '2.4.1',
    '2.5.0',
    '2.5.1',
    '2.6.0',
    '2.6.1',
    '2.7.0',
    '3.0.0-rc.0',
    '3.0.0-rc.1',
    '3.0.0-rc.2',
    '3.0.0',
    '3.1.0',
    '3.2.0',
    '3.3.0',
    '3.4.0',
    '3.4.1',
    '3.5.0',
    '3.5.1',
    '3.5.2',
    '3.5.3',
    '3.5.4',
    '3.5.5',
    '3.5.6',
    '3.6.0',
    '3.7.0',
    '3.7.1',
    '3.8.0',
    '3.8.1',
    '3.9.0',
    '3.9.1',
    '3.10.0',
    '3.11.0',
    '3.12.0',
    '4.0.0-alpha.0',
    '4.0.0-alpha.1',
    '4.0.0-alpha.2',
    '4.0.0-alpha.3',
    '4.0.0-alpha.4',
    '4.0.0-alpha.5',
    '4.0.0-beta.0',
    '4.0.0-beta.1',
    '4.0.0-beta.2',
    '4.0.0-beta.3',
    '4.0.0',
    '4.0.1',
    '4.1.0',
    '4.1.1',
    '4.2.0',
    '4.3.0',
    '4.4.0',
    '4.4.1',
    '4.5.0',
    '4.6.0',
    '4.7.0',
    '4.8.0',
    '4.8.1',
    '4.8.2',
    '4.8.3',
    '4.9.0',
    '4.9.1',
    '4.9.2',
    '4.10.0',
    '4.10.1',
    '4.10.2',
    '4.11.0',
    '4.11.1',
    '4.12.0',
    '4.12.1',
    '4.12.2',
    '4.13.0',
    '4.14.0',
    '4.15.0',
    '4.15.1',
    '4.16.0',
    '4.16.1',
    '4.16.2',
    '4.16.3',
    '4.16.4',
    '4.16.5',
    '4.17.0',
    '4.17.1',
    '4.17.2',
    '4.17.3',
    '4.18.0',
    '4.18.1',
    '4.19.0',
    '4.19.1',
    '4.20.0',
    '4.20.1',
    '4.20.2',
    '4.21.0',
    '4.22.0',
    '4.23.0',
    '4.23.1',
    '4.24.0',
    '4.25.0',
    '4.25.1',
    '4.26.0',
    '4.26.1',
    '4.27.0',
    '4.27.1',
    '4.28.0',
    '4.28.1',
    '4.28.2',
    '4.28.3',
    '4.28.4',
    '4.29.0',
    '4.29.1',
    '4.29.2',
    '4.29.3',
    '4.29.4',
    '4.29.5',
    '4.29.6',
    '4.30.0',
    '4.31.0',
    '4.32.0',
    '4.32.1',
    '4.32.2',
    '4.33.0',
    '4.34.0',
    '4.35.0',
    '4.35.1',
    '4.35.2',
    '4.35.3',
    '4.36.0',
    '4.36.1',
    '4.37.0',
    '4.38.0',
    '4.39.0',
    '4.39.1',
    '4.39.2',
    '4.39.3',
    '4.40.0',
    '4.40.1',
    '4.40.2',
    '4.40.3',
    '4.41.0',
    '4.41.1',
    '4.41.2',
    '5.0.0-alpha.0',
    '5.0.0-alpha.1',
    '5.0.0-alpha.2',
    '5.0.0-alpha.3',
    '5.0.0-alpha.4',
    '5.0.0-alpha.5',
    '5.0.0-alpha.6',
    '5.0.0-alpha.7',
    '5.0.0-alpha.8',
    '5.0.0-alpha.9',
    '5.0.0-alpha.10',
    '5.0.0-alpha.11',
    '5.0.0-alpha.12',
    '5.0.0-alpha.13',
    '5.0.0-alpha.14',
    '5.0.0-alpha.15',
    '5.0.0-alpha.16',
    '5.0.0-alpha.17',
    '5.0.0-alpha.18',
    '5.0.0-alpha.19',
    '5.0.0-alpha.20',
    '5.0.0-alpha.21',
    '5.0.0-alpha.22',
    '5.0.0-alpha.23',
    '5.0.0-alpha.24',
    '5.0.0-alpha.25',
    '5.0.0-alpha.26',
    '5.0.0-alpha.27',
    '5.0.0-alpha.28',
    '5.0.0-alpha.29',
    '5.0.0-alpha.30',
    '5.0.0-alpha.31',
    '5.0.0-alpha.32',
    '5.0.0-beta.0',
    '5.0.0-beta.1',
    '5.0.0-beta.2'
  ],
  maintainers: [
    {
      name: 'jhnns',
      email: '[email protected]'
    },
    {
      name: 'sokra',
      email: '[email protected]'
    },
    {
      name: 'thelarkinn',
      email: '[email protected]'
    }
  ],
  time: {
    modified: '2019-10-31T07:11:28.969Z',
    created: '2012-03-11T20:59:59.339Z',
    '0.1.0': '2012-03-11T21:00:02.365Z',
    '0.1.1': '2012-03-11T21:16:34.415Z',
    '0.1.2': '2012-03-11T21:27:43.440Z',
    '0.1.3': '2012-03-11T21:44:13.850Z',
    '0.1.4': '2012-03-11T21:45:22.067Z',
    '0.1.5': '2012-03-11T23:31:13.060Z',
    '0.1.6': '2012-03-12T17:12:48.784Z',
    '0.2.0': '2012-03-14T20:16:08.384Z',
    '0.2.1': '2012-03-14T23:05:47.972Z',
    '0.2.2': '2012-03-14T23:22:14.032Z',
    '0.2.3': '2012-03-15T13:39:31.580Z',
    '0.2.4': '2012-03-15T22:02:00.102Z',
    '0.2.6': '2012-03-19T19:04:30.034Z',
    '0.2.7': '2012-03-19T19:13:50.038Z',
    '0.2.8': '2012-03-26T12:49:43.064Z',
    '0.3.0': '2012-04-03T14:27:58.763Z',
    '0.3.1': '2012-04-06T10:41:46.840Z',
    '0.3.2': '2012-04-07T02:14:30.610Z',
    '0.3.3': '2012-04-07T19:54:37.157Z',
    '0.3.4': '2012-04-07T19:57:08.775Z',
    '0.3.6': '2012-05-01T14:00:01.903Z',
    '0.3.7': '2012-05-01T14:10:03.818Z',
    '0.3.8': '2012-05-01T15:48:21.096Z',
    '0.3.9': '2012-05-01T19:37:27.023Z',
    '0.3.10': '2012-05-02T12:08:56.389Z',
    '0.3.11': '2012-05-02T12:17:59.809Z',
    '0.3.12': '2012-05-02T22:30:38.037Z',
    '0.3.13': '2012-05-04T14:42:56.290Z',
    '0.3.14': '2012-05-07T07:03:24.437Z',
    '0.3.15': '2012-05-07T19:36:47.241Z',
    '0.3.16': '2012-05-12T14:44:49.505Z',
    '0.3.17': '2012-05-12T15:30:49.662Z',
    '0.3.18': '2012-05-13T14:19:25.532Z',
    '0.3.19': '2012-05-13T14:27:15.412Z',
    '0.3.20': '2012-05-13T14:37:55.743Z',
    '0.4.0': '2012-05-13T21:08:03.547Z',
    '0.4.1': '2012-05-14T20:57:48.198Z',
    '0.4.2': '2012-05-17T10:47:46.304Z',
    '0.4.3': '2012-05-17T21:34:51.938Z',
    '0.4.4': '2012-05-17T23:16:19.263Z',
    '0.4.5': '2012-05-20T22:09:56.598Z',
    '0.4.6': '2012-05-20T22:17:06.147Z',
    '0.4.7': '2012-05-21T20:59:55.493Z',
    '0.4.8': '2012-05-25T22:51:12.794Z',
    '0.4.9': '2012-06-29T20:56:41.076Z',
    '0.4.10': '2012-07-01T14:56:03.506Z',
    '0.4.11': '2012-07-04T09:50:46.307Z',
    '0.4.12': '2012-07-06T15:14:38.532Z',
    '0.4.13': '2012-07-10T17:37:19.023Z',
    '0.4.14': '2012-07-10T18:59:14.884Z',
    '0.4.15': '2012-07-10T22:00:27.692Z',
    '0.4.16': '2012-07-11T00:15:48.205Z',
    '0.4.17': '2012-07-11T10:18:47.738Z',
    '0.4.18': '2012-07-11T10:27:08.725Z',
    '0.4.19': '2012-07-11T15:54:06.072Z',
    '0.4.20': '2012-07-16T05:15:12.416Z',
    '0.4.21': '2012-07-17T11:35:23.729Z',
    '0.4.23': '2012-07-30T15:27:31.827Z',
    '0.4.24': '2012-08-05T19:52:33.718Z',
    '0.4.25': '2012-08-06T16:24:31.170Z',
    '0.5.0': '2012-08-06T20:20:01.014Z',
    '0.5.1': '2012-08-06T20:33:29.813Z',
    '0.5.2': '2012-08-07T18:54:49.051Z',
    '0.5.3': '2012-08-07T19:40:18.736Z',
    '0.5.4': '2012-08-07T20:52:38.281Z',
    '0.5.5': '2012-08-07T21:38:28.797Z',
    '0.5.6': '2012-08-07T21:41:37.642Z',
    '0.5.7': '2012-08-07T21:42:42.374Z',
    '0.5.8': '2012-08-08T18:28:20.889Z',
    '0.5.10': '2012-08-09T09:58:04.161Z',
    '0.6.0': '2012-08-23T18:03:58.457Z',
    '0.6.1': '2012-08-29T13:16:51.403Z',
    '0.6.2': '2012-09-18T16:38:38.248Z',
    '0.7.0-beta': '2012-09-25T15:00:40.075Z',
    '0.7.0-beta2': '2012-09-25T15:04:41.398Z',
    '0.7.0-beta3': '2012-09-25T17:23:27.618Z',
    '0.7.0-beta4': '2012-09-26T10:28:42.589Z',
    '0.7.0-beta5': '2012-09-26T11:02:44.206Z',
    '0.7.0-beta6': '2012-09-26T11:40:20.715Z',
    '0.7.0-beta7': '2012-09-26T12:06:53.666Z',
    '0.7.0-beta8': '2012-10-02T14:28:21.821Z',
    '0.7.0': '2012-10-08T20:39:56.694Z',
    '0.7.1': '2012-10-08T21:35:57.043Z',
    '0.7.2': '2012-10-08T21:47:34.107Z',
    '0.7.3': '2012-10-20T13:31:01.108Z',
    '0.7.4': '2012-10-21T21:34:58.712Z',
    '0.7.5': '2012-10-21T21:38:54.865Z',
    '0.7.6': '2012-10-25T22:48:08.684Z',
    '0.7.7': '2012-10-25T23:41:29.754Z',
    '0.7.8': '2012-10-26T08:55:54.905Z',
    '0.7.9': '2012-10-26T13:08:06.948Z',
    '0.7.11': '2012-10-28T22:12:42.885Z',
    '0.7.12': '2012-10-30T20:17:14.273Z',
    '0.7.13': '2012-11-05T08:15:09.737Z',
    '0.7.14': '2012-11-05T08:24:41.565Z',
    '0.7.15': '2012-11-05T08:34:32.600Z',
    '0.7.16': '2012-11-05T08:38:30.200Z',
    '0.7.17': '2012-11-06T14:29:21.369Z',
    '0.8.0-beta1': '2012-11-07T11:13:45.635Z',
    '0.8.0-beta2': '2012-11-10T10:23:25.539Z',
    '0.8.0-beta3': '2012-11-11T10:42:28.531Z',
    '0.8.0-beta4': '2012-11-13T10:49:34.127Z',
    '0.8.0': '2012-11-14T19:48:35.225Z',
    '0.8.2': '2013-01-07T18:47:51.509Z',
    '0.8.3': '2013-01-21T08:07:00.568Z',
    '0.9.0-beta1': '2013-02-01T07:51:11.747Z',
    '0.9.0-beta2': '2013-02-01T08:08:59.777Z',
    '0.9.0-beta3': '2013-02-01T09:44:13.748Z',
    '0.9.0-beta4': '2013-02-04T09:45:53.345Z',
    '0.9.0-beta5': '2013-02-04T11:33:03.793Z',
    '0.9.0-beta6': '2013-02-04T12:15:12.131Z',
    '0.9.0-beta7': '2013-02-04T12:58:04.442Z',
    '0.9.0-beta8': '2013-02-04T13:43:14.688Z',
    '0.9.0-beta9': '2013-02-04T13:47:23.889Z',
    '0.9.0-beta10': '2013-02-04T14:58:51.354Z',
    '0.9.0-beta11': '2013-02-05T10:06:50.733Z',
    '0.9.0-beta12': '2013-02-10T23:31:19.801Z',
    '0.9.0-beta13': '2013-02-10T23:37:16.163Z',
    '0.9.0-beta14': '2013-02-11T09:59:40.955Z',
    '0.9.0-beta15': '2013-02-11T10:09:12.083Z',
    '0.9.0-beta16': '2013-02-11T10:27:44.564Z',
    '0.9.0-beta17': '2013-02-11T11:02:06.407Z',
    '0.9.0-beta18': '2013-02-13T10:58:20.973Z',
    '0.9.0-beta19': '2013-02-13T12:13:09.758Z',
    '0.9.0-beta20': '2013-02-13T14:02:54.817Z',
    '0.9.0-beta21': '2013-02-13T15:58:36.692Z',
    '0.9.0-beta22': '2013-02-15T16:06:41.461Z',
    '0.9.0-beta23': '2013-02-17T09:30:49.937Z',
    '0.9.0-beta24': '2013-02-19T10:12:47.195Z',
    '0.9.0-beta25': '2013-02-19T11:48:39.605Z',
    '0.9.0-beta26': '2013-02-20T19:56:31.833Z',
    '0.9.0-beta27': '2013-02-22T16:02:28.438Z',
    '0.9.0-beta28': '2013-02-24T01:06:28.959Z',
    '0.9.0-beta29': '2013-02-25T10:35:37.913Z',
    '0.9.0-beta30': '2013-02-25T11:59:44.025Z',
    '0.9.0-beta31': '2013-02-25T17:19:16.219Z',
    '0.9.0-beta32': '2013-02-26T12:33:12.247Z',
    '0.9.0-beta33': '2013-02-26T12:56:48.286Z',
    '0.9.0-beta34': '2013-02-26T13:06:09.282Z',
    '0.9.0-beta35': '2013-02-27T07:00:47.804Z',
    '0.9.0-beta36': '2013-03-01T13:59:52.956Z',
    '0.9.0-beta37': '2013-03-01T14:03:35.606Z',
    '0.9.0-beta38': '2013-03-05T10:10:26.113Z',
    '0.9.0': '2013-03-11T11:20:11.166Z',
    '0.9.1': '2013-03-13T10:40:30.315Z',
    '0.9.2': '2013-03-14T13:52:16.052Z',
    '0.9.3': '2013-03-19T06:57:32.638Z',
    '0.10.0-beta2': '2013-03-26T17:22:59.370Z',
    '0.10.0-beta3': '2013-03-27T08:26:16.018Z',
    '0.10.0-beta5': '2013-04-02T07:14:47.951Z',
    '0.10.0-beta6': '2013-05-08T13:07:43.526Z',
    '0.10.0-beta7': '2013-05-09T16:19:23.777Z',
    '0.10.0-beta8': '2013-05-12T20:35:44.339Z',
    '0.10.0-beta9': '2013-05-12T20:44:30.908Z',
    '0.10.0-beta10': '2013-05-12T21:16:08.754Z',
    '0.10.0-beta11': '2013-05-13T11:34:58.332Z',
    '0.10.0-beta12': '2013-05-13T12:26:13.692Z',
    '0.10.0-beta13': '2013-05-13T14:04:57.051Z',
    '0.10.0-beta14': '2013-05-14T12:00:19.253Z',
    '0.10.0-beta15': '2013-05-18T13:30:40.992Z',
    '0.10.0-beta16': '2013-05-20T23:50:07.057Z',
    '0.10.0-beta17': '2013-05-22T08:31:14.473Z',
    '0.10.0-beta18': '2013-05-31T13:30:23.079Z',
    '0.10.0-beta19': '2013-06-10T12:27:34.552Z',
    '0.10.0-beta20': '2013-06-12T14:17:50.497Z',
    '0.10.0-beta21': '2013-06-14T13:15:29.165Z',
    '0.10.0-beta22': '2013-06-14T13:42:58.520Z',
    '0.10.0-beta23': '2013-06-15T15:32:48.796Z',
    '0.10.0-beta24': '2013-06-17T16:55:50.662Z',
    '0.10.0-beta25': '2013-06-19T09:56:20.622Z',
    '0.10.0': '2013-06-19T11:54:00.022Z',
    '0.11.0-beta1': '2013-06-19T11:55:09.195Z',
    '0.11.0-beta2': '2013-06-19T20:32:43.392Z',
    '0.11.0-beta3': '2013-06-20T10:06:30.472Z',
    '0.11.0-beta4': '2013-06-20T14:33:43.710Z',
    '0.11.0-beta5': '2013-06-23T20:19:56.194Z',
    '0.11.0-beta6': '2013-07-01T12:00:43.116Z',
    '0.11.0-beta7': '2013-07-01T12:11:12.730Z',
    '0.11.0-beta8': '2013-07-04T10:12:23.990Z',
    '0.11.0-beta9': '2013-07-04T12:09:35.413Z',
    '0.11.0-beta10': '2013-07-05T12:18:50.844Z',
    '0.11.0-beta11': '2013-07-05T12:57:59.630Z',
    '0.11.0-beta12': '2013-07-08T06:12:52.855Z',
    '0.11.0-beta13': '2013-07-10T21:21:08.480Z',
    '0.11.0-beta14': '2013-07-10T22:19:39.174Z',
    '0.11.0-beta15': '2013-07-24T18:51:47.977Z',
    '0.11.0-beta16': '2013-08-06T08:31:52.207Z',
    '0.11.0-beta17': '2013-09-13T09:18:50.984Z',
    '0.11.0-beta18': '2013-09-14T09:51:26.420Z',
    '0.11.0-beta19': '2013-09-24T13:26:06.538Z',
    '0.11.0-beta20': '2013-10-11T08:43:22.563Z',
    '0.11.0-beta21': '2013-10-11T09:10:50.726Z',
    '0.11.0-beta22': '2013-10-12T22:37:12.967Z',
    '0.11.0-beta23': '2013-10-14T12:00:34.892Z',
    '0.11.0-beta24': '2013-10-14T12:21:01.490Z',
    '0.11.0-beta25': '2013-10-14T16:51:57.872Z',
    '0.11.0-beta26': '2013-10-14T17:29:27.851Z',
    '0.11.0-beta27': '2013-10-14T22:34:43.067Z',
    '0.11.0-beta28': '2013-10-15T20:35:05.126Z',
    '0.11.0-beta29': '2013-10-29T13:40:03.256Z',
    '0.11.0': '2013-10-30T23:52:11.897Z',
    '0.11.1': '2013-11-03T14:29:32.886Z',
    '0.11.2': '2013-11-03T14:46:11.539Z',
    '0.11.3': '2013-11-05T18:03:36.084Z',
    '0.11.4': '2013-11-06T08:02:52.557Z',
    '0.11.5': '2013-11-06T08:28:58.819Z',
    '0.11.6': '2013-11-08T08:01:40.933Z',
    '0.11.7': '2013-11-26T15:20:49.652Z',
    '0.11.8': '2013-11-27T12:39:10.094Z',
    '0.11.9': '2013-11-27T22:54:09.402Z',
    '0.11.10': '2013-12-03T10:53:45.596Z',
    '0.11.11': '2013-12-03T22:35:57.069Z',
    '0.11.12': '2013-12-11T07:45:31.017Z',
    '0.11.13': '2013-12-13T08:48:42.376Z',
    '0.11.14': '2013-12-15T22:57:24.004Z',
    '0.11.15': '2013-12-16T23:58:35.044Z',
    '1.0.0-beta1': '2013-12-17T22:23:44.975Z',
    '1.0.0-beta2': '2013-12-19T22:26:49.880Z',
    '1.0.0-beta3': '2013-12-29T11:11:52.150Z',
    '1.0.0-beta4': '2013-12-29T11:22:51.610Z',
    '0.11.16': '2013-12-29T11:25:59.055Z',
    '0.11.17': '2013-12-31T11:27:02.756Z',
    '0.11.18': '2013-12-31T11:44:02.062Z',
    '1.0.0-beta5': '2014-01-08T18:24:49.681Z',
    '1.0.0-beta6': '2014-01-10T09:49:45.707Z',
    '1.0.0-beta7': '2014-01-21T15:25:24.906Z',
    '1.0.0-beta8': '2014-01-24T12:34:00.477Z',
    '1.0.0-beta9': '2014-01-31T13:15:50.449Z',
    '1.0.0-rc1': '2014-02-03T17:21:26.637Z',
    '1.0.0-rc2': '2014-02-05T11:05:35.578Z',
    '1.0.0-rc3': '2014-02-05T11:38:10.812Z',
    '1.0.0-rc4': '2014-02-11T11:25:28.743Z',
    '1.0.0-rc5': '2014-02-11T12:37:10.226Z',
    '1.0.0-rc7': '2014-02-12T13:54:06.966Z',
    '1.0.0-rc8': '2014-02-13T10:42:53.373Z',
    '1.0.0-rc9': '2014-02-14T08:51:29.505Z',
    '1.0.0-rc10': '2014-02-14T09:00:44.632Z',
    '1.0.0-rc11': '2014-02-14T11:46:47.641Z',
    '1.0.0-rc12': '2014-02-15T10:50:53.694Z',
    '1.0.0': '2014-02-19T22:10:24.479Z',
    '1.0.1': '2014-02-24T14:09:46.602Z',
    '1.0.2': '2014-02-27T08:11:31.434Z',
    '1.0.3': '2014-02-27T08:20:06.636Z',
    '1.0.4': '2014-03-01T12:39:14.482Z',
    '1.0.5': '2014-03-01T19:12:48.559Z',
    '1.1.0-beta1': '2014-03-03T14:22:51.445Z',
    '1.1.0-beta2': '2014-03-05T19:11:36.961Z',
    '1.1.0-beta3': '2014-03-07T16:10:34.185Z',
    '1.1.0-beta4': '2014-03-10T13:01:09.800Z',
    '1.1.0-beta5': '2014-03-11T16:05:52.781Z',
    '1.1.0-beta6': '2014-03-11T17:47:02.199Z',
    '1.1.0-beta7': '2014-03-12T21:31:39.908Z',
    '1.1.0-beta8': '2014-03-12T22:06:32.925Z',
    '1.1.0-beta9': '2014-03-18T21:47:57.067Z',
    '1.1.0-beta10': '2014-03-19T21:17:59.744Z',
    '1.1.0-beta12': '2014-03-21T15:25:33.608Z',
    '1.1.0': '2014-03-25T15:11:57.208Z',
    '1.1.1': '2014-03-31T06:50:23.163Z',
    '1.1.2': '2014-03-31T09:33:59.811Z',
    '1.1.3': '2014-04-03T17:48:02.034Z',
    '1.1.4': '2014-04-05T16:12:51.095Z',
    '1.1.5': '2014-04-09T07:13:17.868Z',
    '1.1.6': '2014-04-17T06:42:15.390Z',
    '1.1.7': '2014-04-17T07:57:01.056Z',
    '1.1.8': '2014-04-19T19:42:19.750Z',
    '1.1.9': '2014-05-08T07:35:04.495Z',
    '1.1.10': '2014-05-08T16:45:27.070Z',
    '1.1.11': '2014-05-16T23:01:39.271Z',
    '1.2.0-beta1': '2014-05-21T06:09:01.608Z',
    '1.2.0-beta2': '2014-05-21T16:34:10.663Z',
    '1.2.0-beta4': '2014-05-26T10:48:02.528Z',
    '1.2.0-beta5': '2014-05-26T21:56:16.355Z',
    '1.2.0-beta6': '2014-05-27T09:56:18.921Z',
    '1.3.0-beta1': '2014-06-02T22:20:58.957Z',
    '1.3.0-beta2': '2014-06-03T06:47:30.841Z',
    '1.3.0-beta3': '2014-06-04T06:55:21.575Z',
    '1.3.0-beta4': '2014-06-04T19:15:10.882Z',
    '1.3.0-beta5': '2014-06-05T17:56:32.317Z',
    '1.3.0-beta6': '2014-06-11T20:30:07.762Z',
    '1.3.0-beta7': '2014-06-11T21:01:56.693Z',
    '1.3.0-beta8': '2014-06-12T04:35:12.746Z',
    '1.3.0-beta9': '2014-06-17T20:40:38.990Z',
    '1.3.1-beta1': '2014-06-17T20:46:27.053Z',
    '1.3.1-beta2': '2014-06-18T09:19:00.221Z',
    '1.3.1-beta3': '2014-06-18T21:03:35.560Z',
    '1.3.1-beta4': '2014-06-23T22:46:35.060Z',
    '1.3.1-beta5': '2014-07-02T22:02:11.594Z',
    '1.3.1-beta6': '2014-07-04T11:02:07.855Z',
    '1.3.1-beta7': '2014-07-07T11:22:01.959Z',
    '1.3.1-beta8': '2014-07-09T11:37:14.318Z',
    '1.3.1-beta9': '2014-07-16T18:57:25.915Z',
    '1.3.2-beta1': '2014-07-17T00:06:22.116Z',
    '1.3.2-beta2': '2014-07-18T11:34:55.553Z',
    '1.3.2-beta3': '2014-07-19T12:35:08.419Z',
    '1.3.2-beta4': '2014-07-23T12:41:31.655Z',
    '1.3.2-beta5': '2014-07-24T13:07:40.156Z',
    '1.3.2-beta6': '2014-07-24T15:54:43.129Z',
    '1.3.2-beta7': '2014-07-26T12:48:53.406Z',
    '1.3.2-beta8': '2014-07-26T15:53:33.201Z',
    '1.3.2-beta9': '2014-07-28T22:16:13.672Z',
    '1.3.3-beta1': '2014-08-03T19:36:32.713Z',
    '1.3.3-beta2': '2014-08-14T09:33:13.272Z',
    '1.3.4': '2014-08-25T08:21:04.321Z',
    '1.3.5': '2014-08-25T08:44:05.027Z',
    '1.3.6': '2014-08-25T11:37:28.806Z',
    '1.3.7': '2014-08-25T14:34:20.754Z',
    '1.4.0-beta1': '2014-08-27T15:19:52.742Z',
    '1.4.0-beta2': '2014-08-29T14:07:07.703Z',
    '1.4.0-beta3': '2014-09-03T12:16:23.569Z',
    '1.4.0-beta4': '2014-09-07T20:56:49.610Z',
    '1.4.0-beta5': '2014-09-10T12:08:56.832Z',
    '1.4.0-beta6': '2014-09-11T18:22:16.353Z',
    '1.4.0-beta7': '2014-09-15T11:25:44.687Z',
    '1.4.0-beta8': '2014-09-15T11:32:43.831Z',
    '1.4.0-beta9': '2014-09-16T17:35:26.891Z',
    '1.4.0-beta10': '2014-09-17T21:25:43.188Z',
    '1.4.1-beta1': '2014-09-19T06:12:47.347Z',
    '1.4.2': '2014-09-22T21:49:46.951Z',
    '1.4.3': '2014-09-23T06:43:16.403Z',
    '1.4.4': '2014-09-26T06:57:10.040Z',
    '1.4.5': '2014-10-07T13:57:41.522Z',
    '1.4.6': '2014-10-12T10:31:54.563Z',
    '1.4.7': '2014-10-13T14:11:59.657Z',
    '1.4.8': '2014-10-16T20:33:25.489Z',
    '1.4.9': '2014-10-26T10:21:48.344Z',
    '1.4.10': '2014-10-31T11:48:39.646Z',
    '1.4.11': '2014-11-02T12:20:58.152Z',
    '1.4.12': '2014-11-03T07:11:51.300Z',
    '1.4.13': '2014-11-05T23:29:44.349Z',
    '1.4.14': '2014-12-22T14:31:39.357Z',
    '1.4.15': '2014-12-28T00:29:30.387Z',
    '1.5.0': '2015-01-17T22:46:44.990Z',
    '1.5.1': '2015-01-17T23:54:28.223Z',
    '1.5.2': '2015-01-21T19:29:03.495Z',
    '1.5.3': '2015-01-21T19:31:42.679Z',
    '1.6.0': '2015-02-23T22:10:34.397Z',
    '1.7.0': '2015-03-03T19:43:43.031Z',
    '1.7.1': '2015-03-03T22:43:42.033Z',
    '1.7.2': '2015-03-04T06:47:19.353Z',
    '1.7.3': '2015-03-11T22:51:49.669Z',
    '1.8.0': '2015-04-07T13:20:46.737Z',
    '1.8.1': '2015-04-08T06:11:29.956Z',
    '1.8.2': '2015-04-08T13:12:36.467Z',
    '1.8.3': '2015-04-09T22:26:11.707Z',
    '1.8.4': '2015-04-10T08:24:24.421Z',
    '1.8.5': '2015-04-17T08:27:02.983Z',
    '1.8.6': '2015-04-20T17:50:26.565Z',
    '1.8.7': '2015-04-20T18:51:34.454Z',
    '1.8.8': '2015-04-21T06:38:54.952Z',
    '1.8.9': '2015-04-21T21:34:41.882Z',
    '1.8.10': '2015-04-26T20:51:12.910Z',
    '1.8.11': '2015-04-29T10:49:50.503Z',
    '1.9.0': '2015-05-10T10:25:48.445Z',
    '1.9.1': '2015-05-10T11:53:57.494Z',
    '1.9.2': '2015-05-10T12:37:50.530Z',
    '1.9.3': '2015-05-10T14:44:34.472Z',
    '1.9.4': '2015-05-10T16:46:07.011Z',
    '1.9.5': '2015-05-12T19:21:47.573Z',
    '1.9.6': '2015-05-15T15:25:00.998Z',
    '1.9.7': '2015-05-17T17:18:42.520Z',
    '1.9.8': '2015-05-21T22:17:12.137Z',
    '1.9.9': '2015-05-24T07:35:38.008Z',
    '1.9.10': '2015-05-25T19:02:29.248Z',
    '1.9.11': '2015-06-14T10:05:32.043Z',
    '1.9.12': '2015-06-24T21:24:53.128Z',
    '1.9.13': '2015-06-27T09:38:27.187Z',
    '1.10.0': '2015-06-27T20:51:11.796Z',
    '1.10.1': '2015-07-02T13:26:16.478Z',
    '1.10.2': '2015-07-22T20:43:30.878Z',
    '1.10.3': '2015-07-22T21:53:37.613Z',
    '1.10.4': '2015-07-23T21:04:58.304Z',
    '1.10.5': '2015-07-23T22:04:24.195Z',
    '1.11.0': '2015-08-06T11:31:02.053Z',
    '1.12.0': '2015-08-25T08:44:29.942Z',
    '1.12.1': '2015-09-03T12:27:19.229Z',
    '1.12.2': '2015-09-16T21:13:43.462Z',
    '2.0.0-beta': '2015-11-01T22:49:26.895Z',
    '1.12.3': '2015-11-06T00:11:21.464Z',
    '1.12.4': '2015-11-10T20:29:41.343Z',
    '1.12.5': '2015-11-13T21:26:08.773Z',
    '1.12.6': '2015-11-14T08:30:21.486Z',
    '1.12.7': '2015-11-20T19:33:31.162Z',
    '1.12.8': '2015-11-20T20:33:11.445Z',
    '1.12.9': '2015-11-24T07:10:18.190Z',
    '2.0.1-beta': '2015-11-24T07:31:45.679Z',
    '2.0.2-beta': '2015-12-22T11:54:13.341Z',
    '1.12.10': '2016-01-06T19:30:18.689Z',
    '1.12.11': '2016-01-11T18:15:01.443Z',
    '2.0.3-beta': '2016-01-21T18:18:08.548Z',
    '2.0.4-beta': '2016-01-21T18:20:09.285Z',
    '1.12.12': '2016-01-23T12:50:31.115Z',
    '2.0.5-beta': '2016-01-26T17:20:53.977Z',
    '2.0.6-beta': '2016-01-30T12:24:29.216Z',
    '2.0.7-beta': '2016-02-04T13:48:02.251Z',
    '1.12.13': '2016-02-04T14:42:30.738Z',
    '2.1.0-beta.0': '2016-02-22T08:45:09.243Z',
    '2.1.0-beta.1': '2016-02-22T12:30:43.760Z',
    '2.1.0-beta.2': '2016-02-22T14:32:13.672Z',
    '1.12.14': '2016-02-22T22:05:15.190Z',
    '2.1.0-beta.3': '2016-02-22T22:07:26.237Z',
    '2.1.0-beta.4': '2016-02-24T23:09:23.255Z',
    '2.1.0-beta.5': '2016-04-10T22:46:00.897Z',
    '1.12.15': '2016-04-10T22:48:12.861Z',
    '1.13.0': '2016-04-15T13:18:35.147Z',
    '2.1.0-beta.6': '2016-04-21T23:05:28.388Z',
    '2.1.0-beta.7': '2016-05-06T22:01:04.942Z',
    '1.13.1': '2016-05-20T06:48:52.517Z',
    '2.1.0-beta.8': '2016-05-29T18:53:52.233Z',
    '2.1.0-beta.9': '2016-06-04T18:21:38.640Z',
    '2.1.0-beta.10': '2016-06-05T18:20:51.000Z',
    '2.1.0-beta.11': '2016-06-05T18:52:50.405Z',
    '2.1.0-beta.12': '2016-06-05T21:03:11.020Z',
    '2.1.0-beta.13': '2016-06-07T22:26:36.522Z',
    '2.1.0-beta.14': '2016-06-24T00:02:58.360Z',
    '2.1.0-beta.15': '2016-06-28T23:23:52.760Z',
    '2.1.0-beta.16': '2016-07-13T09:12:33.396Z',
    '2.1.0-beta.17': '2016-07-13T12:05:30.210Z',
    '2.1.0-beta.18': '2016-07-15T21:27:18.623Z',
    '2.1.0-beta.19': '2016-07-17T22:49:59.806Z',
    '2.1.0-beta.20': '2016-07-20T22:42:07.260Z',
    '2.1.0-beta.21': '2016-08-17T21:24:19.519Z',
    '1.13.2': '2016-08-18T08:32:08.941Z',
    '2.1.0-beta.22': '2016-09-07T10:48:49.140Z',
    '2.1.0-beta.23': '2016-09-19T23:06:57.711Z',
    '2.1.0-beta.24': '2016-09-20T19:13:48.484Z',
    '2.1.0-beta.25': '2016-09-21T18:31:38.970Z',
    '1.13.3': '2016-10-26T14:23:44.936Z',
    '2.1.0-beta.26': '2016-11-14T00:09:05.610Z',
    '2.1.0-beta.27': '2016-11-15T19:02:00.037Z',
    '1.14.0': '2016-12-07T08:07:03.006Z',
    '2.1.0-beta.28': '2016-12-13T07:59:42.077Z',
    '2.2.0-rc.0': '2016-12-14T21:35:20.511Z',
    '2.2.0-rc.1': '2016-12-17T08:10:03.637Z',
    '2.2.0-rc.2': '2016-12-22T10:52:06.353Z',
    '2.2.0-rc.3': '2016-12-28T15:04:24.599Z',
    '2.2.0-rc.4': '2017-01-11T15:43:11.337Z',
    '2.2.0-rc.5': '2017-01-15T16:24:16.910Z',
    '2.2.0-rc.6': '2017-01-16T02:48:51.761Z',
    '2.2.0-rc.7': '2017-01-16T15:02:29.728Z',
    '2.2.0-rc.8': '2017-01-17T18:46:41.733Z',
    '2.2.0': '2017-01-17T19:58:10.324Z',
    '2.2.1': '2017-01-30T21:13:32.135Z',
    '2.3.0': '2017-03-21T22:43:40.056Z',
    '2.3.1': '2017-03-22T14:41:16.521Z',
    '2.3.2': '2017-03-25T00:02:36.366Z',
    '2.3.3': '2017-04-03T07:51:01.955Z',
    '1.15.0': '2017-04-13T10:20:18.661Z',
    '2.4.0': '2017-04-14T11:44:52.371Z',
    '2.4.1': '2017-04-14T13:47:56.579Z',
    '2.5.0': '2017-05-04T10:17:40.207Z',
    '2.5.1': '2017-05-06T20:07:58.363Z',
    '2.6.0': '2017-05-22T20:45:58.875Z',
    '2.6.1': '2017-05-25T11:16:32.662Z',
    '3.0.0-rc.0': '2017-06-05T14:13:22.131Z',
    '3.0.0-rc.1': '2017-06-07T11:34:42.537Z',
    '3.0.0-rc.2': '2017-06-14T21:46:42.507Z',
    '3.0.0': '2017-06-19T15:37:52.789Z',
    '3.1.0': '2017-07-06T21:57:28.400Z',
    '3.2.0': '2017-07-11T20:17:07.823Z',
    '2.7.0': '2017-07-12T07:00:52.169Z',
    '3.3.0': '2017-07-15T13:53:24.941Z',
    '3.4.0': '2017-07-25T14:28:30.896Z',
    '3.4.1': '2017-07-26T08:49:29.893Z',
    '3.5.0': '2017-08-08T08:50:49.968Z',
    '3.5.1': '2017-08-08T11:26:51.688Z',
    '3.5.2': '2017-08-09T10:52:23.681Z',
    '3.5.3': '2017-08-10T13:39:07.172Z',
    '3.5.4': '2017-08-12T09:16:37.934Z',
    '3.5.5': '2017-08-16T14:56:19.552Z',
    '3.5.6': '2017-09-06T15:42:23.380Z',
    '3.6.0': '2017-09-15T08:46:37.910Z',
    '3.7.0': '2017-10-11T18:08:11.445Z',
    '3.7.1': '2017-10-11T19:40:19.049Z',
    '3.8.0': '2017-10-17T09:16:17.712Z',
    '3.8.1': '2017-10-17T15:22:36.646Z',
    '3.9.0': '2017-11-30T13:54:34.983Z',
    '3.9.1': '2017-11-30T17:11:03.133Z',
    '3.10.0': '2017-12-04T18:03:41.930Z',
    '4.0.0-alpha.0': '2017-12-04T20:11:17.240Z',
    '4.0.0-alpha.1': '2017-12-14T15:09:43.905Z',
    '4.0.0-alpha.2': '2017-12-22T11:51:29.642Z',
    '4.0.0-alpha.3': '2018-01-04T21:25:43.572Z',
    '4.0.0-alpha.4': '2018-01-06T09:47:46.104Z',
    '4.0.0-alpha.5': '2018-01-22T14:20:26.800Z',
    '4.0.0-beta.0': '2018-01-24T22:40:39.433Z',
    '4.0.0-beta.1': '2018-02-10T14:11:06.501Z',
    '3.11.0': '2018-02-10T14:41:42.397Z',
    '4.0.0-beta.2': '2018-02-17T13:14:37.786Z',
    '4.0.0-beta.3': '2018-02-24T14:56:13.075Z',
    '4.0.0': '2018-02-25T02:38:21.375Z',
    '4.0.1': '2018-02-26T20:11:42.320Z',
    '4.1.0': '2018-03-04T10:57:53.732Z',
    '4.1.1': '2018-03-07T16:36:58.894Z',
    '4.2.0': '2018-03-21T08:26:50.354Z',
    '4.3.0': '2018-03-27T09:01:24.855Z',
    '4.4.0': '2018-03-29T14:58:02.182Z',
    '4.4.1': '2018-03-29T15:29:21.308Z',
    '4.5.0': '2018-04-04T13:18:45.033Z',
    '4.6.0': '2018-04-17T16:25:20.710Z',
    '4.7.0': '2018-05-04T12:01:52.630Z',
    '4.8.0': '2018-05-07T11:43:42.678Z',
    '4.8.1': '2018-05-07T21:03:46.219Z',
    '3.12.0': '2018-05-11T14:51:37.064Z',
    '4.8.2': '2018-05-11T16:13:26.202Z',
    '4.8.3': '2018-05-12T20:56:39.541Z',
    '4.9.0': '2018-05-25T20:18:30.039Z',
    '4.9.1': '2018-05-25T21:31:19.440Z',
    '4.9.2': '2018-05-28T20:29:30.540Z',
    '4.10.0': '2018-05-28T23:14:40.577Z',
    '4.10.1': '2018-05-29T13:39:12.393Z',
    '4.10.2': '2018-05-30T08:29:49.476Z',
    '4.11.0': '2018-06-05T11:25:30.238Z',
    '4.11.1': '2018-06-06T07:03:20.957Z',
    '4.12.0': '2018-06-08T07:26:17.710Z',
    '4.12.1': '2018-06-24T08:44:41.956Z',
    '4.12.2': '2018-06-27T05:39:56.075Z',
    '4.13.0': '2018-06-28T15:34:40.395Z',
    '4.14.0': '2018-06-29T12:13:30.881Z',
    '4.15.0': '2018-07-04T19:43:06.788Z',
    '4.15.1': '2018-07-05T13:33:37.748Z',
    '4.16.0': '2018-07-11T08:47:32.065Z',
    '4.16.1': '2018-07-16T08:27:43.203Z',
    '4.16.2': '2018-07-23T09:53:56.981Z',
    '4.16.3': '2018-07-27T10:19:30.934Z',
    '4.16.4': '2018-08-02T13:48:58.763Z',
    '4.16.5': '2018-08-06T07:14:28.690Z',
    '4.17.0': '2018-08-21T08:42:44.226Z',
    '4.17.1': '2018-08-22T09:51:27.412Z',
    '4.17.2': '2018-09-03T17:26:03.247Z',
    '4.17.3': '2018-09-10T14:26:20.068Z',
    '4.18.0': '2018-09-10T15:34:26.617Z',
    '4.18.1': '2018-09-13T10:23:17.249Z',
    '4.19.0': '2018-09-13T22:04:46.122Z',
    '4.19.1': '2018-09-18T07:57:54.644Z',
    '4.20.0': '2018-09-25T07:16:06.902Z',
    '4.20.1': '2018-09-25T13:26:04.913Z',
    '4.20.2': '2018-09-25T20:32:03.867Z',
    '4.21.0': '2018-10-17T17:50:03.697Z',
    '4.22.0': '2018-10-21T09:35:00.321Z',
    '4.23.0': '2018-10-24T15:54:30.111Z',
    '4.23.1': '2018-10-25T08:26:54.221Z',
    '4.24.0': '2018-11-02T12:12:07.928Z',
    '4.25.0': '2018-11-05T08:37:53.260Z',
    '4.25.1': '2018-11-05T18:13:46.054Z',
    '4.26.0': '2018-11-19T08:40:26.862Z',
    '4.26.1': '2018-11-25T20:26:36.939Z',
    '4.27.0': '2018-12-04T09:31:50.996Z',
    '4.27.1': '2018-12-05T19:13:37.999Z',
    '4.28.0': '2018-12-19T12:05:13.690Z',
    '4.28.1': '2018-12-20T17:10:50.646Z',
    '5.0.0-alpha.0': '2018-12-21T14:19:11.958Z',
    '4.28.2': '2018-12-22T12:54:34.354Z',
    '5.0.0-alpha.1': '2018-12-23T20:25:49.509Z',
    '5.0.0-alpha.2': '2018-12-26T10:34:10.238Z',
    '4.28.3': '2018-12-29T11:56:15.139Z',
    '5.0.0-alpha.3': '2018-12-29T17:14:42.610Z',
    '5.0.0-alpha.4': '2019-01-08T14:10:23.509Z',
    '5.0.0-alpha.5': '2019-01-09T14:21:20.149Z',
    '4.28.4': '2019-01-10T15:48:58.106Z',
    '5.0.0-alpha.6': '2019-01-15T16:40:04.618Z',
    '5.0.0-alpha.7': '2019-01-19T12:11:34.375Z',
    '5.0.0-alpha.8': '2019-01-19T19:25:27.131Z',
    '4.29.0': '2019-01-20T17:39:24.910Z',
    '5.0.0-alpha.9': '2019-01-27T12:19:14.611Z',
    '4.29.1': '2019-02-04T17:01:58.192Z',
    '4.29.2': '2019-02-06T14:05:59.781Z',
    '4.29.3': '2019-02-07T08:22:39.541Z',
    '5.0.0-alpha.10': '2019-02-07T08:51:27.381Z',
    '4.29.4': '2019-02-15T15:11:22.879Z',
    '4.29.5': '2019-02-18T10:05:44.512Z',
    '5.0.0-alpha.11': '2019-02-19T10:50:51.346Z',
    '4.29.6': '2019-02-28T09:45:12.829Z',
    '4.30.0': '2019-04-12T20:08:08.632Z',
    '4.31.0': '2019-05-09T07:57:34.358Z',
    '5.0.0-alpha.12': '2019-05-10T22:41:27.093Z',
    '4.32.0': '2019-05-20T09:54:21.482Z',
    '5.0.0-alpha.13': '2019-05-20T12:56:16.999Z',
    '4.32.1': '2019-05-22T06:31:27.278Z',
    '4.32.2': '2019-05-22T23:11:52.486Z',
    '5.0.0-alpha.14': '2019-05-23T07:41:25.823Z',
    '4.33.0': '2019-06-04T19:33:32.464Z',
    '5.0.0-alpha.15': '2019-06-05T16:38:52.415Z',
    '4.34.0': '2019-06-12T23:10:36.043Z',
    '5.0.0-alpha.16': '2019-06-14T13:26:09.333Z',
    '4.35.0': '2019-06-20T04:37:53.914Z',
    '4.35.1': '2019-07-01T09:08:02.123Z',
    '4.35.2': '2019-07-01T09:19:04.599Z',
    '5.0.0-alpha.17': '2019-07-01T10:22:53.650Z',
    '4.35.3': '2019-07-08T13:54:07.743Z',
    '5.0.0-alpha.18': '2019-07-08T20:25:51.913Z',
    '4.36.0': '2019-07-17T11:33:21.422Z',
    '4.36.1': '2019-07-17T13:58:49.686Z',
    '4.37.0': '2019-07-23T09:35:17.774Z',
    '4.38.0': '2019-07-26T07:32:56.493Z',
    '4.39.0': '2019-08-01T15:30:27.774Z',
    '4.39.1': '2019-08-02T12:36:11.469Z',
    '5.0.0-alpha.19': '2019-08-06T14:37:26.622Z',
    '4.39.2': '2019-08-13T17:46:39.844Z',
    '5.0.0-alpha.20': '2019-08-14T08:21:53.507Z',
    '5.0.0-alpha.21': '2019-08-22T19:02:56.811Z',
    '5.0.0-alpha.22': '2019-08-23T13:18:53.289Z',
    '4.39.3': '2019-08-27T12:08:58.392Z',
    '5.0.0-alpha.23': '2019-08-27T17:18:18.433Z',
    '5.0.0-alpha.24': '2019-09-05T12:13:52.422Z',
    '5.0.0-alpha.25': '2019-09-06T13:37:46.162Z',
    '5.0.0-alpha.26': '2019-09-08T20:58:37.761Z',
    '4.40.0': '2019-09-12T18:53:21.203Z',
    '4.40.1': '2019-09-13T07:07:44.925Z',
    '4.40.2': '2019-09-13T14:30:10.364Z',
    '4.40.3': '2019-09-24T15:40:09.668Z',
    '4.41.0': '2019-09-24T15:49:19.627Z',
    '5.0.0-alpha.27': '2019-09-25T22:52:15.422Z',
    '5.0.0-alpha.28': '2019-09-26T21:07:56.823Z',
    '5.0.0-alpha.29': '2019-10-02T06:02:41.486Z',
    '5.0.0-alpha.30': '2019-10-07T14:49:00.658Z',
    '5.0.0-alpha.31': '2019-10-10T20:43:03.155Z',
    '4.41.1': '2019-10-11T11:42:56.278Z',
    '5.0.0-alpha.32': '2019-10-11T12:56:28.623Z',
    '5.0.0-beta.0': '2019-10-11T12:58:37.632Z',
    '4.41.2': '2019-10-15T13:02:37.523Z',
    '5.0.0-beta.1': '2019-10-22T15:57:12.409Z',
    '5.0.0-beta.2': '2019-10-31T07:11:26.567Z'
  },
  author: {
    name: 'Tobias Koppers @sokra'
  },
  users: {
    '6174': true,
    '472967455': true,
    fgribreau: true,
    parroit: true,
    shama: true,
    karolis: true,
    koorchik: true,
    yargalot: true,
    lazd: true,
    timhemming: true,
    risto: true,
    hal9zillion: true,
    ich: true,
    emilstenberg: true,
    jehoshua02: true,
    sobering: true,
    fresheneesz: true,
    tchcxp: true,
    weijarz: true,
    pixel67: true,
    yodairish: true,
    hacfi: true,
    koulmomo: true,
    shiroari: true,
    borjes: true,
    season19840122: true,
    hugov: true,
    leonardorb: true,
    'mr.vingo': true,
    af: true,
    kewah: true,
    oheard: true,
    wfsm: true,
    tobiasalthoff: true,
    gabrielsanterre: true,
    novo: true,
    agtlucas: true,
    buzuli: true,
    itsnotvalid: true,
    snhasani: true,
    drewnull: true,
    mfunkie: true,
    lucasmciruzzi: true,
    tzsiga: true,
    wkaifang: true,
    dmarsh: true,
    m4t7: true,
    taopaic: true,
    aahz: true,
    ugarz: true,
    cypark: true,
    insin: true,
    asawq2006: true,
    sjnnr: true,
    hkbwt_: true,
    evertonrobertoauler: true,
    dasrick: true,
    okmogwai: true,
    boyw165: true,
    klimnikita: true,
    nketchum: true,
    junjiansyu: true,
    wenbing: true,
    fotooo: true,
    sarics: true,
    toplan: true,
    naokie: true,
    'liu-song': true,
    m0a: true,
    dralc: true,
    draganhr: true,
    chrisguerrero: true,
    alectic: true,
    prisme: true,
    crazyjingling: true,
    igreulich: true,
    preco21: true,
    nelix: true,
    hosomichi: true,
    ngtk: true,
    dofy: true,
    josejaguirre: true,
    urbantumbleweed: true,
    leoaee: true,
    aflext: true,
    mbing: true,
    js3692: true,
    lavir: true,
    chinaqstar: true,
    ambdxtrch: true,
    tcrowe: true,
    fatelei: true,
    vwal: true,
    amartelr: true,
    leahcimic: true,
    ikeyan: true,
    saravntbe: true,
    flynntsc: true,
    po: true,
    iroc: true,
    amobiz: true,
    evan2x: true,
    kevinsuttle: true,
    cfleschhut: true,
    'a3.ivanenko': true,
    tobiasnickel: true,
    daniele_cammarata: true,
    vutran: true,
    rokeyzki: true,
    'langri-sha': true,
    landy2014: true,
    truckfondue: true,
    max_devjs: true,
    honpery: true,
    kytart: true,
    glab: true,
    itonyyo: true,
    princemaple: true,
    shelling: true,
    timdp: true,
    tomazzaman: true,
    brettv: true,
    jruif: true,
    meteoro: true,
    dracochou: true,
    nikhilkumar80: true,
    wangnan0610: true,
    sternelee: true,
    anaumidis: true,
    sdierck5: true,
    kmck: true,
    nexume: true,
    apehead: true,
    sandeepgy11: true,
    lcdss: true,
    myxvisual: true,
    orkisz: true,
    fps20only: true,
    abdul: true,
    markscripter: true,
    billfeller: true,
    nicolasgodefroy7: true,
    nickeltobias: true,
    erikvold: true,
    ajaegle: true,
    heyun: true,
    cstlaurent: true,
    huibean: true,
    hemstreet: true,
    dhampik: true,
    sdt: true,
    ichigotenshou: true,
    sakura: true,
    fipo: true,
    donkapetra: true,
    benmosher: true,
    asztal: true,
    wouter_vdb: true,
    marcker: true,
    keeyanajones: true,
    dainov: true,
    reekdeb: true,
    rubiadias: true,
    phlp: true,
    'alex-cory': true,
    princetoad: true,
    strokirk: true,
    garenyondem: true,
    vascosilva: true,
    'sir-rodge-podge': true,
    alimd: true,
    philiiiiiipp: true,
    eliaslfox: true,
    dskecse: true,
    walkah: true,
    r3nya: true,
    ezeikel: true,
    dmitryscaletta: true,
    asm2hex: true,
    ramzesucr: true,
    ghettovoice: true,
    javascriptismagic: true,
    lukaserat: true,
    alexjsdev: true,
    bogdanvlviv: true,
    frankg: true,
    'tin-lek': true,
    jetlua: true,
    ackerapple: true,
    bpatel: true,
    'hongbo-miao': true,
    pvorb: true,
    marcobiedermann: true,
    goatandsheep: true,
    takumab: true,
    meluko: true,
    edloidas: true,
    yatsu: true,
    nodkz: true,
    jellycheng: true,
    scotchulous: true,
    razr9: true,
    slurm: true,
    rpnna: true,
    maritz: true,
    movibe: true,
    tonyseek: true,
    skolmer: true,
    marshallbu: true,
    tamer1an: true,
    redstrike: true,
    kele527: true,
    v3rron: true,
    freaktechnik: true,
    psychollama: true,
    tmurngon: true,
    monjer: true,
    'uid-11222': true,
    markthethomas: true,
    knoja4: true,
    meb: true,
    kudakv: true,
    mrmaxmeranda: true,
    amdsouza92: true,
    pretendentas: true,
    cwaffles: true,
    chemzqm: true,
    finico: true,
    samersm: true,
    fenrir: true,
    geduardcatalin: true,
    muroc: true,
    ahvonenj: true,
    juk: true,
    zhen: true,
    igorsetsfire: true,
    mors84: true,
    mikeflores: true,
    jetbug123: true,
    barenko: true,
    shanewholloway: true,
    oleblaesing: true,
    ferchoriverar: true,
    inectum: true,
    'christopher.urquidi': true,
    nilz3ro: true,
    yeoyou: true,
    sbekrin: true,
    jerrywu: true,
    gambo: true,
    wickie: true,
    radutoader: true,
    'stone-jin': true,
    sunny_anna: true,
    bapinney: true,
    xueboren: true,
    orenschwartz: true,
    wearevilla: true,
    guiqide: true,
    izzy: true,
    shakakira: true,
    vur: true,
    beth_rogers465: true,
    pixelcraft: true,
    robertomstocker: true,
    zcfan: true,
    weerd: true,
    vmleon: true,
    defking: true,
    egoroof: true,
    drewigg: true,
    mhaidarh: true,
    outofcoffee: true,
    aquiandres: true,
    hyteer: true,
    dispalt: true,
    anoubis: true,
    hugdru: true,
    vinbhatt: true,
    themadjoker: true,
    liufang8: true,
    mskjp: true,
    evdokimovm: true,
    goldencrow: true,
    'ognjen.jevremovic': true,
    kevinagin: true,
    lassevolkmann: true,
    schrej: true,
    jaxx2104: true,
    isik: true,
    isa424: true,
    mjbeswick: true,
    'mr-bat': true,
    fpigeon: true,
    quafoo: true,
    bebeskin: true,
    suemcnab: true,
    bradmartin: true,
    marcelohmdias: true,
    'e.luna92': true,
    dnero: true,
    barzim: true,
    kmathmann: true,
    pmbenjamin: true,
    marlongrape: true,
    allenmoore: true,
    daizch: true,
    caijf: true,
    fantasy: true,
    spences10: true,
    nilz: true,
    'serge-nikitin': true,
    mikedfunk: true,
    'nate-river': true,
    kidney: true,
    junos: true,
    foxted: true,
    abpeinado: true,
    cunningdj: true,
    edditoria: true,
    chrisakakay: true,
    keithpepin: true,
    sgnh: true,
    fadihania: true,
    lacodda: true,
    gableroux: true,
    shuoshubao: true,
    'stefan.age': true,
    morogasper: true,
    josokinas: true,
    jaska: true,
    npmmurali: true,
    'artem.tkachuck': true,
    louielouie: true,
    johnny_kim: true,
    ryanadolphson: true,
    kuzmicheff: true,
    miadzadfallah: true,
    sadmansamee: true,
    ruiyu: true,
    chinawolf_wyp: true,
    jaguarj: true,
    uvalmsick: true,
    leapm: true,
    guioconnor: true,
    stevomccormack: true,
    fabrianibrahim: true,
    myorkgitis: true,
    heartnett: true,
    errol: true,
    arcanedev: true,
    maxwelldu: true,
    tenpenny: true,
    ikhsaan: true,
    cl0udw4lk3r: true,
    ricardogobbosouza: true,
    blittle: true,
    'dhanya-kr': true,
    jaymcoder: true,
    dannypaul: true,
    cattle: true,
    santhoshbabu: true,
    fabioper: true,
    naifen00: true,
    mattyboy: true,
    sanketss84: true,
    albertico88: true,
    chiefford: true,
    awesomename: true,
    shentengtu: true,
    zsf: true,
    mobeicaoyuan: true,
    abt10: true,
    alanho: true,
    borasta: true,
    herrbischoff: true,
    nickolas_sv: true,
    'alek-s': true,
    buzzpsych: true,
    thivieira: true,
    duooduo: true,
    jamesbedont: true,
    alshamiri2: true,
    tilegudu: true,
    alexdevero: true,
    manojkhannakm: true,
    kefniark: true,
    kakaman: true,
    gvhinks: true,
    kkho595: true,
    jetthiago: true,
    asj1992: true,
    rdca84: true,
    l3au: true,
    libertychisasuro: true,
    mcfarljw: true,
    mpsenn: true,
    adriasb: true,
    phixid: true,
    geoorgex: true,
    djviolin: true,
    stephensauceda: true,
    jnields: true,
    eagleflo: true,
    redky: true,
    bittercoffee: true,
    damlys: true,
    'frente-fin': true,
    majkel: true,
    'd-band': true,
    spinbit: true,
    daniellink: true,
    organic: true,
    krostyslav: true,
    paulkolesnyk: true,
    kron4eg: true,
    uptonking: true,
    jondar: true,
    'ciro-maciel': true,
    gzg1500521074: true,
    tiggem1993: true,
    'akh-rman': true,
    maycon_ribeiro: true,
    largepuma: true,
    yeming: true,
    xinwangwang: true,
    heshalianren: true,
    wormby: true,
    johanlindberg: true,
    zwwggg: true,
    ssmhan4: true,
    robinblomberg: true,
    suryasaripalli: true,
    denisdl: true,
    mtclark518: true,
    asfrom30: true,
    jream: true,
    working: true,
    egantz: true,
    xiaohuapeng: true,
    fakefarm: true,
    maddas: true,
    yangzw: true,
    tztz: true,
    'daniel-lewis-bsc-hons': true,
    shamilton: true,
    msq: true,
    vchouhan: true,
    tonyetro: true,
    iceglaive: true,
    xanderlewis: true,
    rudchyk: true,
    bonashen: true,
    dh19911021: true,
    laserblue: true,
    iceriver2: true,
    danielheene: true,
    pauljacobson: true,
    tryvols: true,
    matejmazur: true,
    sayrilamar: true,
    owillo: true,
    leor: true,
    lomocc: true,
    marcovossen: true,
    milotindragos: true,
    birkey: true,
    soroushj: true,
    gurunate: true,
    ben_valencia: true,
    pixelscommander: true,
    danday74: true,
    ostoh: true,
    flayks: true,
    atikenny: true,
    agplan: true,
    'jobayer.arman': true,
    sshrike: true,
    stevenvachon: true,
    smtnkc: true,
    jaredwilli: true,
    renishskills: true,
    soldair: true,
    rogerthoang: true,
    jgp968: true,
    laoshaw: true,
    nguyenvanhoang26041994: true,
    hridoyryan: true,
    ik_make: true,
    'ruban-gt': true,
    geofftech: true,
    losymear: true,
    wolfram77: true,
    severen: true,
    jeppesigaard: true,
    midascreed: true,
    spencermathews: true,
    mdedirudianto: true,
    akabeko: true,
    imaginegenesis: true,
    zhangaz1: true,
    qinshixixing: true,
    alexdreptu: true,
    centiball: true,
    irj: true,
    ephigenia: true,
    jmontesc: true,
    salvationz: true,
    chuckdumont: true,
    adamduehansen: true,
    minggangw: true,
    '71emj1': true,
    willwolffmyren: true,
    umetomo: true,
    gfilip: true,
    lqweb: true,
    diogocapela: true,
    chumingze: true,
    huiyifyj: true,
    gpmetheny: true,
    mrahmadawais: true,
    juananto11: true,
    ajwarreniii: true,
    abuelwafa: true,
    eduarte78: true,
    takonyc: true,
    tkshrs: true,
    lionel86: true,
    zachkrall: true,
    jsg2021: true,
    amiziara: true,
    xiaobing: true,
    gamersdelight: true,
    mgthomas99: true,
    alienfreak: true,
    dandunckelman: true,
    wlritchie33: true,
    leonstill: true,
    logol: true,
    raciat: true,
    jalik: true,
    wandyezj: true,
    scarsu: true,
    intermetric: true,
    benwyse11: true,
    hbshun: true,
    pvoronin: true,
    ayan4m1: true,
    dazhuo: true
  },
  repository: {
    type: 'git',
    url: 'git+https://github.com/webpack/webpack.git'
  },
  homepage: 'https://github.com/webpack/webpack',
  bugs: {
    url: 'https://github.com/webpack/webpack/issues'
  },
  license: 'MIT',
  version: '4.41.2',
  dependencies: {
    '@webassemblyjs/ast': '1.8.5',
    '@webassemblyjs/helper-module-context': '1.8.5',
    '@webassemblyjs/wasm-edit': '1.8.5',
    '@webassemblyjs/wasm-parser': '1.8.5',
    acorn: '^6.2.1',
    ajv: '^6.10.2',
    'ajv-keywords': '^3.4.1',
    'chrome-trace-event': '^1.0.2',
    'enhanced-resolve': '^4.1.0',
    'eslint-scope': '^4.0.3',
    'json-parse-better-errors': '^1.0.2',
    'loader-runner': '^2.4.0',
    'loader-utils': '^1.2.3',
    'memory-fs': '^0.4.1',
    micromatch: '^3.1.10',
    mkdirp: '^0.5.1',
    'neo-async': '^2.6.1',
    'node-libs-browser': '^2.2.1',
    'schema-utils': '^1.0.0',
    tapable: '^1.1.3',
    'terser-webpack-plugin': '^1.4.1',
    watchpack: '^1.6.0',
    'webpack-sources': '^1.4.1'
  },
  devDependencies: {
    '@types/node': '^10.12.21',
    '@types/tapable': '^1.0.1',
    '@types/webpack-sources': '^0.1.4',
    '@yarnpkg/lockfile': '^1.1.0',
    benchmark: '^2.1.1',
    'bundle-loader': '~0.5.0',
    'coffee-loader': '^0.9.0',
    coffeescript: '^2.3.2',
    coveralls: '^3.0.2',
    'css-loader': '^2.1.0',
    'es6-promise-polyfill': '^1.1.1',
    eslint: '^5.8.0',
    'eslint-config-prettier': '^4.0.0',
    'eslint-plugin-jest': '^22.2.2',
    'eslint-plugin-jsdoc': '^15.3.2',
    'eslint-plugin-node': '^8.0.0',
    'eslint-plugin-prettier': '^3.0.0',
    express: '~4.16.4',
    'file-loader': '^3.0.1',
    glob: '^7.1.3',
    husky: '^1.1.3',
    'i18n-webpack-plugin': '^1.0.0',
    istanbul: '^0.4.5',
    jest: '^24.9.0',
    'jest-junit': '^8.0.0',
    'json-loader': '^0.5.7',
    'json-schema-to-typescript': '^6.0.1',
    less: '^3.9.0',
    'less-loader': '^4.0.3',
    'lint-staged': '^8.0.4',
    lodash: '^4.17.4',
    prettier: '^1.14.3',
    pug: '^2.0.4',
    'pug-loader': '^2.4.0',
    'raw-loader': '^1.0.0',
    react: '^16.8.0',
    'react-dom': '^16.8.0',
    rimraf: '^2.6.2',
    'script-loader': '~0.7.0',
    'simple-git': '^1.65.0',
    'strip-ansi': '^5.2.0',
    'style-loader': '^0.23.1',
    typescript: '^3.0.0-rc',
    'url-loader': '^1.1.2',
    'val-loader': '^1.0.2',
    'vm-browserify': '~1.1.0',
    'wast-loader': '^1.5.5',
    'webpack-dev-middleware': '^3.5.1',
    'worker-loader': '^2.0.0',
    xxhashjs: '^0.2.1'
  },
  engines: {
    node: '>=6.11.5'
  },
  main: 'lib/webpack.js',
  web: 'lib/webpack.web.js',
  bin: {
    webpack: './bin/webpack.js'
  },
  scripts: {
    setup: 'node ./setup/setup.js',
    test: 'node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest',
    'test:update-snapshots': 'yarn jest -u',
    'test:integration': 'node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch "<rootDir>/test/*.test.js"',
    'test:basic': 'node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch "<rootDir>/te{st/TestCasesNormal,st/StatsTestCases,st/ConfigTestCases}.test.js"',
    'test:unit': 'node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch "<rootDir>/test/*.unittest.js"',
    'travis:integration': 'yarn cover:integration --ci $JEST',
    'travis:basic': 'yarn cover:basic --ci $JEST',
    'travis:lintunit': 'yarn lint && yarn cover:unit --ci $JEST',
    'travis:benchmark': 'yarn benchmark --ci',
    'appveyor:integration': 'yarn cover:integration --ci %JEST%',
    'appveyor:unit': 'yarn cover:unit --ci %JEST%',
    'appveyor:benchmark': 'yarn benchmark --ci',
    'build:examples': 'cd examples && node buildAll.js',
    pretest: 'yarn lint',
    prelint: 'yarn setup',
    lint: 'yarn code-lint && yarn jest-lint && yarn type-lint && yarn special-lint',
    'code-lint': "eslint . --ext '.js' --cache",
    'type-lint': 'tsc --pretty',
    'special-lint': 'node tooling/inherit-types && node tooling/format-schemas && node tooling/compile-to-definitions',
    'special-lint-fix': 'node tooling/inherit-types --write --override && node tooling/format-schemas --write && node tooling/compile-to-definitions --write',
    fix: 'yarn code-lint --fix && yarn special-lint-fix',
    pretty: 'prettier --loglevel warn --write "*.{ts,js,json,yml,yaml}" "{setup,lib,bin,hot,buildin,benchmark,tooling,schemas}/**/*.{js,json}" "test/*.js" "test/helpers/*.js" "test/{configCases,watchCases,statsCases,hotCases}/**/webpack.config.js" "examples/**/webpack.config.js"',
    'jest-lint': 'node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --testMatch "<rootDir>/test/*.lint.js" --no-verbose',
    benchmark: 'node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch "<rootDir>/test/*.benchmark.js" --runInBand',
    cover: 'yarn cover:all && yarn cover:report',
    'cover:all': 'node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --coverage',
    'cover:basic': 'node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --testMatch "<rootDir>/te{st/TestCasesNormal,st/StatsTestCases,st/ConfigTestCases}.test.js" --coverage',
    'cover:integration': 'node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --testMatch "<rootDir>/test/*.test.js" --coverage',
    'cover:unit': 'node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --testMatch "<rootDir>/test/*.unittest.js" --coverage',
    'cover:report': 'istanbul report'
  },
  husky: {
    hooks: {
      'pre-commit': 'lint-staged'
    }
  },
  'lint-staged': {
    '*.js|{lib,setup,bin,hot,buildin,tooling,schemas}/**/*.js|test/*.js|{test,examples}/**/webpack.config.js}': [
      'eslint --cache'
    ]
  },
  jest: {
    forceExit: true,
    setupFilesAfterEnv: [
      '<rootDir>/test/setupTestFramework.js'
    ],
    testMatch: [
      '<rootDir>/test/*.test.js',
      '<rootDir>/test/*.unittest.js'
    ],
    watchPathIgnorePatterns: [
      '<rootDir>/.git',
      '<rootDir>/node_modules',
      '<rootDir>/test/js',
      '<rootDir>/test/browsertest/js',
      '<rootDir>/test/fixtures/temp-cache-fixture',
      '<rootDir>/test/fixtures/temp-',
      '<rootDir>/benchmark',
      '<rootDir>/examples/*/dist',
      '<rootDir>/coverage',
      '<rootDir>/.eslintcache'
    ],
    modulePathIgnorePatterns: [
      '<rootDir>/.git',
      '<rootDir>/node_modules/webpack/node_modules',
      '<rootDir>/test/js',
      '<rootDir>/test/browsertest/js',
      '<rootDir>/test/fixtures/temp-cache-fixture',
      '<rootDir>/test/fixtures/temp-',
      '<rootDir>/benchmark',
      '<rootDir>/examples/*/dist',
      '<rootDir>/coverage',
      '<rootDir>/.eslintcache'
    ],
    transformIgnorePatterns: [
      '<rootDir>'
    ],
    coverageDirectory: '<rootDir>/coverage',
    coveragePathIgnorePatterns: [
      '\\.runtime\\.js$',
      '<rootDir>/test',
      '<rootDir>/schemas',
      '<rootDir>/node_modules'
    ],
    testEnvironment: 'node',
    coverageReporters: [
      'json'
    ]
  },
  gitHead: '11e94dd2d0a8d8baae75e715ff8a69f27a9e3014',
  dist: {
    integrity: 'sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==',
    shasum: 'c34ec76daa3a8468c9b61a50336d8e3303dce74e',
    tarball: 'https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz',
    fileCount: 357,
    unpackedSize: 1462030,
    'npm-signature': '-----BEGIN PGP SIGNATURE-----\r\n' +
      'Version: OpenPGP.js v3.0.4\r\n' +
      'Comment: https://openpgpjs.org\r\n' +
      '\r\n' +
      'wsFcBAEBCAAQBQJdpcNuCRA9TVsSAnZWagAAO58P/Re2uPmWIddOFs3C3Pw9\n' +
      'ROKDAPH2GZHAPKyMb8ZtFZxNyoBrEx41bXLX4hcMrLR1bbT8XBY4o30t8ZPA\n' +
      'aV9UTvyjR07Jbcy76z2/gpR/IQupeZNr6apScMrmu+GLDfXSIQiBN/kis/Jz\n' +
      'NBx1oTqZbYX8gyu/whA7aIGNJ0SfdkrUBBdQ0Ua6HXya/+V7AZVNgZkVsG/a\n' +
      'YJ4c354zrgcRRj9Ku7+Ni32h5GPqvHGk6UwNXA2S57Q38UJz3PClKQINQy5g\n' +
      'j8S7+MfdJOGcDqF4fVv1xn1FtYqVA+tEotcTeXyt+oF0WoDqdH5nF3W0Gx1p\n' +
      '6UCD+gsXFOWpSgJjSSwuE7hoA0ANuy/vmKsxQBj3BNWdHmt8V5QQVazzH7xB\n' +
      'veoPJKXHwgA/12Z0YcqyUROGP4cv/to/+XETRhdGNt/LlwkCHGAtyDkcQv5F\n' +
      'P5JjA+mH3VBnjIGIC13w7dMfHVFAzOdZ/rxR8pZKEaSIrCY8Uj5H1Xyg79OG\n' +
      'TCnyCoSIRYf6SdUe4tgugpdEWSraEWr1SSLW0cndv3BaFF+gmHE1w1XmYNpW\n' +
      '5HLlnlCO9wHxujgPFpl831IvopCEwaiBm0D2OGgvAZXCRsi6f58t0D15jWgI\n' +
      'AGyaLMdDWFB+ofqXjAhIRLh/g52odiFs6hhY64HdbZwOcUA1NAVBrJNv4IOv\n' +
      'tENt\r\n' +
      '=bqWt\r\n' +
      '-----END PGP SIGNATURE-----\r\n'
  },
  directories: {}
}

Error: Conflict: Multiple chunks emit assets to the same filename ssr-bundle.js

Hi, I have encountered this problem when I was trying to create multiple html files with multiple entries.

Error: Child compilation failed:
  Error: Conflict: Multiple chunks emit assets to the same filename ssr-bundle.js (chunks 1 and 2  )
//webpack config
config.entry = {
  a: './a.js',
  b: './b.js',
}

Object.keys(config.entry).map(i => {
  config.plugins.push(
    new HtmlWebpackPlugin({
      template: `!!prerender-loader?string!./template.html`,
      filename: `${i}.html`,
      hash: false,
      chunks: [i],
    }),
  );
});

I have tried below but doesnt make any difference.

template: `!!prerender-loader?${JSON.stringify({ string: true, params: { url: `/${i}/` } })}!./template.html`
        "html-webpack-plugin": "^4.0.0-alpha.2",
        "prerender-loader": "^1.2.0",
        "webpack": "^4.29.3",
        "webpack-assets-manifest": "^2.0.0",
        "webpack-cli": "^3.1.1",
        "webpack-dev-server": "^3.1.14"

node v11.9.0.

Any ideas?

Incorrect hash for dynamic CSS files not using contenthash,

Hi, when using prerender-loader in conjunction with mini-css-extract-plugin there is an error loading CSS imported by dynamic-chunks when the hashing strategy is different from contenthash for that css file.

In that case, prerender-loader outputs a link pointing to a CSS file with a different hash.

Note that this doesn't apply to JS files nor to CSS files imported by the main (entrypoint) chunk.

A full reproduction is in https://github.com/isidrok/prerender-loader-reprod, look at the readme for more information.

The original discussion is in GoogleChromeLabs/critters#7

Remove Prerendered JavaScript

Hi,
this works and generates the rendered HTML, the JS stays the same however. Is there a way to remove all the render calls in the JS/TS files after the inline-loader?

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type object

Hello !

I tried to prerender my preact application but I get this error.
If I remove prerender-loader and just put the path to my index.html I don't get any error.
Module build failed: TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type object

I'm using html-webpack-plugin like so :

new htmlWebpackPlugin({
  // prerendering with prerender-loader
  template: `!!prerender-loader?string!${path.resolve(__dirname, '../src/index.html')}`,
  minify: {
    removeComments: true
  },
  cache: true,
  // make it work consistently with multiple chunks
  chunksSortMode: 'dependency'
})

Thanks for the help ! ๐Ÿ˜ƒ

npm build with webpack hangs but the build is finished and successful

After adding prerender-loader to my production build npm run build hangs after the job is finished(and the build is successful with prerendering done) and requires manual ctrl+c whereas without it builds and returns the prompt. Below package.json, webpack.config.js and terminal output.

Package.json

"scripts": {
    "start": "NODE_ENV=development webpack-dev-server --mode development",
    "build": "NODE_ENV=production webpack --mode production",
    "lint-fix": "standard --fix"
  },
  "standard": {
    "parser": "babel-eslint",
    "globals": [
      "React",
      "ReactDOM"
    ]
  },
  "author": "Grzegorz Jakubiak",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.9.0",
    "@babel/preset-env": "^7.9.0",
    "@babel/preset-react": "^7.9.4",
    "babel-eslint": "^10.1.0",
    "babel-loader": "^8.1.0",
    "copy-webpack-plugin": "^5.1.1",
    "css-loader": "^1.0.1",
    "file-loader": "^4.3.0",
    "html-webpack-plugin": "^3.2.0",
    "mini-css-extract-plugin": "^0.4.5",
    "optimize-css-assets-webpack-plugin": "^5.0.3",
    "prerender-loader": "^1.3.0",
    "standard": "^14.3.3",
    "standard-loader": "^7.0.0",
    "style-loader": "^0.23.1",
    "terser-webpack-plugin": "^2.3.5",
    "webpack": "^4.42.1",
    "webpack-cli": "^3.3.11",
    "webpack-dev-server": "^3.10.3"
  },
  "dependencies": {
    "@rmwc/card": "^5.7.2",
    "babel-polyfill": "^6.26.0",
    "classnames": "^2.2.6",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-icons": "^3.9.0",
    "react-responsive-carousel": "^3.1.57"
  }

Console output

Entrypoint main = src/css/main.css src/js/main.js
 [7] ./src/pages/home/index.jsx 1.14 KiB {0} [built]
[13] ./src/assets/images/banners/mechanik/banner_1.jpg 76 bytes {0} [built]
[14] ./src/assets/images/banners/mechanik/banner_2.jpg 76 bytes {0} [built]
[15] ./src/assets/images/banners/mechanik/banner_3.jpg 76 bytes {0} [built]
[16] ./src/assets/images/banners/mechanik/banner_1x800.jpg 80 bytes {0} [built]
[17] ./src/assets/images/banners/mechanik/banner_2x800.jpg 80 bytes {0} [built]
[18] ./src/assets/images/banners/mechanik/banner_3x800.jpg 80 bytes {0} [built]
[19] ./src/assets/images/banners/mechanik/banner_1.webp 77 bytes {0} [built]
[20] ./src/assets/images/banners/mechanik/banner_2.webp 77 bytes {0} [built]
[21] ./src/assets/images/banners/mechanik/banner_3.webp 77 bytes {0} [built]
[30] ./src/data/tills.js 4.8 KiB {0} [built]
[43] ./src/components/till/card/index.jsx + 23 modules 105 KiB {0} [built]
     |    24 modules
[45] ./src/components/scroll-button/index.jsx + 5 modules 1.28 MiB {0} [built]
     |    6 modules
[48] ./src/index.js 254 bytes {0} [built]
[69] ./src/assets/css/main.css 39 bytes {0} [built]
    + 76 hidden modules
Child html-webpack-plugin for "index.html":
     1 asset
    Entrypoint undefined = ./index.html
    [0] ./node_modules/prerender-loader/dist/prerender-loader.js?string!./public/index.html 13.1 KiB {0} [built]
    Child prerender:
         29 assets
        Entrypoint main = src/css/main.css ssr-bundle.js
         [7] ./src/pages/home/index.jsx 1.14 KiB {0} [built]
        [13] ./src/assets/images/banners/mechanik/banner_1.jpg 76 bytes {0} [built]
        [14] ./src/assets/images/banners/mechanik/banner_2.jpg 76 bytes {0} [built]
        [15] ./src/assets/images/banners/mechanik/banner_3.jpg 76 bytes {0} [built]
        [16] ./src/assets/images/banners/mechanik/banner_1x800.jpg 80 bytes {0} [built]
        [17] ./src/assets/images/banners/mechanik/banner_2x800.jpg 80 bytes {0} [built]
        [18] ./src/assets/images/banners/mechanik/banner_3x800.jpg 80 bytes {0} [built]
        [19] ./src/assets/images/banners/mechanik/banner_1.webp 77 bytes {0} [built]
        [20] ./src/assets/images/banners/mechanik/banner_2.webp 77 bytes {0} [built]
        [21] ./src/assets/images/banners/mechanik/banner_3.webp 77 bytes {0} [built]
        [30] ./src/data/tills.js 4.8 KiB {0} [built]
        [43] ./src/components/till/card/index.jsx + 23 modules 105 KiB {0} [built]
             |    24 modules
        [45] ./src/components/scroll-button/index.jsx + 5 modules 1.28 MiB {0} [built]
             |    6 modules
        [48] ./src/index.js 254 bytes {0} [built]
        [69] ./src/assets/css/main.css 39 bytes {0} [built]
            + 76 hidden modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/@material/button/dist/mdc.button.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/@material/card/dist/mdc.card.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/@material/icon-button/dist/mdc.icon-button.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/react-responsive-carousel/lib/styles/carousel.min.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/assets/css/main.css:
            Entrypoint mini-css-extract-plugin = *
            [0] ./node_modules/css-loader!./src/assets/css/main.css 336 bytes {0} [built]
                + 1 hidden module
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/carousel/style.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/footer/style.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/header/navbar/style.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/header/style.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/scroll-button/style.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/till/card/style.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
        Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/till/online/style.css:
            Entrypoint mini-css-extract-plugin = *
               2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/@material/button/dist/mdc.button.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/@material/card/dist/mdc.card.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/@material/icon-button/dist/mdc.icon-button.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!node_modules/react-responsive-carousel/lib/styles/carousel.min.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/assets/css/main.css:
    Entrypoint mini-css-extract-plugin = *
    [0] ./node_modules/css-loader!./src/assets/css/main.css 336 bytes {0} [built]
        + 1 hidden module
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/carousel/style.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/footer/style.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/header/navbar/style.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/header/style.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/scroll-button/style.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/till/card/style.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules
Child mini-css-extract-plugin node_modules/css-loader/index.js!src/components/till/online/style.css:
    Entrypoint mini-css-extract-plugin = *
       2 modules


webpack config

'use strict'

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin')

module.exports = (env, { mode }) => {
  const isProduction = mode === 'production'
  const importReact = new webpack.ProvidePlugin({
    React: 'react',
    ReactDOM: 'react-dom'
  })

  const config = {
    resolve: {
      extensions: ['.js', '.jsx'],
      alias: {
        src: path.resolve(__dirname, 'src/')
      }
    },
    mode: mode,
    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: 'src/js/[name].js'
    },
    module: {
      rules: [
        {
          enforce: 'pre',
          test: /\.(js|jsx)?$/,
          exclude: /node_modules/,
          use: {
            loader: 'standard-loader',
            options: {
              parser: 'babel-eslint'
            }
          }
        },
        {
          test: /\.(js|jsx)?$/,
          exclude: /node_modules/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env', '@babel/preset-react']
            }
          }
        },
        {
          test: /\.css$/,
          use: [
            MiniCssExtractPlugin.loader,
            'css-loader'
          ]
        },
        {
          test: /\.(png|jp(e*)g|svg|webp)$/,
          use: [{
            loader: 'file-loader',
            options: {
              name: 'src/assets/images/[name].[ext]'
            }
          }]
        }
      ]
    },
    optimization: {
      minimize: true,
      minimizer: [
        new TerserPlugin(),
        new OptimizeCSSAssetsPlugin({})
      ]
    },
    plugins: [
      importReact,
      new CopyPlugin([
        { from: 'src/pages/errors', to: './' },
        { from: '.htaccess', to: './' },
        { from: 'sitemap.xml', to: './' },
        { from: 'robots.txt', to: './' },
        { from: 'public/favicon.ico', to: './' }
      ]),
      new MiniCssExtractPlugin({
        filename: 'src/css/[name].css'
      }),
      new HtmlWebpackPlugin({
        template: isProduction ? '!!prerender-loader?string!./public/index.html' : './public/index.html',
        filename: './index.html'
      })
    ]
  }

  return config
}

Cannot find module 'webpack/lib/MultiEntryPlugin'

  • "prerender-loader": "^1.3.0",
  • "webpack": "^5.3.2",
  • "webpack-cli": "^3.3.12",

image

when I run webpack it turn out this.
I can not find webpack/lib/MultiEntryPluginin webpack5 lib.
but how to fix this?

Entry module not found: Error: Can't resolve 'prerender-loader'

Hey there! So this is probably something I'm doing wrong but I'd appreciate any help.

This is what I have in my plugins section

...routes.map(url =>
  new HtmlWebpackPlugin({
    filename: `${paths.clientPublic}${url}index.html`,
    template: `!!prerender-loader?string!${paths.clientHtml}`,
  })
),

This is the error I am getting

Error: Child compilation failed:
  Entry module not found: Error: Can't resolve 'prerender-loader' in '/Users/jace/...':
  Error: Can't resolve 'prerender-loader' in '/Users/jace/...'

I have installed via yarn add --dev https://github.com/havenchyk/prerender-loader#47a6ec31715930a17ed5eca8d4637f0d57707ed5 (because I need the multiple entry support)

Any help would be great, thank you!

Using.ejs template: getting "Module build failed: TypeError: Path must be a string."

I am using an .ejs template, like this:

        new HtmlWebpackPlugin({
            template: 'src/html/index.ejs',
            title: package_json.name
        })

I followed the instructions and changed it to:

        new HtmlWebpackPlugin({
            template: '!!prerender-loader?string!./src/html/index.ejs',
            title: package_json.name
        })

But this gives this erorr:

ERROR in Error: Child compilation failed:
Module build failed: TypeError: Path must be a string. Received [ 'E:\Docs\Dev\react-500px\node_modules\webpack-dev-server\client\index.js?http://127.0.0.1:8888',

Is there something special to do when using .ejs (or other format) templates?

My full webpack.config.js can be seen here.

Module not found. attempted require...

I get an error when using prerender-loader. It seems to fail with the below error. I traced it to this line and it appears that the only keys in compilation.assets are ssr-bundle.js. Any suggestions?

 '  Error: Child compilation failed:\n  Module build failed (from ./node_modules/prerender-loader/dist/prerender-loader.js):\n  Error: Error:  Module not found. attempted require("url")\n  \n  - index.js:190 runChildCompiler.then.window.require\n    [account-web]/[prerender-loader]/src/index.js:190:19\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  - Error: Error:  Module not found. attempted require("url")\n  \n  - compiler.js:79 childCompiler.runAsChild\n    [account-web]/[react-app]/[html-webpack-plugin]/lib/compiler.js:79:16\n  \n  - Compiler.js:296 compile\n    [account-web]/[react-app]/[webpack]/lib/Compiler.js:296:11\n  \n  - Compiler.js:553 hooks.afterCompile.callAsync.err\n    [account-web]/[react-app]/[webpack]/lib/Compiler.js:553:14\n  \n  \n  - Hook.js:35 AsyncSeriesHook.lazyCompileHook [as _callAsync]\n    [account-web]/[react-app]/[tapable]/lib/Hook.js:35:21\n  \n  - Compiler.js:550 compilation.seal.err\n    [account-web]/[react-app]/[webpack]/lib/Compiler.js:550:30\n  \n  \n  - Hook.js:35 AsyncSeriesHook.lazyCompileHook [as _callAsync]\n    [account-web]/[react-app]/[tapable]/lib/Hook.js:35:21\n  \n  - Compilation.js:1294 hooks.optimizeAssets.callAsync.err\n    [account-web]/[react-app]/[webpack]/lib/Compilation.js:1294:35\n  \n  \n  - Hook.js:35 AsyncSeriesHook.lazyCompileHook [as _callAsync]\n    [account-web]/[react-app]/[tapable]/lib/Hook.js:35:21\n  \n  - Compilation.js:1285 hooks.optimizeChunkAssets.callAsync.err\n    [account-web]/[react-app]/[webpack]/lib/Compilation.js:1285:32\n  \n  \n  - Hook.js:35 AsyncSeriesHook.lazyCompileHook [as _callAsync]\n    [account-web]/[react-app]/[tapable]/lib/Hook.js:35:21\n  \n  - Compilation.js:1280 hooks.additionalAssets.callAsync.err\n    [account-web]/[react-app]/[webpack]/lib/Compilation.js:1280:36\n  \n  \n' ]

Extracting css/scss on build time

Hi, the prerender-loader works fine for me except when it comes to css.

In my index.js:
import './style.scss

But when I run the build I get this error:

ERROR in ./web-assets/scss/style.scss Module build failed: Error: "extract-text-webpack-plugin" loader is used without the corresponding plugin, refer to https://github.com/webpack/extract-text-webpack-plugin for the usage example

webpack.prod.config:

output: {
    filename: "[name]-[chunkhash].js",
    chunkFilename: "[id].[chunkhash].bundle.js",
    publicPath: '/static/dist/',
    path: __dirname + "/dist"
},

plugins: [

    new webpack.optimize.UglifyJsPlugin(),
    new webpack.LoaderOptionsPlugin({ minimize: true }),
    new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
    new HtmlWebpackPlugin({
        filename: 'index.html',
        template: '!!prerender-loader?string!index.html',
    }),
    new ExtractTextPlugin("[name]-[chunkhash].css"),
  

],

module: {
    rules: [

        {
            test: /\.css$/,
            use: ExtractTextPlugin.extract({
                fallback: "style-loader",
                loader: "css-loader"
            })
        },
        {
            test: /\.scss/,
            use: ExtractTextPlugin.extract({
                fallback: "style-loader",
                loader: [
                    {
                        loader: 'css-loader',
                        options: {
                            sourceMap: true
                        }
                    },
                    {
                        loader: 'sass-loader',
                        options: {
                            sourceMap: true
                        }
                    }
                ]
            })
        },  
    ]
}

Jsdom is obsolete

Hi!
Required jsdom@11 does not support some Element's methods, for example .insertAdjacentText.
Can this dependency be upgraded?

webpack hangs forever after compilation if prerender-loader present in configuration

Hello!
The issue is described in title :-)
If I do remove prerender-loader from conf, webpack compilation finished instantly as expected, for this reason I associate the issue with prerender-loader.

Here is my webpack prod config:

import path from 'path'
import merge from 'webpack-merge'
import * as paths from './paths'
import { IEnv } from './types'
import common from './webpack.common'
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const TerserPlugin = require('terser-webpack-plugin')
const HappyPack = require('happypack')
const ScriptExtHtmlPlugin = require('script-ext-html-webpack-plugin')

const sep = path.sep === '\\' ? '\\' + path.sep : path.sep

const vendorList = [
	'react(-dom)?',
	'react-spring',
	'rxjs(-compat)?',
	`@grammarly${sep}focal`,
	'date-fns',
	'typestyle',
].join('|')

const testVendor = new RegExp(`${sep}node_modules${sep}(${vendorList})${sep}`)

export default (env: IEnv) =>
	merge(common(env), {
		output: {
			filename: '[name].[chunkhash:5].js',
			chunkFilename: '[name].[chunkhash:5].js',
		},
		stats: {
			hash: true,
			timings: true,
			assets: true,
			chunks: true,
			chunkModules: false,
			modules: false,
			children: false,
		},
		optimization: {
			runtimeChunk: 'single',
			splitChunks: {
				cacheGroups: {
					vendor: {
						test: testVendor,
						chunks: 'initial',
						name: 'vendor',
						enforce: true,
					},
				},
			},
			minimizer: [
				new TerserPlugin({
					terserOptions: {
						compress: {
							inline: 1,
						},
						mangle: {
							safari10: true,
						},
						output: {
							safari10: true,
						},
					},
				}),
			],
		},
		plugins: [
			new HappyPack({
				id: 'ts',
				threads: 4,
				loaders: [
					{
						loader: 'babel-loader',
						options: {
							babelrc: false,
							presets: [
								['@babel/preset-env', { modules: false }],
								['@babel/preset-react', { development: false }],
							],
							plugins: ['@babel/plugin-syntax-dynamic-import'],
						},
					},
					{
						loader: 'ts-loader',
						options: {
							configFile: paths.tsconfigDev,
							happyPackMode: true,
						},
					},
				],
			}),
			new ScriptExtHtmlPlugin({
				inline: ['runtime'],
			}),
			new BundleAnalyzerPlugin({
				analyzerMode: 'static',
				defaultSizes: 'gzip',
				openAnalyzer: false,
			}),
		],
		module: {
			rules: [
				{
					test: paths.indexHtml,
					loader: 'prerender-loader',
					options: {
						string: true,
					},
				},
				{
					test: /\.tsx?$/,
					include: paths.src,
					loader: 'happypack/loader?id=ts',
				},
			],
		},
	})

webpack.common.ts

import webpack from 'webpack'
import * as paths from './paths'
import { IEnv } from './types'
import HtmlWebpackPlugin from 'html-webpack-plugin'

export default (env: IEnv) =>
	({
		mode: env.mode,
		entry: paths.prerender,
		context: paths.root,
		target: 'web',
		resolve: {
			extensions: ['.js', '.ts', '.tsx'],
		},
		output: {
			filename: '[name].js',
			path: paths.dist,
			publicPath: '/',
			globalObject: 'self',
		},
		plugins: [
			new webpack.DefinePlugin({
				// We set node.process=false later in this config.
				// Here we make sure if (process && process.foo) still works:
				process: JSON.stringify({ env: { VERSION: env.version, NODE_ENV: env.mode } }),
			}),
			new HtmlWebpackPlugin({
				template: paths.indexHtml,
				minify: {
					removeComments: true,
					useShortDoctype: true,
					keepClosingSlash: true,
					collapseWhitespace: true,
					removeEmptyAttributes: true,
					removeRedundantAttributes: true,
					removeScriptTypeAttributes: true,
					removeStyleLinkTypeAttributes: true,
				},
			}),
		],
		// Turn off various NodeJS environment polyfills Webpack adds to bundles.
		// They're supposed to be added only when used, but the heuristic is loose
		// (eg: existence of a variable called setImmedaite in any scope)
		node: {
			console: false,
			// Keep global, it's just an alias of window and used by many third party modules:
			global: true,
			// Turn off process to avoid bundling a nextTick implementation:
			process: false,
			// Inline __filename and __dirname values:
			__filename: 'mock',
			__dirname: 'mock',
			// Never embed a portable implementation of Node's Buffer module:
			Buffer: false,
			// Never embed a setImmediate implementation:
			setImmediate: false,
		},
	} as webpack.Configuration)

prerender.ts

import React from 'react'
import ReactDOM from 'react-dom'
import { Landing } from './Landing'
import { forceRenderStyles } from 'typestyle'
import { DB$ } from '../schedule/stateSchedule'

document.head.insertAdjacentHTML(
	'beforeend',
	'<link href="https://fonts.googleapis.com/css?family=Roboto:400,700" rel="stylesheet">'
)

forceRenderStyles()

const render = async () => {
	await import(/* webpackChunkName: "DB" */
	'../schedule/db').then(({ DB }) => {
		DB$.set(DB)
	})
	ReactDOM.render(React.createElement(Landing), document.getElementById('app'))
}

render()

export default render

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.