diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 6785235b31..3d2bd8739e 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -46,7 +46,7 @@ jobs: run: npm run lint - name: Security audit - run: npm audit + run: npm audit --production - name: Check commit message uses: wagoid/commitlint-github-action@v1 diff --git a/.gitignore b/.gitignore index 76b023d5ea..d8e4a4b692 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ coverage node_modules .vscode yarn.lock +yarn-error.log .eslintcache diff --git a/README.md b/README.md index 400aa49840..d54b8131aa 100644 --- a/README.md +++ b/README.md @@ -64,107 +64,116 @@ Following options are available with `webpack serve`: Usage: webpack serve|server|s [entries...] [options] Options: - -c, --config Provide path to a webpack configuration file e.g. ./webpack.config.js. - --config-name Name of the configuration to use. - -m, --merge Merge two or more configurations using 'webpack-merge'. - --env Environment passed to the configuration when it is a function. - --node-env Sets process.env.NODE_ENV to the specified value. - --progress [value] Print compilation progress during build. - -j, --json [value] Prints result as JSON or store it in a file. - -d, --devtool Determine source maps to use. - --no-devtool Do not generate source maps. - --entry The entry point(s) of your application e.g. ./src/main.js. - --mode Defines the mode to pass to webpack. - --name Name of the configuration. Used when loading multiple configurations. - -o, --output-path Output location of the file generated by webpack e.g. ./dist/. - --stats [value] It instructs webpack on how to treat the stats e.g. verbose. - --no-stats Disable stats output. - -t, --target Sets the build target e.g. node. - --no-target Negative 'target' option. - --watch-options-stdin Stop watching when stdin stream has ended. - --no-watch-options-stdin Do not stop watching when stdin stream has ended. - --allowed-hosts Set hosts that are allowed to access the dev server. - --allowed-hosts-reset Clear all items provided in allowedHosts configuration. - --bonjour Broadcasts the server via ZeroConf networking on start. - --no-bonjour Do not broadcast the server via ZeroConf networking on start. - --client-transport Allows to set custom transport to communicate with server. - --client-logging Specifies client properties. - --client-progress Print compilation progress in percentage in the browser. - --no-client-progress Do not print compilation progress in percentage in the browser. - --client-overlay Show a full-screen overlay in the browser when there are compiler errors or warnings. - --no-client-overlay Do not show a full-screen overlay in the browser when there are compiler errors or warnings. - --client-overlay-errors Show a full-screen overlay in the browser when there are compiler errors. - --no-client-overlay-errors Negative 'client-overlay-errors' option. - --client-overlay-warnings Show a full-screen overlay in the browser when there are compiler warnings. - --no-client-overlay-warnings Negative 'client-overlay-warnings' option. - --client-need-client-entry Tells devServer to inject a client entry. - --no-client-need-client-entry Negative 'client-need-client-entry' option. - --client-hot-entry Tells devServer to inject a Hot Module Replacement entry. - --no-client-hot-entry Do not tell devServer to inject a Hot Module Replacement entry. - --client-web-socket-url When using dev server and you're proxying dev-server, the client script does not always know where to - connect to. - --client-web-socket-url-host Tells clients connected to devServer to use the provided host. - --client-web-socket-url-port Tells clients connected to devServer to use the provided port. - --client-web-socket-url-path Tells clients connected to devServer to use the provided path to connect. - --web-socket-server Allows to set web socket server and options. - --web-socket-server-type Allows to set web socket server and options. - --compress Enable gzip compression for everything served. - --no-compress Disable gzip compression. - --firewall [value...] Defines routes which are enabled by default, on by default and allows localhost. - --no-firewall Disable firewall. - --firewall-reset Clear all items provided in firewall configuration. - --history-api-fallback When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 - responses. - --no-history-api-fallback Negative 'history-api-fallback' option. - --host Specify a host to use. If you want your server to be accessible externally. - --hot [value] Enable webpack's Hot Module Replacement feature. - --no-hot Disable webpack's Hot Module Replacement feature. - --http2 Serve over HTTP/2 using spdy. - --no-http2 Do not use HTTP/2. - --https By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. - --no-https Do not use HTTPS protocol. - --https-passphrase Passphrase for a pfx file. - --https-request-cert Request for an SSL certificate. - --no-https-request-cert Do not request for an SSL certificate. - --https-cacert Path to an SSL CA certificate. - --https-key Path to an SSL key. - --https-pfx Path to an SSL pfx file. - --https-cert Path to an SSL certificate. - --live-reload By default, the dev-server will reload/refresh the page when file changes are detected. - --no-live-reload Disables live reloading on changing files. - --open [value...] Tells dev-server to open the browser after server had been started. Set it to true to open your default - browser. - --no-open Do not open the default browser. - --open-target [value...] Open specified route in browser. - --no-open-target Do not open specified route in browser. - --open-app-name Open specified browser. - --open-app Open specified browser. - --open-reset Clear all items provided in open configuration. - --open-target-reset Clear all items provided in open.target configuration. - --open-app-name-reset Clear all items provided in open.app.name configuration. - --port Specify a port number to listen for requests on. - --public The public hostname/ip address of the server that client script will try to connect to. - --static [value...] It is possible to configure advanced options for serving static files from directory. See the Express - documentation for the possible options. - --no-static Negative 'static' option. - --static-directory Directory for static contents. - --static-public-path The bundled files will be available in the browser under this path. - --static-serve-index Tells dev-server to use serveIndex middleware when enabled. - --no-static-serve-index Do not tell dev-server to use serveIndex middleware. - --static-watch Watch for files in static content directory. - --no-static-watch Do not watch for files in static content directory. - --static-reset Clear all items provided in static configuration. - --static-public-path-reset Clear all items provided in static.publicPath configuration. - --watch-files List of files to watch for file changes and serve. - --watch-files-paths List of files to watch for file changes and serve. - --watch-files-reset Clear all items provided in watchFiles configuration. - --watch-files-paths-reset Clear all items provided in watchFiles.paths configuration. + -c, --config Provide path to a webpack configuration file e.g. ./webpack.config.js. + --config-name Name of the configuration to use. + -m, --merge Merge two or more configurations using 'webpack-merge'. + --env Environment passed to the configuration when it is a function. + --node-env Sets process.env.NODE_ENV to the specified value. + --progress [value] Print compilation progress during build. + -j, --json [value] Prints result as JSON or store it in a file. + -d, --devtool Determine source maps to use. + --no-devtool Do not generate source maps. + --entry The entry point(s) of your application e.g. ./src/main.js. + --mode Defines the mode to pass to webpack. + --name Name of the configuration. Used when loading multiple configurations. + -o, --output-path Output location of the file generated by webpack e.g. ./dist/. + --stats [value] It instructs webpack on how to treat the stats e.g. verbose. + --no-stats Disable stats output. + -t, --target Sets the build target e.g. node. + --no-target Negative 'target' option. + --watch-options-stdin Stop watching when stdin stream has ended. + --no-watch-options-stdin Do not stop watching when stdin stream has ended. + --allowed-hosts Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev + server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + --allowed-hosts-reset Clear all items provided in configuration. Allows to enumerate the hosts from which access to the dev server are + allowed (useful when you are proxying dev server, by default is 'auto'). + https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + --bonjour Allows to broadcasts dev server via ZeroConf networking on start. + https://webpack.js.org/configuration/dev-server/#devserverbonjour + --no-bonjour Negative 'bonjour' option. + --client-hot-entry Injects a Hot Module Replacement entry. + --no-client-hot-entry Negative 'client-hot-entry' option. + --client-logging Allows to specify options for client script in the browser. + https://webpack.js.org/configuration/dev-server/#devserverclient + --client-need-client-entry Inject a client entry. + --no-client-need-client-entry Negative 'client-need-client-entry' option. + --client-overlay Enables a full-screen overlay in the browser when there are compiler errors or warnings. + --no-client-overlay Negative 'client-overlay' option. + --client-overlay-errors Enables a full-screen overlay in the browser when there are compiler errors. + --no-client-overlay-errors Negative 'client-overlay-errors' option. + --client-overlay-warnings Enables a full-screen overlay in the browser when there are compiler warnings. + --no-client-overlay-warnings Negative 'client-overlay-warnings' option. + --client-progress Prints compilation progress in percentage in the browser. + --no-client-progress Negative 'client-progress' option. + --client-transport Allows to set custom transport to communicate with dev server. + --client-web-socket-url Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not + always know where to connect to). + --client-web-socket-url-host Tells clients connected to devServer to use the provided host. + --client-web-socket-url-path Tells clients connected to devServer to use the provided path to connect. + --client-web-socket-url-port Tells clients connected to devServer to use the provided port. + --client-web-socket-url-protocol Tells clients connected to devServer to use the provided protocol. + --compress Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress + --no-compress Negative 'compress' option. + --history-api-fallback Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page + Applications that utilise the HTML5 History API. + https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback + --no-history-api-fallback Negative 'history-api-fallback' option. + --host Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost + --hot [value] Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot + --no-hot Negative 'hot' option. + --http2 Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2 + --no-http2 Negative 'http2' option. + --https Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). + https://webpack.js.org/configuration/dev-server/#devserverhttps + --no-https Negative 'https' option. + --https-passphrase Passphrase for a pfx file. + --https-request-cert Request for an SSL certificate. + --no-https-request-cert Negative 'https-request-cert' option. + --https-cacert Path to an SSL CA certificate. + --https-key Path to an SSL key. + --https-pfx Path to an SSL pfx file. + --https-cert Path to an SSL certificate. + --live-reload Enables reload/refresh the page(s) when file changes are detected (enabled by default). + https://webpack.js.org/configuration/dev-server/#devserverlivereload + --no-live-reload Negative 'live-reload' option. + --open [value...] Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to + open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen + --no-open Negative 'open' option. + --open-target [value...] Opens specified page in browser. + --no-open-target Negative 'open-target' option. + --open-app-name Open specified browser. + --open-app Open specified browser. + --open-reset Clear all items provided in configuration. Allows to configure dev server to open the browser(s) and page(s) after + server had been started (set it to true to open your default browser). + https://webpack.js.org/configuration/dev-server/#devserveropen + --open-target-reset Clear all items provided in configuration. Opens specified page in browser. + --open-app-name-reset Clear all items provided in configuration. Open specified browser. + --port Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport + --static [value...] Allows to configure options for serving static files from directory (by default 'public' directory). + https://webpack.js.org/configuration/dev-server/#devserverstatic + --no-static Negative 'static' option. + --static-directory Directory for static contents. + --static-public-path The static files will be available in the browser under this public path. + --static-serve-index Tells dev server to use serveIndex middleware when enabled. + --no-static-serve-index Negative 'static-serve-index' option. + --static-watch Watches for files in static content directory. + --no-static-watch Negative 'static-watch' option. + --static-reset Clear all items provided in configuration. Allows to configure options for serving static files from directory (by + default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic + --static-public-path-reset Clear all items provided in configuration. The static files will be available in the browser under this public + path. + --watch-files Allows to configure list of globs/directories/files to watch for file changes. + https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + --watch-files-reset Clear all items provided in configuration. Allows to configure list of globs/directories/files to watch for file + changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + --web-socket-server Allows to set web socket server and options (by default 'ws'). + https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver Global options: - --color Enable colors on console. - --no-color Disable colors on console. - -v, --version Output the version number of 'webpack', 'webpack-cli' and 'webpack-dev-server' and commands. - -h, --help [verbose] Display help for commands and options. + --color Enable colors on console. + --no-color Disable colors on console. + -v, --version Output the version number of 'webpack', 'webpack-cli' and 'webpack-dev-server' and commands. + -h, --help [verbose] Display help for commands and options. ``` _**Note**: For more information on above options explore this [link](https://webpack.js.org/configuration/dev-server/)._ diff --git a/bin/cli-flags.js b/bin/cli-flags.js index 603707b11c..8d3044cbee 100644 --- a/bin/cli-flags.js +++ b/bin/cli-flags.js @@ -7,12 +7,12 @@ module.exports = { type: 'string', multiple: true, description: - "Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", + "Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", path: 'allowedHosts[]', }, { description: - "Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", + "Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", multiple: false, path: 'allowedHosts', type: 'enum', @@ -20,7 +20,7 @@ module.exports = { }, ], description: - "Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", + "Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", multiple: true, simpleType: 'string', }, @@ -30,12 +30,12 @@ module.exports = { type: 'reset', multiple: false, description: - "Clear all items provided in configuration. Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", + "Clear all items provided in configuration. Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", path: 'allowedHosts', }, ], description: - "Clear all items provided in configuration. Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", + "Clear all items provided in configuration. Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts", simpleType: 'boolean', multiple: false, }, @@ -45,14 +45,14 @@ module.exports = { type: 'boolean', multiple: false, description: - 'Broadcasts the server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour', + 'Allows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour', path: 'bonjour', }, ], description: - 'Broadcasts the server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour', + 'Allows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour', negatedDescription: - 'Do not broadcast the server via ZeroConf networking on start.', + 'Disallows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour', simpleType: 'boolean', multiple: false, }, @@ -63,18 +63,19 @@ module.exports = { values: ['sockjs', 'ws'], multiple: false, description: - 'Allows to set custom transport to communicate with server.', + 'Allows to set custom transport to communicate with dev server.', path: 'client.transport', }, { type: 'string', multiple: false, description: - 'Allows to set custom transport to communicate with server.', + 'Allows to set custom transport to communicate with dev server.', path: 'client.transport', }, ], - description: 'Allows to set custom transport to communicate with server.', + description: + 'Allows to set custom transport to communicate with dev server.', simpleType: 'string', multiple: false, }, @@ -85,12 +86,12 @@ module.exports = { values: ['none', 'error', 'warn', 'info', 'log', 'verbose'], multiple: false, description: - 'Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient', + 'Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient', path: 'client.logging', }, ], description: - 'Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient', + 'Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient', simpleType: 'string', multiple: false, }, @@ -99,13 +100,14 @@ module.exports = { { type: 'boolean', multiple: false, - description: 'Print compilation progress in percentage in the browser.', + description: + 'Prints compilation progress in percentage in the browser.', path: 'client.progress', }, ], - description: 'Print compilation progress in percentage in the browser.', + description: 'Prints compilation progress in percentage in the browser.', negatedDescription: - 'Do not print compilation progress in percentage in the browser.', + 'Does not print compilation progress in percentage in the browser.', simpleType: 'boolean', multiple: false, }, @@ -115,14 +117,14 @@ module.exports = { type: 'boolean', multiple: false, description: - 'Show a full-screen overlay in the browser when there are compiler errors or warnings.', + 'Enables a full-screen overlay in the browser when there are compiler errors or warnings.', path: 'client.overlay', }, ], description: - 'Show a full-screen overlay in the browser when there are compiler errors or warnings.', + 'Enables a full-screen overlay in the browser when there are compiler errors or warnings.', negatedDescription: - 'Do not show a full-screen overlay in the browser when there are compiler errors or warnings.', + 'Disables a full-screen overlay in the browser when there are compiler errors or warnings.', simpleType: 'boolean', multiple: false, }, @@ -132,12 +134,12 @@ module.exports = { type: 'boolean', multiple: false, description: - 'Show a full-screen overlay in the browser when there are compiler errors.', + 'Enables a full-screen overlay in the browser when there are compiler errors.', path: 'client.overlay.errors', }, ], description: - 'Show a full-screen overlay in the browser when there are compiler errors.', + 'Enables a full-screen overlay in the browser when there are compiler errors.', simpleType: 'boolean', multiple: false, }, @@ -147,12 +149,12 @@ module.exports = { type: 'boolean', multiple: false, description: - 'Show a full-screen overlay in the browser when there are compiler warnings.', + 'Enables a full-screen overlay in the browser when there are compiler warnings.', path: 'client.overlay.warnings', }, ], description: - 'Show a full-screen overlay in the browser when there are compiler warnings.', + 'Enables a full-screen overlay in the browser when there are compiler warnings.', simpleType: 'boolean', multiple: false, }, @@ -161,11 +163,11 @@ module.exports = { { type: 'boolean', multiple: false, - description: 'Tells devServer to inject a client entry.', + description: 'Inject a client entry.', path: 'client.needClientEntry', }, ], - description: 'Tells devServer to inject a client entry.', + description: 'Inject a client entry.', simpleType: 'boolean', multiple: false, }, @@ -174,14 +176,12 @@ module.exports = { { type: 'boolean', multiple: false, - description: - 'Tells devServer to inject a Hot Module Replacement entry.', + description: 'Injects a Hot Module Replacement entry.', path: 'client.hotEntry', }, ], - description: 'Tells devServer to inject a Hot Module Replacement entry.', - negatedDescription: - 'Do not tell devServer to inject a Hot Module Replacement entry.', + description: 'Injects a Hot Module Replacement entry.', + negatedDescription: 'Does not injects a Hot Module Replacement entry.', simpleType: 'boolean', multiple: false, }, @@ -191,12 +191,12 @@ module.exports = { type: 'string', multiple: false, description: - "When using dev server and you're proxying dev-server, the client script does not always know where to connect to.", + "Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to).", path: 'client.webSocketURL', }, ], description: - "When using dev server and you're proxying dev-server, the client script does not always know where to connect to.", + "Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to).", simpleType: 'string', multiple: false, }, @@ -275,23 +275,56 @@ module.exports = { multiple: false, simpleType: 'string', }, + 'client-web-socket-url-username': { + configs: [ + { + type: 'string', + multiple: false, + description: + 'Tells clients connected to devServer to use the provided username to authenticate.', + path: 'client.webSocketURL.username', + }, + ], + description: + 'Tells clients connected to devServer to use the provided username to authenticate.', + simpleType: 'string', + multiple: false, + }, + 'client-web-socket-url-password': { + configs: [ + { + type: 'string', + multiple: false, + description: + 'Tells clients connected to devServer to use the provided password to authenticate.', + path: 'client.webSocketURL.password', + }, + ], + description: + 'Tells clients connected to devServer to use the provided password to authenticate.', + simpleType: 'string', + multiple: false, + }, 'web-socket-server': { configs: [ { type: 'enum', values: ['sockjs', 'ws'], multiple: false, - description: 'Allows to set web socket server and options.', + description: + "Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver", path: 'webSocketServer', }, { type: 'string', multiple: false, - description: 'Allows to set web socket server and options.', + description: + "Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver", path: 'webSocketServer', }, ], - description: 'Allows to set web socket server and options.', + description: + "Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver", simpleType: 'string', multiple: false, }, @@ -301,13 +334,13 @@ module.exports = { type: 'boolean', multiple: false, description: - 'Enable gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress', + 'Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress', path: 'compress', }, ], description: - 'Enable gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress', - negatedDescription: 'Disable gzip compression.', + 'Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress', + negatedDescription: 'Disables gzip compression for everything served.', simpleType: 'boolean', multiple: false, }, @@ -317,12 +350,12 @@ module.exports = { type: 'boolean', multiple: false, description: - 'When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback', + "Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page Applications that utilise the HTML5 History API. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback", path: 'historyApiFallback', }, ], description: - 'When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback', + "Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page Applications that utilise the HTML5 History API. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback", simpleType: 'boolean', multiple: false, }, @@ -332,12 +365,12 @@ module.exports = { type: 'string', multiple: false, description: - 'Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost', + 'Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost', path: 'host', }, ], description: - 'Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost', + 'Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost', simpleType: 'string', multiple: false, }, @@ -347,7 +380,7 @@ module.exports = { type: 'boolean', multiple: false, description: - "Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot", + 'Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot', path: 'hot', }, { @@ -355,13 +388,13 @@ module.exports = { values: ['only'], multiple: false, description: - "Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot", + 'Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot', path: 'hot', }, ], description: - "Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot", - negatedDescription: "Disable webpack's Hot Module Replacement feature.", + 'Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot', + negatedDescription: 'Disables Hot Module Replacement.', simpleType: 'string', multiple: false, }, @@ -371,13 +404,13 @@ module.exports = { type: 'boolean', multiple: false, description: - 'Serve over HTTP/2 using spdy. https://webpack.js.org/configuration/dev-server/#devserverhttp2', + 'Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2', path: 'http2', }, ], description: - 'Serve over HTTP/2 using spdy. https://webpack.js.org/configuration/dev-server/#devserverhttp2', - negatedDescription: 'Do not use HTTP/2.', + 'Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2', + negatedDescription: 'Does not serve over HTTP/2 using SPDY.', simpleType: 'boolean', multiple: false, }, @@ -387,13 +420,14 @@ module.exports = { type: 'boolean', multiple: false, description: - 'By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps', + "Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps", path: 'https', }, ], description: - 'By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps', - negatedDescription: 'Do not use HTTPS protocol.', + "Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps", + negatedDescription: + "Disallows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP).", simpleType: 'boolean', multiple: false, }, @@ -420,7 +454,7 @@ module.exports = { }, ], description: 'Request for an SSL certificate.', - negatedDescription: 'Do not request for an SSL certificate.', + negatedDescription: 'Does not request for an SSL certificate.', simpleType: 'boolean', multiple: false, }, @@ -482,13 +516,14 @@ module.exports = { type: 'boolean', multiple: false, description: - 'By default, the dev-server will reload/refresh the page when file changes are detected. https://webpack.js.org/configuration/dev-server/#devserverlivereload', + 'Enables reload/refresh the page(s) when file changes are detected (enabled by default). https://webpack.js.org/configuration/dev-server/#devserverlivereload', path: 'liveReload', }, ], description: - 'By default, the dev-server will reload/refresh the page when file changes are detected. https://webpack.js.org/configuration/dev-server/#devserverlivereload', - negatedDescription: 'Disables live reloading on changing files.', + 'Enables reload/refresh the page(s) when file changes are detected (enabled by default). https://webpack.js.org/configuration/dev-server/#devserverlivereload', + negatedDescription: + 'Disables reload/refresh the page(s) when file changes are detected (enabled by default)', simpleType: 'boolean', multiple: false, }, @@ -498,20 +533,20 @@ module.exports = { type: 'string', multiple: true, description: - 'Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen', + 'Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen', path: 'open[]', }, { type: 'boolean', multiple: false, description: - 'Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen', + 'Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen', path: 'open', }, ], description: - 'Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen', - negatedDescription: 'Do not open the default browser.', + 'Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen', + negatedDescription: 'Does not open the default browser.', simpleType: 'string', multiple: true, }, @@ -520,24 +555,24 @@ module.exports = { { type: 'boolean', multiple: true, - description: 'Open specified route in browser.', + description: 'Opens specified page in browser.', path: 'open[].target', }, { type: 'string', multiple: true, - description: 'Open specified route in browser.', + description: 'Opens specified page in browser.', path: 'open[].target', }, { type: 'string', multiple: true, - description: 'Open specified route in browser.', + description: 'Opens specified page in browser.', path: 'open.target[]', }, ], - description: 'Open specified route in browser.', - negatedDescription: 'Do not open specified route in browser.', + description: 'Opens specified page in browser.', + negatedDescription: 'Does not open specified page in browser.', simpleType: 'string', multiple: true, }, @@ -579,12 +614,12 @@ module.exports = { type: 'reset', multiple: false, description: - 'Clear all items provided in configuration. Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen', + 'Clear all items provided in configuration. Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen', path: 'open', }, ], description: - 'Clear all items provided in configuration. Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen', + 'Clear all items provided in configuration. Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen', simpleType: 'boolean', multiple: false, }, @@ -594,12 +629,12 @@ module.exports = { type: 'reset', multiple: false, description: - 'Clear all items provided in configuration. Open specified route in browser.', + 'Clear all items provided in configuration. Opens specified page in browser.', path: 'open.target', }, ], description: - 'Clear all items provided in configuration. Open specified route in browser.', + 'Clear all items provided in configuration. Opens specified page in browser.', simpleType: 'boolean', multiple: false, }, @@ -624,14 +659,14 @@ module.exports = { type: 'number', multiple: false, description: - 'Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport', + 'Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport', path: 'port', }, { type: 'string', multiple: false, description: - 'Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport', + 'Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport', path: 'port', }, { @@ -639,12 +674,12 @@ module.exports = { values: ['auto'], multiple: false, description: - 'Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport', + 'Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport', path: 'port', }, ], description: - 'Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport', + 'Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport', simpleType: 'string', multiple: false, }, @@ -654,19 +689,19 @@ module.exports = { type: 'string', multiple: true, description: - 'It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic', + "Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic", path: 'static[]', }, { type: 'boolean', multiple: false, description: - 'It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic', + "Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic", path: 'static', }, ], description: - 'It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic', + "Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic", simpleType: 'string', multiple: true, }, @@ -689,19 +724,19 @@ module.exports = { type: 'string', multiple: true, description: - 'The bundled files will be available in the browser under this path.', + 'The static files will be available in the browser under this public path.', path: 'static[].publicPath', }, { type: 'string', multiple: true, description: - 'The bundled files will be available in the browser under this path.', + 'The static files will be available in the browser under this public path.', path: 'static.publicPath[]', }, ], description: - 'The bundled files will be available in the browser under this path.', + 'The static files will be available in the browser under this public path.', simpleType: 'string', multiple: true, }, @@ -711,12 +746,13 @@ module.exports = { type: 'boolean', multiple: true, description: - 'Tells dev-server to use serveIndex middleware when enabled.', + 'Tells dev server to use serveIndex middleware when enabled.', path: 'static[].serveIndex', }, ], - description: 'Tells dev-server to use serveIndex middleware when enabled.', - negatedDescription: 'Do not tell dev-server to use serveIndex middleware.', + description: 'Tells dev server to use serveIndex middleware when enabled.', + negatedDescription: + 'Does not tell dev server to use serveIndex middleware.', simpleType: 'boolean', multiple: true, }, @@ -725,12 +761,12 @@ module.exports = { { type: 'boolean', multiple: true, - description: 'Watch for files in static content directory.', + description: 'Watches for files in static content directory.', path: 'static[].watch', }, ], - description: 'Watch for files in static content directory.', - negatedDescription: 'Do not watch for files in static content directory.', + description: 'Watches for files in static content directory.', + negatedDescription: 'Does not watch for files in static content directory.', simpleType: 'boolean', multiple: true, }, @@ -740,12 +776,12 @@ module.exports = { type: 'reset', multiple: false, description: - 'Clear all items provided in configuration. It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic', + "Clear all items provided in configuration. Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic", path: 'static', }, ], description: - 'Clear all items provided in configuration. It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic', + "Clear all items provided in configuration. Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic", simpleType: 'boolean', multiple: false, }, @@ -755,12 +791,12 @@ module.exports = { type: 'reset', multiple: false, description: - 'Clear all items provided in configuration. The bundled files will be available in the browser under this path.', + 'Clear all items provided in configuration. The static files will be available in the browser under this public path.', path: 'static.publicPath', }, ], description: - 'Clear all items provided in configuration. The bundled files will be available in the browser under this path.', + 'Clear all items provided in configuration. The static files will be available in the browser under this public path.', simpleType: 'boolean', multiple: false, }, @@ -770,12 +806,12 @@ module.exports = { type: 'string', multiple: true, description: - 'List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', + 'Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', path: 'watchFiles[]', }, ], description: - 'List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', + 'Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', simpleType: 'string', multiple: true, }, @@ -785,12 +821,12 @@ module.exports = { type: 'reset', multiple: false, description: - 'Clear all items provided in configuration. List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', + 'Clear all items provided in configuration. Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', path: 'watchFiles', }, ], description: - 'Clear all items provided in configuration. List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', + 'Clear all items provided in configuration. Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles', simpleType: 'boolean', multiple: false, }, diff --git a/client-src/clients/BaseClient.js b/client-src/clients/BaseClient.js deleted file mode 100644 index cb6c085c50..0000000000 --- a/client-src/clients/BaseClient.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -module.exports = class BaseClient { - // eslint-disable-next-line no-unused-vars - static getClientPath(options) { - throw new Error('Client needs implementation'); - } -}; diff --git a/client-src/clients/SockJSClient.js b/client-src/clients/SockJSClient.js index e7981615b8..5fd1b7f39b 100644 --- a/client-src/clients/SockJSClient.js +++ b/client-src/clients/SockJSClient.js @@ -2,12 +2,9 @@ const SockJS = require('../modules/sockjs-client'); const { log } = require('../utils/log'); -const BaseClient = require('./BaseClient'); -module.exports = class SockJSClient extends BaseClient { +module.exports = class SockJSClient { constructor(url) { - super(); - // SockJS requires `http` and `https` protocols this.sock = new SockJS( url.replace(/^ws:/i, 'http:').replace(/^wss:/i, 'https:') @@ -17,11 +14,6 @@ module.exports = class SockJSClient extends BaseClient { }; } - // eslint-disable-next-line no-unused-vars - static getClientPath(options) { - return require.resolve('./SockJSClient'); - } - onOpen(f) { this.sock.onopen = f; } diff --git a/client-src/clients/WebsocketClient.js b/client-src/clients/WebsocketClient.js index f748edea34..404f80f5a3 100644 --- a/client-src/clients/WebsocketClient.js +++ b/client-src/clients/WebsocketClient.js @@ -1,23 +1,15 @@ 'use strict'; const { log } = require('../utils/log'); -const BaseClient = require('./BaseClient'); -module.exports = class WebsocketClient extends BaseClient { +module.exports = class WebsocketClient { constructor(url) { - super(); - this.client = new WebSocket(url); this.client.onerror = (error) => { log.error(error); }; } - // eslint-disable-next-line no-unused-vars - static getClientPath(options) { - return require.resolve('./WebsocketClient'); - } - onOpen(f) { this.client.onopen = f; } diff --git a/client-src/index.js b/client-src/index.js index 5e1d367732..53bb7a6e30 100644 --- a/client-src/index.js +++ b/client-src/index.js @@ -51,7 +51,9 @@ const socketURL = createSocketURL(parsedResourceQuery); function setAllLogLevel(level) { // This is needed because the HMR logger operate separately from dev server logger - webpackHotLog.setLogLevel(level); + webpackHotLog.setLogLevel( + level === 'verbose' || level === 'log' ? 'info' : level + ); setLogLevel(level); } @@ -85,7 +87,7 @@ const onSocketMessage = { // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain. if (options.overlay) { - overlay.clear(); + overlay.hide(); } sendMessage('Invalid'); @@ -119,7 +121,7 @@ const onSocketMessage = { log.info('Nothing changed.'); if (options.overlay) { - overlay.clear(); + overlay.hide(); } sendMessage('StillOk'); @@ -128,7 +130,7 @@ const onSocketMessage = { sendMessage('Ok'); if (options.overlay) { - overlay.clear(); + overlay.hide(); } if (options.initial) { @@ -175,7 +177,7 @@ const onSocketMessage = { : options.overlay && options.overlay.warnings; if (needShowOverlay) { - overlay.showMessage(warnings); + overlay.show(warnings, 'warnings'); } if (options.initial) { @@ -203,7 +205,7 @@ const onSocketMessage = { : options.overlay && options.overlay.errors; if (needShowOverlay) { - overlay.showMessage(errors); + overlay.show(errors, 'errors'); } options.initial = false; diff --git a/client-src/overlay.js b/client-src/overlay.js index c5e2240e55..e8947fee59 100644 --- a/client-src/overlay.js +++ b/client-src/overlay.js @@ -19,113 +19,139 @@ const colors = { darkgrey: '6D7891', }; -let overlayIframe = null; -let overlayDiv = null; -let lastOnOverlayDivReady = null; +let iframeContainerElement; +let containerElement; +let onLoadQueue = []; ansiHTML.setColors(colors); -function createOverlayIframe(onIframeLoad) { - const iframe = document.createElement('iframe'); - - iframe.id = 'webpack-dev-server-client-overlay'; - iframe.src = 'about:blank'; - iframe.style.position = 'fixed'; - iframe.style.left = 0; - iframe.style.top = 0; - iframe.style.right = 0; - iframe.style.bottom = 0; - iframe.style.width = '100vw'; - iframe.style.height = '100vh'; - iframe.style.border = 'none'; - iframe.style.zIndex = 9999999999; - iframe.onload = onIframeLoad; - - return iframe; +function createContainer() { + iframeContainerElement = document.createElement('iframe'); + iframeContainerElement.id = 'webpack-dev-server-client-overlay'; + iframeContainerElement.src = 'about:blank'; + iframeContainerElement.style.position = 'fixed'; + iframeContainerElement.style.left = 0; + iframeContainerElement.style.top = 0; + iframeContainerElement.style.right = 0; + iframeContainerElement.style.bottom = 0; + iframeContainerElement.style.width = '100vw'; + iframeContainerElement.style.height = '100vh'; + iframeContainerElement.style.border = 'none'; + iframeContainerElement.style.zIndex = 9999999999; + iframeContainerElement.onload = () => { + containerElement = + iframeContainerElement.contentDocument.createElement('div'); + containerElement.id = 'webpack-dev-server-client-overlay-div'; + containerElement.style.position = 'fixed'; + containerElement.style.boxSizing = 'border-box'; + containerElement.style.left = 0; + containerElement.style.top = 0; + containerElement.style.right = 0; + containerElement.style.bottom = 0; + containerElement.style.width = '100vw'; + containerElement.style.height = '100vh'; + containerElement.style.backgroundColor = 'rgba(0, 0, 0, 0.85)'; + containerElement.style.color = '#E8E8E8'; + containerElement.style.fontFamily = 'Menlo, Consolas, monospace'; + containerElement.style.fontSize = 'large'; + containerElement.style.padding = '2rem'; + containerElement.style.lineHeight = '1.2'; + containerElement.style.whiteSpace = 'pre-wrap'; + containerElement.style.overflow = 'auto'; + + const headerElement = document.createElement('span'); + + headerElement.innerText = 'Compiled with problems:'; + + const closeButtonElement = document.createElement('button'); + + closeButtonElement.innerText = 'X'; + closeButtonElement.style.background = 'transparent'; + closeButtonElement.style.border = 'none'; + closeButtonElement.style.fontSize = '20px'; + closeButtonElement.style.fontWeight = 'bold'; + closeButtonElement.style.color = 'white'; + closeButtonElement.style.cursor = 'pointer'; + closeButtonElement.style.cssFloat = 'right'; + closeButtonElement.style.styleFloat = 'right'; + closeButtonElement.addEventListener('click', () => { + hide(); + }); + + containerElement.appendChild(headerElement); + containerElement.appendChild(closeButtonElement); + containerElement.appendChild(document.createElement('br')); + containerElement.appendChild(document.createElement('br')); + + iframeContainerElement.contentDocument.body.appendChild(containerElement); + + onLoadQueue.forEach((onLoad) => { + onLoad(containerElement); + }); + onLoadQueue = []; + + iframeContainerElement.onload = null; + }; + + document.body.appendChild(iframeContainerElement); } -function addOverlayDivTo(iframe) { - const div = iframe.contentDocument.createElement('div'); - - div.id = 'webpack-dev-server-client-overlay-div'; - div.style.position = 'fixed'; - div.style.boxSizing = 'border-box'; - div.style.left = 0; - div.style.top = 0; - div.style.right = 0; - div.style.bottom = 0; - div.style.width = '100vw'; - div.style.height = '100vh'; - div.style.backgroundColor = 'rgba(0, 0, 0, 0.85)'; - div.style.color = '#E8E8E8'; - div.style.fontFamily = 'Menlo, Consolas, monospace'; - div.style.fontSize = 'large'; - div.style.padding = '2rem'; - div.style.lineHeight = '1.2'; - div.style.whiteSpace = 'pre-wrap'; - div.style.overflow = 'auto'; - - iframe.contentDocument.body.appendChild(div); - - return div; -} - -function ensureOverlayDivExists(onOverlayDivReady) { - if (overlayDiv) { +function ensureOverlayExists(callback) { + if (containerElement) { // Everything is ready, call the callback right away. - onOverlayDivReady(overlayDiv); + callback(containerElement); + return; } - // Creating an iframe may be asynchronous so we'll schedule the callback. - // In case of multiple calls, last callback wins. - lastOnOverlayDivReady = onOverlayDivReady; + onLoadQueue.push(callback); - if (overlayIframe) { - // We've already created it. + if (iframeContainerElement) { return; } - // Create iframe and, when it is ready, a div inside it. - overlayIframe = createOverlayIframe(() => { - overlayDiv = addOverlayDivTo(overlayIframe); - // Now we can talk! - lastOnOverlayDivReady(overlayDiv); - }); - - // Zalgo alert: onIframeLoad() will be called either synchronously - // or asynchronously depending on the browser. - // We delay adding it so `overlayIframe` is set when `onIframeLoad` fires. - document.body.appendChild(overlayIframe); + createContainer(); } // Successful compilation. -function clear() { - if (!overlayDiv) { - // It is not there in the first place. +function hide() { + if (!iframeContainerElement) { return; } // Clean up and reset internal state. - document.body.removeChild(overlayIframe); + document.body.removeChild(iframeContainerElement); - overlayDiv = null; - overlayIframe = null; - lastOnOverlayDivReady = null; + iframeContainerElement = null; + containerElement = null; } // Compilation with errors (e.g. syntax error or missing modules). -function showMessage(messages) { - ensureOverlayDivExists((div) => { - // Make it look similar to our terminal. - const errorMessage = messages[0].message || messages[0]; - const text = ansiHTML(encode(errorMessage)); - - div.innerHTML = `Failed to compile.

${text}`; +function show(messages, type) { + ensureOverlayExists(() => { + messages.forEach((message) => { + const entryElement = document.createElement('div'); + const typeElement = document.createElement('span'); + + typeElement.innerText = type === 'warnings' ? 'Warning:' : 'Error:'; + typeElement.style.color = `#${colors.red}`; + + // Make it look similar to our terminal. + const errorMessage = message.message || messages[0]; + const text = ansiHTML(encode(errorMessage)); + const messageTextNode = document.createTextNode(text); + + entryElement.appendChild(typeElement); + entryElement.appendChild(document.createElement('br')); + entryElement.appendChild(document.createElement('br')); + entryElement.appendChild(messageTextNode); + entryElement.appendChild(document.createElement('br')); + entryElement.appendChild(document.createElement('br')); + entryElement.appendChild(document.createElement('br')); + + containerElement.appendChild(entryElement); + }); }); } -module.exports = { - clear, - showMessage, -}; +module.exports = { show, hide }; diff --git a/examples/cli/web-socket-url-cli/README.md b/examples/cli/web-socket-url-cli/README.md index 650fec3905..3f1d49d08e 100644 --- a/examples/cli/web-socket-url-cli/README.md +++ b/examples/cli/web-socket-url-cli/README.md @@ -1,14 +1,14 @@ # CLI: Web Socket URL ```console -npx webpack serve --open-target --host 0.0.0.0 --web-socket-url :8080 +npx webpack serve --open-target --host 0.0.0.0 --client-web-socket-url ws://:8080 ``` -_NOTE: replace `` with your local IP Address._ +_NOTE: replace `` with your local IP Address._ In order to make the server publicly accessible the client needs to know with what host to connect to the server. If `--host 0.0.0.0` is given, the client -would try to connect to `0.0.0.0`. With the `--web-socket-url` options it is possible to +would try to connect to `0.0.0.0`. With the `--client-web-socket-url` options it is possible to override this. ## What Should Happen diff --git a/examples/cli/web-socket-url/README.md b/examples/cli/web-socket-url/README.md index 8311a2a076..58b01687ce 100644 --- a/examples/cli/web-socket-url/README.md +++ b/examples/cli/web-socket-url/README.md @@ -4,10 +4,8 @@ npx webpack serve ``` -_NOTE: replace `` with your local IP Address._ - You're now able to explicitly define the protocol used with the `client.webSocketURL` option -(have a look to the config provided in `webpack.config.js`). +(have a look at the config provided in `webpack.config.js`). ## What Should Happen diff --git a/globalSetupTest.js b/globalSetupTest.js index 66a9708fc0..fa14343cc9 100644 --- a/globalSetupTest.js +++ b/globalSetupTest.js @@ -17,7 +17,9 @@ async function validatePorts() { arr.forEach((port) => { const check = tcpPortUsed.check(port, 'localhost').then((inUse) => { - if (inUse) throw new Error(`${port} has already used. [${key}]`); + if (inUse) { + throw new Error(`${port} has already used. [${key}]`); + } }); samples.push(check); diff --git a/jest.config.js b/jest.config.js index e1045830f9..1c028ecc39 100644 --- a/jest.config.js +++ b/jest.config.js @@ -9,11 +9,7 @@ module.exports = { '/client/', ], testPathIgnorePatterns: ['/bin/this/process-arguments.js'], - moduleFileExtensions: ['js', 'json'], - testMatch: ['**/test/**/*.test.js'], snapshotResolver: '/test/helpers/snapshotResolver.js', setupFilesAfterEnv: ['/setupTest.js'], globalSetup: '/globalSetupTest.js', - testRunner: 'jest-circus/runner', - testSequencer: '/test/testSequencer.js', }; diff --git a/lib/Server.js b/lib/Server.js index 9ae6323d43..d6bfb09fa9 100644 --- a/lib/Server.js +++ b/lib/Server.js @@ -32,7 +32,7 @@ class Server { this.compiler = compiler; this.options = options; this.logger = this.compiler.getInfrastructureLogger('webpack-dev-server'); - this.sockets = []; + this.webSocketConnections = []; this.staticWatchers = []; // Keep track of websocket proxies for external websocket upgrade. this.webSocketProxies = []; @@ -43,7 +43,7 @@ class Server { this.applyDevServerPlugin(); - this.SocketServerImplementation = getSocketServerImplementation( + this.webSocketServerImplementation = getSocketServerImplementation( this.options ); @@ -99,7 +99,7 @@ class Server { msg = `${msg} (${addInfo})`; } - this.sendMessage(this.sockets, 'progress-update', { + this.sendMessage(this.webSocketConnections, 'progress-update', { percent, msg, pluginName, @@ -120,7 +120,7 @@ class Server { setupHooks() { // Listening for events const invalidPlugin = () => { - this.sendMessage(this.sockets, 'invalid'); + this.sendMessage(this.webSocketConnections, 'invalid'); }; const addHooks = (compiler) => { @@ -129,7 +129,7 @@ class Server { compile.tap('webpack-dev-server', invalidPlugin); invalid.tap('webpack-dev-server', invalidPlugin); done.tap('webpack-dev-server', (stats) => { - this.sendStats(this.sockets, this.getStats(stats)); + this.sendStats(this.webSocketConnections, this.getStats(stats)); this.stats = stats; }); }; @@ -474,9 +474,10 @@ class Server { } createWebSocketServer() { - this.socketServer = new this.SocketServerImplementation(this); + // eslint-disable-next-line new-cap + this.webSocketServer = new this.webSocketServerImplementation(this); - this.socketServer.onConnection((connection, headers) => { + this.webSocketServer.onConnection((connection, headers) => { if (!connection) { return; } @@ -495,18 +496,18 @@ class Server { ) { this.sendMessage([connection], 'error', 'Invalid Host/Origin header'); - this.socketServer.close(connection); + this.webSocketServer.closeConnection(connection); return; } - this.sockets.push(connection); + this.webSocketConnections.push(connection); - this.socketServer.onConnectionClose(connection, () => { - const idx = this.sockets.indexOf(connection); + this.webSocketServer.onConnectionClose(connection, () => { + const idx = this.webSocketConnections.indexOf(connection); if (idx >= 0) { - this.sockets.splice(idx, 1); + this.webSocketConnections.splice(idx, 1); } }); @@ -718,7 +719,7 @@ class Server { this.options.port, this.options.host, (error) => { - if (this.options.hot || this.options.liveReload) { + if (Boolean(this.options.hot) || this.options.liveReload) { this.createWebSocketServer(); } @@ -747,12 +748,11 @@ class Server { }); } - close(cb) { - this.sockets.forEach((socket) => { - this.socketServer.close(socket); - }); - - this.sockets = []; + close(callback) { + if (this.webSocketServer) { + this.webSocketServer.close(); + this.webSocketConnections = []; + } const prom = Promise.all( this.staticWatchers.map((watcher) => watcher.close()) @@ -762,7 +762,7 @@ class Server { this.server.kill(() => { // watchers must be closed before closing middleware prom.then(() => { - this.middleware.close(cb); + this.middleware.close(callback); }); }); } @@ -789,7 +789,7 @@ class Server { function runPortFinder() { return new Promise((resolve, reject) => { // default port - portfinder.basePort = 8080; + portfinder.basePort = process.env.WEBPACK_DEV_SERVER_BASE_PORT || 8080; portfinder.getPort((error, foundPort) => { if (error) { return reject(error); @@ -802,7 +802,8 @@ class Server { // Try to find unused port and listen on it for 3 times, // if port is not specified in options. - const defaultPortRetry = parseInt(process.env.DEFAULT_PORT_RETRY, 10) || 3; + const defaultPortRetry = + parseInt(process.env.WEBPACK_DEV_SERVER_PORT_RETRY, 10) || 3; return pRetry(runPortFinder, { retries: defaultPortRetry }); } @@ -929,37 +930,42 @@ class Server { return false; } - sendMessage(sockets, type, data) { - sockets.forEach((socket) => { - this.socketServer.send(socket, JSON.stringify({ type, data })); + sendMessage(webSocketConnections, type, data) { + webSocketConnections.forEach((webSocketConnection) => { + this.webSocketServer.send( + webSocketConnection, + JSON.stringify({ type, data }) + ); }); } serveMagicHtml(req, res, next) { - const _path = req.path; + this.middleware.waitUntilValid(() => { + const _path = req.path; - try { - const filename = this.middleware.getFilenameFromUrl(`${_path}.js`); - const isFile = this.middleware.context.outputFileSystem - .statSync(filename) - .isFile(); + try { + const filename = this.middleware.getFilenameFromUrl(`${_path}.js`); + const isFile = this.middleware.context.outputFileSystem + .statSync(filename) + .isFile(); - if (!isFile) { - return next(); - } + if (!isFile) { + return next(); + } - // Serve a page that executes the javascript - const queries = req._parsedUrl.search || ''; - const responsePage = ``; + // Serve a page that executes the javascript + const queries = req._parsedUrl.search || ''; + const responsePage = ``; - res.send(responsePage); - } catch (error) { - return next(); - } + res.send(responsePage); + } catch (error) { + return next(); + } + }); } // Send stats to a socket or multiple sockets - sendStats(sockets, stats, force) { + sendStats(webSocketConnections, stats, force) { const shouldEmit = !force && stats && @@ -969,19 +975,23 @@ class Server { stats.assets.every((asset) => !asset.emitted); if (shouldEmit) { - this.sendMessage(sockets, 'still-ok'); + this.sendMessage(webSocketConnections, 'still-ok'); return; } - this.sendMessage(sockets, 'hash', stats.hash); + this.sendMessage(webSocketConnections, 'hash', stats.hash); - if (stats.errors.length > 0) { - this.sendMessage(sockets, 'errors', stats.errors); - } else if (stats.warnings.length > 0) { - this.sendMessage(sockets, 'warnings', stats.warnings); + if (stats.errors.length > 0 || stats.warnings.length > 0) { + if (stats.warnings.length > 0) { + this.sendMessage(webSocketConnections, 'warnings', stats.warnings); + } + + if (stats.errors.length > 0) { + this.sendMessage(webSocketConnections, 'errors', stats.errors); + } } else { - this.sendMessage(sockets, 'ok'); + this.sendMessage(webSocketConnections, 'ok'); } } @@ -1021,8 +1031,8 @@ class Server { // disabling refreshing on changing the content if (this.options.liveReload) { - watcher.on('change', () => { - this.sendMessage(this.sockets, 'static-changed', watchPath); + watcher.on('change', (item) => { + this.sendMessage(this.webSocketConnections, 'static-changed', item); }); } diff --git a/lib/options.json b/lib/options.json index f955da4f6a..12076138db 100644 --- a/lib/options.json +++ b/lib/options.json @@ -6,21 +6,23 @@ "anyOf": [ { "type": "array", + "minItems": 1, "items": { - "type": "string", - "minLength": 1 - }, - "minItems": 1 + "$ref": "#/definitions/AllowedHostsItem" + } }, { "enum": ["auto", "all"] }, { - "type": "string", - "minLength": 1 + "$ref": "#/definitions/AllowedHostsItem" } ], - "description": "Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts" + "description": "Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts" + }, + "AllowedHostsItem": { + "type": "string", + "minLength": 1 }, "Bonjour": { "anyOf": [ @@ -32,184 +34,176 @@ "description": "Options for bonjour, description available at https://github.com/watson/bonjour#initializing" } ], - "description": "Broadcasts the server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour" + "description": "Allows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour" }, - "ClientTransportEnum": { - "enum": ["sockjs", "ws"] - }, - "ClientTransportString": { - "type": "string", - "minLength": 1 - }, - "ClientOptions": { + "Client": { "type": "object", + "description": "Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient", + "additionalProperties": false, "properties": { - "transport": { - "anyOf": [ - { - "$ref": "#/definitions/ClientTransportEnum" - }, - { - "$ref": "#/definitions/ClientTransportString" - } - ], - "description": "Allows to set custom transport to communicate with server." + "hotEntry": { + "$ref": "#/definitions/ClientHotEntry" }, "logging": { - "enum": ["none", "error", "warn", "info", "log", "verbose"], - "decription": "Log level in the browser." + "$ref": "#/definitions/ClientLogging" }, - "progress": { - "type": "boolean", - "description": "Print compilation progress in percentage in the browser." + "needClientEntry": { + "$ref": "#/definitions/ClientNeedClientEntry" }, "overlay": { - "anyOf": [ - { - "type": "boolean", - "description": "Show a full-screen overlay in the browser when there are compiler errors or warnings." - }, - { - "type": "object", - "properties": { - "errors": { - "type": "boolean", - "description": "Show a full-screen overlay in the browser when there are compiler errors." - }, - "warnings": { - "type": "boolean", - "description": "Show a full-screen overlay in the browser when there are compiler warnings." - } - } - } - ] + "$ref": "#/definitions/ClientOverlay" }, - "needClientEntry": { - "anyOf": [ - { - "type": "boolean" - }, - { - "instanceof": "Function" - } - ], - "description": "Tells devServer to inject a client entry." + "progress": { + "$ref": "#/definitions/ClientProgress" }, - "hotEntry": { - "anyOf": [ - { - "type": "boolean" - }, - { - "instanceof": "Function" - } - ], - "description": "Tells devServer to inject a Hot Module Replacement entry." + "transport": { + "$ref": "#/definitions/ClientTransport" }, "webSocketURL": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "protocol": { - "anyOf": [ - { - "enum": ["auto"] - }, - { - "type": "string", - "minLength": 1 - } - ], - "description": "Tells clients connected to devServer to use the provided protocol." - }, - "host": { - "type": "string", - "minLength": 1, - "description": "Tells clients connected to devServer to use the provided host." - }, - "port": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string", - "minLength": 1 - } - ], - "description": "Tells clients connected to devServer to use the provided port." - }, - "path": { - "type": "string", - "description": "Tells clients connected to devServer to use the provided path to connect." - } - } - } - ], - "description": "When using dev server and you're proxying dev-server, the client script does not always know where to connect to." + "$ref": "#/definitions/ClientWebSocketURL" } - }, - "description": "Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient", - "additionalProperties": false + } }, - "Compress": { - "type": "boolean", - "description": "Enable gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress" + "ClientHotEntry": { + "description": "Injects a Hot Module Replacement entry.", + "anyOf": [ + { + "type": "boolean" + }, + { + "instanceof": "Function" + } + ] }, - "DevMiddleware": { - "type": "object", - "description": "Provide options to webpack-dev-middleware which handles webpack assets. https://webpack.js.org/configuration/dev-server/#devserverdevmiddleware" + "ClientLogging": { + "enum": ["none", "error", "warn", "info", "log", "verbose"], + "decription": "Allows to set log level in the browser." }, - "Headers": { + "ClientNeedClientEntry": { + "description": "Inject a client entry.", "anyOf": [ { - "type": "object" + "type": "boolean" }, { "instanceof": "Function" } - ], - "description": "Adds headers to all responses. https://webpack.js.org/configuration/dev-server/#devserverheaders" + ] }, - "HistoryApiFallback": { + "ClientOverlay": { "anyOf": [ { + "description": "Enables a full-screen overlay in the browser when there are compiler errors or warnings.", "type": "boolean" }, { "type": "object", - "description": "Options for `historyApiFallback`, description available at https://github.com/bripkens/connect-history-api-fallback#options" + "additionalProperties": false, + "properties": { + "errors": { + "description": "Enables a full-screen overlay in the browser when there are compiler errors.", + "type": "boolean" + }, + "warnings": { + "description": "Enables a full-screen overlay in the browser when there are compiler warnings.", + "type": "boolean" + } + } + } + ] + }, + "ClientProgress": { + "description": "Prints compilation progress in percentage in the browser.", + "type": "boolean" + }, + "ClientTransport": { + "anyOf": [ + { + "$ref": "#/definitions/ClientTransportEnum" + }, + { + "$ref": "#/definitions/ClientTransportString" } ], - "description": "When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback" + "description": "Allows to set custom transport to communicate with dev server." }, - "Host": { + "ClientTransportEnum": { + "enum": ["sockjs", "ws"] + }, + "ClientTransportString": { "type": "string", - "minLength": 1, - "description": "Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost" + "minLength": 1 }, - "Hot": { + "ClientWebSocketURL": { + "description": "Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to).", "anyOf": [ { - "type": "boolean" + "type": "string", + "minLength": 1 }, { - "enum": ["only"] + "type": "object", + "additionalProperties": false, + "properties": { + "host": { + "description": "Tells clients connected to devServer to use the provided host.", + "type": "string", + "minLength": 1 + }, + "path": { + "description": "Tells clients connected to devServer to use the provided path to connect.", + "type": "string" + }, + "password": { + "description": "Tells clients connected to devServer to use the provided password to authenticate.", + "type": "string" + }, + "port": { + "description": "Tells clients connected to devServer to use the provided port.", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "minLength": 1 + } + ] + }, + "protocol": { + "description": "Tells clients connected to devServer to use the provided protocol.", + "anyOf": [ + { + "enum": ["auto"] + }, + { + "type": "string", + "minLength": 1 + } + ] + }, + "username": { + "description": "Tells clients connected to devServer to use the provided username to authenticate.", + "type": "string" + } + } } - ], - "description": "Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot" + ] + }, + "Compress": { + "type": "boolean", + "description": "Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress" + }, + "DevMiddleware": { + "description": "Provide options to 'webpack-dev-middleware' which handles webpack assets. https://webpack.js.org/configuration/dev-server/#devserverdevmiddleware", + "type": "object", + "additionalProperties": true }, "HTTP2": { "type": "boolean", - "description": "Serve over HTTP/2 using spdy. https://webpack.js.org/configuration/dev-server/#devserverhttp2" + "description": "Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2" }, - "HTTPSOptions": { + "HTTPS": { "anyOf": [ { "type": "boolean" @@ -273,31 +267,94 @@ } } ], - "description": "By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps" + "description": "Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps" + }, + "Headers": { + "anyOf": [ + { + "type": "object" + }, + { + "instanceof": "Function" + } + ], + "description": "Allows to set custom headers on response. https://webpack.js.org/configuration/dev-server/#devserverheaders" + }, + "HistoryApiFallback": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "description": "Options for `historyApiFallback`, description available at https://github.com/bripkens/connect-history-api-fallback#options" + } + ], + "description": "Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page Applications that utilise the HTML5 History API. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback" + }, + "Host": { + "type": "string", + "minLength": 1, + "description": "Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost" }, + "Hot": { + "anyOf": [ + { + "type": "boolean" + }, + { + "enum": ["only"] + } + ], + "description": "Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot" + }, + "LiveReload": { "type": "boolean", - "description": "By default, the dev-server will reload/refresh the page when file changes are detected. https://webpack.js.org/configuration/dev-server/#devserverlivereload" + "description": "Enables reload/refresh the page(s) when file changes are detected (enabled by default). https://webpack.js.org/configuration/dev-server/#devserverlivereload" }, "OnAfterSetupMiddleware": { "instanceof": "Function", - "description": "Provides the ability to execute custom middleware after all other middleware internally within the server. https://webpack.js.org/configuration/dev-server/#devserverafter" + "description": "Provides the ability to execute a custom function and apply custom middleware(s) after all other middlewares. https://webpack.js.org/configuration/dev-server/#devserveronaftersetupmiddleware" }, "OnBeforeSetupMiddleware": { "instanceof": "Function", - "description": "Provides the ability to execute custom middleware prior to all other middleware internally within the server. https://webpack.js.org/configuration/dev-server/#devserverbefore" + "description": "Provides the ability to execute a custom function and apply custom middleware(s) prior to all other middlewares. https://webpack.js.org/configuration/dev-server/#devserveronbeforesetupmiddleware" }, "OnListening": { "instanceof": "Function", - "description": "Provides an option to execute a custom function when webpack-dev-server starts listening for connections on a port. https://webpack.js.org/configuration/dev-server/#onlistening" + "description": "Provides the ability to execute a custom function when dev server starts listening. https://webpack.js.org/configuration/dev-server/#devserveronlistening" + }, + "Open": { + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/OpenString" + }, + { + "$ref": "#/definitions/OpenObject" + } + ] + } + }, + { + "$ref": "#/definitions/OpenBoolean" + }, + { + "$ref": "#/definitions/OpenString" + }, + { + "$ref": "#/definitions/OpenObject" + } + ], + "description": "Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen" }, "OpenBoolean": { "type": "boolean" }, - "OpenString": { - "type": "string", - "minLength": 1 - }, "OpenObject": { "type": "object", "additionalProperties": false, @@ -307,20 +364,17 @@ { "type": "array", "items": { - "type": "string", - "minLength": 1 - }, - "minItems": 1 + "type": "string" + } }, { "type": "boolean" }, { - "type": "string", - "minLength": 1 + "type": "string" } ], - "description": "Open specified route in browser." + "description": "Opens specified page in browser." }, "app": { "anyOf": [ @@ -348,8 +402,7 @@ "items": { "type": "string", "minLength": 1 - }, - "minItems": 1 + } } } }, @@ -362,32 +415,9 @@ } } }, - "Open": { - "anyOf": [ - { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/OpenString" - }, - { - "$ref": "#/definitions/OpenObject" - } - ] - } - }, - { - "$ref": "#/definitions/OpenBoolean" - }, - { - "$ref": "#/definitions/OpenString" - }, - { - "$ref": "#/definitions/OpenObject" - } - ], - "description": "Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen" + "OpenString": { + "type": "string", + "minLength": 1 }, "Port": { "anyOf": [ @@ -402,7 +432,7 @@ "enum": ["auto"] } ], - "description": "Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport" + "description": "Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport" }, "Proxy": { "anyOf": [ @@ -420,19 +450,45 @@ "instanceof": "Function" } ] - }, - "minItems": 1 + } } ], - "description": "Proxying some URLs can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy" + "description": "Allows to proxy requests, can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy" }, "SetupExitSignals": { "type": "boolean", - "description": "It takes a boolean and if true (default on CLI), the server will close and exit the process on SIGINT and SIGTERM. https://webpack.js.org/configuration/dev-server/#devserversetupexitsignals", + "description": "Allows to close dev server and exit the process on SIGINT and SIGTERM signals (enabled by default for CLI). https://webpack.js.org/configuration/dev-server/#devserversetupexitsignals", "cli": { "exclude": true } }, + "Static": { + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/StaticString" + }, + { + "$ref": "#/definitions/StaticObject" + } + ] + } + }, + { + "type": "boolean" + }, + { + "$ref": "#/definitions/StaticString" + }, + { + "$ref": "#/definitions/StaticObject" + } + ], + "description": "Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic" + }, "StaticObject": { "type": "object", "additionalProperties": false, @@ -451,17 +507,15 @@ { "type": "array", "items": { - "type": "string", - "minLength": 1 + "type": "string" }, "minItems": 1 }, { - "type": "string", - "minLength": 1 + "type": "string" } ], - "description": "The bundled files will be available in the browser under this path." + "description": "The static files will be available in the browser under this public path." }, "serveIndex": { "anyOf": [ @@ -473,7 +527,7 @@ "additionalProperties": true } ], - "description": "Tells dev-server to use serveIndex middleware when enabled." + "description": "Tells dev server to use serveIndex middleware when enabled." }, "watch": { "anyOf": [ @@ -482,10 +536,10 @@ }, { "type": "object", - "description": "options for watch, description available at https://github.com/paulmillr/chokidar#api" + "description": "Options for watch, description available at https://github.com/paulmillr/chokidar#api" } ], - "description": "Watch for files in static content directory." + "description": "Watches for files in static content directory." } } }, @@ -493,36 +547,29 @@ "type": "string", "minLength": 1 }, - "Static": { + "WatchFiles": { "anyOf": [ { "type": "array", "items": { "anyOf": [ { - "$ref": "#/definitions/StaticString" + "$ref": "#/definitions/WatchFilesString" }, { - "$ref": "#/definitions/StaticObject" + "$ref": "#/definitions/WatchFilesObject" } ] } }, { - "type": "boolean" - }, - { - "$ref": "#/definitions/StaticString" + "$ref": "#/definitions/WatchFilesString" }, { - "$ref": "#/definitions/StaticObject" + "$ref": "#/definitions/WatchFilesObject" } ], - "description": "It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic" - }, - "WatchFilesString": { - "type": "string", - "minLength": 1 + "description": "Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles" }, "WatchFilesObject": { "cli": { @@ -552,37 +599,30 @@ }, "additionalProperties": false }, - "WatchFiles": { + "WatchFilesString": { + "type": "string", + "minLength": 1 + }, + "WebSocketServer": { "anyOf": [ { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/WatchFilesString" - }, - { - "$ref": "#/definitions/WatchFilesObject" - } - ] - } + "$ref": "#/definitions/WebSocketServerEnum" }, { - "$ref": "#/definitions/WatchFilesString" + "$ref": "#/definitions/WebSocketServerString" }, { - "$ref": "#/definitions/WatchFilesObject" + "$ref": "#/definitions/WebSocketServerFunction" + }, + { + "$ref": "#/definitions/WebSocketServerObject" } ], - "description": "List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles" + "description": "Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver" }, "WebSocketServerEnum": { "enum": ["sockjs", "ws"] }, - "WebSocketServerString": { - "type": "string", - "minLength": 1 - }, "WebSocketServerFunction": { "instanceof": "Function" }, @@ -612,24 +652,12 @@ }, "additionalProperties": false }, - "WebSocketServer": { - "anyOf": [ - { - "$ref": "#/definitions/WebSocketServerEnum" - }, - { - "$ref": "#/definitions/WebSocketServerString" - }, - { - "$ref": "#/definitions/WebSocketServerFunction" - }, - { - "$ref": "#/definitions/WebSocketServerObject" - } - ], - "description": "Allows to set web socket server and options." + "WebSocketServerString": { + "type": "string", + "minLength": 1 } }, + "additionalProperties": false, "properties": { "allowedHosts": { "$ref": "#/definitions/AllowedHosts" @@ -638,7 +666,7 @@ "$ref": "#/definitions/Bonjour" }, "client": { - "$ref": "#/definitions/ClientOptions" + "$ref": "#/definitions/Client" }, "compress": { "$ref": "#/definitions/Compress" @@ -662,7 +690,7 @@ "$ref": "#/definitions/HTTP2" }, "https": { - "$ref": "#/definitions/HTTPSOptions" + "$ref": "#/definitions/HTTPS" }, "liveReload": { "$ref": "#/definitions/LiveReload" @@ -697,6 +725,5 @@ "webSocketServer": { "$ref": "#/definitions/WebSocketServer" } - }, - "additionalProperties": false + } } diff --git a/lib/servers/SockJSServer.js b/lib/servers/SockJSServer.js index ebfeb4ddf2..ccc81ec700 100644 --- a/lib/servers/SockJSServer.js +++ b/lib/servers/SockJSServer.js @@ -34,7 +34,7 @@ module.exports = class SockJSServer extends BaseServer { constructor(server) { super(server); - this.socket = sockjs.createServer({ + this.implementation = sockjs.createServer({ // Use provided up-to-date sockjs-client sockjs_url: '/__webpack_dev_server__/sockjs.bundle.js', // Default logger is very annoy. Limit useless logs. @@ -57,7 +57,7 @@ module.exports = class SockJSServer extends BaseServer { return options.path; }; - this.socket.installHandlers(this.server.server, { + this.implementation.installHandlers(this.server.server, { ...this.server.options.webSocketServer.options, prefix: getPrefix(this.server.options.webSocketServer.options), }); @@ -72,13 +72,23 @@ module.exports = class SockJSServer extends BaseServer { connection.write(message); } - close(connection) { + close(callback) { + [...this.server.webSocketConnections].forEach((socket) => { + this.closeConnection(socket); + }); + + if (callback) { + callback(); + } + } + + closeConnection(connection) { connection.close(); } // f should be passed the resulting connection and the connection headers onConnection(f) { - this.socket.on('connection', (connection) => { + this.implementation.on('connection', (connection) => { f(connection, connection ? connection.headers : null); }); } diff --git a/lib/servers/WebsocketServer.js b/lib/servers/WebsocketServer.js index c226bad55a..ddeba5e543 100644 --- a/lib/servers/WebsocketServer.js +++ b/lib/servers/WebsocketServer.js @@ -10,29 +10,29 @@ module.exports = class WebsocketServer extends BaseServer { constructor(server) { super(server); - this.webSocketServer = new ws.Server({ + this.implementation = new ws.Server({ ...this.server.options.webSocketServer.options, noServer: true, }); this.server.server.on('upgrade', (req, sock, head) => { - if (!this.webSocketServer.shouldHandle(req)) { + if (!this.implementation.shouldHandle(req)) { return; } - this.webSocketServer.handleUpgrade(req, sock, head, (connection) => { - this.webSocketServer.emit('connection', connection, req); + this.implementation.handleUpgrade(req, sock, head, (connection) => { + this.implementation.emit('connection', connection, req); }); }); - this.webSocketServer.on('error', (err) => { + this.implementation.on('error', (err) => { this.server.logger.error(err.message); }); const noop = () => {}; - setInterval(() => { - this.webSocketServer.clients.forEach((socket) => { + const interval = setInterval(() => { + this.implementation.clients.forEach((socket) => { if (socket.isAlive === false) { return socket.terminate(); } @@ -41,6 +41,10 @@ module.exports = class WebsocketServer extends BaseServer { socket.ping(noop); }); }, this.server.webSocketHeartbeatInterval); + + this.implementation.on('close', () => { + clearInterval(interval); + }); } send(connection, message) { @@ -52,13 +56,17 @@ module.exports = class WebsocketServer extends BaseServer { connection.send(message); } - close(connection) { + close(callback) { + this.implementation.close(callback); + } + + closeConnection(connection) { connection.close(); } // f should be passed the resulting connection and the connection headers onConnection(f) { - this.webSocketServer.on('connection', (connection, req) => { + this.implementation.on('connection', (connection, req) => { connection.isAlive = true; connection.on('pong', () => { connection.isAlive = true; diff --git a/lib/utils/DevServerPlugin.js b/lib/utils/DevServerPlugin.js index f8014526b2..db310954cf 100644 --- a/lib/utils/DevServerPlugin.js +++ b/lib/utils/DevServerPlugin.js @@ -3,25 +3,23 @@ const ipaddr = require('ipaddr.js'); const getSocketClientPath = require('./getSocketClientPath'); +/** + * An Entry, it can be of type string or string[] or Object + * @typedef {(string[] | string | Object)} Entry + */ + class DevServerPlugin { /** - * @param {?Object} options - Dev-Server options + * @param {Object} options - Dev-Server options */ constructor(options) { this.options = options; } /** - * An Entry, it can be of type string or string[] or Object - * @typedef {(string[] | string | Object)} Entry - */ - - /** - * Apply the plugin - * @param {Object} compiler the compiler instance - * @returns {void} + * @returns {string} */ - apply(compiler) { + getWebSocketURL() { const { options } = this; /** @type {"ws:" | "wss:" | "http:" | "https:" | "auto:"} */ @@ -95,6 +93,7 @@ class DevServerPlugin { if (typeof options.client.webSocketURL.path !== 'undefined') { path = options.client.webSocketURL.path; } + // Web socket server works on custom `path` else if ( typeof options.webSocketServer.options.prefix !== 'undefined' || @@ -105,34 +104,54 @@ class DevServerPlugin { options.webSocketServer.options.path; } - /** @type {Record} */ - const searchParams = {}; + /** @type {string} */ + let username = ''; + + if (typeof options.client.webSocketURL.username !== 'undefined') { + username = options.client.webSocketURL.username; + } + + /** @type {string} */ + let password = ''; + + if (typeof options.client.webSocketURL.password !== 'undefined') { + password = options.client.webSocketURL.password; + } + + const searchParams = new URLSearchParams(); if (typeof options.client.logging !== 'undefined') { - searchParams.logging = options.client.logging; + searchParams.set('logging', options.client.logging); } - const webSocketURL = encodeURIComponent( + const searchParamsString = searchParams.toString(); + + return encodeURIComponent( new URL( - `${protocol}//${ipaddr.IPv6.isIPv6(host) ? `[${host}]` : host}${ + `${protocol}//${username}${password ? `:${password}` : ''}${ + username || password ? `@` : '' + }${ipaddr.IPv6.isIPv6(host) ? `[${host}]` : host}${ port ? `:${port}` : '' - }${path || '/'}${ - Object.keys(searchParams).length > 0 - ? `?${Object.entries(searchParams) - .map(([key, value]) => `${key}=${value}`) - .join('&')}` - : '' - }` + }${path || '/'}${searchParamsString ? `?${searchParamsString}` : ''}` ).toString() ).replace( /[!'()*]/g, (character) => `%${character.charCodeAt(0).toString(16)}` ); + } + /** + * @returns {string} + */ + getClientEntry() { + const webSocketURL = this.getWebSocketURL(); /** @type {string} */ - const clientEntry = `${require.resolve( - '../../client/index.js' - )}?${webSocketURL}`; + + return `${require.resolve('../../client/index.js')}?${webSocketURL}`; + } + + getHotEntry() { + const { options } = this; /** @type {(string[] | string)} */ let hotEntry; @@ -142,47 +161,35 @@ class DevServerPlugin { } else if (options.hot) { hotEntry = require.resolve('webpack/hot/dev-server'); } - /** - * prependEntry Method for webpack 4 - * @param {Entry} originalEntry - * @param {Entry} additionalEntries - * @returns {Entry} - */ - const prependEntry = (originalEntry, additionalEntries) => { - if (typeof originalEntry === 'function') { - return () => - Promise.resolve(originalEntry()).then((entry) => - prependEntry(entry, additionalEntries) - ); - } - - if (typeof originalEntry === 'object' && !Array.isArray(originalEntry)) { - /** @type {Object} */ - const clone = {}; - - Object.keys(originalEntry).forEach((key) => { - // entry[key] should be a string here - const entryDescription = originalEntry[key]; - clone[key] = prependEntry(entryDescription, additionalEntries); - }); - - return clone; - } - - // in this case, entry is a string or an array. - // make sure that we do not add duplicates. - /** @type {Entry} */ - const entriesClone = additionalEntries.slice(0); - [].concat(originalEntry).forEach((newEntry) => { - if (!entriesClone.includes(newEntry)) { - entriesClone.push(newEntry); - } - }); + return hotEntry; + } - return entriesClone; - }; + /** + * @param {Object} compilerOptions + * @returns {boolean} + */ + // eslint-disable-next-line class-methods-use-this + isWebTarget(compilerOptions) { + return compilerOptions.externalsPresets + ? compilerOptions.externalsPresets.web + : [ + 'web', + 'webworker', + 'electron-renderer', + 'node-webkit', + // eslint-disable-next-line no-undefined + undefined, + null, + ].includes(compilerOptions.target); + } + /** + * Apply the plugin + * @param {Object} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { /** * * Description of the option for checkInject method @@ -211,38 +218,29 @@ class DevServerPlugin { return defaultValue; }; - const compilerOptions = compiler.options; + const additionalEntries = []; - compilerOptions.plugins = compilerOptions.plugins || []; + const clientEntry = this.getClientEntry(); - /** @type {boolean} */ - const isWebTarget = compilerOptions.externalsPresets - ? compilerOptions.externalsPresets.web - : [ - 'web', - 'webworker', - 'electron-renderer', - 'node-webkit', - // eslint-disable-next-line no-undefined - undefined, - null, - ].includes(compilerOptions.target); + if ( + checkInject( + this.options.client ? this.options.client.needClientEntry : null, + compiler.options, + this.isWebTarget(compiler.options) && + (Boolean(this.options.hot) || this.options.liveReload) + ) + ) { + additionalEntries.push(clientEntry); + } - /** @type {Entry} */ - const additionalEntries = checkInject( - options.client ? options.client.needClientEntry : null, - compilerOptions, - isWebTarget - ) - ? [clientEntry] - : []; + const hotEntry = this.getHotEntry(); if ( hotEntry && checkInject( - options.client ? options.client.hotEntry : null, - compilerOptions, - true + this.options.client ? this.options.client.hotEntry : null, + compiler.options, + Boolean(this.options.hot) ) ) { additionalEntries.push(hotEntry); @@ -252,32 +250,116 @@ class DevServerPlugin { // use a hook to add entries if available if (typeof webpack.EntryPlugin !== 'undefined') { - for (const additionalEntry of additionalEntries) { - new webpack.EntryPlugin(compiler.context, additionalEntry, { - // eslint-disable-next-line no-undefined - name: undefined, - }).apply(compiler); - } + // Register Entry Dependency in Factory + const EntryDependency = require('webpack/lib/dependencies/EntryDependency'); + compiler.hooks.compilation.tap( + 'webpack-dev-server', + (compilation, { normalModuleFactory }) => { + compilation.dependencyFactories.set( + EntryDependency, + normalModuleFactory + ); + } + ); + + // eslint-disable-next-line no-undefined + const entryOptions = { name: undefined }; + compiler.hooks.make.tapAsync( + 'webpack-dev-server', + (compilation, callback) => { + let entriesCompleted = 0; + const errors = []; + // Register additionalEntries + for (const additionalEntry of additionalEntries) { + const dependency = webpack.EntryPlugin.createDependency( + additionalEntry, + entryOptions + ); + compilation.addEntry( + compiler.context, + dependency, + entryOptions, + // eslint-disable-next-line no-loop-func + (err) => { + if (err) { + errors.push(err); + } + entriesCompleted += 1; + if (entriesCompleted === additionalEntries.length) { + callback(errors[0]); + } + } + ); + } + } + ); } else { - compilerOptions.entry = prependEntry( - compilerOptions.entry || './src', + /** + * prependEntry Method for webpack 4 + * @param {Entry} originalEntry + * @param {Entry} newAdditionalEntries + * @returns {Entry} + */ + const prependEntry = (originalEntry, newAdditionalEntries) => { + if (typeof originalEntry === 'function') { + return () => + Promise.resolve(originalEntry()).then((entry) => + prependEntry(entry, newAdditionalEntries) + ); + } + + if ( + typeof originalEntry === 'object' && + !Array.isArray(originalEntry) + ) { + /** @type {Object} */ + const clone = {}; + + Object.keys(originalEntry).forEach((key) => { + // entry[key] should be a string here + const entryDescription = originalEntry[key]; + + clone[key] = prependEntry(entryDescription, newAdditionalEntries); + }); + + return clone; + } + + // in this case, entry is a string or an array. + // make sure that we do not add duplicates. + /** @type {Entry} */ + const entriesClone = additionalEntries.slice(0); + + [].concat(originalEntry).forEach((newEntry) => { + if (!entriesClone.includes(newEntry)) { + entriesClone.push(newEntry); + } + }); + + return entriesClone; + }; + + compiler.options.entry = prependEntry( + compiler.options.entry || './src', additionalEntries ); compiler.hooks.entryOption.call( - compilerOptions.context, - compilerOptions.entry + compiler.options.context, + compiler.options.entry ); } const providePlugin = new webpack.ProvidePlugin({ - __webpack_dev_server_client__: getSocketClientPath(options), + __webpack_dev_server_client__: getSocketClientPath(this.options), }); providePlugin.apply(compiler); + compiler.options.plugins = compiler.options.plugins || []; + if ( hotEntry && - !compilerOptions.plugins.find( + !compiler.options.plugins.find( (p) => p.constructor === webpack.HotModuleReplacementPlugin ) ) { diff --git a/lib/utils/findCacheDir.js b/lib/utils/findCacheDir.js new file mode 100644 index 0000000000..512fdcb3ee --- /dev/null +++ b/lib/utils/findCacheDir.js @@ -0,0 +1,32 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const findCacheDir = () => { + const cwd = process.cwd(); + let dir = cwd; + for (;;) { + try { + if (fs.statSync(path.join(dir, 'package.json')).isFile()) break; + // eslint-disable-next-line no-empty + } catch (e) {} + const parent = path.dirname(dir); + if (dir === parent) { + // eslint-disable-next-line no-undefined + dir = undefined; + break; + } + dir = parent; + } + if (!dir) { + return path.resolve(cwd, '.cache/webpack-dev-server'); + } else if (process.versions.pnp === '1') { + return path.resolve(dir, '.pnp/.cache/webpack-dev-server'); + } else if (process.versions.pnp === '3') { + return path.resolve(dir, '.yarn/.cache/webpack-dev-server'); + } + return path.resolve(dir, 'node_modules/.cache/webpack-dev-server'); +}; + +module.exports = findCacheDir; diff --git a/lib/utils/getCertificate.js b/lib/utils/getCertificate.js index 51e260ca68..3facb5cc8f 100644 --- a/lib/utils/getCertificate.js +++ b/lib/utils/getCertificate.js @@ -4,7 +4,7 @@ const path = require('path'); const os = require('os'); const fs = require('graceful-fs'); const del = require('del'); -const findCacheDir = require('find-cache-dir'); +const findCacheDir = require('./findCacheDir'); const createCertificate = require('./createCertificate'); function getCertificate(logger) { diff --git a/lib/utils/getSocketClientPath.js b/lib/utils/getSocketClientPath.js index 1efd9067ca..5484ba358e 100644 --- a/lib/utils/getSocketClientPath.js +++ b/lib/utils/getSocketClientPath.js @@ -21,13 +21,17 @@ function getSocketClientPath(options) { case 'string': // could be 'sockjs', 'ws', or a path that should be required if (clientTransport === 'sockjs') { - ClientImplementation = require('../../client/clients/SockJSClient'); + ClientImplementation = require.resolve( + '../../client/clients/SockJSClient' + ); } else if (clientTransport === 'ws') { - ClientImplementation = require('../../client/clients/WebsocketClient'); + ClientImplementation = require.resolve( + '../../client/clients/WebsocketClient' + ); } else { try { // eslint-disable-next-line import/no-dynamic-require - ClientImplementation = require(clientTransport); + ClientImplementation = require.resolve(clientTransport); } catch (e) { clientImplementationFound = false; } @@ -43,11 +47,11 @@ function getSocketClientPath(options) { !isKnownWebSocketServerImplementation ? 'When you use custom web socket implementation you must explicitly specify client.transport. ' : '' - }client.transport must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to a JS file which exports a class extending BaseClient (webpack-dev-server/client-src/clients/BaseClient.js) via require.resolve(...)` + }client.transport must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to a JS file via require.resolve(...) which exports a class ` ); } - return ClientImplementation.getClientPath(options); + return ClientImplementation; } module.exports = getSocketClientPath; diff --git a/lib/utils/normalizeOptions.js b/lib/utils/normalizeOptions.js index 538a90feac..50dc9121dc 100644 --- a/lib/utils/normalizeOptions.js +++ b/lib/utils/normalizeOptions.js @@ -124,6 +124,8 @@ function normalizeOptions(compiler, options, logger) { host: parsedURL.hostname, port: parsedURL.port.length > 0 ? Number(parsedURL.port) : '', path: parsedURL.pathname, + username: parsedURL.username, + password: parsedURL.password, }; } else if (typeof options.client.webSocketURL.port === 'string') { options.client.webSocketURL.port = Number(options.client.webSocketURL.port); @@ -132,6 +134,12 @@ function normalizeOptions(compiler, options, logger) { // Enable client overlay by default if (typeof options.client.overlay === 'undefined') { options.client.overlay = true; + } else if (typeof options.client.overlay !== 'boolean') { + options.client.overlay = { + errors: true, + warnings: true, + ...options.client.overlay, + }; } // client.hotEntry diff --git a/package-lock.json b/package-lock.json index 4fb1ae8d47..29db8ab4b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,12 +15,11 @@ "connect-history-api-fallback": "^1.6.0", "del": "^6.0.0", "express": "^4.17.1", - "find-cache-dir": "^3.3.1", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.0", "internal-ip": "^6.2.0", - "ipaddr.js": "^2.0.0", + "ipaddr.js": "^2.0.1", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", "open": "^8.0.9", @@ -40,17 +39,16 @@ "webpack-dev-server": "bin/webpack-dev-server.js" }, "devDependencies": { - "@babel/cli": "^7.14.3", - "@babel/core": "^7.14.3", - "@babel/plugin-transform-object-assign": "^7.12.13", - "@babel/plugin-transform-runtime": "^7.14.3", - "@babel/preset-env": "^7.14.2", - "@babel/runtime": "^7.14.0", + "@babel/cli": "^7.14.5", + "@babel/core": "^7.14.5", + "@babel/plugin-transform-object-assign": "^7.14.5", + "@babel/plugin-transform-runtime": "^7.14.5", + "@babel/preset-env": "^7.14.5", + "@babel/runtime": "^7.14.5", "@commitlint/cli": "^12.1.3", "@commitlint/config-conventional": "^12.1.4", - "@jest/test-sequencer": "^26.6.3", "acorn": "^8.2.4", - "babel-jest": "^26.6.3", + "babel-jest": "^27.0.2", "babel-loader": "^8.2.2", "body-parser": "^1.19.0", "core-js": "^3.12.1", @@ -63,8 +61,7 @@ "file-loader": "^6.2.0", "html-webpack-plugin": "^4.5.2", "husky": "^6.0.0", - "jest": "^26.6.3", - "jest-circus": "^26.6.3", + "jest": "^27.0.4", "less": "^4.1.1", "less-loader": "^7.3.0", "lint-staged": "^11.0.0", @@ -82,7 +79,7 @@ "tcp-port-used": "^1.0.2", "typescript": "^4.2.4", "url-loader": "^4.1.1", - "webpack": "^5.37.1", + "webpack": "^5.39.1", "webpack-cli": "^4.7.2", "webpack-merge": "^5.8.0" }, @@ -99,9 +96,9 @@ } }, "node_modules/@babel/cli": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.3.tgz", - "integrity": "sha512-zU4JLvwk32ay1lhhyGfqiRUSPoltVDjhYkA3aQq8+Yby9z30s/EsFw1EPOHxWG9YZo2pAGfgdRNeHZQAYU5m9A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.5.tgz", + "integrity": "sha512-poegjhRvXHWO0EAsnYajwYZuqcz7gyfxwfaecUESxDujrqOivf3zrjFbub8IJkrqEaz3fvJWh001EzxBub54fg==", "dev": true, "dependencies": { "commander": "^4.0.1", @@ -116,8 +113,11 @@ "babel": "bin/babel.js", "babel-external-helpers": "bin/babel-external-helpers.js" }, + "engines": { + "node": ">=6.9.0" + }, "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.2", "chokidar": "^3.4.0" }, "peerDependencies": { @@ -125,35 +125,41 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dev": true, "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz", - "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==", - "dev": true + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz", + "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -170,76 +176,94 @@ } }, "node_modules/@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.2", + "@babel/types": "^7.14.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz", - "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-validator-option": "^7.12.17", + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz", - "integrity": "sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.14.4", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz", - "integrity": "sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } @@ -264,193 +288,249 @@ } }, "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", "dev": true, "dependencies": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", - "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", "dev": true, "dependencies": { - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz", + "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz", - "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.4" + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", "dev": true, "dependencies": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", "dev": true, "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", - "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", + "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -460,217 +540,262 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", - "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz", + "integrity": "sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz", - "integrity": "sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.3", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-class-static-block": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", - "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", - "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", - "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-json-strings": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", - "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", - "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", - "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz", - "integrity": "sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz", + "integrity": "sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-compilation-targets": "^7.14.4", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.2" + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", - "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", - "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-create-class-features-plugin": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=4" @@ -716,12 +841,15 @@ } }, "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", - "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -848,495 +976,618 @@ } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz", - "integrity": "sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz", - "integrity": "sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.14.4", - "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", "globals": "^11.1.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz", - "integrity": "sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz", + "integrity": "sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", - "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", - "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", - "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz", + "integrity": "sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-assign": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz", - "integrity": "sha512-4QxDMc0lAOkIBSfCrnSGbAJ+4epDBF2XXwcLXuBcG1xl9u7LrktNVD4+LwhL47XuKVPQ7R25e/WdcV+h97HyZA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.14.5.tgz", + "integrity": "sha512-lvhjk4UN9xJJYB1mI5KC0/o1D5EcJXdbhVe+4fSk08D6ZN+iuAIs7LJC+71h8av9Ew4+uRq9452v9R93SFmQlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", - "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "dev": true, "dependencies": { "regenerator-transform": "^0.14.2" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz", - "integrity": "sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.4.tgz", - "integrity": "sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-compilation-targets": "^7.14.4", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-class-static-block": "^7.14.3", - "@babel/plugin-proposal-dynamic-import": "^7.14.2", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-object-rest-spread": "^7.14.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-private-property-in-object": "^7.14.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.5.tgz", + "integrity": "sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.5", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -1346,48 +1597,51 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.14.4", - "@babel/plugin-transform-classes": "^7.14.4", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.14.4", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.14.2", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.14.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.14.2", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.5", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.5", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.5", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.4", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.14.0", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } @@ -1409,49 +1663,62 @@ } }, "node_modules/@babel/runtime": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", - "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", + "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { @@ -1460,22 +1727,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, "node_modules/@commitlint/cli": { "version": "12.1.4", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-12.1.4.tgz", @@ -2052,20 +2303,20 @@ } }, "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.2.tgz", + "integrity": "sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^27.0.2", + "jest-util": "^27.0.2", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/console/node_modules/ansi-styles": { @@ -2148,42 +2399,51 @@ } }, "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.4.tgz", + "integrity": "sha512-+dsmV8VUs1h/Szb+rEWk8xBM1fp1I///uFy9nk3wXGvRsF2lBp8EVPmtWc+QFRb3MY2b7u2HbkGF1fzoDzQTLA==", "dev": true, "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/reporters": "^27.0.4", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", + "jest-changed-files": "^27.0.2", + "jest-config": "^27.0.4", + "jest-haste-map": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-resolve-dependencies": "^27.0.4", + "jest-runner": "^27.0.4", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "jest-watcher": "^27.0.2", + "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/@jest/core/node_modules/ansi-styles": { @@ -2324,62 +2584,62 @@ } }, "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.3.tgz", + "integrity": "sha512-pN9m7fbKsop5vc3FOfH8NF7CKKdRbEZzcxfIo1n2TT6ucKWLFq0P6gCJH0GpnQp036++yY9utHOxpeT1WnkWTA==", "dev": true, "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^27.0.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.3.tgz", + "integrity": "sha512-fQ+UCKRIYKvTCEOyKPnaPnomLATIhMnHC/xPZ7yT1Uldp7yMgMxoYIFidDbpSTgB79+/U+FgfoD30c6wg3IUjA==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^27.0.2", + "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^27.0.2", + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.3.tgz", + "integrity": "sha512-OzsIuf7uf+QalqAGbjClyezzEcLQkdZ+7PejUrZgDs+okdAK8GwRCGcYCirHvhMBBQh60Jr3NlIGbn/KBPQLEQ==", "dev": true, "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^27.0.3", + "@jest/types": "^27.0.2", + "expect": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.4.tgz", + "integrity": "sha512-Xa90Nm3JnV0xCe4M6A10M9WuN9krb+WFKxV1A98Y4ePCw40n++r7uxFUNU7DT1i9Behj7fjrAIju9oU0t1QtCg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -2390,10 +2650,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "jest-haste-map": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -2401,10 +2661,15 @@ "v8-to-istanbul": "^7.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, - "optionalDependencies": { - "node-notifier": "^8.0.0" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/@jest/reporters/node_modules/ansi-styles": { @@ -2496,9 +2761,9 @@ } }, "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.1.tgz", + "integrity": "sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==", "dev": true, "dependencies": { "callsites": "^3.0.0", @@ -2506,7 +2771,7 @@ "source-map": "^0.6.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/source-map/node_modules/source-map": { @@ -2519,60 +2784,59 @@ } }, "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.2.tgz", + "integrity": "sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==", "dev": true, "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/types": "^27.0.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz", + "integrity": "sha512-6UFEVwdmxYdyNffBxVVZxmXEdBE4riSddXYSnFNH0ELFQFk/bvagizim8WfgJTqF4EKd+j1yFxvhb8BMHfOjSQ==", "dev": true, "dependencies": { - "@jest/test-result": "^26.6.2", + "@jest/test-result": "^27.0.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "jest-haste-map": "^27.0.2", + "jest-runtime": "^27.0.4" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.2.tgz", + "integrity": "sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", + "jest-haste-map": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-util": "^27.0.2", + "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform/node_modules/ansi-styles": { @@ -2722,19 +2986,19 @@ } }, "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz", + "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { @@ -2808,16 +3072,16 @@ } }, "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "version": "2.1.8-no-fsevents.2", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz", + "integrity": "sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg==", "dev": true, "optional": true, "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "glob-parent": "^3.1.0", + "glob-parent": "^5.1.2", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", @@ -2869,9 +3133,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" @@ -3015,9 +3279,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "15.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" + "version": "15.12.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.3.tgz", + "integrity": "sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.0", @@ -3032,9 +3296,9 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", "dev": true }, "node_modules/@types/retry": { @@ -3135,9 +3399,9 @@ } }, "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", + "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -3355,9 +3619,9 @@ } }, "node_modules/acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", + "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", "bin": { "acorn": "bin/acorn" }, @@ -3518,6 +3782,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, + "optional": true, "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -3528,6 +3793,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, + "optional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" }, @@ -3549,6 +3815,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3558,6 +3825,7 @@ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3567,6 +3835,7 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3623,6 +3892,7 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3658,6 +3928,7 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3706,6 +3977,7 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, + "optional": true, "bin": { "atob": "bin/atob.js" }, @@ -3714,25 +3986,25 @@ } }, "node_modules/babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.2.tgz", + "integrity": "sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q==", "dev": true, "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", + "babel-preset-jest": "^27.0.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.8.0" } }, "node_modules/babel-jest/node_modules/ansi-styles": { @@ -3892,9 +4164,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz", + "integrity": "sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -3903,7 +4175,7 @@ "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { @@ -3921,13 +4193,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz", - "integrity": "sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.9.1" + "core-js-compat": "^3.14.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -3969,16 +4241,16 @@ } }, "node_modules/babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz", + "integrity": "sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^27.0.1", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -3994,6 +4266,7 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, + "optional": true, "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -4012,6 +4285,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -4154,6 +4428,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, + "optional": true, "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -4263,6 +4538,7 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, + "optional": true, "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -4336,26 +4612,14 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001236", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz", - "integrity": "sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ==", + "version": "1.0.30001238", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001238.tgz", + "integrity": "sha512-bZGam2MxEt7YNsa2VwshqWQMwrYs5tR5WZQRYSuFxsBQunWjBuXhN4cS9nV5FFb1Z9y+DoQcQ0COyQbv6A+CKw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" } }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -4380,23 +4644,23 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/chokidar/node_modules/anymatch": { @@ -4441,17 +4705,6 @@ "node": ">=8" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chokidar/node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4472,9 +4725,9 @@ } }, "node_modules/chokidar/node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -4508,15 +4761,15 @@ } }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", "dev": true }, "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", + "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", "dev": true }, "node_modules/class-utils": { @@ -4524,6 +4777,7 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, + "optional": true, "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -4539,6 +4793,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -4551,6 +4806,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -4563,6 +4819,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -4575,6 +4832,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -4589,6 +4847,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -4705,6 +4964,7 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, + "optional": true, "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -4757,7 +5017,8 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true }, "node_modules/compare-func": { "version": "2.0.0", @@ -5182,6 +5443,7 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -5477,6 +5739,7 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true, + "optional": true, "engines": { "node": ">=0.10" } @@ -5553,6 +5816,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -5642,12 +5906,12 @@ "dev": true }, "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz", + "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==", "dev": true, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/dir-glob": { @@ -5882,14 +6146,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.3.750", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.750.tgz", - "integrity": "sha512-Eqy9eHNepZxJXT+Pc5++zvEi5nQ6AGikwFYDCYwXUFBr+ynJ6pDG7MzZmwGYCIuXShLJM0n4bq+aoKDmvSGJ8A==" + "version": "1.3.752", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", + "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==" }, "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true, "engines": { "node": ">=10" @@ -6536,18 +6800,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/eslint/node_modules/globals": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", @@ -6749,12 +7001,6 @@ "node": ">=0.12.0" } }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -6791,6 +7037,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, + "optional": true, "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -6809,6 +7056,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "dependencies": { "ms": "2.0.0" } @@ -6818,6 +7066,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -6830,6 +7079,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -6842,6 +7092,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -6854,6 +7105,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -6868,6 +7120,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -6876,58 +7129,38 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "optional": true }, "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz", + "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" + "@jest/types": "^27.0.2", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.1", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-regex-util": "^27.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/expect/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/expect/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/expect/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -6991,6 +7224,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "dependencies": { "is-extendable": "^0.1.0" }, @@ -7003,6 +7237,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, + "optional": true, "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -7022,6 +7257,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -7107,17 +7343,6 @@ "node": ">=8" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-glob/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7275,6 +7500,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, + "optional": true, "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -7319,6 +7545,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -7335,6 +7562,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -7347,6 +7575,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -7358,6 +7587,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -7372,6 +7602,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -7386,6 +7617,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -7397,6 +7629,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -7463,6 +7696,7 @@ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -7503,6 +7737,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, + "optional": true, "dependencies": { "map-cache": "^0.2.2" }, @@ -7931,6 +8166,7 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -8021,27 +8257,14 @@ } }, "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "is-extglob": "^2.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, "node_modules/glob-to-regexp": { @@ -8071,9 +8294,9 @@ } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -8110,13 +8333,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -8206,6 +8422,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, + "optional": true, "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -8220,6 +8437,7 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, + "optional": true, "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -8233,6 +8451,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, + "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -8771,9 +8990,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz", - "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "engines": { "node": ">= 10" } @@ -8791,6 +9010,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, + "optional": true, "dependencies": { "kind-of": "^6.0.0" }, @@ -8803,6 +9023,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -8868,7 +9089,8 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "dev": true, + "optional": true }, "node_modules/is-callable": { "version": "1.2.3", @@ -8883,12 +9105,12 @@ } }, "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", "dev": true, "dependencies": { - "ci-info": "^2.0.0" + "ci-info": "^3.1.1" }, "bin": { "is-ci": "bin.js" @@ -8911,6 +9133,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, + "optional": true, "dependencies": { "kind-of": "^6.0.0" }, @@ -8923,6 +9146,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -8943,6 +9167,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, + "optional": true, "dependencies": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -8957,6 +9182,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -8980,6 +9206,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -9061,6 +9288,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -9246,6 +9474,7 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -9404,114 +9633,73 @@ "node": ">=8" } }, - "node_modules/jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/jest": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz", + "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "@jest/core": "^27.0.4", + "import-local": "^3.0.2", + "jest-cli": "^27.0.4" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/jest-changed-files/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "node_modules/jest-changed-files": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.2.tgz", + "integrity": "sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==", "dev": true, + "dependencies": { + "@jest/types": "^27.0.2", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, "engines": { - "node": ">=8.12.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-circus": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.3.tgz", - "integrity": "sha512-ACrpWZGcQMpbv13XbzRzpytEJlilP/Su0JtNCi5r/xLpOUhnaIJr8leYYpLEMgPFURZISEHrnnpmB54Q/UziPw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.4.tgz", + "integrity": "sha512-QD+eblDiRphta630WRKewuASLs/oY1Zki2G4bccntRvrTHQ63ljwFR5TLduuK4Zg0ZPzW0+8o6AP7KRd1yKOjw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", + "@jest/environment": "^27.0.3", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^26.6.2", + "expect": "^27.0.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "stack-utils": "^2.0.2", - "throat": "^5.0.0" + "jest-each": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-circus/node_modules/ansi-styles": { @@ -9572,6 +9760,15 @@ "node": ">=8" } }, + "node_modules/jest-circus/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9585,30 +9782,37 @@ } }, "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.4.tgz", + "integrity": "sha512-E0T+/i2lxsWAzV7LKYd0SB7HUAvePqaeIh5vX43/G5jXLhv1VzjYzJAGEkTfvxV774ll9cyE2ljcL73PVMEOXQ==", "dev": true, "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/core": "^27.0.4", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-config": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", "prompts": "^2.0.1", - "yargs": "^15.4.1" + "yargs": "^16.0.3" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/jest-cli/node_modules/ansi-styles": { @@ -9642,17 +9846,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9671,19 +9864,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-cli/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9693,45 +9873,6 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9744,88 +9885,36 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.4.tgz", + "integrity": "sha512-VkQFAHWnPQefdvHU9A+G3H/Z3NrrTKqWpvxgQz3nkUdkDTWeKJE6e//BL+R7z79dXOMVksYgM/z6ndtN0hfChg==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@jest/test-sequencer": "^27.0.4", + "@jest/types": "^27.0.2", + "babel-jest": "^27.0.2", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" + "is-ci": "^3.0.0", + "jest-circus": "^27.0.4", + "jest-environment-jsdom": "^27.0.3", + "jest-environment-node": "^27.0.3", + "jest-get-type": "^27.0.1", + "jest-jasmine2": "^27.0.4", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-runner": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "ts-node": ">=9.0.0" @@ -9965,18 +10054,18 @@ } }, "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz", + "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^27.0.1", + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-diff/node_modules/ansi-styles": { @@ -10050,31 +10139,31 @@ } }, "node_modules/jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.1.tgz", + "integrity": "sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.2.tgz", + "integrity": "sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.0.1", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-each/node_modules/ansi-styles": { @@ -10148,74 +10237,73 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz", + "integrity": "sha512-5KLmgv1bhiimpSA8oGTnZYk6g4fsNyZiA/6gI2tAZUgrufd7heRUSVh4gRokzZVEj8zlwAQYT0Zs6tuJSW/ECA==", "dev": true, "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2", + "jsdom": "^16.6.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.3.tgz", + "integrity": "sha512-co2/IVnIFL3cItpFULCvXFg9us4gvWXgs7mutAMPCbFhcqh56QAOdKhNzC2+RycsC/k4mbMj1VF+9F/NzA0ROg==", "dev": true, "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz", + "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==", "dev": true, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.2.tgz", + "integrity": "sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", + "jest-regex-util": "^27.0.1", + "jest-serializer": "^27.0.1", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", + "micromatch": "^4.0.4", "walker": "^1.0.7" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "optionalDependencies": { - "fsevents": "^2.1.2" + "fsevents": "^2.3.2" } }, "node_modules/jest-haste-map/node_modules/anymatch": { @@ -10290,32 +10378,32 @@ } }, "node_modules/jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz", + "integrity": "sha512-yj3WrjjquZwkJw+eA4c9yucHw4/+EHndHWSqgHbHGQfT94ihaaQsa009j1a0puU8CNxPDk0c1oAPeOpdJUElwA==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.0.3", + "@jest/source-map": "^27.0.1", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.2", + "expect": "^27.0.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "jest-each": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2", + "throat": "^6.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-jasmine2/node_modules/ansi-styles": { @@ -10389,31 +10477,31 @@ } }, "node_modules/jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz", + "integrity": "sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==", "dev": true, "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz", + "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^27.0.2", + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { @@ -10487,23 +10575,23 @@ } }, "node_modules/jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz", + "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.2", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-message-util/node_modules/ansi-styles": { @@ -10644,16 +10732,16 @@ } }, "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.3.tgz", + "integrity": "sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "@types/node": "*" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-pnp-resolver": { @@ -10674,45 +10762,46 @@ } }, "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz", + "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==", "dev": true, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.4.tgz", + "integrity": "sha512-BcfyK2i3cG79PDb/6gB6zFeFQlcqLsQjGBqznFCpA0L/3l1L/oOsltdUjs5eISAWA9HS9qtj8v2PSZr/yWxONQ==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "chalk": "^4.0.0", + "escalade": "^3.1.1", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "resolve": "^1.20.0", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz", + "integrity": "sha512-F33UPfw1YGWCV2uxJl7wD6TvcQn5IC0LtguwY3r4L7R6H4twpLkp5Q2ZfzRx9A2I3G8feiy0O0sqcn/Qoym71A==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "@jest/types": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-snapshot": "^27.0.4" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve/node_modules/ansi-styles": { @@ -10764,133 +10853,13 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-resolve/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/jest-resolve/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/jest-resolve/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-resolve/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=8" } }, "node_modules/jest-resolve/node_modules/slash": { @@ -10914,44 +10883,37 @@ "node": ">=8" } }, - "node_modules/jest-resolve/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.4.tgz", + "integrity": "sha512-NfmvSYLCsCJk2AG8Ar2NAh4PhsJJpO+/r+g4bKR5L/5jFzx/indUpnVBdrfDvuqhGLLAvrKJ9FM/Nt8o1dsqxg==", "dev": true, "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/environment": "^27.0.3", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.7.1", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "jest-docblock": "^27.0.1", + "jest-environment-jsdom": "^27.0.3", + "jest-environment-node": "^27.0.3", + "jest-haste-map": "^27.0.2", + "jest-leak-detector": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-runtime": "^27.0.4", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", "source-map-support": "^0.5.6", - "throat": "^5.0.0" + "throat": "^6.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner/node_modules/ansi-styles": { @@ -11025,44 +10987,40 @@ } }, "node_modules/jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.4.tgz", + "integrity": "sha512-voJB4xbAjS/qYPboV+e+gmg3jfvHJJY4CagFWBOM9dQKtlaiTjcpD2tWwla84Z7PtXSQPeIpXY0qksA9Dum29A==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.2", + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/globals": "^27.0.3", + "@jest/source-map": "^27.0.1", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-haste-map": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-mock": "^27.0.3", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" + "yargs": "^16.0.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runtime/node_modules/ansi-styles": { @@ -11096,17 +11054,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runtime/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -11125,19 +11072,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-runtime/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11147,45 +11081,6 @@ "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runtime/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runtime/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -11207,99 +11102,52 @@ "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/jest-runtime/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.1.tgz", + "integrity": "sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==", "dev": true, "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.4" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.4.tgz", + "integrity": "sha512-hnjrvpKGdSMvKfbHyaG5Kul7pDJGZvjVy0CKpzhu28MmAssDXS6GpynhXzgst1wBQoKD8c9b2VS2a5yhDLQRCA==", "dev": true, "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^26.6.2", + "expect": "^27.0.2", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", + "jest-diff": "^27.0.2", + "jest-get-type": "^27.0.1", + "jest-haste-map": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-util": "^27.0.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", + "pretty-format": "^27.0.2", "semver": "^7.3.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-snapshot/node_modules/ansi-styles": { @@ -11388,20 +11236,20 @@ } }, "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.2.tgz", + "integrity": "sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-util/node_modules/ansi-styles": { @@ -11419,18 +11267,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-util/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", @@ -11465,18 +11301,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-util/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11486,28 +11310,6 @@ "node": ">=8" } }, - "node_modules/jest-util/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jest-util/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11520,33 +11322,21 @@ "node": ">=8" } }, - "node_modules/jest-util/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.2.tgz", + "integrity": "sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^27.0.2", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^27.0.1", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^27.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-validate/node_modules/ansi-styles": { @@ -11632,21 +11422,21 @@ } }, "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.2.tgz", + "integrity": "sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==", "dev": true, "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "jest-util": "^27.0.2", "string-length": "^4.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-watcher/node_modules/ansi-styles": { @@ -11720,14 +11510,13 @@ } }, "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", + "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "engines": { "node": ">= 10.13.0" @@ -11737,21 +11526,22 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-tokens": { @@ -11927,6 +11717,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -12624,6 +12415,7 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -12645,6 +12437,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, + "optional": true, "dependencies": { "object-visit": "^1.0.0" }, @@ -12653,15 +12446,15 @@ } }, "node_modules/marked": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.7.tgz", - "integrity": "sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.1.tgz", + "integrity": "sha512-5XFS69o9CzDpQDSpUYC+AN2xvq8yl1EGa5SG/GI1hP78/uTeo3PDfiDNmsUyiahpyhToDDJhQk7fNtJsga+KVw==", "dev": true, "bin": { "marked": "bin/marked" }, "engines": { - "node": ">= 8.16.2" + "node": ">= 12" } }, "node_modules/media-typer": { @@ -12912,6 +12705,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, + "optional": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -12936,6 +12730,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -12949,6 +12744,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -12961,6 +12757,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -13070,6 +12867,7 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, + "optional": true, "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -13083,6 +12881,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -13149,6 +12948,7 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, + "optional": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -13171,6 +12971,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -13184,6 +12985,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -13196,6 +12998,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -13295,37 +13098,6 @@ "node": ">=0.10.0" } }, - "node_modules/node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-releases": { "version": "1.1.73", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", @@ -13513,6 +13285,7 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, + "optional": true, "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -13527,6 +13300,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -13539,6 +13313,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -13551,6 +13326,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -13563,6 +13339,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -13577,6 +13354,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -13618,6 +13396,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, + "optional": true, "dependencies": { "isobject": "^3.0.0" }, @@ -13665,6 +13444,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, + "optional": true, "dependencies": { "isobject": "^3.0.1" }, @@ -13889,6 +13669,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -13977,21 +13758,16 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -14295,14 +14071,15 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", "dev": true, "dependencies": { "colorette": "^1.2.2", @@ -14427,53 +14204,32 @@ } }, "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz", + "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "engines": { - "node": ">= 10" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "node": ">=10" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -14655,6 +14411,27 @@ "node": ">=0.4.0" } }, + "node_modules/puppeteer/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -14985,6 +14762,7 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, + "optional": true, "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -14998,6 +14776,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -15011,6 +14790,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -15034,9 +14814,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" @@ -15102,19 +14882,41 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "dev": true, + "optional": true }, "node_modules/renderkid": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.6.tgz", - "integrity": "sha512-GIis2GBr/ho0pFNf57D4XM4+PgnQuTii0WCPjEZmZfKivzUfGuRdjN2aQYtYMiNggHmNyBve+thFnNR1iBRcKg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^6.0.0" + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/repeat-element": { @@ -15122,6 +14924,7 @@ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -15131,6 +14934,7 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true, + "optional": true, "engines": { "node": ">=0.10" } @@ -15165,12 +14969,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -15227,7 +15025,8 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true + "dev": true, + "optional": true }, "node_modules/restore-cursor": { "version": "3.1.0", @@ -15247,6 +15046,7 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, + "optional": true, "engines": { "node": ">=0.12" } @@ -15282,15 +15082,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15341,6 +15132,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, + "optional": true, "dependencies": { "ret": "~0.1.10" } @@ -15350,147 +15142,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -15544,6 +15195,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -15671,17 +15323,12 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, + "optional": true, "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -15760,13 +15407,6 @@ "node": ">=4" } }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -15853,6 +15493,7 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, + "optional": true, "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -15872,6 +15513,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, + "optional": true, "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -15886,6 +15528,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -15898,6 +15541,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.2.0" }, @@ -15910,6 +15554,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "dependencies": { "ms": "2.0.0" } @@ -15919,6 +15564,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -15931,6 +15577,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -15943,6 +15590,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -15955,6 +15603,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -15969,6 +15618,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -15977,7 +15627,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "optional": true }, "node_modules/sockjs": { "version": "0.3.21", @@ -16012,15 +15663,6 @@ "ms": "^2.1.1" } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -16049,6 +15691,7 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, + "optional": true, "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -16078,7 +15721,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true + "dev": true, + "optional": true }, "node_modules/spdx-correct": { "version": "3.1.1", @@ -16170,6 +15814,7 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, + "optional": true, "dependencies": { "extend-shallow": "^3.0.0" }, @@ -16182,6 +15827,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -16195,6 +15841,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -16315,6 +15962,7 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, + "optional": true, "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -16328,6 +15976,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -16340,6 +15989,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -16352,6 +16002,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -16364,6 +16015,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -16378,6 +16030,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -16526,15 +16179,6 @@ "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -16955,27 +16599,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "node_modules/terser-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "node_modules/terser-webpack-plugin/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16984,20 +16607,6 @@ "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/terser-webpack-plugin/node_modules/terser": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", @@ -17067,9 +16676,9 @@ "dev": true }, "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, "node_modules/through": { @@ -17126,6 +16735,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, + "optional": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -17138,6 +16748,7 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, + "optional": true, "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -17153,6 +16764,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, + "optional": true, "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -17166,6 +16778,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -17179,6 +16792,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -17281,9 +16895,9 @@ } }, "node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true }, "node_modules/type-check": { @@ -17347,9 +16961,9 @@ } }, "node_modules/typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -17442,6 +17056,7 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, + "optional": true, "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -17474,6 +17089,7 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, + "optional": true, "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -17487,6 +17103,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, + "optional": true, "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -17501,6 +17118,7 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, + "optional": true, "dependencies": { "isarray": "1.0.0" }, @@ -17513,6 +17131,7 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -17541,7 +17160,8 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true + "dev": true, + "optional": true }, "node_modules/url": { "version": "0.11.0", @@ -17613,6 +17233,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -17647,13 +17268,12 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "bin/uuid" } }, "node_modules/v8-compile-cache": { @@ -17763,9 +17383,9 @@ } }, "node_modules/webpack": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz", - "integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==", + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.1.tgz", + "integrity": "sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw==", "dependencies": { "@types/eslint-scope": "^3.7.0", "@types/estree": "^0.0.47", @@ -18025,12 +17645,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -18120,9 +17734,9 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", "engines": { "node": ">=8.3.0" }, @@ -18235,12 +17849,12 @@ }, "dependencies": { "@babel/cli": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.3.tgz", - "integrity": "sha512-zU4JLvwk32ay1lhhyGfqiRUSPoltVDjhYkA3aQq8+Yby9z30s/EsFw1EPOHxWG9YZo2pAGfgdRNeHZQAYU5m9A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.5.tgz", + "integrity": "sha512-poegjhRvXHWO0EAsnYajwYZuqcz7gyfxwfaecUESxDujrqOivf3zrjFbub8IJkrqEaz3fvJWh001EzxBub54fg==", "dev": true, "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.2", "chokidar": "^3.4.0", "commander": "^4.0.1", "convert-source-map": "^1.1.0", @@ -18252,35 +17866,35 @@ } }, "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz", - "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz", + "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==", "dev": true }, "@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -18290,68 +17904,68 @@ } }, "@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", "dev": true, "requires": { - "@babel/types": "^7.14.2", + "@babel/types": "^7.14.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-compilation-targets": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz", - "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-validator-option": "^7.12.17", + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz", - "integrity": "sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.14.4", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz", - "integrity": "sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" } }, @@ -18372,362 +17986,361 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", "dev": true, "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" } }, "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-hoist-variables": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", - "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", "dev": true, "requires": { - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16" + "@babel/types": "^7.14.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz", + "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" } }, "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" } }, "@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-replace-supers": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz", - "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.4" + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.14.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", "dev": true, "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", - "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", + "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", "dev": true }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", - "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz", + "integrity": "sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz", - "integrity": "sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.3", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-class-static-block": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", - "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", - "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", - "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", - "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", - "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", - "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz", - "integrity": "sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz", + "integrity": "sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-compilation-targets": "^7.14.4", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.2" + "@babel/plugin-transform-parameters": "^7.14.5" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", - "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", - "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-create-class-features-plugin": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-async-generators": { @@ -18758,12 +18371,12 @@ } }, "@babel/plugin-syntax-class-static-block": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", - "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { @@ -18857,387 +18470,396 @@ } }, "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz", - "integrity": "sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz", - "integrity": "sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.14.4", - "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-destructuring": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz", - "integrity": "sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz", + "integrity": "sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", - "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", - "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", - "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz", + "integrity": "sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-assign": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz", - "integrity": "sha512-4QxDMc0lAOkIBSfCrnSGbAJ+4epDBF2XXwcLXuBcG1xl9u7LrktNVD4+LwhL47XuKVPQ7R25e/WdcV+h97HyZA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.14.5.tgz", + "integrity": "sha512-lvhjk4UN9xJJYB1mI5KC0/o1D5EcJXdbhVe+4fSk08D6ZN+iuAIs7LJC+71h8av9Ew4+uRq9452v9R93SFmQlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", - "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-runtime": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz", - "integrity": "sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/preset-env": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.4.tgz", - "integrity": "sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.14.4", - "@babel/helper-compilation-targets": "^7.14.4", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-class-static-block": "^7.14.3", - "@babel/plugin-proposal-dynamic-import": "^7.14.2", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-object-rest-spread": "^7.14.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-private-property-in-object": "^7.14.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.5.tgz", + "integrity": "sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.5", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -19247,46 +18869,46 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.14.4", - "@babel/plugin-transform-classes": "^7.14.4", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.14.4", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.14.2", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.14.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.14.2", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.5", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.5", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.5", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.4", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.14.0", "semver": "^6.3.0" } }, @@ -19304,48 +18926,49 @@ } }, "@babel/runtime": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", - "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", + "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" } }, @@ -19355,16 +18978,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, "@commitlint/cli": { "version": "12.1.4", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-12.1.4.tgz", @@ -19794,16 +19407,16 @@ "dev": true }, "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.2.tgz", + "integrity": "sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^27.0.2", + "jest-util": "^27.0.2", "slash": "^3.0.0" }, "dependencies": { @@ -19865,35 +19478,36 @@ } }, "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.4.tgz", + "integrity": "sha512-+dsmV8VUs1h/Szb+rEWk8xBM1fp1I///uFy9nk3wXGvRsF2lBp8EVPmtWc+QFRb3MY2b7u2HbkGF1fzoDzQTLA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/reporters": "^27.0.4", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", + "jest-changed-files": "^27.0.2", + "jest-config": "^27.0.4", + "jest-haste-map": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-resolve-dependencies": "^27.0.4", + "jest-runner": "^27.0.4", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "jest-watcher": "^27.0.2", + "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", @@ -20001,53 +19615,53 @@ } }, "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.3.tgz", + "integrity": "sha512-pN9m7fbKsop5vc3FOfH8NF7CKKdRbEZzcxfIo1n2TT6ucKWLFq0P6gCJH0GpnQp036++yY9utHOxpeT1WnkWTA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^27.0.3" } }, "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.3.tgz", + "integrity": "sha512-fQ+UCKRIYKvTCEOyKPnaPnomLATIhMnHC/xPZ7yT1Uldp7yMgMxoYIFidDbpSTgB79+/U+FgfoD30c6wg3IUjA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^27.0.2", + "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^27.0.2", + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2" } }, "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.3.tgz", + "integrity": "sha512-OzsIuf7uf+QalqAGbjClyezzEcLQkdZ+7PejUrZgDs+okdAK8GwRCGcYCirHvhMBBQh60Jr3NlIGbn/KBPQLEQ==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^27.0.3", + "@jest/types": "^27.0.2", + "expect": "^27.0.2" } }, "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.4.tgz", + "integrity": "sha512-Xa90Nm3JnV0xCe4M6A10M9WuN9krb+WFKxV1A98Y4ePCw40n++r7uxFUNU7DT1i9Behj7fjrAIju9oU0t1QtCg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -20058,11 +19672,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", + "jest-haste-map": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -20134,9 +19747,9 @@ } }, "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.1.tgz", + "integrity": "sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -20153,47 +19766,46 @@ } }, "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.2.tgz", + "integrity": "sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/types": "^27.0.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz", + "integrity": "sha512-6UFEVwdmxYdyNffBxVVZxmXEdBE4riSddXYSnFNH0ELFQFk/bvagizim8WfgJTqF4EKd+j1yFxvhb8BMHfOjSQ==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", + "@jest/test-result": "^27.0.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "jest-haste-map": "^27.0.2", + "jest-runtime": "^27.0.4" } }, "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.2.tgz", + "integrity": "sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", + "jest-haste-map": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-util": "^27.0.2", + "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", "source-map": "^0.6.1", @@ -20307,15 +19919,15 @@ } }, "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz", + "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "dependencies": { @@ -20371,16 +19983,16 @@ } }, "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "version": "2.1.8-no-fsevents.2", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz", + "integrity": "sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg==", "dev": true, "optional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "glob-parent": "^3.1.0", + "glob-parent": "^5.1.2", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", @@ -20423,9 +20035,9 @@ } }, "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" @@ -20566,9 +20178,9 @@ "dev": true }, "@types/node": { - "version": "15.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" + "version": "15.12.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.3.tgz", + "integrity": "sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -20583,9 +20195,9 @@ "dev": true }, "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", + "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", "dev": true }, "@types/retry": { @@ -20680,9 +20292,9 @@ } }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", + "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -20884,9 +20496,9 @@ } }, "acorn": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz", - "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==" + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", + "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==" }, "acorn-globals": { "version": "6.0.0", @@ -20999,6 +20611,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, + "optional": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -21009,6 +20622,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, + "optional": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -21028,19 +20642,22 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "dev": true, + "optional": true }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "dev": true, + "optional": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "dev": true, + "optional": true }, "array-find-index": { "version": "1.0.2", @@ -21081,7 +20698,8 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "dev": true, + "optional": true }, "array.prototype.flat": { "version": "1.2.4", @@ -21104,7 +20722,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "dev": true, + "optional": true }, "astral-regex": { "version": "2.0.0", @@ -21143,19 +20762,20 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "dev": true, + "optional": true }, "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.2.tgz", + "integrity": "sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q==", "dev": true, "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", + "babel-preset-jest": "^27.0.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" @@ -21275,9 +20895,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz", + "integrity": "sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -21298,13 +20918,13 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz", - "integrity": "sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.9.1" + "core-js-compat": "^3.14.0" } }, "babel-plugin-polyfill-regenerator": { @@ -21337,12 +20957,12 @@ } }, "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz", + "integrity": "sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^27.0.1", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -21356,6 +20976,7 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, + "optional": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -21371,6 +20992,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^1.0.0" } @@ -21490,6 +21112,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, + "optional": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -21566,6 +21189,7 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, + "optional": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -21621,18 +21245,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001236", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz", - "integrity": "sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ==" - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } + "version": "1.0.30001238", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001238.tgz", + "integrity": "sha512-bZGam2MxEt7YNsa2VwshqWQMwrYs5tR5WZQRYSuFxsBQunWjBuXhN4cS9nV5FFb1Z9y+DoQcQ0COyQbv6A+CKw==" }, "chalk": { "version": "2.4.2", @@ -21652,18 +21267,18 @@ "dev": true }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "dependencies": { "anymatch": { @@ -21696,14 +21311,6 @@ "to-regex-range": "^5.0.1" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -21718,9 +21325,9 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } @@ -21747,15 +21354,15 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", "dev": true }, "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", + "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", "dev": true }, "class-utils": { @@ -21763,6 +21370,7 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, + "optional": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -21775,6 +21383,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -21784,6 +21393,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -21793,6 +21403,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -21802,6 +21413,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -21812,7 +21424,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "dev": true, + "optional": true } } } @@ -21906,6 +21519,7 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, + "optional": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -21949,7 +21563,8 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true }, "compare-func": { "version": "2.0.0", @@ -22293,7 +21908,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "dev": true, + "optional": true }, "core-js": { "version": "3.14.0", @@ -22509,7 +22125,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "dev": true, + "optional": true }, "dedent": { "version": "0.7.0", @@ -22568,6 +22185,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, + "optional": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -22635,9 +22253,9 @@ "dev": true }, "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz", + "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==", "dev": true }, "dir-glob": { @@ -22822,14 +22440,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.750", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.750.tgz", - "integrity": "sha512-Eqy9eHNepZxJXT+Pc5++zvEi5nQ6AGikwFYDCYwXUFBr+ynJ6pDG7MzZmwGYCIuXShLJM0n4bq+aoKDmvSGJ8A==" + "version": "1.3.752", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", + "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==" }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true }, "emoji-regex": { @@ -23133,15 +22751,6 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, "globals": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", @@ -23473,12 +23082,6 @@ "original": "^1.0.0" } }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -23506,6 +23109,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, + "optional": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -23521,6 +23125,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -23530,6 +23135,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -23539,6 +23145,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -23548,6 +23155,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -23557,6 +23165,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -23567,7 +23176,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -23575,46 +23185,29 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "optional": true } } }, "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz", + "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" + "@jest/types": "^27.0.2", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.1", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-regex-util": "^27.0.1" }, "dependencies": { "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } @@ -23681,6 +23274,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -23690,6 +23284,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, + "optional": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -23706,6 +23301,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^1.0.0" } @@ -23769,14 +23365,6 @@ "to-regex-range": "^5.0.1" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -23904,6 +23492,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, + "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -23944,6 +23533,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -23954,6 +23544,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -23963,6 +23554,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -23971,6 +23563,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "requires": { "semver": "^6.0.0" } @@ -23979,6 +23572,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -23987,6 +23581,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -23995,6 +23590,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "requires": { "find-up": "^4.0.0" } @@ -24036,7 +23632,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "dev": true, + "optional": true }, "form-data": { "version": "3.0.1", @@ -24065,6 +23662,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, + "optional": true, "requires": { "map-cache": "^0.2.2" } @@ -24394,7 +23992,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "dev": true, + "optional": true }, "git-raw-commits": { "version": "2.0.10", @@ -24460,26 +24059,11 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } }, "glob-to-regexp": { @@ -24503,9 +24087,9 @@ "dev": true }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -24532,13 +24116,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -24601,6 +24178,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, + "optional": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -24612,6 +24190,7 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, + "optional": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -24622,6 +24201,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -25017,9 +24597,9 @@ "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" }, "ipaddr.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz", - "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, "is-absolute-url": { "version": "3.0.3", @@ -25031,6 +24611,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, + "optional": true, "requires": { "kind-of": "^6.0.0" }, @@ -25039,7 +24620,8 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -25086,7 +24668,8 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "dev": true, + "optional": true }, "is-callable": { "version": "1.2.3", @@ -25095,12 +24678,12 @@ "dev": true }, "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "ci-info": "^3.1.1" } }, "is-core-module": { @@ -25117,6 +24700,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, + "optional": true, "requires": { "kind-of": "^6.0.0" }, @@ -25125,7 +24709,8 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -25139,6 +24724,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -25149,7 +24735,8 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -25162,7 +24749,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "dev": true, + "optional": true }, "is-extglob": { "version": "2.1.1", @@ -25214,6 +24802,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -25338,7 +24927,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "dev": true, + "optional": true }, "is-wsl": { "version": "2.2.0", @@ -25460,88 +25050,52 @@ } }, "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz", + "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==", "dev": true, "requires": { - "@jest/core": "^26.6.3", + "@jest/core": "^27.0.4", "import-local": "^3.0.2", - "jest-cli": "^26.6.3" + "jest-cli": "^27.0.4" } }, "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.2.tgz", + "integrity": "sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - } + "@jest/types": "^27.0.2", + "execa": "^5.0.0", + "throat": "^6.0.1" } }, "jest-circus": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.3.tgz", - "integrity": "sha512-ACrpWZGcQMpbv13XbzRzpytEJlilP/Su0JtNCi5r/xLpOUhnaIJr8leYYpLEMgPFURZISEHrnnpmB54Q/UziPw==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.4.tgz", + "integrity": "sha512-QD+eblDiRphta630WRKewuASLs/oY1Zki2G4bccntRvrTHQ63ljwFR5TLduuK4Zg0ZPzW0+8o6AP7KRd1yKOjw==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", + "@jest/environment": "^27.0.3", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^26.6.2", + "expect": "^27.0.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "stack-utils": "^2.0.2", - "throat": "^5.0.0" + "jest-each": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -25584,6 +25138,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25596,24 +25156,23 @@ } }, "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.4.tgz", + "integrity": "sha512-E0T+/i2lxsWAzV7LKYd0SB7HUAvePqaeIh5vX43/G5jXLhv1VzjYzJAGEkTfvxV774ll9cyE2ljcL73PVMEOXQ==", "dev": true, "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/core": "^27.0.4", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-config": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", "prompts": "^2.0.1", - "yargs": "^15.4.1" + "yargs": "^16.0.3" }, "dependencies": { "ansi-styles": { @@ -25635,17 +25194,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -25661,49 +25209,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25712,79 +25223,36 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.4.tgz", + "integrity": "sha512-VkQFAHWnPQefdvHU9A+G3H/Z3NrrTKqWpvxgQz3nkUdkDTWeKJE6e//BL+R7z79dXOMVksYgM/z6ndtN0hfChg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@jest/test-sequencer": "^27.0.4", + "@jest/types": "^27.0.2", + "babel-jest": "^27.0.2", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" + "is-ci": "^3.0.0", + "jest-circus": "^27.0.4", + "jest-environment-jsdom": "^27.0.3", + "jest-environment-node": "^27.0.3", + "jest-get-type": "^27.0.1", + "jest-jasmine2": "^27.0.4", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-runner": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.2" }, "dependencies": { "ansi-styles": { @@ -25882,15 +25350,15 @@ } }, "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz", + "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^27.0.1", + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" }, "dependencies": { "ansi-styles": { @@ -25945,25 +25413,25 @@ } }, "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.1.tgz", + "integrity": "sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.2.tgz", + "integrity": "sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.0.1", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2" }, "dependencies": { "ansi-styles": { @@ -26018,59 +25486,58 @@ } }, "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz", + "integrity": "sha512-5KLmgv1bhiimpSA8oGTnZYk6g4fsNyZiA/6gI2tAZUgrufd7heRUSVh4gRokzZVEj8zlwAQYT0Zs6tuJSW/ECA==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2", + "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.3.tgz", + "integrity": "sha512-co2/IVnIFL3cItpFULCvXFg9us4gvWXgs7mutAMPCbFhcqh56QAOdKhNzC2+RycsC/k4mbMj1VF+9F/NzA0ROg==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/types": "^27.0.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^27.0.3", + "jest-util": "^27.0.2" } }, "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz", + "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==", "dev": true }, "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.2.tgz", + "integrity": "sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", + "fsevents": "^2.3.2", "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", + "jest-regex-util": "^27.0.1", + "jest-serializer": "^27.0.1", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", + "micromatch": "^4.0.4", "walker": "^1.0.7" }, "dependencies": { @@ -26130,29 +25597,29 @@ } }, "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz", + "integrity": "sha512-yj3WrjjquZwkJw+eA4c9yucHw4/+EHndHWSqgHbHGQfT94ihaaQsa009j1a0puU8CNxPDk0c1oAPeOpdJUElwA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.0.3", + "@jest/source-map": "^27.0.1", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.2", + "expect": "^27.0.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "jest-each": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-runtime": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "pretty-format": "^27.0.2", + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -26207,25 +25674,25 @@ } }, "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz", + "integrity": "sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==", "dev": true, "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" } }, "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz", + "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^27.0.2", + "jest-get-type": "^27.0.1", + "pretty-format": "^27.0.2" }, "dependencies": { "ansi-styles": { @@ -26280,20 +25747,20 @@ } }, "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz", + "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.2", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" }, "dependencies": { "ansi-styles": { @@ -26397,174 +25864,83 @@ } }, "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.3.tgz", + "integrity": "sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "@jest/types": "^27.0.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz", + "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==", + "dev": true + }, + "jest-resolve": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.4.tgz", + "integrity": "sha512-BcfyK2i3cG79PDb/6gB6zFeFQlcqLsQjGBqznFCpA0L/3l1L/oOsltdUjs5eISAWA9HS9qtj8v2PSZr/yWxONQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.2", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "p-try": "^2.0.0" + "color-convert": "^2.0.1" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } + "color-name": "~1.1.4" } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "slash": { @@ -26581,52 +25957,48 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true } } }, "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz", + "integrity": "sha512-F33UPfw1YGWCV2uxJl7wD6TvcQn5IC0LtguwY3r4L7R6H4twpLkp5Q2ZfzRx9A2I3G8feiy0O0sqcn/Qoym71A==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "@jest/types": "^27.0.2", + "jest-regex-util": "^27.0.1", + "jest-snapshot": "^27.0.4" } }, "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.4.tgz", + "integrity": "sha512-NfmvSYLCsCJk2AG8Ar2NAh4PhsJJpO+/r+g4bKR5L/5jFzx/indUpnVBdrfDvuqhGLLAvrKJ9FM/Nt8o1dsqxg==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.0.2", + "@jest/environment": "^27.0.3", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.7.1", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "jest-docblock": "^27.0.1", + "jest-environment-jsdom": "^27.0.3", + "jest-environment-node": "^27.0.3", + "jest-haste-map": "^27.0.2", + "jest-leak-detector": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-runtime": "^27.0.4", + "jest-util": "^27.0.2", + "jest-worker": "^27.0.2", "source-map-support": "^0.5.6", - "throat": "^5.0.0" + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -26681,38 +26053,37 @@ } }, "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.4.tgz", + "integrity": "sha512-voJB4xbAjS/qYPboV+e+gmg3jfvHJJY4CagFWBOM9dQKtlaiTjcpD2tWwla84Z7PtXSQPeIpXY0qksA9Dum29A==", + "dev": true, + "requires": { + "@jest/console": "^27.0.2", + "@jest/environment": "^27.0.3", + "@jest/fake-timers": "^27.0.3", + "@jest/globals": "^27.0.3", + "@jest/source-map": "^27.0.1", + "@jest/test-result": "^27.0.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-haste-map": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-mock": "^27.0.3", + "jest-regex-util": "^27.0.1", + "jest-resolve": "^27.0.4", + "jest-snapshot": "^27.0.4", + "jest-util": "^27.0.2", + "jest-validate": "^27.0.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.4.1" + "yargs": "^16.0.3" }, "dependencies": { "ansi-styles": { @@ -26734,17 +26105,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -26760,49 +26120,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -26817,59 +26140,13 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.1.tgz", + "integrity": "sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==", "dev": true, "requires": { "@types/node": "*", @@ -26877,26 +26154,34 @@ } }, "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.4.tgz", + "integrity": "sha512-hnjrvpKGdSMvKfbHyaG5Kul7pDJGZvjVy0CKpzhu28MmAssDXS6GpynhXzgst1wBQoKD8c9b2VS2a5yhDLQRCA==", "dev": true, "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", + "@jest/transform": "^27.0.2", + "@jest/types": "^27.0.2", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^26.6.2", + "expect": "^27.0.2", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", + "jest-diff": "^27.0.2", + "jest-get-type": "^27.0.1", + "jest-haste-map": "^27.0.2", + "jest-matcher-utils": "^27.0.2", + "jest-message-util": "^27.0.2", + "jest-resolve": "^27.0.4", + "jest-util": "^27.0.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", + "pretty-format": "^27.0.2", "semver": "^7.3.2" }, "dependencies": { @@ -26961,17 +26246,17 @@ } }, "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.2.tgz", + "integrity": "sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" }, "dependencies": { "ansi-styles": { @@ -26983,15 +26268,6 @@ "color-convert": "^2.0.1" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "chalk": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", @@ -27017,37 +26293,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -27056,30 +26307,21 @@ "requires": { "has-flag": "^4.0.0" } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.2.tgz", + "integrity": "sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^27.0.2", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^27.0.1", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^27.0.2" }, "dependencies": { "ansi-styles": { @@ -27140,17 +26382,17 @@ } }, "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.2.tgz", + "integrity": "sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^27.0.2", + "@jest/types": "^27.0.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "jest-util": "^27.0.2", "string-length": "^4.0.1" }, "dependencies": { @@ -27206,27 +26448,24 @@ } }, "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", + "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { "has-flag": "^4.0.0" } @@ -27369,6 +26608,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -27897,7 +27137,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "dev": true, + "optional": true }, "map-obj": { "version": "4.2.1", @@ -27910,14 +27151,15 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, + "optional": true, "requires": { "object-visit": "^1.0.0" } }, "marked": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.7.tgz", - "integrity": "sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.1.tgz", + "integrity": "sha512-5XFS69o9CzDpQDSpUYC+AN2xvq8yl1EGa5SG/GI1hP78/uTeo3PDfiDNmsUyiahpyhToDDJhQk7fNtJsga+KVw==", "dev": true }, "media-typer": { @@ -28107,6 +27349,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, + "optional": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -28128,6 +27371,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -28138,6 +27382,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -28146,7 +27391,8 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -28227,6 +27473,7 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, + "optional": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -28237,6 +27484,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -28287,6 +27535,7 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, + "optional": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -28306,6 +27555,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -28316,6 +27566,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -28324,7 +27575,8 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -28404,35 +27656,8 @@ "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true }, "node-releases": { "version": "1.1.73", @@ -28575,6 +27800,7 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, + "optional": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -28586,6 +27812,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -28595,6 +27822,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -28604,6 +27832,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -28613,6 +27842,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -28623,7 +27853,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "dev": true, + "optional": true } } } @@ -28654,6 +27885,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, + "optional": true, "requires": { "isobject": "^3.0.0" } @@ -28686,6 +27918,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, + "optional": true, "requires": { "isobject": "^3.0.1" } @@ -28837,7 +28070,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "param-case": { "version": "3.0.4", @@ -28907,19 +28141,14 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true, "optional": true }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -29147,12 +28376,13 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "dev": true, + "optional": true }, "postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", "dev": true, "requires": { "colorette": "^1.2.2", @@ -29235,39 +28465,21 @@ } }, "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz", + "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.0.2", "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "dependencies": { "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } @@ -29414,6 +28626,13 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "requires": {} } } }, @@ -29673,6 +28892,7 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, + "optional": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -29683,6 +28903,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -29693,6 +28914,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -29709,9 +28931,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { @@ -29761,32 +28983,52 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "dev": true, + "optional": true }, "renderkid": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.6.tgz", - "integrity": "sha512-GIis2GBr/ho0pFNf57D4XM4+PgnQuTii0WCPjEZmZfKivzUfGuRdjN2aQYtYMiNggHmNyBve+thFnNR1iBRcKg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dev": true, "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^6.0.0" + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true + "dev": true, + "optional": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "dev": true, + "optional": true }, "repeating": { "version": "2.0.1", @@ -29809,12 +29051,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -29858,7 +29094,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "dev": true, + "optional": true }, "restore-cursor": { "version": "3.1.0", @@ -29874,7 +29111,8 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "dev": true, + "optional": true }, "retry": { "version": "0.12.0", @@ -29894,12 +29132,6 @@ "glob": "^7.1.3" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -29935,6 +29167,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, + "optional": true, "requires": { "ret": "~0.1.10" } @@ -29944,113 +29177,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -30093,7 +29219,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "semver-compare": { "version": "1.0.0", @@ -30212,17 +29339,12 @@ "send": "0.17.1" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, + "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -30282,13 +29404,6 @@ "rechoir": "^0.6.2" } }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -30359,6 +29474,7 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, + "optional": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -30375,6 +29491,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -30384,6 +29501,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -30393,6 +29511,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -30402,6 +29521,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -30411,6 +29531,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -30421,7 +29542,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -30429,7 +29551,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "optional": true } } }, @@ -30438,6 +29561,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, + "optional": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -30449,6 +29573,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^1.0.0" } @@ -30460,6 +29585,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, + "optional": true, "requires": { "kind-of": "^3.2.0" } @@ -30472,13 +29598,6 @@ "faye-websocket": "^0.11.3", "uuid": "^3.4.0", "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } } }, "sockjs-client": { @@ -30528,6 +29647,7 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, + "optional": true, "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -30556,7 +29676,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true + "dev": true, + "optional": true }, "spdx-correct": { "version": "3.1.1", @@ -30641,6 +29762,7 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, + "optional": true, "requires": { "extend-shallow": "^3.0.0" }, @@ -30650,6 +29772,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -30660,6 +29783,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -30761,6 +29885,7 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, + "optional": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -30771,6 +29896,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -30780,6 +29906,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -30789,6 +29916,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -30798,6 +29926,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -30808,7 +29937,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "dev": true, + "optional": true } } } @@ -30924,12 +30054,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -31257,34 +30381,11 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - }, "terser": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", @@ -31328,9 +30429,9 @@ "dev": true }, "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, "through": { @@ -31383,6 +30484,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -31392,6 +30494,7 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, + "optional": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -31404,6 +30507,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -31414,6 +30518,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -31425,6 +30530,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, + "optional": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -31505,9 +30611,9 @@ } }, "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true }, "type-check": { @@ -31556,9 +30662,9 @@ } }, "typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", "dev": true }, "uglify-js": { @@ -31623,6 +30729,7 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, + "optional": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -31646,6 +30753,7 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, + "optional": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -31656,6 +30764,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, + "optional": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -31667,6 +30776,7 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, + "optional": true, "requires": { "isarray": "1.0.0" } @@ -31677,7 +30787,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "dev": true, + "optional": true } } }, @@ -31700,7 +30811,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "dev": true, + "optional": true }, "url": { "version": "0.11.0", @@ -31756,7 +30868,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "dev": true, + "optional": true }, "util-deprecate": { "version": "1.0.2", @@ -31785,11 +30898,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { "version": "2.3.0", @@ -31882,9 +30993,9 @@ "dev": true }, "webpack": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz", - "integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==", + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.1.tgz", + "integrity": "sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw==", "requires": { "@types/eslint-scope": "^3.7.0", "@types/estree": "^0.0.47", @@ -32063,12 +31174,6 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -32142,9 +31247,9 @@ } }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", "requires": {} }, "xml-name-validator": { diff --git a/package.json b/package.json index 60302fbebd..bb56d3f4d2 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "fix:js": "npm run lint:js -- --fix", "fix": "npm-run-all fix:js fmt", "commitlint": "commitlint --from=master", - "test:only": "jest --forceExit", + "test:only": "jest", "test:coverage": "npm run test:only -- --coverage", "test:watch": "npm run test:coverage --watch", "test": "npm run test:coverage", @@ -38,12 +38,11 @@ "connect-history-api-fallback": "^1.6.0", "del": "^6.0.0", "express": "^4.17.1", - "find-cache-dir": "^3.3.1", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.0", "internal-ip": "^6.2.0", - "ipaddr.js": "^2.0.0", + "ipaddr.js": "^2.0.1", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", "open": "^8.0.9", @@ -60,17 +59,16 @@ "ws": "^7.4.5" }, "devDependencies": { - "@babel/cli": "^7.14.3", - "@babel/core": "^7.14.3", - "@babel/plugin-transform-object-assign": "^7.12.13", - "@babel/plugin-transform-runtime": "^7.14.3", - "@babel/preset-env": "^7.14.2", - "@babel/runtime": "^7.14.0", + "@babel/cli": "^7.14.5", + "@babel/core": "^7.14.5", + "@babel/plugin-transform-object-assign": "^7.14.5", + "@babel/plugin-transform-runtime": "^7.14.5", + "@babel/preset-env": "^7.14.5", + "@babel/runtime": "^7.14.5", "@commitlint/cli": "^12.1.3", "@commitlint/config-conventional": "^12.1.4", - "@jest/test-sequencer": "^26.6.3", "acorn": "^8.2.4", - "babel-jest": "^26.6.3", + "babel-jest": "^27.0.2", "babel-loader": "^8.2.2", "body-parser": "^1.19.0", "core-js": "^3.12.1", @@ -83,8 +81,7 @@ "file-loader": "^6.2.0", "html-webpack-plugin": "^4.5.2", "husky": "^6.0.0", - "jest": "^26.6.3", - "jest-circus": "^26.6.3", + "jest": "^27.0.4", "less": "^4.1.1", "less-loader": "^7.3.0", "lint-staged": "^11.0.0", @@ -102,7 +99,7 @@ "tcp-port-used": "^1.0.2", "typescript": "^4.2.4", "url-loader": "^4.1.1", - "webpack": "^5.37.1", + "webpack": "^5.39.1", "webpack-cli": "^4.7.2", "webpack-merge": "^5.8.0" }, diff --git a/test/__snapshots__/validate-options.test.js.snap.webpack4 b/test/__snapshots__/validate-options.test.js.snap.webpack4 index 484b06b72d..ed0aa8280f 100644 --- a/test/__snapshots__/validate-options.test.js.snap.webpack4 +++ b/test/__snapshots__/validate-options.test.js.snap.webpack4 @@ -1,10 +1,20 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`options validate should throw an error on the "allowedHosts" option with '[""]' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.allowedHosts[0] should be an non-empty string." +`; + +exports[`options validate should throw an error on the "allowedHosts" option with '[]' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.allowedHosts should be an non-empty array." +`; + exports[`options validate should throw an error on the "allowedHosts" option with '123' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.allowedHosts should be one of these: [non-empty string, ...] (should not have fewer than 1 item) | \\"auto\\" | \\"all\\" | non-empty string - -> Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + -> Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts Details: * options.allowedHosts should be an array: [non-empty string, ...] (should not have fewer than 1 item) @@ -17,7 +27,7 @@ exports[`options validate should throw an error on the "allowedHosts" option wit "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.allowedHosts should be one of these: [non-empty string, ...] (should not have fewer than 1 item) | \\"auto\\" | \\"all\\" | non-empty string - -> Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + -> Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts Details: * options.allowedHosts should be an array: [non-empty string, ...] (should not have fewer than 1 item) @@ -30,7 +40,7 @@ exports[`options validate should throw an error on the "allowedHosts" option wit "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.allowedHosts should be one of these: [non-empty string, ...] (should not have fewer than 1 item) | \\"auto\\" | \\"all\\" | non-empty string - -> Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + -> Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts Details: * options.allowedHosts should be an array: [non-empty string, ...] (should not have fewer than 1 item) @@ -43,7 +53,7 @@ exports[`options validate should throw an error on the "bonjour" option with '' "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.bonjour should be one of these: boolean | object { … } - -> Broadcasts the server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour + -> Allows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour Details: * options.bonjour should be a boolean. * options.bonjour should be an object: @@ -55,7 +65,7 @@ exports[`options validate should throw an error on the "client" option with '{"h "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.hotEntry should be one of these: boolean | function - -> Tells devServer to inject a Hot Module Replacement entry. + -> Injects a Hot Module Replacement entry. Details: * options.client.hotEntry should be a boolean. * options.client.hotEntry should be an instance of function." @@ -77,7 +87,7 @@ exports[`options validate should throw an error on the "client" option with '{"n "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.needClientEntry should be one of these: boolean | function - -> Tells devServer to inject a client entry. + -> Inject a client entry. Details: * options.client.needClientEntry should be a boolean. * options.client.needClientEntry should be an instance of function." @@ -86,37 +96,43 @@ exports[`options validate should throw an error on the "client" option with '{"n exports[`options validate should throw an error on the "client" option with '{"overlay":""}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.overlay should be one of these: - boolean | object { errors?, warnings?, … } + boolean | object { errors?, warnings? } Details: * options.client.overlay should be a boolean. - -> Show a full-screen overlay in the browser when there are compiler errors or warnings. + -> Enables a full-screen overlay in the browser when there are compiler errors or warnings. * options.client.overlay should be an object: - object { errors?, warnings?, … }" + object { errors?, warnings? }" +`; + +exports[`options validate should throw an error on the "client" option with '{"overlay":{"arbitrary":""}}' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.client.overlay has an unknown property 'arbitrary'. These properties are valid: + object { errors?, warnings? }" `; exports[`options validate should throw an error on the "client" option with '{"overlay":{"errors":""}}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.overlay.errors should be a boolean. - -> Show a full-screen overlay in the browser when there are compiler errors." + -> Enables a full-screen overlay in the browser when there are compiler errors." `; exports[`options validate should throw an error on the "client" option with '{"overlay":{"warnings":""}}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.overlay.warnings should be a boolean. - -> Show a full-screen overlay in the browser when there are compiler warnings." + -> Enables a full-screen overlay in the browser when there are compiler warnings." `; exports[`options validate should throw an error on the "client" option with '{"progress":""}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.progress should be a boolean. - -> Print compilation progress in percentage in the browser." + -> Prints compilation progress in percentage in the browser." `; exports[`options validate should throw an error on the "client" option with '{"transport":true}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.transport should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string - -> Allows to set custom transport to communicate with server. + -> Allows to set custom transport to communicate with dev server. Details: * options.client.transport should be one of these: \\"sockjs\\" | \\"ws\\" @@ -126,8 +142,8 @@ exports[`options validate should throw an error on the "client" option with '{"t exports[`options validate should throw an error on the "client" option with '{"unknownOption":true}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client has an unknown property 'unknownOption'. These properties are valid: - object { transport?, logging?, progress?, overlay?, needClientEntry?, hotEntry?, webSocketURL? } - -> Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient" + object { hotEntry?, logging?, needClientEntry?, overlay?, progress?, transport?, webSocketURL? } + -> Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient" `; exports[`options validate should throw an error on the "client" option with '{"webSocketURL":{"host":""}}' value 1`] = ` @@ -156,8 +172,8 @@ exports[`options validate should throw an error on the "client" option with '{"w exports[`options validate should throw an error on the "client" option with '{"webSocketURL":{"port":true}}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.webSocketURL should be one of these: - non-empty string | object { protocol?, host?, port?, path? } - -> When using dev server and you're proxying dev-server, the client script does not always know where to connect to. + non-empty string | object { host?, path?, password?, port?, protocol?, username? } + -> Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to). Details: * options.client.webSocketURL.port should be one of these: number | non-empty string @@ -167,31 +183,43 @@ exports[`options validate should throw an error on the "client" option with '{"w * options.client.webSocketURL.port should be a non-empty string." `; +exports[`options validate should throw an error on the "client" option with '{"webSocketURL":{"username":123,"password":976}}' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.client.webSocketURL should be one of these: + non-empty string | object { host?, path?, password?, port?, protocol?, username? } + -> Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to). + Details: + * options.client.webSocketURL.password should be a string. + -> Tells clients connected to devServer to use the provided password to authenticate. + * options.client.webSocketURL.username should be a string. + -> Tells clients connected to devServer to use the provided username to authenticate." +`; + exports[`options validate should throw an error on the "client" option with 'whoops!' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client should be an object: - object { transport?, logging?, progress?, overlay?, needClientEntry?, hotEntry?, webSocketURL? } - -> Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient" + object { hotEntry?, logging?, needClientEntry?, overlay?, progress?, transport?, webSocketURL? } + -> Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient" `; exports[`options validate should throw an error on the "compress" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.compress should be a boolean. - -> Enable gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress" + -> Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress" `; exports[`options validate should throw an error on the "devMiddleware" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.devMiddleware should be an object: object { … } - -> Provide options to webpack-dev-middleware which handles webpack assets. https://webpack.js.org/configuration/dev-server/#devserverdevmiddleware" + -> Provide options to 'webpack-dev-middleware' which handles webpack assets. https://webpack.js.org/configuration/dev-server/#devserverdevmiddleware" `; exports[`options validate should throw an error on the "headers" option with '1' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.headers should be one of these: object { … } | function - -> Adds headers to all responses. https://webpack.js.org/configuration/dev-server/#devserverheaders + -> Allows to set custom headers on response. https://webpack.js.org/configuration/dev-server/#devserverheaders Details: * options.headers should be an object: object { … } @@ -202,7 +230,7 @@ exports[`options validate should throw an error on the "headers" option with 'fa "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.headers should be one of these: object { … } | function - -> Adds headers to all responses. https://webpack.js.org/configuration/dev-server/#devserverheaders + -> Allows to set custom headers on response. https://webpack.js.org/configuration/dev-server/#devserverheaders Details: * options.headers should be an object: object { … } @@ -213,7 +241,7 @@ exports[`options validate should throw an error on the "historyApiFallback" opti "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.historyApiFallback should be one of these: boolean | object { … } - -> When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback + -> Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page Applications that utilise the HTML5 History API. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback Details: * options.historyApiFallback should be a boolean. * options.historyApiFallback should be an object: @@ -224,26 +252,26 @@ exports[`options validate should throw an error on the "historyApiFallback" opti exports[`options validate should throw an error on the "host" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.host should be an non-empty string. - -> Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost" + -> Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost" `; exports[`options validate should throw an error on the "host" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.host should be a non-empty string. - -> Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost" + -> Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost" `; exports[`options validate should throw an error on the "host" option with 'null' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.host should be a non-empty string. - -> Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost" + -> Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost" `; exports[`options validate should throw an error on the "hot" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.hot should be one of these: boolean | \\"only\\" - -> Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot + -> Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot Details: * options.hot should be a boolean. * options.hot should be \\"only\\"." @@ -253,7 +281,7 @@ exports[`options validate should throw an error on the "hot" option with 'foo' v "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.hot should be one of these: boolean | \\"only\\" - -> Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot + -> Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot Details: * options.hot should be a boolean. * options.hot should be \\"only\\"." @@ -262,14 +290,14 @@ exports[`options validate should throw an error on the "hot" option with 'foo' v exports[`options validate should throw an error on the "http2" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.http2 should be a boolean. - -> Serve over HTTP/2 using spdy. https://webpack.js.org/configuration/dev-server/#devserverhttp2" + -> Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2" `; exports[`options validate should throw an error on the "https" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https should be a boolean. * options.https should be an object: @@ -280,7 +308,7 @@ exports[`options validate should throw an error on the "https" option with '{"ca "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.cacert should be one of these: string | Buffer @@ -294,7 +322,7 @@ exports[`options validate should throw an error on the "https" option with '{"ce "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.cert should be one of these: string | Buffer @@ -314,7 +342,7 @@ exports[`options validate should throw an error on the "https" option with '{"ke "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.key should be one of these: string | Buffer @@ -334,7 +362,7 @@ exports[`options validate should throw an error on the "https" option with '{"pf "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.pfx should be one of these: string | Buffer @@ -353,19 +381,19 @@ exports[`options validate should throw an error on the "https" option with '{"re exports[`options validate should throw an error on the "onAfterSetupMiddleware" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.onAfterSetupMiddleware should be an instance of function. - -> Provides the ability to execute custom middleware after all other middleware internally within the server. https://webpack.js.org/configuration/dev-server/#devserverafter" + -> Provides the ability to execute a custom function and apply custom middleware(s) after all other middlewares. https://webpack.js.org/configuration/dev-server/#devserveronaftersetupmiddleware" `; exports[`options validate should throw an error on the "onBeforeSetupMiddleware" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.onBeforeSetupMiddleware should be an instance of function. - -> Provides the ability to execute custom middleware prior to all other middleware internally within the server. https://webpack.js.org/configuration/dev-server/#devserverbefore" + -> Provides the ability to execute a custom function and apply custom middleware(s) prior to all other middlewares. https://webpack.js.org/configuration/dev-server/#devserveronbeforesetupmiddleware" `; exports[`options validate should throw an error on the "onListening" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.onListening should be an instance of function. - -> Provides an option to execute a custom function when webpack-dev-server starts listening for connections on a port. https://webpack.js.org/configuration/dev-server/#onlistening" + -> Provides the ability to execute a custom function when dev server starts listening. https://webpack.js.org/configuration/dev-server/#devserveronlistening" `; exports[`options validate should throw an error on the "open" option with '' value 1`] = ` @@ -377,7 +405,7 @@ exports[`options validate should throw an error on the "open" option with '{"app "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.open should be one of these: [non-empty string | object { target?, app? }, ...] | boolean | non-empty string | object { target?, app? } - -> Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen + -> Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen Details: * options.open.app should be one of these: object { name?, arguments? } | non-empty string @@ -398,16 +426,16 @@ exports[`options validate should throw an error on the "open" option with '{"tar "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.open should be one of these: [non-empty string | object { target?, app? }, ...] | boolean | non-empty string | object { target?, app? } - -> Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen + -> Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen Details: * options.open.target should be one of these: - [non-empty string, ...] (should not have fewer than 1 item) | boolean | non-empty string - -> Open specified route in browser. + [string, ...] | boolean | string + -> Opens specified page in browser. Details: * options.open.target should be an array: - [non-empty string, ...] (should not have fewer than 1 item) + [string, ...] * options.open.target should be a boolean. - * options.open.target should be a non-empty string." + * options.open.target should be a string." `; exports[`options validate should throw an error on the "port" option with '' value 1`] = ` @@ -419,7 +447,7 @@ exports[`options validate should throw an error on the "port" option with 'false "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.port should be one of these: number | non-empty string | \\"auto\\" - -> Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport + -> Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport Details: * options.port should be a number. * options.port should be a non-empty string. @@ -430,40 +458,35 @@ exports[`options validate should throw an error on the "port" option with 'null' "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.port should be one of these: number | non-empty string | \\"auto\\" - -> Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport + -> Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport Details: * options.port should be a number. * options.port should be a non-empty string. * options.port should be \\"auto\\"." `; -exports[`options validate should throw an error on the "proxy" option with '[]' value 1`] = ` -"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - - options.proxy should be an non-empty array." -`; - exports[`options validate should throw an error on the "proxy" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.proxy should be one of these: - object { … } | [object { … } | function, ...] (should not have fewer than 1 item) - -> Proxying some URLs can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy + object { … } | [object { … } | function, ...] + -> Allows to proxy requests, can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy Details: * options.proxy should be an object: object { … } * options.proxy should be an array: - [object { … } | function, ...] (should not have fewer than 1 item)" + [object { … } | function, ...]" `; exports[`options validate should throw an error on the "proxy" option with 'function () {}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.proxy should be one of these: - object { … } | [object { … } | function, ...] (should not have fewer than 1 item) - -> Proxying some URLs can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy + object { … } | [object { … } | function, ...] + -> Allows to proxy requests, can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy Details: * options.proxy should be an object: object { … } * options.proxy should be an array: - [object { … } | function, ...] (should not have fewer than 1 item)" + [object { … } | function, ...]" `; exports[`options validate should throw an error on the "static" option with '' value 1`] = ` @@ -481,26 +504,26 @@ exports[`options validate should throw an error on the "static" option with '{"p "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static.publicPath should be one of these: - [non-empty string, ...] (should not have fewer than 1 item) | non-empty string - -> The bundled files will be available in the browser under this path. + [string, ...] (should not have fewer than 1 item) | string + -> The static files will be available in the browser under this public path. Details: * options.static.publicPath should be an array: - [non-empty string, ...] (should not have fewer than 1 item) - * options.static.publicPath should be a non-empty string." + [string, ...] (should not have fewer than 1 item) + * options.static.publicPath should be a string." `; exports[`options validate should throw an error on the "static" option with '{"serveIndex":"true"}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static.serveIndex should be one of these: boolean | object { … } - -> Tells dev-server to use serveIndex middleware when enabled. + -> Tells dev server to use serveIndex middleware when enabled. Details: * options.static.serveIndex should be a boolean. * options.static.serveIndex should be an object: @@ -511,23 +534,23 @@ exports[`options validate should throw an error on the "static" option with '{"w "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static.watch should be one of these: boolean | object { … } - -> Watch for files in static content directory. + -> Watches for files in static content directory. Details: * options.static.watch should be a boolean. * options.static.watch should be an object: object { … } - -> options for watch, description available at https://github.com/paulmillr/chokidar#api" + -> Options for watch, description available at https://github.com/paulmillr/chokidar#api" `; exports[`options validate should throw an error on the "static" option with '0' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static should be an array: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] @@ -541,7 +564,7 @@ exports[`options validate should throw an error on the "static" option with 'nul "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static should be an array: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] @@ -555,7 +578,7 @@ exports[`options validate should throw an error on the "watchFiles" option with "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.watchFiles should be one of these: [non-empty string | object { paths?, options? }, ...] | non-empty string | object { paths?, options? } - -> List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + -> Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles Details: * options.watchFiles should be an array: [non-empty string | object { paths?, options? }, ...] @@ -568,7 +591,7 @@ exports[`options validate should throw an error on the "watchFiles" option with "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.watchFiles should be one of these: [non-empty string | object { paths?, options? }, ...] | non-empty string | object { paths?, options? } - -> List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + -> Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles Details: * options.watchFiles should be an array: [non-empty string | object { paths?, options? }, ...] @@ -587,7 +610,7 @@ exports[`options validate should throw an error on the "webSocketServer" option "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function | object { type?, options? } - -> Allows to set web socket server and options. + -> Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver Details: * options.webSocketServer.type should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function @@ -602,7 +625,7 @@ exports[`options validate should throw an error on the "webSocketServer" option "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function | object { type?, options? } - -> Allows to set web socket server and options. + -> Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver Details: * options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" @@ -612,13 +635,13 @@ exports[`options validate should throw an error on the "webSocketServer" option object { type?, options? }" `; -exports[`options validate should throw an error on the "webSocketServer" option with 'nonexistent-implementation' value 1`] = `"Error: When you use custom web socket implementation you must explicitly specify client.transport. client.transport must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to a JS file which exports a class extending BaseClient (webpack-dev-server/client-src/clients/BaseClient.js) via require.resolve(...)"`; +exports[`options validate should throw an error on the "webSocketServer" option with 'nonexistent-implementation' value 1`] = `"Error: When you use custom web socket implementation you must explicitly specify client.transport. client.transport must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to a JS file via require.resolve(...) which exports a class "`; exports[`options validate should throw an error on the "webSocketServer" option with 'null' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function | object { type?, options? } - -> Allows to set web socket server and options. + -> Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver Details: * options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" diff --git a/test/__snapshots__/validate-options.test.js.snap.webpack5 b/test/__snapshots__/validate-options.test.js.snap.webpack5 index 484b06b72d..ed0aa8280f 100644 --- a/test/__snapshots__/validate-options.test.js.snap.webpack5 +++ b/test/__snapshots__/validate-options.test.js.snap.webpack5 @@ -1,10 +1,20 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`options validate should throw an error on the "allowedHosts" option with '[""]' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.allowedHosts[0] should be an non-empty string." +`; + +exports[`options validate should throw an error on the "allowedHosts" option with '[]' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.allowedHosts should be an non-empty array." +`; + exports[`options validate should throw an error on the "allowedHosts" option with '123' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.allowedHosts should be one of these: [non-empty string, ...] (should not have fewer than 1 item) | \\"auto\\" | \\"all\\" | non-empty string - -> Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + -> Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts Details: * options.allowedHosts should be an array: [non-empty string, ...] (should not have fewer than 1 item) @@ -17,7 +27,7 @@ exports[`options validate should throw an error on the "allowedHosts" option wit "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.allowedHosts should be one of these: [non-empty string, ...] (should not have fewer than 1 item) | \\"auto\\" | \\"all\\" | non-empty string - -> Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + -> Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts Details: * options.allowedHosts should be an array: [non-empty string, ...] (should not have fewer than 1 item) @@ -30,7 +40,7 @@ exports[`options validate should throw an error on the "allowedHosts" option wit "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.allowedHosts should be one of these: [non-empty string, ...] (should not have fewer than 1 item) | \\"auto\\" | \\"all\\" | non-empty string - -> Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + -> Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts Details: * options.allowedHosts should be an array: [non-empty string, ...] (should not have fewer than 1 item) @@ -43,7 +53,7 @@ exports[`options validate should throw an error on the "bonjour" option with '' "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.bonjour should be one of these: boolean | object { … } - -> Broadcasts the server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour + -> Allows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour Details: * options.bonjour should be a boolean. * options.bonjour should be an object: @@ -55,7 +65,7 @@ exports[`options validate should throw an error on the "client" option with '{"h "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.hotEntry should be one of these: boolean | function - -> Tells devServer to inject a Hot Module Replacement entry. + -> Injects a Hot Module Replacement entry. Details: * options.client.hotEntry should be a boolean. * options.client.hotEntry should be an instance of function." @@ -77,7 +87,7 @@ exports[`options validate should throw an error on the "client" option with '{"n "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.needClientEntry should be one of these: boolean | function - -> Tells devServer to inject a client entry. + -> Inject a client entry. Details: * options.client.needClientEntry should be a boolean. * options.client.needClientEntry should be an instance of function." @@ -86,37 +96,43 @@ exports[`options validate should throw an error on the "client" option with '{"n exports[`options validate should throw an error on the "client" option with '{"overlay":""}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.overlay should be one of these: - boolean | object { errors?, warnings?, … } + boolean | object { errors?, warnings? } Details: * options.client.overlay should be a boolean. - -> Show a full-screen overlay in the browser when there are compiler errors or warnings. + -> Enables a full-screen overlay in the browser when there are compiler errors or warnings. * options.client.overlay should be an object: - object { errors?, warnings?, … }" + object { errors?, warnings? }" +`; + +exports[`options validate should throw an error on the "client" option with '{"overlay":{"arbitrary":""}}' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.client.overlay has an unknown property 'arbitrary'. These properties are valid: + object { errors?, warnings? }" `; exports[`options validate should throw an error on the "client" option with '{"overlay":{"errors":""}}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.overlay.errors should be a boolean. - -> Show a full-screen overlay in the browser when there are compiler errors." + -> Enables a full-screen overlay in the browser when there are compiler errors." `; exports[`options validate should throw an error on the "client" option with '{"overlay":{"warnings":""}}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.overlay.warnings should be a boolean. - -> Show a full-screen overlay in the browser when there are compiler warnings." + -> Enables a full-screen overlay in the browser when there are compiler warnings." `; exports[`options validate should throw an error on the "client" option with '{"progress":""}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.progress should be a boolean. - -> Print compilation progress in percentage in the browser." + -> Prints compilation progress in percentage in the browser." `; exports[`options validate should throw an error on the "client" option with '{"transport":true}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.transport should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string - -> Allows to set custom transport to communicate with server. + -> Allows to set custom transport to communicate with dev server. Details: * options.client.transport should be one of these: \\"sockjs\\" | \\"ws\\" @@ -126,8 +142,8 @@ exports[`options validate should throw an error on the "client" option with '{"t exports[`options validate should throw an error on the "client" option with '{"unknownOption":true}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client has an unknown property 'unknownOption'. These properties are valid: - object { transport?, logging?, progress?, overlay?, needClientEntry?, hotEntry?, webSocketURL? } - -> Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient" + object { hotEntry?, logging?, needClientEntry?, overlay?, progress?, transport?, webSocketURL? } + -> Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient" `; exports[`options validate should throw an error on the "client" option with '{"webSocketURL":{"host":""}}' value 1`] = ` @@ -156,8 +172,8 @@ exports[`options validate should throw an error on the "client" option with '{"w exports[`options validate should throw an error on the "client" option with '{"webSocketURL":{"port":true}}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client.webSocketURL should be one of these: - non-empty string | object { protocol?, host?, port?, path? } - -> When using dev server and you're proxying dev-server, the client script does not always know where to connect to. + non-empty string | object { host?, path?, password?, port?, protocol?, username? } + -> Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to). Details: * options.client.webSocketURL.port should be one of these: number | non-empty string @@ -167,31 +183,43 @@ exports[`options validate should throw an error on the "client" option with '{"w * options.client.webSocketURL.port should be a non-empty string." `; +exports[`options validate should throw an error on the "client" option with '{"webSocketURL":{"username":123,"password":976}}' value 1`] = ` +"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. + - options.client.webSocketURL should be one of these: + non-empty string | object { host?, path?, password?, port?, protocol?, username? } + -> Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to). + Details: + * options.client.webSocketURL.password should be a string. + -> Tells clients connected to devServer to use the provided password to authenticate. + * options.client.webSocketURL.username should be a string. + -> Tells clients connected to devServer to use the provided username to authenticate." +`; + exports[`options validate should throw an error on the "client" option with 'whoops!' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.client should be an object: - object { transport?, logging?, progress?, overlay?, needClientEntry?, hotEntry?, webSocketURL? } - -> Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient" + object { hotEntry?, logging?, needClientEntry?, overlay?, progress?, transport?, webSocketURL? } + -> Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient" `; exports[`options validate should throw an error on the "compress" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.compress should be a boolean. - -> Enable gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress" + -> Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress" `; exports[`options validate should throw an error on the "devMiddleware" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.devMiddleware should be an object: object { … } - -> Provide options to webpack-dev-middleware which handles webpack assets. https://webpack.js.org/configuration/dev-server/#devserverdevmiddleware" + -> Provide options to 'webpack-dev-middleware' which handles webpack assets. https://webpack.js.org/configuration/dev-server/#devserverdevmiddleware" `; exports[`options validate should throw an error on the "headers" option with '1' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.headers should be one of these: object { … } | function - -> Adds headers to all responses. https://webpack.js.org/configuration/dev-server/#devserverheaders + -> Allows to set custom headers on response. https://webpack.js.org/configuration/dev-server/#devserverheaders Details: * options.headers should be an object: object { … } @@ -202,7 +230,7 @@ exports[`options validate should throw an error on the "headers" option with 'fa "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.headers should be one of these: object { … } | function - -> Adds headers to all responses. https://webpack.js.org/configuration/dev-server/#devserverheaders + -> Allows to set custom headers on response. https://webpack.js.org/configuration/dev-server/#devserverheaders Details: * options.headers should be an object: object { … } @@ -213,7 +241,7 @@ exports[`options validate should throw an error on the "historyApiFallback" opti "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.historyApiFallback should be one of these: boolean | object { … } - -> When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback + -> Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page Applications that utilise the HTML5 History API. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback Details: * options.historyApiFallback should be a boolean. * options.historyApiFallback should be an object: @@ -224,26 +252,26 @@ exports[`options validate should throw an error on the "historyApiFallback" opti exports[`options validate should throw an error on the "host" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.host should be an non-empty string. - -> Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost" + -> Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost" `; exports[`options validate should throw an error on the "host" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.host should be a non-empty string. - -> Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost" + -> Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost" `; exports[`options validate should throw an error on the "host" option with 'null' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.host should be a non-empty string. - -> Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost" + -> Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost" `; exports[`options validate should throw an error on the "hot" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.hot should be one of these: boolean | \\"only\\" - -> Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot + -> Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot Details: * options.hot should be a boolean. * options.hot should be \\"only\\"." @@ -253,7 +281,7 @@ exports[`options validate should throw an error on the "hot" option with 'foo' v "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.hot should be one of these: boolean | \\"only\\" - -> Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot + -> Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot Details: * options.hot should be a boolean. * options.hot should be \\"only\\"." @@ -262,14 +290,14 @@ exports[`options validate should throw an error on the "hot" option with 'foo' v exports[`options validate should throw an error on the "http2" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.http2 should be a boolean. - -> Serve over HTTP/2 using spdy. https://webpack.js.org/configuration/dev-server/#devserverhttp2" + -> Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2" `; exports[`options validate should throw an error on the "https" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https should be a boolean. * options.https should be an object: @@ -280,7 +308,7 @@ exports[`options validate should throw an error on the "https" option with '{"ca "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.cacert should be one of these: string | Buffer @@ -294,7 +322,7 @@ exports[`options validate should throw an error on the "https" option with '{"ce "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.cert should be one of these: string | Buffer @@ -314,7 +342,7 @@ exports[`options validate should throw an error on the "https" option with '{"ke "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.key should be one of these: string | Buffer @@ -334,7 +362,7 @@ exports[`options validate should throw an error on the "https" option with '{"pf "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.https should be one of these: boolean | object { passphrase?, requestCert?, cacert?, key?, pfx?, cert? } - -> By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps + -> Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps Details: * options.https.pfx should be one of these: string | Buffer @@ -353,19 +381,19 @@ exports[`options validate should throw an error on the "https" option with '{"re exports[`options validate should throw an error on the "onAfterSetupMiddleware" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.onAfterSetupMiddleware should be an instance of function. - -> Provides the ability to execute custom middleware after all other middleware internally within the server. https://webpack.js.org/configuration/dev-server/#devserverafter" + -> Provides the ability to execute a custom function and apply custom middleware(s) after all other middlewares. https://webpack.js.org/configuration/dev-server/#devserveronaftersetupmiddleware" `; exports[`options validate should throw an error on the "onBeforeSetupMiddleware" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.onBeforeSetupMiddleware should be an instance of function. - -> Provides the ability to execute custom middleware prior to all other middleware internally within the server. https://webpack.js.org/configuration/dev-server/#devserverbefore" + -> Provides the ability to execute a custom function and apply custom middleware(s) prior to all other middlewares. https://webpack.js.org/configuration/dev-server/#devserveronbeforesetupmiddleware" `; exports[`options validate should throw an error on the "onListening" option with '' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.onListening should be an instance of function. - -> Provides an option to execute a custom function when webpack-dev-server starts listening for connections on a port. https://webpack.js.org/configuration/dev-server/#onlistening" + -> Provides the ability to execute a custom function when dev server starts listening. https://webpack.js.org/configuration/dev-server/#devserveronlistening" `; exports[`options validate should throw an error on the "open" option with '' value 1`] = ` @@ -377,7 +405,7 @@ exports[`options validate should throw an error on the "open" option with '{"app "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.open should be one of these: [non-empty string | object { target?, app? }, ...] | boolean | non-empty string | object { target?, app? } - -> Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen + -> Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen Details: * options.open.app should be one of these: object { name?, arguments? } | non-empty string @@ -398,16 +426,16 @@ exports[`options validate should throw an error on the "open" option with '{"tar "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.open should be one of these: [non-empty string | object { target?, app? }, ...] | boolean | non-empty string | object { target?, app? } - -> Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen + -> Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen Details: * options.open.target should be one of these: - [non-empty string, ...] (should not have fewer than 1 item) | boolean | non-empty string - -> Open specified route in browser. + [string, ...] | boolean | string + -> Opens specified page in browser. Details: * options.open.target should be an array: - [non-empty string, ...] (should not have fewer than 1 item) + [string, ...] * options.open.target should be a boolean. - * options.open.target should be a non-empty string." + * options.open.target should be a string." `; exports[`options validate should throw an error on the "port" option with '' value 1`] = ` @@ -419,7 +447,7 @@ exports[`options validate should throw an error on the "port" option with 'false "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.port should be one of these: number | non-empty string | \\"auto\\" - -> Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport + -> Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport Details: * options.port should be a number. * options.port should be a non-empty string. @@ -430,40 +458,35 @@ exports[`options validate should throw an error on the "port" option with 'null' "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.port should be one of these: number | non-empty string | \\"auto\\" - -> Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport + -> Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport Details: * options.port should be a number. * options.port should be a non-empty string. * options.port should be \\"auto\\"." `; -exports[`options validate should throw an error on the "proxy" option with '[]' value 1`] = ` -"ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - - options.proxy should be an non-empty array." -`; - exports[`options validate should throw an error on the "proxy" option with 'false' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.proxy should be one of these: - object { … } | [object { … } | function, ...] (should not have fewer than 1 item) - -> Proxying some URLs can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy + object { … } | [object { … } | function, ...] + -> Allows to proxy requests, can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy Details: * options.proxy should be an object: object { … } * options.proxy should be an array: - [object { … } | function, ...] (should not have fewer than 1 item)" + [object { … } | function, ...]" `; exports[`options validate should throw an error on the "proxy" option with 'function () {}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.proxy should be one of these: - object { … } | [object { … } | function, ...] (should not have fewer than 1 item) - -> Proxying some URLs can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy + object { … } | [object { … } | function, ...] + -> Allows to proxy requests, can be useful when you have a separate API backend development server and you want to send API requests on the same domain. https://webpack.js.org/configuration/dev-server/#devserverproxy Details: * options.proxy should be an object: object { … } * options.proxy should be an array: - [object { … } | function, ...] (should not have fewer than 1 item)" + [object { … } | function, ...]" `; exports[`options validate should throw an error on the "static" option with '' value 1`] = ` @@ -481,26 +504,26 @@ exports[`options validate should throw an error on the "static" option with '{"p "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static.publicPath should be one of these: - [non-empty string, ...] (should not have fewer than 1 item) | non-empty string - -> The bundled files will be available in the browser under this path. + [string, ...] (should not have fewer than 1 item) | string + -> The static files will be available in the browser under this public path. Details: * options.static.publicPath should be an array: - [non-empty string, ...] (should not have fewer than 1 item) - * options.static.publicPath should be a non-empty string." + [string, ...] (should not have fewer than 1 item) + * options.static.publicPath should be a string." `; exports[`options validate should throw an error on the "static" option with '{"serveIndex":"true"}' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static.serveIndex should be one of these: boolean | object { … } - -> Tells dev-server to use serveIndex middleware when enabled. + -> Tells dev server to use serveIndex middleware when enabled. Details: * options.static.serveIndex should be a boolean. * options.static.serveIndex should be an object: @@ -511,23 +534,23 @@ exports[`options validate should throw an error on the "static" option with '{"w "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static.watch should be one of these: boolean | object { … } - -> Watch for files in static content directory. + -> Watches for files in static content directory. Details: * options.static.watch should be a boolean. * options.static.watch should be an object: object { … } - -> options for watch, description available at https://github.com/paulmillr/chokidar#api" + -> Options for watch, description available at https://github.com/paulmillr/chokidar#api" `; exports[`options validate should throw an error on the "static" option with '0' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static should be an array: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] @@ -541,7 +564,7 @@ exports[`options validate should throw an error on the "static" option with 'nul "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.static should be one of these: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] | boolean | non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? } - -> It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic + -> Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic Details: * options.static should be an array: [non-empty string | object { directory?, staticOptions?, publicPath?, serveIndex?, watch? }, ...] @@ -555,7 +578,7 @@ exports[`options validate should throw an error on the "watchFiles" option with "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.watchFiles should be one of these: [non-empty string | object { paths?, options? }, ...] | non-empty string | object { paths?, options? } - -> List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + -> Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles Details: * options.watchFiles should be an array: [non-empty string | object { paths?, options? }, ...] @@ -568,7 +591,7 @@ exports[`options validate should throw an error on the "watchFiles" option with "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.watchFiles should be one of these: [non-empty string | object { paths?, options? }, ...] | non-empty string | object { paths?, options? } - -> List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + -> Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles Details: * options.watchFiles should be an array: [non-empty string | object { paths?, options? }, ...] @@ -587,7 +610,7 @@ exports[`options validate should throw an error on the "webSocketServer" option "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function | object { type?, options? } - -> Allows to set web socket server and options. + -> Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver Details: * options.webSocketServer.type should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function @@ -602,7 +625,7 @@ exports[`options validate should throw an error on the "webSocketServer" option "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function | object { type?, options? } - -> Allows to set web socket server and options. + -> Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver Details: * options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" @@ -612,13 +635,13 @@ exports[`options validate should throw an error on the "webSocketServer" option object { type?, options? }" `; -exports[`options validate should throw an error on the "webSocketServer" option with 'nonexistent-implementation' value 1`] = `"Error: When you use custom web socket implementation you must explicitly specify client.transport. client.transport must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to a JS file which exports a class extending BaseClient (webpack-dev-server/client-src/clients/BaseClient.js) via require.resolve(...)"`; +exports[`options validate should throw an error on the "webSocketServer" option with 'nonexistent-implementation' value 1`] = `"Error: When you use custom web socket implementation you must explicitly specify client.transport. client.transport must be a string denoting a default implementation (e.g. 'sockjs', 'ws') or a full path to a JS file via require.resolve(...) which exports a class "`; exports[`options validate should throw an error on the "webSocketServer" option with 'null' value 1`] = ` "ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" | non-empty string | function | object { type?, options? } - -> Allows to set web socket server and options. + -> Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver Details: * options.webSocketServer should be one of these: \\"sockjs\\" | \\"ws\\" diff --git a/test/cli/__snapshots__/basic.test.js.snap.webpack4 b/test/cli/__snapshots__/basic.test.js.snap.webpack4 new file mode 100644 index 0000000000..def0c38505 --- /dev/null +++ b/test/cli/__snapshots__/basic.test.js.snap.webpack4 @@ -0,0 +1,121 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`basic basic should work using "--host localhost --port ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`basic basic should work: stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`basic should output help should generate correct cli flags 1`] = ` +"Usage: webpack serve|server|s [entries...] [options] + +Run the webpack dev server. + +Options: + -c, --config Provide path to a webpack configuration file e.g. ./webpack.config.js. + --config-name Name of the configuration to use. + -m, --merge Merge two or more configurations using 'webpack-merge'. + --env Environment passed to the configuration when it is a function. + --node-env Sets process.env.NODE_ENV to the specified value. + --progress [value] Print compilation progress during build. + -j, --json [value] Prints result as JSON or store it in a file. + --entry The entry point(s) of your application e.g. ./src/main.js. + -o, --output-path Output location of the file generated by webpack e.g. ./dist/. + -t, --target Sets the build target e.g. node. + -d, --devtool Determine source maps to use. + --no-devtool Do not generate source maps. + --mode Defines the mode to pass to webpack. + --name Name of the configuration. Used when loading multiple configurations. + --stats [value] It instructs webpack on how to treat the stats e.g. verbose. + --no-stats Disable stats output. + --watch-options-stdin Stop watching when stdin stream has ended. + --no-watch-options-stdin Do not stop watching when stdin stream has ended. + --allowed-hosts Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + --allowed-hosts-reset Clear all items provided in configuration. Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + --bonjour Allows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour + --no-bonjour Disallows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour + --client-transport Allows to set custom transport to communicate with dev server. + --client-logging Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient + --client-progress Prints compilation progress in percentage in the browser. + --no-client-progress Does not print compilation progress in percentage in the browser. + --client-overlay Enables a full-screen overlay in the browser when there are compiler errors or warnings. + --no-client-overlay Disables a full-screen overlay in the browser when there are compiler errors or warnings. + --client-overlay-errors Enables a full-screen overlay in the browser when there are compiler errors. + --no-client-overlay-errors Negative 'client-overlay-errors' option. + --client-overlay-warnings Enables a full-screen overlay in the browser when there are compiler warnings. + --no-client-overlay-warnings Negative 'client-overlay-warnings' option. + --client-need-client-entry Inject a client entry. + --no-client-need-client-entry Negative 'client-need-client-entry' option. + --client-hot-entry Injects a Hot Module Replacement entry. + --no-client-hot-entry Does not injects a Hot Module Replacement entry. + --client-web-socket-url Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to). + --client-web-socket-url-host Tells clients connected to devServer to use the provided host. + --client-web-socket-url-port Tells clients connected to devServer to use the provided port. + --client-web-socket-url-path Tells clients connected to devServer to use the provided path to connect. + --client-web-socket-url-protocol Tells clients connected to devServer to use the provided protocol. + --client-web-socket-url-username Tells clients connected to devServer to use the provided username to authenticate. + --client-web-socket-url-password Tells clients connected to devServer to use the provided password to authenticate. + --web-socket-server Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver + --compress Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress + --no-compress Disables gzip compression for everything served. + --history-api-fallback Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page Applications that utilise the HTML5 History API. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback + --no-history-api-fallback Negative 'history-api-fallback' option. + --host Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost + --hot [value] Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot + --no-hot Disables Hot Module Replacement. + --http2 Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2 + --no-http2 Does not serve over HTTP/2 using SPDY. + --https Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps + --no-https Disallows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). + --https-passphrase Passphrase for a pfx file. + --https-request-cert Request for an SSL certificate. + --no-https-request-cert Does not request for an SSL certificate. + --https-cacert Path to an SSL CA certificate. + --https-key Path to an SSL key. + --https-pfx Path to an SSL pfx file. + --https-cert Path to an SSL certificate. + --live-reload Enables reload/refresh the page(s) when file changes are detected (enabled by default). https://webpack.js.org/configuration/dev-server/#devserverlivereload + --no-live-reload Disables reload/refresh the page(s) when file changes are detected (enabled by default) + --open [value...] Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen + --no-open Does not open the default browser. + --open-target [value...] Opens specified page in browser. + --no-open-target Does not open specified page in browser. + --open-app-name Open specified browser. + --open-app Open specified browser. + --open-reset Clear all items provided in configuration. Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen + --open-target-reset Clear all items provided in configuration. Opens specified page in browser. + --open-app-name-reset Clear all items provided in configuration. Open specified browser. + --port Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport + --static [value...] Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic + --no-static Negative 'static' option. + --static-directory Directory for static contents. + --static-public-path The static files will be available in the browser under this public path. + --static-serve-index Tells dev server to use serveIndex middleware when enabled. + --no-static-serve-index Does not tell dev server to use serveIndex middleware. + --static-watch Watches for files in static content directory. + --no-static-watch Does not watch for files in static content directory. + --static-reset Clear all items provided in configuration. Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic + --static-public-path-reset Clear all items provided in configuration. The static files will be available in the browser under this public path. + --watch-files Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + --watch-files-reset Clear all items provided in configuration. Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + +Global options: + --color Enable colors on console. + --no-color Disable colors on console. + -v, --version Output the version number of 'webpack', 'webpack-cli' and 'webpack-dev-server' and commands. + -h, --help [verbose] Display help for commands and options. + +To see list of all supported commands and options run 'webpack --help=verbose'. + +Webpack documentation: https://webpack.js.org/. +CLI documentation: https://webpack.js.org/api/cli/. +Made with ♥ by the webpack team." +`; diff --git a/test/cli/__snapshots__/basic.test.js.snap.webpack5 b/test/cli/__snapshots__/basic.test.js.snap.webpack5 new file mode 100644 index 0000000000..00d4623697 --- /dev/null +++ b/test/cli/__snapshots__/basic.test.js.snap.webpack5 @@ -0,0 +1,122 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`basic basic should work using "--host localhost --port ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`basic basic should work: stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`basic should output help should generate correct cli flags 1`] = ` +"Usage: webpack serve|server|s [entries...] [options] + +Run the webpack dev server. + +Options: + -c, --config Provide path to a webpack configuration file e.g. ./webpack.config.js. + --config-name Name of the configuration to use. + -m, --merge Merge two or more configurations using 'webpack-merge'. + --env Environment passed to the configuration when it is a function. + --node-env Sets process.env.NODE_ENV to the specified value. + --progress [value] Print compilation progress during build. + -j, --json [value] Prints result as JSON or store it in a file. + -d, --devtool Determine source maps to use. + --no-devtool Do not generate source maps. + --entry The entry point(s) of your application e.g. ./src/main.js. + --mode Defines the mode to pass to webpack. + --name Name of the configuration. Used when loading multiple configurations. + -o, --output-path Output location of the file generated by webpack e.g. ./dist/. + --stats [value] It instructs webpack on how to treat the stats e.g. verbose. + --no-stats Disable stats output. + -t, --target Sets the build target e.g. node. + --no-target Negative 'target' option. + --watch-options-stdin Stop watching when stdin stream has ended. + --no-watch-options-stdin Do not stop watching when stdin stream has ended. + --allowed-hosts Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + --allowed-hosts-reset Clear all items provided in configuration. Allows to enumerate the hosts from which access to the dev server are allowed (useful when you are proxying dev server, by default is 'auto'). https://webpack.js.org/configuration/dev-server/#devserverallowedhosts + --bonjour Allows to broadcasts dev server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour + --no-bonjour Negative 'bonjour' option. + --client-hot-entry Injects a Hot Module Replacement entry. + --no-client-hot-entry Negative 'client-hot-entry' option. + --client-logging Allows to specify options for client script in the browser. https://webpack.js.org/configuration/dev-server/#devserverclient + --client-need-client-entry Inject a client entry. + --no-client-need-client-entry Negative 'client-need-client-entry' option. + --client-overlay Enables a full-screen overlay in the browser when there are compiler errors or warnings. + --no-client-overlay Negative 'client-overlay' option. + --client-overlay-errors Enables a full-screen overlay in the browser when there are compiler errors. + --no-client-overlay-errors Negative 'client-overlay-errors' option. + --client-overlay-warnings Enables a full-screen overlay in the browser when there are compiler warnings. + --no-client-overlay-warnings Negative 'client-overlay-warnings' option. + --client-progress Prints compilation progress in percentage in the browser. + --no-client-progress Negative 'client-progress' option. + --client-transport Allows to set custom transport to communicate with dev server. + --client-web-socket-url Allows to specify URL to web socket server (useful when you're proxying dev server and client script does not always know where to connect to). + --client-web-socket-url-host Tells clients connected to devServer to use the provided host. + --client-web-socket-url-path Tells clients connected to devServer to use the provided path to connect. + --client-web-socket-url-password Tells clients connected to devServer to use the provided password to authenticate. + --client-web-socket-url-port Tells clients connected to devServer to use the provided port. + --client-web-socket-url-protocol Tells clients connected to devServer to use the provided protocol. + --client-web-socket-url-username Tells clients connected to devServer to use the provided username to authenticate. + --compress Enables gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress + --no-compress Negative 'compress' option. + --history-api-fallback Allows to proxy requests through a specified index page (by default 'index.html'), useful for Single Page Applications that utilise the HTML5 History API. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback + --no-history-api-fallback Negative 'history-api-fallback' option. + --host Allows to specify a hostname to use. https://webpack.js.org/configuration/dev-server/#devserverhost + --hot [value] Enables Hot Module Replacement. https://webpack.js.org/configuration/dev-server/#devserverhot + --no-hot Negative 'hot' option. + --http2 Allows to serve over HTTP/2 using SPDY. https://webpack.js.org/configuration/dev-server/#devserverhttp2 + --no-http2 Negative 'http2' option. + --https Allows to configure the server's listening socket for TLS (by default, dev server will be served over HTTP). https://webpack.js.org/configuration/dev-server/#devserverhttps + --no-https Negative 'https' option. + --https-passphrase Passphrase for a pfx file. + --https-request-cert Request for an SSL certificate. + --no-https-request-cert Negative 'https-request-cert' option. + --https-cacert Path to an SSL CA certificate. + --https-key Path to an SSL key. + --https-pfx Path to an SSL pfx file. + --https-cert Path to an SSL certificate. + --live-reload Enables reload/refresh the page(s) when file changes are detected (enabled by default). https://webpack.js.org/configuration/dev-server/#devserverlivereload + --no-live-reload Negative 'live-reload' option. + --open [value...] Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen + --no-open Negative 'open' option. + --open-target [value...] Opens specified page in browser. + --no-open-target Negative 'open-target' option. + --open-app-name Open specified browser. + --open-app Open specified browser. + --open-reset Clear all items provided in configuration. Allows to configure dev server to open the browser(s) and page(s) after server had been started (set it to true to open your default browser). https://webpack.js.org/configuration/dev-server/#devserveropen + --open-target-reset Clear all items provided in configuration. Opens specified page in browser. + --open-app-name-reset Clear all items provided in configuration. Open specified browser. + --port Allows to specify a port to use. https://webpack.js.org/configuration/dev-server/#devserverport + --static [value...] Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic + --no-static Negative 'static' option. + --static-directory Directory for static contents. + --static-public-path The static files will be available in the browser under this public path. + --static-serve-index Tells dev server to use serveIndex middleware when enabled. + --no-static-serve-index Negative 'static-serve-index' option. + --static-watch Watches for files in static content directory. + --no-static-watch Negative 'static-watch' option. + --static-reset Clear all items provided in configuration. Allows to configure options for serving static files from directory (by default 'public' directory). https://webpack.js.org/configuration/dev-server/#devserverstatic + --static-public-path-reset Clear all items provided in configuration. The static files will be available in the browser under this public path. + --watch-files Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + --watch-files-reset Clear all items provided in configuration. Allows to configure list of globs/directories/files to watch for file changes. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles + --web-socket-server Allows to set web socket server and options (by default 'ws'). https://webpack.js.org/configuration/dev-server/#devserverwebsocketserver + +Global options: + --color Enable colors on console. + --no-color Disable colors on console. + -v, --version Output the version number of 'webpack', 'webpack-cli' and 'webpack-dev-server' and commands. + -h, --help [verbose] Display help for commands and options. + +To see list of all supported commands and options run 'webpack --help=verbose'. + +Webpack documentation: https://webpack.js.org/. +CLI documentation: https://webpack.js.org/api/cli/. +Made with ♥ by the webpack team." +`; diff --git a/test/cli/__snapshots__/bonjour-option.test.js.snap.webpack4 b/test/cli/__snapshots__/bonjour-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..57f20cbbf7 --- /dev/null +++ b/test/cli/__snapshots__/bonjour-option.test.js.snap.webpack4 @@ -0,0 +1,27 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"bonjour" CLI option should work using "--bonjour and --https" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory + [webpack-dev-server] Broadcasting \\"https\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" +`; + +exports[`"bonjour" CLI option should work using "--bonjour" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory + [webpack-dev-server] Broadcasting \\"http\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" +`; + +exports[`"bonjour" CLI option should work using "--no-bonjour" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/bonjour-option.test.js.snap.webpack5 b/test/cli/__snapshots__/bonjour-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..57f20cbbf7 --- /dev/null +++ b/test/cli/__snapshots__/bonjour-option.test.js.snap.webpack5 @@ -0,0 +1,27 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"bonjour" CLI option should work using "--bonjour and --https" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory + [webpack-dev-server] Broadcasting \\"https\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" +`; + +exports[`"bonjour" CLI option should work using "--bonjour" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory + [webpack-dev-server] Broadcasting \\"http\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" +`; + +exports[`"bonjour" CLI option should work using "--no-bonjour" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/cli.test.js.snap.webpack4 b/test/cli/__snapshots__/cli.test.js.snap.webpack4 deleted file mode 100644 index d3c1bb5c38..0000000000 --- a/test/cli/__snapshots__/cli.test.js.snap.webpack4 +++ /dev/null @@ -1,430 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CLI bonjour option --bonjour 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory - [webpack-dev-server] Broadcasting \\"http\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" -`; - -exports[`CLI bonjour option --bonjour and --https 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory - [webpack-dev-server] Broadcasting \\"https\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" -`; - -exports[`CLI bonjour option --no-bonjour 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI help should generate correct cli flags 1`] = ` -"Usage: webpack serve|server|s [entries...] [options] - -Run the webpack dev server. - -Options: - -c, --config Provide path to a webpack configuration file e.g. ./webpack.config.js. - --config-name Name of the configuration to use. - -m, --merge Merge two or more configurations using 'webpack-merge'. - --env Environment passed to the configuration when it is a function. - --node-env Sets process.env.NODE_ENV to the specified value. - --progress [value] Print compilation progress during build. - -j, --json [value] Prints result as JSON or store it in a file. - --entry The entry point(s) of your application e.g. ./src/main.js. - -o, --output-path Output location of the file generated by webpack e.g. ./dist/. - -t, --target Sets the build target e.g. node. - -d, --devtool Determine source maps to use. - --no-devtool Do not generate source maps. - --mode Defines the mode to pass to webpack. - --name Name of the configuration. Used when loading multiple configurations. - --stats [value] It instructs webpack on how to treat the stats e.g. verbose. - --no-stats Disable stats output. - --watch-options-stdin Stop watching when stdin stream has ended. - --no-watch-options-stdin Do not stop watching when stdin stream has ended. - --allowed-hosts Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts - --allowed-hosts-reset Clear all items provided in configuration. Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts - --bonjour Broadcasts the server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour - --no-bonjour Do not broadcast the server via ZeroConf networking on start. - --client-transport Allows to set custom transport to communicate with server. - --client-logging Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient - --client-progress Print compilation progress in percentage in the browser. - --no-client-progress Do not print compilation progress in percentage in the browser. - --client-overlay Show a full-screen overlay in the browser when there are compiler errors or warnings. - --no-client-overlay Do not show a full-screen overlay in the browser when there are compiler errors or warnings. - --client-overlay-errors Show a full-screen overlay in the browser when there are compiler errors. - --no-client-overlay-errors Negative 'client-overlay-errors' option. - --client-overlay-warnings Show a full-screen overlay in the browser when there are compiler warnings. - --no-client-overlay-warnings Negative 'client-overlay-warnings' option. - --client-need-client-entry Tells devServer to inject a client entry. - --no-client-need-client-entry Negative 'client-need-client-entry' option. - --client-hot-entry Tells devServer to inject a Hot Module Replacement entry. - --no-client-hot-entry Do not tell devServer to inject a Hot Module Replacement entry. - --client-web-socket-url When using dev server and you're proxying dev-server, the client script does not always know where to connect to. - --client-web-socket-url-host Tells clients connected to devServer to use the provided host. - --client-web-socket-url-port Tells clients connected to devServer to use the provided port. - --client-web-socket-url-path Tells clients connected to devServer to use the provided path to connect. - --client-web-socket-url-protocol Tells clients connected to devServer to use the provided protocol. - --web-socket-server Allows to set web socket server and options. - --compress Enable gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress - --no-compress Disable gzip compression. - --history-api-fallback When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback - --no-history-api-fallback Negative 'history-api-fallback' option. - --host Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost - --hot [value] Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot - --no-hot Disable webpack's Hot Module Replacement feature. - --http2 Serve over HTTP/2 using spdy. https://webpack.js.org/configuration/dev-server/#devserverhttp2 - --no-http2 Do not use HTTP/2. - --https By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps - --no-https Do not use HTTPS protocol. - --https-passphrase Passphrase for a pfx file. - --https-request-cert Request for an SSL certificate. - --no-https-request-cert Do not request for an SSL certificate. - --https-cacert Path to an SSL CA certificate. - --https-key Path to an SSL key. - --https-pfx Path to an SSL pfx file. - --https-cert Path to an SSL certificate. - --live-reload By default, the dev-server will reload/refresh the page when file changes are detected. https://webpack.js.org/configuration/dev-server/#devserverlivereload - --no-live-reload Disables live reloading on changing files. - --open [value...] Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen - --no-open Do not open the default browser. - --open-target [value...] Open specified route in browser. - --no-open-target Do not open specified route in browser. - --open-app-name Open specified browser. - --open-app Open specified browser. - --open-reset Clear all items provided in configuration. Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen - --open-target-reset Clear all items provided in configuration. Open specified route in browser. - --open-app-name-reset Clear all items provided in configuration. Open specified browser. - --port Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport - --static [value...] It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic - --no-static Negative 'static' option. - --static-directory Directory for static contents. - --static-public-path The bundled files will be available in the browser under this path. - --static-serve-index Tells dev-server to use serveIndex middleware when enabled. - --no-static-serve-index Do not tell dev-server to use serveIndex middleware. - --static-watch Watch for files in static content directory. - --no-static-watch Do not watch for files in static content directory. - --static-reset Clear all items provided in configuration. It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic - --static-public-path-reset Clear all items provided in configuration. The bundled files will be available in the browser under this path. - --watch-files List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles - --watch-files-reset Clear all items provided in configuration. List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles - -Global options: - --color Enable colors on console. - --no-color Disable colors on console. - -v, --version Output the version number of 'webpack', 'webpack-cli' and 'webpack-dev-server' and commands. - -h, --help [verbose] Display help for commands and options. - -To see list of all supported commands and options run 'webpack --help=verbose'. - -Webpack documentation: https://webpack.js.org/. -CLI documentation: https://webpack.js.org/api/cli/. -Made with ♥ by the webpack team." -`; - -exports[`CLI historyApiFallback option --history-api-fallback 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory - [webpack-dev-server] 404s will fallback to '/index.html'" -`; - -exports[`CLI historyApiFallback option --no-history-api-fallback 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host and port options --host and --port are unspecified: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host and port options --host localhost --port 9999: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host :: (IPv6): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host ::1 (IPv6): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://[::1]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host 0.0.0.0 (IPv4): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host 0:0:0:0:0:FFFF:7F00:0001 (IPv6): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://127.0.0.1:/ - [webpack-dev-server] On Your Network (IPv6): http://[::ffff:127.0.0.1]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host 127.0.0.1 (IPv4): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://127.0.0.1:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host localhost: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI http2 option --http2 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI http2 option --no-http2 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --https 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --https-request-cert 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --no-https 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --no-https-request-cert 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option https and other related options 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option https options 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI port option --port is auto: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI port option --port is string: stderr 1`] = ` -" [webpack-dev-server] The \\"port\\" specified in options is different from the port passed as an argument. Will be used from arguments. - [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --no-static-serve-index: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --no-static-watch: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static --static : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static, other-static' directory" -`; - -exports[`CLI static option --static : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static' directory" -`; - -exports[`CLI static option --static: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-directory: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'static-dir' directory" -`; - -exports[`CLI static option --static-directory: stderr 2`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'static-dir' directory" -`; - -exports[`CLI static option --static-public-path: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-public-path-reset: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-reset --static-directory : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static-directory' directory" -`; - -exports[`CLI static option --static-reset: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static-after-reset' directory" -`; - -exports[`CLI static option --static-serve-index: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-watch: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI watchFiles option --watch-files --watch-files : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI watchFiles option --watch-files : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI watchFiles option --watch-files-reset: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; diff --git a/test/cli/__snapshots__/cli.test.js.snap.webpack5 b/test/cli/__snapshots__/cli.test.js.snap.webpack5 deleted file mode 100644 index 028b8f206e..0000000000 --- a/test/cli/__snapshots__/cli.test.js.snap.webpack5 +++ /dev/null @@ -1,431 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CLI bonjour option --bonjour 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory - [webpack-dev-server] Broadcasting \\"http\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" -`; - -exports[`CLI bonjour option --bonjour and --https 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory - [webpack-dev-server] Broadcasting \\"https\\" with subtype of \\"webpack\\" via ZeroConf DNS (Bonjour)" -`; - -exports[`CLI bonjour option --no-bonjour 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI help should generate correct cli flags 1`] = ` -"Usage: webpack serve|server|s [entries...] [options] - -Run the webpack dev server. - -Options: - -c, --config Provide path to a webpack configuration file e.g. ./webpack.config.js. - --config-name Name of the configuration to use. - -m, --merge Merge two or more configurations using 'webpack-merge'. - --env Environment passed to the configuration when it is a function. - --node-env Sets process.env.NODE_ENV to the specified value. - --progress [value] Print compilation progress during build. - -j, --json [value] Prints result as JSON or store it in a file. - -d, --devtool Determine source maps to use. - --no-devtool Do not generate source maps. - --entry The entry point(s) of your application e.g. ./src/main.js. - --mode Defines the mode to pass to webpack. - --name Name of the configuration. Used when loading multiple configurations. - -o, --output-path Output location of the file generated by webpack e.g. ./dist/. - --stats [value] It instructs webpack on how to treat the stats e.g. verbose. - --no-stats Disable stats output. - -t, --target Sets the build target e.g. node. - --no-target Negative 'target' option. - --watch-options-stdin Stop watching when stdin stream has ended. - --no-watch-options-stdin Do not stop watching when stdin stream has ended. - --allowed-hosts Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts - --allowed-hosts-reset Clear all items provided in configuration. Defines routes which are enabled by default, on by default and allows localhost/value from the 'host' option/value from the 'client.webSocketURL' option. https://webpack.js.org/configuration/dev-server/#devserverallowedhosts - --bonjour Broadcasts the server via ZeroConf networking on start. https://webpack.js.org/configuration/dev-server/#devserverbonjour - --no-bonjour Negative 'bonjour' option. - --client-transport Allows to set custom transport to communicate with server. - --client-logging Specifies client properties. https://webpack.js.org/configuration/dev-server/#devserverclient - --client-progress Print compilation progress in percentage in the browser. - --no-client-progress Negative 'client-progress' option. - --client-overlay Show a full-screen overlay in the browser when there are compiler errors or warnings. - --no-client-overlay Negative 'client-overlay' option. - --client-overlay-errors Show a full-screen overlay in the browser when there are compiler errors. - --no-client-overlay-errors Negative 'client-overlay-errors' option. - --client-overlay-warnings Show a full-screen overlay in the browser when there are compiler warnings. - --no-client-overlay-warnings Negative 'client-overlay-warnings' option. - --client-need-client-entry Tells devServer to inject a client entry. - --no-client-need-client-entry Negative 'client-need-client-entry' option. - --client-hot-entry Tells devServer to inject a Hot Module Replacement entry. - --no-client-hot-entry Negative 'client-hot-entry' option. - --client-web-socket-url When using dev server and you're proxying dev-server, the client script does not always know where to connect to. - --client-web-socket-url-protocol Tells clients connected to devServer to use the provided protocol. - --client-web-socket-url-host Tells clients connected to devServer to use the provided host. - --client-web-socket-url-port Tells clients connected to devServer to use the provided port. - --client-web-socket-url-path Tells clients connected to devServer to use the provided path to connect. - --compress Enable gzip compression for everything served. https://webpack.js.org/configuration/dev-server/#devservercompress - --no-compress Negative 'compress' option. - --history-api-fallback When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 responses. https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback - --no-history-api-fallback Negative 'history-api-fallback' option. - --host Specify a host to use. If you want your server to be accessible externally. https://webpack.js.org/configuration/dev-server/#devserverhost - --hot [value] Enable webpack's Hot Module Replacement feature. https://webpack.js.org/configuration/dev-server/#devserverhot - --no-hot Negative 'hot' option. - --http2 Serve over HTTP/2 using spdy. https://webpack.js.org/configuration/dev-server/#devserverhttp2 - --no-http2 Negative 'http2' option. - --https By default, dev-server will be served over HTTP. It can optionally be served over HTTP/2 with HTTPS. https://webpack.js.org/configuration/dev-server/#devserverhttps - --no-https Negative 'https' option. - --https-passphrase Passphrase for a pfx file. - --https-request-cert Request for an SSL certificate. - --no-https-request-cert Negative 'https-request-cert' option. - --https-cacert Path to an SSL CA certificate. - --https-key Path to an SSL key. - --https-pfx Path to an SSL pfx file. - --https-cert Path to an SSL certificate. - --live-reload By default, the dev-server will reload/refresh the page when file changes are detected. https://webpack.js.org/configuration/dev-server/#devserverlivereload - --no-live-reload Negative 'live-reload' option. - --open [value...] Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen - --no-open Negative 'open' option. - --open-target [value...] Open specified route in browser. - --no-open-target Negative 'open-target' option. - --open-app-name Open specified browser. - --open-app Open specified browser. - --open-reset Clear all items provided in configuration. Tells dev-server to open the browser after server had been started. Set it to true to open your default browser. https://webpack.js.org/configuration/dev-server/#devserveropen - --open-target-reset Clear all items provided in configuration. Open specified route in browser. - --open-app-name-reset Clear all items provided in configuration. Open specified browser. - --port Specify a port number to listen for requests on. https://webpack.js.org/configuration/dev-server/#devserverport - --static [value...] It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic - --no-static Negative 'static' option. - --static-directory Directory for static contents. - --static-public-path The bundled files will be available in the browser under this path. - --static-serve-index Tells dev-server to use serveIndex middleware when enabled. - --no-static-serve-index Negative 'static-serve-index' option. - --static-watch Watch for files in static content directory. - --no-static-watch Negative 'static-watch' option. - --static-reset Clear all items provided in configuration. It is possible to configure advanced options for serving static files from directory. See the Express documentation for the possible options. https://webpack.js.org/configuration/dev-server/#devserverstatic - --static-public-path-reset Clear all items provided in configuration. The bundled files will be available in the browser under this path. - --watch-files List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles - --watch-files-reset Clear all items provided in configuration. List of files to watch for file changes and serve. https://webpack.js.org/configuration/dev-server/#devserverwatchfiles - --web-socket-server Allows to set web socket server and options. - -Global options: - --color Enable colors on console. - --no-color Disable colors on console. - -v, --version Output the version number of 'webpack', 'webpack-cli' and 'webpack-dev-server' and commands. - -h, --help [verbose] Display help for commands and options. - -To see list of all supported commands and options run 'webpack --help=verbose'. - -Webpack documentation: https://webpack.js.org/. -CLI documentation: https://webpack.js.org/api/cli/. -Made with ♥ by the webpack team." -`; - -exports[`CLI historyApiFallback option --history-api-fallback 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory - [webpack-dev-server] 404s will fallback to '/index.html'" -`; - -exports[`CLI historyApiFallback option --no-history-api-fallback 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host and port options --host and --port are unspecified: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host and port options --host localhost --port 9999: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host :: (IPv6): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host ::1 (IPv6): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://[::1]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host 0.0.0.0 (IPv4): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host 0:0:0:0:0:FFFF:7F00:0001 (IPv6): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] On Your Network (IPv4): http://127.0.0.1:/ - [webpack-dev-server] On Your Network (IPv6): http://[::ffff:127.0.0.1]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host 127.0.0.1 (IPv4): stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://127.0.0.1:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI host option --host localhost: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI http2 option --http2 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI http2 option --no-http2 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --https 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --https-request-cert 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --no-https 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option --no-https-request-cert 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option https and other related options 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI https option https options 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: https://localhost:/ - [webpack-dev-server] On Your Network (IPv4): https://:/ - [webpack-dev-server] On Your Network (IPv6): https://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI port option --port is auto: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI port option --port is string: stderr 1`] = ` -" [webpack-dev-server] The \\"port\\" specified in options is different from the port passed as an argument. Will be used from arguments. - [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --no-static-serve-index: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --no-static-watch: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static --static : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static, other-static' directory" -`; - -exports[`CLI static option --static : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static' directory" -`; - -exports[`CLI static option --static: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-directory: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'static-dir' directory" -`; - -exports[`CLI static option --static-directory: stderr 2`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'static-dir' directory" -`; - -exports[`CLI static option --static-public-path: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-public-path-reset: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-reset --static-directory : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static-directory' directory" -`; - -exports[`CLI static option --static-reset: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from 'new-static-after-reset' directory" -`; - -exports[`CLI static option --static-serve-index: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI static option --static-watch: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI watchFiles option --watch-files --watch-files : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI watchFiles option --watch-files : stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; - -exports[`CLI watchFiles option --watch-files-reset: stderr 1`] = ` -" [webpack-dev-server] Project is running at: - [webpack-dev-server] Loopback: http://localhost:/ - [webpack-dev-server] On Your Network (IPv4): http://:/ - [webpack-dev-server] On Your Network (IPv6): http://[]:/ - [webpack-dev-server] Content not from webpack is served from '/public' directory" -`; diff --git a/test/cli/__snapshots__/historyApiFallback-option.test.js.snap.webpack4 b/test/cli/__snapshots__/historyApiFallback-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..bad32bcee6 --- /dev/null +++ b/test/cli/__snapshots__/historyApiFallback-option.test.js.snap.webpack4 @@ -0,0 +1,18 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"historyApiFallback" CLI option should work using "--history-api-fallback" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory + [webpack-dev-server] 404s will fallback to '/index.html'" +`; + +exports[`"historyApiFallback" CLI option should work using "--no-history-api-fallback" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/historyApiFallback-option.test.js.snap.webpack5 b/test/cli/__snapshots__/historyApiFallback-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..bad32bcee6 --- /dev/null +++ b/test/cli/__snapshots__/historyApiFallback-option.test.js.snap.webpack5 @@ -0,0 +1,18 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"historyApiFallback" CLI option should work using "--history-api-fallback" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory + [webpack-dev-server] 404s will fallback to '/index.html'" +`; + +exports[`"historyApiFallback" CLI option should work using "--no-history-api-fallback" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/host-option.test.js.snap.webpack4 b/test/cli/__snapshots__/host-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..5f52f39a6f --- /dev/null +++ b/test/cli/__snapshots__/host-option.test.js.snap.webpack4 @@ -0,0 +1,60 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"host" CLI option should work using "--host ::" (IPv6): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host ::1" (IPv6): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://[::1]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host 0.0.0.0" (IPv4): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host 0:0:0:0:0:FFFF:7F00:0001" (IPv6): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://127.0.0.1:/ + [webpack-dev-server] On Your Network (IPv6): http://[::ffff:127.0.0.1]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host 127.0.0.1" (IPv4): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://127.0.0.1:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host local-ip": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host local-ipv4": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host localhost": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/host-option.test.js.snap.webpack5 b/test/cli/__snapshots__/host-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..5f52f39a6f --- /dev/null +++ b/test/cli/__snapshots__/host-option.test.js.snap.webpack5 @@ -0,0 +1,60 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"host" CLI option should work using "--host ::" (IPv6): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host ::1" (IPv6): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://[::1]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host 0.0.0.0" (IPv4): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host 0:0:0:0:0:FFFF:7F00:0001" (IPv6): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://127.0.0.1:/ + [webpack-dev-server] On Your Network (IPv6): http://[::ffff:127.0.0.1]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host 127.0.0.1" (IPv4): stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://127.0.0.1:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host local-ip": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host local-ipv4": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"host" CLI option should work using "--host localhost": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/, http://127.0.0.1:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/http2-option.test.js.snap.webpack4 b/test/cli/__snapshots__/http2-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..5a4b71e919 --- /dev/null +++ b/test/cli/__snapshots__/http2-option.test.js.snap.webpack4 @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"http2" CLI option should work using "--http2" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"http2" CLI option should work using "--no-http2" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/http2-option.test.js.snap.webpack5 b/test/cli/__snapshots__/http2-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..5a4b71e919 --- /dev/null +++ b/test/cli/__snapshots__/http2-option.test.js.snap.webpack5 @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"http2" CLI option should work using "--http2" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"http2" CLI option should work using "--no-http2" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/https-option.test.js.snap.webpack4 b/test/cli/__snapshots__/https-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..81137816fb --- /dev/null +++ b/test/cli/__snapshots__/https-option.test.js.snap.webpack4 @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"https" CLI option should work using "--https" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--https-key --https-pfx --https-passphrase webpack-dev-server --https-cert --https-cacert " 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--https-key --https-pfx --https-passphrase webpack-dev-server --https-cert " 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--https-request-cert" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--no-https" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--no-https-request-cert" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/https-option.test.js.snap.webpack5 b/test/cli/__snapshots__/https-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..81137816fb --- /dev/null +++ b/test/cli/__snapshots__/https-option.test.js.snap.webpack5 @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"https" CLI option should work using "--https" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--https-key --https-pfx --https-passphrase webpack-dev-server --https-cert --https-cacert " 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--https-key --https-pfx --https-passphrase webpack-dev-server --https-cert " 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--https-request-cert" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--no-https" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"https" CLI option should work using "--no-https-request-cert" 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: https://localhost:/ + [webpack-dev-server] On Your Network (IPv4): https://:/ + [webpack-dev-server] On Your Network (IPv6): https://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/port-option.test.js.snap.webpack4 b/test/cli/__snapshots__/port-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..16acd55c53 --- /dev/null +++ b/test/cli/__snapshots__/port-option.test.js.snap.webpack4 @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"port" CLI option should work using "--port ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"port" CLI option should work using "--port auto": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/port-option.test.js.snap.webpack5 b/test/cli/__snapshots__/port-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..16acd55c53 --- /dev/null +++ b/test/cli/__snapshots__/port-option.test.js.snap.webpack5 @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"port" CLI option should work using "--port ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"port" CLI option should work using "--port auto": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/static-option.test.js.snap.webpack4 b/test/cli/__snapshots__/static-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..81ba084c5a --- /dev/null +++ b/test/cli/__snapshots__/static-option.test.js.snap.webpack4 @@ -0,0 +1,97 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"static" CLI option should work using "--no-static-serve-index": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--no-static-watch": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static new-static --static other-static": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static, other-static' directory" +`; + +exports[`"static" CLI option should work using "--static new-static": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static' directory" +`; + +exports[`"static" CLI option should work using "--static": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-directory static-dir": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'static-dir' directory" +`; + +exports[`"static" CLI option should work using "--static-public-path /public": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-public-path-reset": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-reset --static-directory new-static-directory": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static-directory' directory" +`; + +exports[`"static" CLI option should work using "--static-reset": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static-after-reset' directory" +`; + +exports[`"static" CLI option should work using "--static-serve-index": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-watch": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/static-option.test.js.snap.webpack5 b/test/cli/__snapshots__/static-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..81ba084c5a --- /dev/null +++ b/test/cli/__snapshots__/static-option.test.js.snap.webpack5 @@ -0,0 +1,97 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"static" CLI option should work using "--no-static-serve-index": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--no-static-watch": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static new-static --static other-static": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static, other-static' directory" +`; + +exports[`"static" CLI option should work using "--static new-static": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static' directory" +`; + +exports[`"static" CLI option should work using "--static": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-directory static-dir": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'static-dir' directory" +`; + +exports[`"static" CLI option should work using "--static-public-path /public": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-public-path-reset": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-reset --static-directory new-static-directory": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static-directory' directory" +`; + +exports[`"static" CLI option should work using "--static-reset": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from 'new-static-after-reset' directory" +`; + +exports[`"static" CLI option should work using "--static-serve-index": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"static" CLI option should work using "--static-watch": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/watchFiles-option.test.js.snap.webpack4 b/test/cli/__snapshots__/watchFiles-option.test.js.snap.webpack4 new file mode 100644 index 0000000000..cbe8ff13d2 --- /dev/null +++ b/test/cli/__snapshots__/watchFiles-option.test.js.snap.webpack4 @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"watchFiles" CLI option should work using "--watch-files --watch-files ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"watchFiles" CLI option should work using "--watch-files ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"watchFiles" CLI option should work using "--watch-files-reset --watch-files ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/__snapshots__/watchFiles-option.test.js.snap.webpack5 b/test/cli/__snapshots__/watchFiles-option.test.js.snap.webpack5 new file mode 100644 index 0000000000..cbe8ff13d2 --- /dev/null +++ b/test/cli/__snapshots__/watchFiles-option.test.js.snap.webpack5 @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`"watchFiles" CLI option should work using "--watch-files --watch-files ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"watchFiles" CLI option should work using "--watch-files ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; + +exports[`"watchFiles" CLI option should work using "--watch-files-reset --watch-files ": stderr 1`] = ` +" [webpack-dev-server] Project is running at: + [webpack-dev-server] Loopback: http://localhost:/ + [webpack-dev-server] On Your Network (IPv4): http://:/ + [webpack-dev-server] On Your Network (IPv6): http://[]:/ + [webpack-dev-server] Content not from webpack is served from '/public' directory" +`; diff --git a/test/cli/allowedHosts-option.test.js b/test/cli/allowedHosts-option.test.js new file mode 100644 index 0000000000..e0b945c4f5 --- /dev/null +++ b/test/cli/allowedHosts-option.test.js @@ -0,0 +1,34 @@ +'use strict'; + +const { testBin } = require('../helpers/test-bin'); + +describe('"allowedHosts" CLI option', () => { + it('should work using "--allowed-hosts auto"', async () => { + const { exitCode } = await testBin(['--allowed-hosts', 'auto']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--allowed-hosts all"', async () => { + const { exitCode } = await testBin(['--allowed-hosts', 'all']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--allowed-hosts testhouse.com"', async () => { + const { exitCode } = await testBin(['--allowed-hosts', 'testhouse.com']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--allowed-hosts testhost.com --allowed-hosts testhost1.com"', async () => { + const { exitCode } = await testBin([ + '--allowed-hosts', + 'testhost.com', + '--allowed-hosts', + 'testhost1.com', + ]); + + expect(exitCode).toEqual(0); + }); +}); diff --git a/test/cli/basic.test.js b/test/cli/basic.test.js new file mode 100644 index 0000000000..f05d4567c6 --- /dev/null +++ b/test/cli/basic.test.js @@ -0,0 +1,345 @@ +'use strict'; + +const path = require('path'); +const webpack = require('webpack'); +const execa = require('execa'); +const stripAnsi = require('strip-ansi'); +const schema = require('../../lib/options.json'); +const cliOptions = require('../../bin/cli-flags'); +const { testBin, normalizeStderr } = require('../helpers/test-bin'); +const isWebpack5 = require('../helpers/isWebpack5'); +const port = require('../ports-map')['cli-basic']; + +const isMacOS = process.platform === 'darwin'; +const webpack5Test = isWebpack5 ? it : it.skip; + +describe('basic', () => { + describe('should validate CLI options', () => { + webpack5Test('should be same as in schema', () => { + const cliOptionsFromWebpack = webpack.cli.getArguments(schema); + + const normalizedCliOptions = {}; + + for (const [name, options] of Object.entries(cliOptions)) { + // Only webpack-cli supports it + // TODO send PR to webpack + delete options.negatedDescription; + + normalizedCliOptions[name] = options; + } + + expect(normalizedCliOptions).toStrictEqual(cliOptionsFromWebpack); + }); + }); + + describe('should output help', () => { + (isMacOS ? it.skip : it)('should generate correct cli flags', async () => { + const { exitCode, stdout } = await testBin(['--help']); + + expect(exitCode).toBe(0); + expect(stripAnsi(stdout)).toMatchSnapshot(); + }); + }); + + describe('basic', () => { + it('should work', async () => { + const { exitCode, stderr } = await testBin(''); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--host localhost --port "', async () => { + const { exitCode, stderr } = await testBin([ + '--host', + 'localhost', + '--port', + port, + ]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it('should accept the promise function of webpack.config.js', (done) => { + testBin( + false, + path.resolve(__dirname, '../fixtures/promise-config/webpack.config.js') + ) + .then((output) => { + expect(output.exitCode).toEqual(0); + done(); + }) + .catch((err) => { + // for windows + expect(err.stdout).toContain('main.js'); + done(); + }); + }); + + it('should exit the process when SIGINT is detected', (done) => { + const cliPath = path.resolve( + __dirname, + '../../bin/webpack-dev-server.js' + ); + const examplePath = path.resolve( + __dirname, + '../../examples/cli/web-socket-url' + ); + const cp = execa('node', [cliPath], { cwd: examplePath }); + + cp.stdout.on('data', (data) => { + const bits = data.toString(); + + if (/main.js/.test(bits)) { + expect(cp.pid !== 0).toBe(true); + + cp.kill('SIGINT'); + } + }); + + cp.on('exit', () => { + done(); + }); + }); + + it('should exit the process when SIGINT is detected, even before the compilation is done', (done) => { + const cliPath = path.resolve( + __dirname, + '../../bin/webpack-dev-server.js' + ); + const cwd = path.resolve(__dirname, '../fixtures/cli'); + const cp = execa('node', [cliPath], { cwd }); + + let killed = false; + + cp.stdout.on('data', () => { + if (!killed) { + expect(cp.pid !== 0).toBe(true); + + cp.kill('SIGINT'); + } + + killed = true; + }); + + cp.on('exit', () => { + done(); + }); + }); + + it('should exit the process when stdin ends if --watch-options-stdin', (done) => { + const cliPath = path.resolve( + __dirname, + '../../bin/webpack-dev-server.js' + ); + const examplePath = path.resolve( + __dirname, + '../../examples/cli/web-socket-url' + ); + const cp = execa('node', [cliPath, '--watch-options-stdin'], { + cwd: examplePath, + }); + + cp.stdout.on('data', (data) => { + const bits = data.toString(); + + if (/main.js/.test(bits)) { + expect(cp.pid !== 0).toBe(true); + + cp.stdin.write('hello'); + cp.stdin.end('world'); + } + }); + + cp.on('exit', () => { + done(); + }); + }); + + it('should exit the process when stdin ends if --watch-options-stdin, even before the compilation is done', (done) => { + const cliPath = path.resolve( + __dirname, + '../../bin/webpack-dev-server.js' + ); + const cwd = path.resolve(__dirname, '../fixtures/cli'); + const cp = execa('node', [cliPath, '--watch-options-stdin'], { cwd }); + + let killed = false; + + cp.stdout.on('data', () => { + if (!killed) { + expect(cp.pid !== 0).toBe(true); + + cp.stdin.write('hello'); + cp.stdin.end('world'); + } + + killed = true; + }); + + cp.on('exit', () => { + done(); + }); + }); + + it('should add dev server entry points to a single entry point', async () => { + const { exitCode, stdout } = await testBin( + null, + './test/fixtures/dev-server/default-config.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('client/index.js?'); + }); + + webpack5Test( + 'should add dev server entry points to a multi entry point object', + async () => { + const { exitCode, stdout } = await testBin( + '--stats=verbose', + './test/fixtures/dev-server/multi-entry.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('client/index.js?'); + expect(stdout).toContain('foo.js'); + } + ); + + webpack5Test( + 'should add dev server entry points to an empty entry object', + async () => { + const { exitCode, stdout } = await testBin( + null, + './test/fixtures/dev-server/empty-entry.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('client/index.js?'); + } + ); + + webpack5Test('should supports entry as descriptor', async () => { + const { exitCode, stdout } = await testBin( + '--stats=detailed', + './test/fixtures/entry-as-descriptor/webpack.config' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('foo.js'); + }); + + it('should only prepends dev server entry points to "web" target', async () => { + const { exitCode, stdout } = await testBin( + '--target web', + './test/fixtures/dev-server/default-config.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('client/index.js?'); + expect(stdout).toContain('foo.js'); + }); + + it('should not prepend dev server entry points to "node" target', async () => { + const { exitCode, stdout } = await testBin( + '--target node', + './test/fixtures/dev-server/default-config.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).not.toContain('client/index.js?'); + expect(stdout).toContain('foo.js'); + }); + + it('should prepends the hot runtime to "node" target as well', async () => { + const { exitCode, stdout } = await testBin( + '--target node --hot', + './test/fixtures/dev-server/default-config.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('webpack/hot/dev-server'); + }); + + webpack5Test( + 'should prepend dev server entry points depending on targetProperties', + async () => { + const { exitCode, stdout } = await testBin( + null, + './test/fixtures/dev-server/target-config.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('client/index.js'); + } + ); + + it.skip('should use different random port when multiple instances are started on different processes', async () => { + const cliPath = path.resolve( + __dirname, + '../../bin/webpack-dev-server.js' + ); + const cwd = path.resolve(__dirname, '../fixtures/cli'); + + const cp = execa('node', [cliPath, '--colors=false'], { cwd }); + const cp2 = execa('node', [cliPath, '--colors=false'], { cwd }); + + const runtime = { + cp: { + port: null, + done: false, + }, + cp2: { + port: null, + done: false, + }, + }; + + cp.stderr.on('data', (data) => { + const bits = data.toString(); + const portMatch = + /Project is running at http:\/\/localhost:(\d*)\//.exec(bits); + + if (portMatch) { + runtime.cp.port = portMatch[1]; + } + + if (/Compiled successfully/.test(bits)) { + expect(cp.pid !== 0).toBe(true); + cp.kill('SIGINT'); + } + }); + + cp2.stderr.on('data', (data) => { + const bits = data.toString(); + const portMatch = + /Project is running at http:\/\/localhost:(\d*)\//.exec(bits); + + if (portMatch) { + runtime.cp2.port = portMatch[1]; + } + + if (/Compiled successfully/.test(bits)) { + expect(cp.pid !== 0).toBe(true); + cp2.kill('SIGINT'); + } + }); + + cp.on('exit', () => { + runtime.cp.done = true; + if (runtime.cp2.done) { + expect(runtime.cp.port !== runtime.cp2.port).toBe(true); + } + }); + + cp2.on('exit', () => { + runtime.cp2.done = true; + + if (runtime.cp.done) { + expect(runtime.cp.port !== runtime.cp2.port).toBe(true); + } + }); + }); + }); +}); diff --git a/test/cli/bonjour-option.test.js b/test/cli/bonjour-option.test.js new file mode 100644 index 0000000000..5c1ea50316 --- /dev/null +++ b/test/cli/bonjour-option.test.js @@ -0,0 +1,28 @@ +'use strict'; + +const { testBin, normalizeStderr } = require('../helpers/test-bin'); + +describe('"bonjour" CLI option', () => { + it('should work using "--bonjour"', async () => { + const { exitCode, stderr } = await testBin(['--bonjour']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot(); + }); + + it('should work using "--bonjour and --https"', async () => { + const { exitCode, stderr } = await testBin(['--bonjour', '--https']); + + expect(exitCode).toEqual(0); + expect( + normalizeStderr(stderr, { ipv6: true, https: true }) + ).toMatchSnapshot(); + }); + + it('should work using "--no-bonjour"', async () => { + const { exitCode, stderr } = await testBin(['--no-bonjour']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot(); + }); +}); diff --git a/test/cli/cli.test.js b/test/cli/cli.test.js deleted file mode 100644 index 43ea13ee14..0000000000 --- a/test/cli/cli.test.js +++ /dev/null @@ -1,1344 +0,0 @@ -'use strict'; - -const path = require('path'); -const webpack = require('webpack'); -const execa = require('execa'); -const internalIp = require('internal-ip'); -const stripAnsi = require('strip-ansi'); -const schema = require('../../lib/options.json'); -const cliOptions = require('../../bin/cli-flags'); -const { testBin, normalizeStderr } = require('../helpers/test-bin'); - -const isMacOS = process.platform === 'darwin'; -const localIPv4 = internalIp.v4.sync(); -const localIPv6 = internalIp.v6.sync(); - -const httpsCertificateDirectory = path.resolve( - __dirname, - '../fixtures/https-certificate' -); - -describe('CLI', () => { - describe('options', () => { - (webpack.version.startsWith('5') ? it : it.skip)( - 'should be same as in schema', - () => { - const cliOptionsFromWebpack = webpack.cli.getArguments(schema); - - const normalizedCliOptions = {}; - - for (const [name, options] of Object.entries(cliOptions)) { - // Only webpack-cli supports it - // TODO send PR to webpack - delete options.negatedDescription; - - normalizedCliOptions[name] = options; - } - - expect(normalizedCliOptions).toStrictEqual(cliOptionsFromWebpack); - } - ); - }); - - describe('help', () => { - (isMacOS ? it.skip : it)('should generate correct cli flags', (done) => { - testBin('--help') - .then((output) => { - expect(stripAnsi(output.stdout)).toMatchSnapshot(); - done(); - }) - .catch(done); - }); - }); - - describe('hot option', () => { - it('--hot', (done) => { - testBin('--hot --stats=detailed') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('webpack/hot/dev-server.js'); - - done(); - }) - .catch(done); - }); - - it('--no-hot', (done) => { - testBin('--no-hot') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).not.toContain('webpack/hot/dev-server.js'); - - done(); - }) - .catch(done); - }); - - it('--hot only', (done) => { - testBin('--hot only') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('/hot/only-dev-server'); - - done(); - }) - .catch(done); - }); - }); - - describe('allowedHosts option', () => { - it('--allowed-hosts auto', (done) => { - testBin(['--allowed-hosts', 'auto']) - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--allowed-hosts all', (done) => { - testBin(['--allowed-hosts', 'all']) - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--allowed-hosts string', (done) => { - testBin(['--allowed-hosts', 'testhost.com']) - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--allowed-hosts multiple', (done) => { - testBin([ - '--allowed-hosts', - 'testhost.com', - '--allowed-hosts', - 'testhost1.com', - ]) - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - }); - - describe('bonjour option', () => { - it('--bonjour', (done) => { - testBin('--bonjour') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - it('--bonjour and --https', (done) => { - testBin('--bonjour --https') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true, https: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - it('--no-bonjour', (done) => { - testBin('--no-bonjour') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - }); - - describe('client option', () => { - it('--client-transport sockjs', (done) => { - testBin('--client-transport sockjs') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-transport ws', (done) => { - testBin('--client-transport ws') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-overlay', (done) => { - testBin('--client-overlay') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-client-overlay', (done) => { - testBin('--no-client-overlay') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-overlay-errors', (done) => { - testBin('--client-overlay-errors') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-client-overlay-errors', (done) => { - testBin('--no-client-overlay-errors') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-overlay-warnings', (done) => { - testBin('--client-overlay-warnings') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-client-overlay-warnings', (done) => { - testBin('--no-client-overlay-warnings') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-need-client-entry', (done) => { - testBin('--client-need-client-entry --stats=detailed') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('client/index.js'); - - done(); - }) - .catch(done); - }); - - it('--no-client-need-client-entry', (done) => { - testBin('--no-client-need-client-entry --stats=detailed') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).not.toContain('client/index.js'); - - done(); - }) - .catch(done); - }); - - it('--client-logging', (done) => { - testBin('--client-logging verbose') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-progress', (done) => { - testBin('--client-progress') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-client-progress', (done) => { - testBin('--no-client-progress') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-hot-entry', (done) => { - testBin('--client-hot-entry --stats=detailed') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('webpack/hot/dev-server.js'); - - done(); - }) - .catch(done); - }); - - it('--no-client-hot-entry', (done) => { - testBin('--no-client-hot-entry --stats=detailed') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).not.toContain('webpack/hot/dev-server.js'); - - done(); - }) - .catch(done); - }); - - it('should not inject HMR entry "--client-hot-entry" and "--no-hot"', (done) => { - testBin('--client-hot-entry --no-hot --stats=detailed') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).not.toContain('webpack/hot/dev-server.js'); - - done(); - }) - .catch(done); - }); - - it('should not inject HMR entry with "--no-client-hot-entry" and "--hot"', (done) => { - testBin('--no-client-hot-entry --hot --stats=detailed') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).not.toContain('webpack/hot/dev-server.js'); - - done(); - }) - .catch(done); - }); - - it('--client-web-socket-url', (done) => { - testBin('--client-web-socket-url ws://myhost.com:8080/foo/test') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-web-socket-url-protocol', (done) => { - testBin('--client-web-socket-url-protocol ws:') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-web-socket-url-host', (done) => { - testBin('--client-web-socket-url-host 0.0.0.0') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-web-socket-url-path', (done) => { - testBin('--client-web-socket-url-path /ws') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--client-web-socket-url-port', (done) => { - testBin('--client-web-socket-url-port 8080') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - }); - - describe('webSocketServer option', () => { - it('--web-socket-server sockjs', (done) => { - testBin('--web-socket-server sockjs') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--web-socket-server ws', (done) => { - testBin('--web-socket-server ws') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - }); - - describe('http2 option', () => { - it('--http2', (done) => { - testBin('--http2') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true, https: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - it('--no-http2', (done) => { - testBin('--no-http2') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - }); - - describe('https option', () => { - it('--https', (done) => { - testBin('--https') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true, https: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - it('https options', (done) => { - const pfxFile = path.join(httpsCertificateDirectory, 'server.pfx'); - const key = path.join(httpsCertificateDirectory, 'server.key'); - const cert = path.join(httpsCertificateDirectory, 'server.crt'); - const cacert = path.join(httpsCertificateDirectory, 'ca.pem'); - const passphrase = 'webpack-dev-server'; - - testBin( - `--https-key ${key} --https-pfx ${pfxFile} --https-passphrase ${passphrase} --https-cert ${cert} --https-cacert ${cacert}` - ) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true, https: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - // For https://github.com/webpack/webpack-dev-server/issues/3306 - it('https and other related options', (done) => { - const pfxFile = path.join(httpsCertificateDirectory, 'server.pfx'); - const key = path.join(httpsCertificateDirectory, 'server.key'); - const cert = path.join(httpsCertificateDirectory, 'server.crt'); - const passphrase = 'webpack-dev-server'; - - testBin( - `--https-key ${key} --https-pfx ${pfxFile} --https-passphrase ${passphrase} --https-cert ${cert}` - ) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true, https: true }) - ).toMatchSnapshot(); - done(); - }) - .catch(done); - }); - - it('--https-request-cert', (done) => { - testBin('--https-request-cert') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true, https: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - it('--no-https-request-cert', (done) => { - testBin('--no-https-request-cert') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true, https: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - it('--no-https', (done) => { - testBin('--no-https') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - }); - - describe('historyApiFallback option', () => { - it('--history-api-fallback', (done) => { - testBin('--history-api-fallback --no-color') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - - it('--no-history-api-fallback', (done) => { - testBin('--no-history-api-fallback') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot(); - - done(); - }) - .catch(done); - }); - }); - - describe('host option', () => { - it('--host 0.0.0.0 (IPv4)', (done) => { - testBin('--host 0.0.0.0') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host :: (IPv6)', (done) => { - testBin('--host ::') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host ::1 (IPv6)', (done) => { - testBin('--host ::1') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host localhost', (done) => { - testBin('--host localhost') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host 127.0.0.1 (IPv4)', (done) => { - testBin('--host 127.0.0.1') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host 0:0:0:0:0:FFFF:7F00:0001 (IPv6)', (done) => { - testBin('--host 0:0:0:0:0:FFFF:7F00:0001') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it(`--host `, (done) => { - testBin(`--host ${localIPv4}`) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it.skip(`--host `, (done) => { - testBin(`--host ${localIPv6}`) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host ', (done) => { - testBin('--host local-ip') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host ', (done) => { - testBin('--host local-ipv4') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - }); - - describe('port option', () => { - it('--port is string', (done) => { - testBin(`--port "8080"`) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it(`--port is auto`, (done) => { - testBin(`--port auto`) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - }); - - describe('host and port options', () => { - it('--host and --port are unspecified', (done) => { - testBin('') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - - it('--host localhost --port 9999', (done) => { - testBin('--host localhost --port 9999') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(normalizeStderr(output.stderr)).toMatchSnapshot('stderr'); - - done(); - }) - .catch(done); - }); - }); - - describe('liveReload option', () => { - it('--live-reload', (done) => { - testBin('--live-reload') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-live-reload', (done) => { - testBin('--no-live-reload') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - }); - - describe('open option', () => { - it('--open', (done) => { - testBin('--open') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open /index.html', (done) => { - testBin('--open /index.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open /first.html second.html', (done) => { - testBin('--open /first.html second.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-open', (done) => { - testBin('--no-open') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-reset', (done) => { - testBin('--open-reset --open /third.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-reset --open-target', (done) => { - testBin('--open-reset --open-target') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-reset --open-target ', (done) => { - testBin('--open-reset --open-target /third.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-app google-chrome', (done) => { - testBin('--open-app google-chrome') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-app-name google-chrome', (done) => { - testBin('--open-app-name google-chrome') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-app-name-reset', (done) => { - testBin('--open-app-name-reset --open-app-name firefox') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target', (done) => { - testBin('--open-target') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-open-target', (done) => { - testBin('--no-open-target') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target index.html', (done) => { - testBin('--open-target index.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target-reset', (done) => { - testBin('--open-target-reset --open-target first.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target index.html', (done) => { - testBin('--open-target index.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target /first.html second.html', (done) => { - testBin('--open-target /first.html second.html') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target /index.html --open-app google-chrome', (done) => { - testBin('--open-target /index.html --open-app google-chrome') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target /index.html --open-app-name google-chrome', (done) => { - testBin('--open-target /index.html --open-app-name google-chrome') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target /index.html --open-app google-chrome', (done) => { - testBin('--open-target /index.html --open-app google-chrome') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--open-target /index.html --open-app google-chrome --open-app-name google-chrome', (done) => { - testBin( - '--open-target /index.html --open-app google-chrome --open-app-name google-chrome' - ) - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - }); - - describe('compress option', () => { - it('--compress', (done) => { - testBin('--compress') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - - it('--no-compress', (done) => { - testBin('--compress') - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch(done); - }); - }); - - describe('static option', () => { - it('--static', (done) => { - testBin('--static') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static ', (done) => { - testBin('--static new-static') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static --static ', (done) => { - testBin('--static new-static --static other-static') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-reset', (done) => { - testBin('--static-reset --static new-static-after-reset') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-reset --static-directory ', (done) => { - testBin('--static-reset --static-directory new-static-directory') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-directory', (done) => { - testBin('--static-directory static-dir') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-directory', (done) => { - testBin('--static-directory static-dir') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-public-path', (done) => { - testBin('--static-public-path /public') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-public-path-reset', (done) => { - testBin('--static-public-path-reset --static-public-path /new-public') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-serve-index', (done) => { - testBin('--static-serve-index') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--no-static-serve-index', (done) => { - testBin('--no-static-serve-index') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--static-watch', (done) => { - testBin('--static-watch') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--no-static-watch', (done) => { - testBin('--no-static-watch') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - }); - - describe('watchFiles option', () => { - it('--watch-files ', (done) => { - const watchDirectory = path.resolve( - __dirname, - '../fixtures/static/static' - ); - - testBin(`--watch-files ${watchDirectory}`) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--watch-files --watch-files ', (done) => { - const watchDirectory = path.resolve( - __dirname, - '../fixtures/static/static' - ); - const watchOtherDirectory = path.resolve( - __dirname, - '../fixtures/static/simple-config' - ); - - testBin( - `--watch-files ${watchDirectory} --watch-files ${watchOtherDirectory}` - ) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - - it('--watch-files-reset', (done) => { - const watchDirectory = path.resolve( - __dirname, - '../fixtures/static/static' - ); - - testBin(`--watch-files-reset --watch-files ${watchDirectory}`) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect( - normalizeStderr(output.stderr, { ipv6: true }) - ).toMatchSnapshot('stderr'); - done(); - }) - .catch(done); - }); - }); - - it('should accept the promise function of webpack.config.js', (done) => { - testBin( - false, - path.resolve(__dirname, '../fixtures/promise-config/webpack.config.js') - ) - .then((output) => { - expect(output.exitCode).toEqual(0); - done(); - }) - .catch((err) => { - // for windows - expect(err.stdout).toContain('main.js'); - done(); - }); - }); - - it('should exit the process when SIGINT is detected', (done) => { - const cliPath = path.resolve(__dirname, '../../bin/webpack-dev-server.js'); - const examplePath = path.resolve( - __dirname, - '../../examples/cli/web-socket-url' - ); - const cp = execa('node', [cliPath], { cwd: examplePath }); - - cp.stdout.on('data', (data) => { - const bits = data.toString(); - - if (/main.js/.test(bits)) { - expect(cp.pid !== 0).toBe(true); - - cp.kill('SIGINT'); - } - }); - - cp.on('exit', () => { - done(); - }); - }); - - it('should exit the process when SIGINT is detected, even before the compilation is done', (done) => { - const cliPath = path.resolve(__dirname, '../../bin/webpack-dev-server.js'); - const cwd = path.resolve(__dirname, '../fixtures/cli'); - const cp = execa('node', [cliPath], { cwd }); - - let killed = false; - - cp.stdout.on('data', () => { - if (!killed) { - expect(cp.pid !== 0).toBe(true); - - cp.kill('SIGINT'); - } - - killed = true; - }); - - cp.on('exit', () => { - done(); - }); - }); - - it('should exit the process when stdin ends if --watch-options-stdin', (done) => { - const cliPath = path.resolve(__dirname, '../../bin/webpack-dev-server.js'); - const examplePath = path.resolve( - __dirname, - '../../examples/cli/web-socket-url' - ); - const cp = execa('node', [cliPath, '--watch-options-stdin'], { - cwd: examplePath, - }); - - cp.stdout.on('data', (data) => { - const bits = data.toString(); - - if (/main.js/.test(bits)) { - expect(cp.pid !== 0).toBe(true); - - cp.stdin.write('hello'); - cp.stdin.end('world'); - } - }); - - cp.on('exit', () => { - done(); - }); - }); - - it('should exit the process when stdin ends if --watch-options-stdin, even before the compilation is done', (done) => { - const cliPath = path.resolve(__dirname, '../../bin/webpack-dev-server.js'); - const cwd = path.resolve(__dirname, '../fixtures/cli'); - const cp = execa('node', [cliPath, '--watch-options-stdin'], { cwd }); - - let killed = false; - - cp.stdout.on('data', () => { - if (!killed) { - expect(cp.pid !== 0).toBe(true); - - cp.stdin.write('hello'); - cp.stdin.end('world'); - } - - killed = true; - }); - - cp.on('exit', () => { - done(); - }); - }); - - it.skip('should use different random port when multiple instances are started on different processes', (done) => { - const cliPath = path.resolve(__dirname, '../../bin/webpack-dev-server.js'); - const cwd = path.resolve(__dirname, '../fixtures/cli'); - - const cp = execa('node', [cliPath, '--colors=false'], { cwd }); - const cp2 = execa('node', [cliPath, '--colors=false'], { cwd }); - - const runtime = { - cp: { - port: null, - done: false, - }, - cp2: { - port: null, - done: false, - }, - }; - - cp.stderr.on('data', (data) => { - const bits = data.toString(); - const portMatch = /Project is running at http:\/\/localhost:(\d*)\//.exec( - bits - ); - - if (portMatch) { - runtime.cp.port = portMatch[1]; - } - - if (/Compiled successfully/.test(bits)) { - expect(cp.pid !== 0).toBe(true); - cp.kill('SIGINT'); - } - }); - - cp2.stderr.on('data', (data) => { - const bits = data.toString(); - const portMatch = /Project is running at http:\/\/localhost:(\d*)\//.exec( - bits - ); - - if (portMatch) { - runtime.cp2.port = portMatch[1]; - } - - if (/Compiled successfully/.test(bits)) { - expect(cp.pid !== 0).toBe(true); - cp2.kill('SIGINT'); - } - }); - - cp.on('exit', () => { - runtime.cp.done = true; - if (runtime.cp2.done) { - expect(runtime.cp.port !== runtime.cp2.port).toBe(true); - done(); - } - }); - - cp2.on('exit', () => { - runtime.cp2.done = true; - - if (runtime.cp.done) { - expect(runtime.cp.port !== runtime.cp2.port).toBe(true); - done(); - } - }); - }); -}); diff --git a/test/cli/client-option.test.js b/test/cli/client-option.test.js new file mode 100644 index 0000000000..d7d9f13b64 --- /dev/null +++ b/test/cli/client-option.test.js @@ -0,0 +1,192 @@ +'use strict'; + +const { testBin } = require('../helpers/test-bin'); + +describe('"client" CLI option', () => { + it('should work using "--client-transport sockjs"', async () => { + const { exitCode } = await testBin(['--client-transport', 'sockjs']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-transport ws"', async () => { + const { exitCode } = await testBin(['--client-transport', 'ws']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-overlay"', async () => { + const { exitCode } = await testBin(['--client-overlay']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-client-overlay"', async () => { + const { exitCode } = await testBin(['--no-client-overlay']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-overlay-errors"', async () => { + const { exitCode } = await testBin(['--client-overlay-errors']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-client-overlay-errors"', async () => { + const { exitCode } = await testBin(['--no-client-overlay-errors']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-overlay-warnings"', async () => { + const { exitCode } = await testBin(['--client-overlay-warnings']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-client-overlay-warnings"', async () => { + const { exitCode } = await testBin(['--no-client-overlay-warnings']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-need-client-entry"', async () => { + const { exitCode, stdout } = await testBin([ + '--client-need-client-entry', + '--stats=detailed', + ]); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('client/index.js'); + }); + + it('should work using "--no-client-need-client-entry"', async () => { + const { exitCode, stdout } = await testBin([ + '--no-client-need-client-entry', + '--stats=detailed', + ]); + + expect(exitCode).toEqual(0); + expect(stdout).not.toContain('client/index.js'); + }); + + it('should work using "--client-logging"', async () => { + const { exitCode } = await testBin(['--client-logging', 'verbose']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-progress"', async () => { + const { exitCode } = await testBin(['--client-progress']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-client-progress"', async () => { + const { exitCode } = await testBin(['--no-client-progress']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-hot-entry"', async () => { + const { exitCode, stdout } = await testBin([ + '--client-hot-entry', + '--stats=detailed', + ]); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('webpack/hot/dev-server.js'); + }); + + it('should work using "--no-client-hot-entry"', async () => { + const { exitCode, stdout } = await testBin([ + '--no-client-hot-entry', + '--stats=detailed', + ]); + + expect(exitCode).toEqual(0); + expect(stdout).not.toContain('webpack/hot/dev-server.js'); + }); + + it('should not inject HMR entry using "--client-hot-entry --no-hot"', async () => { + const { exitCode, stdout } = await testBin([ + '--client-hot-entry', + '--no-hot', + '--stats=detailed', + ]); + + expect(exitCode).toEqual(0); + expect(stdout).not.toContain('webpack/hot/dev-server.js'); + }); + + it('should not inject HMR entry using "--no-client-hot-entry --hot"', async () => { + const { exitCode, stdout } = await testBin([ + '--no-client-hot-entry', + '--hot', + '--stats=detailed', + ]); + + expect(exitCode).toEqual(0); + expect(stdout).not.toContain('webpack/hot/dev-server.js'); + }); + + it('should work using "--client-web-socket-url"', async () => { + const { exitCode } = await testBin([ + '--client-web-socket-url', + 'ws://myhost.com:8080/foo/test', + ]); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-web-socket-url-protocol"', async () => { + const { exitCode } = await testBin([ + '--client-web-socket-url-protocol', + 'ws:', + ]); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-web-socket-url-host"', async () => { + const { exitCode } = await testBin([ + '--client-web-socket-url-host', + '0.0.0.0', + ]); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-web-socket-url-path"', async () => { + const { exitCode } = await testBin(['--client-web-socket-url-path', '/ws']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--client-web-socket-url-port"', async () => { + const { exitCode } = await testBin(['--client-web-socket-url-port', 8080]); + + expect(exitCode).toEqual(0); + }); + + it('should add "/ws" web socket path by default', async () => { + const { exitCode, stdout } = await testBin( + null, + './test/fixtures/dev-server/client-default-path-config.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('ws%3A%2F%2F0.0.0.0%2Fws'); + }); + + it('should use "client.webSocketURL.path" from configuration', async () => { + const { exitCode, stdout } = await testBin( + null, + './test/fixtures/dev-server/client-custom-path-config.js' + ); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('ws%3A%2F%2F0.0.0.0%2Fcustom%2Fpath'); + }); +}); diff --git a/test/cli/compress-option.test.js b/test/cli/compress-option.test.js new file mode 100644 index 0000000000..d0fecfb621 --- /dev/null +++ b/test/cli/compress-option.test.js @@ -0,0 +1,17 @@ +'use strict'; + +const { testBin } = require('../helpers/test-bin'); + +describe('"compress" CLI option', () => { + it('should work using "--compress"', async () => { + const { exitCode } = await testBin('--compress'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-compress"', async () => { + const { exitCode } = await testBin('--no-compress'); + + expect(exitCode).toEqual(0); + }); +}); diff --git a/test/cli/historyApiFallback-option.test.js b/test/cli/historyApiFallback-option.test.js new file mode 100644 index 0000000000..18b1108ded --- /dev/null +++ b/test/cli/historyApiFallback-option.test.js @@ -0,0 +1,19 @@ +'use strict'; + +const { testBin, normalizeStderr } = require('../helpers/test-bin'); + +describe('"historyApiFallback" CLI option', () => { + it('should work using "--history-api-fallback"', async () => { + const { exitCode, stderr } = await testBin(['--history-api-fallback']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot(); + }); + + it('should work using "--no-history-api-fallback"', async () => { + const { exitCode, stderr } = await testBin(['--no-history-api-fallback']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot(); + }); +}); diff --git a/test/cli/host-option.test.js b/test/cli/host-option.test.js new file mode 100644 index 0000000000..7071128dc5 --- /dev/null +++ b/test/cli/host-option.test.js @@ -0,0 +1,82 @@ +'use strict'; + +const internalIp = require('internal-ip'); +const { testBin, normalizeStderr } = require('../helpers/test-bin'); + +const localIPv4 = internalIp.v4.sync(); +const localIPv6 = internalIp.v6.sync(); + +describe('"host" CLI option', () => { + it('should work using "--host 0.0.0.0" (IPv4)', async () => { + const { exitCode, stderr } = await testBin(['--host', '0.0.0.0']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--host ::" (IPv6)', async () => { + const { exitCode, stderr } = await testBin(['--host', '::']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--host ::1" (IPv6)', async () => { + const { exitCode, stderr } = await testBin(['--host', '::1']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it('should work using "--host localhost"', async () => { + const { exitCode, stderr } = await testBin(['--host', 'localhost']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it('should work using "--host 127.0.0.1" (IPv4)', async () => { + const { exitCode, stderr } = await testBin(['--host', '127.0.0.1']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it('should work using "--host 0:0:0:0:0:FFFF:7F00:0001" (IPv6)', async () => { + const { exitCode, stderr } = await testBin([ + '--host', + '0:0:0:0:0:FFFF:7F00:0001', + ]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it(`should work using "--host "`, async () => { + const { exitCode, stderr } = await testBin(['--host', localIPv4]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it.skip(`should work using "--host "`, async () => { + const { exitCode, stderr } = await testBin(['--host', localIPv6]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it('should work using "--host local-ip"', async () => { + const { exitCode, stderr } = await testBin(['--host', 'local-ip']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); + + it('should work using "--host local-ipv4"', async () => { + const { exitCode, stderr } = await testBin(['--host', 'local-ipv4']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr)).toMatchSnapshot('stderr'); + }); +}); diff --git a/test/cli/hot-option.test.js b/test/cli/hot-option.test.js new file mode 100644 index 0000000000..9ad498c197 --- /dev/null +++ b/test/cli/hot-option.test.js @@ -0,0 +1,29 @@ +'use strict'; + +const { testBin } = require('../helpers/test-bin'); + +describe('"hot" CLI option', () => { + it('should work using "--hot"', async () => { + const { exitCode, stdout } = await testBin(['--hot', '--stats=detailed']); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('webpack/hot/dev-server.js'); + }); + + it('should work using "--no-hot"', async () => { + const { exitCode, stdout } = await testBin([ + '--no-hot', + '--stats=detailed', + ]); + + expect(exitCode).toEqual(0); + expect(stdout).not.toContain('webpack/hot/dev-server.js'); + }); + + it('should work using "--hot only"', async () => { + const { exitCode, stdout } = await testBin(['--hot', 'only']); + + expect(exitCode).toEqual(0); + expect(stdout).toContain('/hot/only-dev-server.js'); + }); +}); diff --git a/test/cli/http2-option.test.js b/test/cli/http2-option.test.js new file mode 100644 index 0000000000..4738cdee3a --- /dev/null +++ b/test/cli/http2-option.test.js @@ -0,0 +1,21 @@ +'use strict'; + +const { testBin, normalizeStderr } = require('../helpers/test-bin'); + +describe('"http2" CLI option', () => { + it('should work using "--http2"', async () => { + const { exitCode, stderr } = await testBin(['--http2']); + + expect(exitCode).toEqual(0); + expect( + normalizeStderr(stderr, { ipv6: true, https: true }) + ).toMatchSnapshot(); + }); + + it('should work using "--no-http2"', async () => { + const { exitCode, stderr } = await testBin(['--no-http2']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot(); + }); +}); diff --git a/test/cli/https-option.test.js b/test/cli/https-option.test.js new file mode 100644 index 0000000000..40f43b8e7b --- /dev/null +++ b/test/cli/https-option.test.js @@ -0,0 +1,79 @@ +'use strict'; + +const path = require('path'); +const { testBin, normalizeStderr } = require('../helpers/test-bin'); + +const httpsCertificateDirectory = path.resolve( + __dirname, + '../fixtures/https-certificate' +); + +describe('"https" CLI option', () => { + it('should work using "--https"', async () => { + const { exitCode, stderr } = await testBin(['--https']); + + expect(exitCode).toEqual(0); + expect( + normalizeStderr(stderr, { ipv6: true, https: true }) + ).toMatchSnapshot(); + }); + + it('should work using "--https-key --https-pfx --https-passphrase webpack-dev-server --https-cert --https-cacert "', async () => { + const pfxFile = path.join(httpsCertificateDirectory, 'server.pfx'); + const key = path.join(httpsCertificateDirectory, 'server.key'); + const cert = path.join(httpsCertificateDirectory, 'server.crt'); + const cacert = path.join(httpsCertificateDirectory, 'ca.pem'); + const passphrase = 'webpack-dev-server'; + + const { exitCode, stderr } = await testBin( + `--https-key ${key} --https-pfx ${pfxFile} --https-passphrase ${passphrase} --https-cert ${cert} --https-cacert ${cacert}` + ); + + expect(exitCode).toEqual(0); + expect( + normalizeStderr(stderr, { ipv6: true, https: true }) + ).toMatchSnapshot(); + }); + + // For https://github.com/webpack/webpack-dev-server/issues/3306 + it('should work using "--https-key --https-pfx --https-passphrase webpack-dev-server --https-cert "', async () => { + const pfxFile = path.join(httpsCertificateDirectory, 'server.pfx'); + const key = path.join(httpsCertificateDirectory, 'server.key'); + const cert = path.join(httpsCertificateDirectory, 'server.crt'); + const passphrase = 'webpack-dev-server'; + + const { exitCode, stderr } = await testBin( + `--https-key ${key} --https-pfx ${pfxFile} --https-passphrase ${passphrase} --https-cert ${cert}` + ); + + expect(exitCode).toEqual(0); + expect( + normalizeStderr(stderr, { ipv6: true, https: true }) + ).toMatchSnapshot(); + }); + + it('should work using "--https-request-cert"', async () => { + const { exitCode, stderr } = await testBin(['--https-request-cert']); + + expect(exitCode).toEqual(0); + expect( + normalizeStderr(stderr, { ipv6: true, https: true }) + ).toMatchSnapshot(); + }); + + it('should work using "--no-https-request-cert"', async () => { + const { exitCode, stderr } = await testBin(['--no-https-request-cert']); + + expect(exitCode).toEqual(0); + expect( + normalizeStderr(stderr, { ipv6: true, https: true }) + ).toMatchSnapshot(); + }); + + it('should work using "--no-https"', async () => { + const { exitCode, stderr } = await testBin(['--no-https']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot(); + }); +}); diff --git a/test/cli/liveReload-option.test.js b/test/cli/liveReload-option.test.js new file mode 100644 index 0000000000..8d9980f92c --- /dev/null +++ b/test/cli/liveReload-option.test.js @@ -0,0 +1,17 @@ +'use strict'; + +const { testBin } = require('../helpers/test-bin'); + +describe('"liveReload" CLI option', () => { + it('should work using "--live-reload"', async () => { + const { exitCode } = await testBin(['--live-reload']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-live-reload"', async () => { + const { exitCode } = await testBin(['--no-live-reload']); + + expect(exitCode).toEqual(0); + }); +}); diff --git a/test/cli/open-option.test.js b/test/cli/open-option.test.js new file mode 100644 index 0000000000..3152741189 --- /dev/null +++ b/test/cli/open-option.test.js @@ -0,0 +1,125 @@ +'use strict'; + +const { testBin } = require('../helpers/test-bin'); + +describe('"open" CLI option', () => { + it('should work using "--open"', async () => { + const { exitCode } = await testBin(['--open']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open /index.html"', async () => { + const { exitCode } = await testBin('--open /index.html'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open /first.html second.html"', async () => { + const { exitCode } = await testBin('--open /first.html second.html'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-open"', async () => { + const { exitCode } = await testBin('--no-open'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-reset"', async () => { + const { exitCode } = await testBin('--open-reset --open /third.html'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-reset --open-target"', async () => { + const { exitCode } = await testBin('--open-reset --open-target'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-reset --open-target /third.html"', async () => { + const { exitCode } = await testBin( + '--open-reset --open-target /third.html' + ); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-app google-chrome"', async () => { + const { exitCode } = await testBin('--open-app google-chrome'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-app-name google-chrome"', async () => { + const { exitCode } = await testBin('--open-app-name google-chrome'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-app-name-reset --open-app-name firefox"', async () => { + const { exitCode } = await testBin( + '-open-app-name-reset --open-app-name firefox' + ); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-target"', async () => { + const { exitCode } = await testBin('-open-target'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--no-open-target"', async () => { + const { exitCode } = await testBin('--no-open-target'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-target index.html"', async () => { + const { exitCode } = await testBin('--open-target index.html'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-target-reset"', async () => { + const { exitCode } = await testBin( + '--open-target-reset --open-target first.html' + ); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-target /first.html second.html"', async () => { + const { exitCode } = await testBin('--open-target /first.html second.html'); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-target /index.html --open-app google-chrome"', async () => { + const { exitCode } = await testBin( + '--open-target /index.html --open-app google-chrome' + ); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-target /index.html --open-app-name google-chrome"', async () => { + const { exitCode } = await testBin( + '--open-target /index.html --open-app-name google-chrome' + ); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--open-target /index.html --open-app google-chrome --open-app-name google-chrome"', async () => { + const { exitCode } = await testBin( + '--open-target /index.html --open-app google-chrome --open-app-name google-chrome' + ); + + expect(exitCode).toEqual(0); + }); +}); diff --git a/test/cli/port-option.test.js b/test/cli/port-option.test.js new file mode 100644 index 0000000000..f2eb4136af --- /dev/null +++ b/test/cli/port-option.test.js @@ -0,0 +1,20 @@ +'use strict'; + +const { testBin, normalizeStderr } = require('../helpers/test-bin'); +const port = require('../ports-map')['cli-port-option']; + +describe('"port" CLI option', () => { + it('should work using "--port "', async () => { + const { exitCode, stderr } = await testBin(['--port', port]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it(`should work using "--port auto"`, async () => { + const { exitCode, stderr } = await testBin(['--port', 'auto']); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); +}); diff --git a/test/cli/static-option.test.js b/test/cli/static-option.test.js new file mode 100644 index 0000000000..84d4bd7be3 --- /dev/null +++ b/test/cli/static-option.test.js @@ -0,0 +1,97 @@ +'use strict'; + +const { testBin, normalizeStderr } = require('../helpers/test-bin'); + +describe('"static" CLI option', () => { + it('should work using "--static"', async () => { + const { exitCode, stderr } = await testBin('--static'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static new-static"', async () => { + const { exitCode, stderr } = await testBin('--static new-static'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static new-static --static other-static"', async () => { + const { exitCode, stderr } = await testBin( + '--static new-static --static other-static' + ); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static-reset"', async () => { + const { exitCode, stderr } = await testBin( + '--static-reset --static new-static-after-reset' + ); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static-reset --static-directory new-static-directory"', async () => { + const { exitCode, stderr } = await testBin( + '--static-reset --static-directory new-static-directory' + ); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static-directory static-dir"', async () => { + const { exitCode, stderr } = await testBin('--static-directory static-dir'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static-public-path /public"', async () => { + const { exitCode, stderr } = await testBin('--static-public-path /public'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static-public-path-reset"', async () => { + const { exitCode, stderr } = await testBin( + '--static-public-path-reset --static-public-path /new-public' + ); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static-serve-index"', async () => { + const { exitCode, stderr } = await testBin('--static-serve-index'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--no-static-serve-index"', async () => { + const { exitCode, stderr } = await testBin('--no-static-serve-index'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--static-watch"', async () => { + const { exitCode, stderr } = await testBin('--static-watch'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--no-static-watch"', async () => { + const { exitCode, stderr } = await testBin('--no-static-watch'); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); +}); diff --git a/test/cli/watchFiles-option.test.js b/test/cli/watchFiles-option.test.js new file mode 100644 index 0000000000..3d76b6d3ef --- /dev/null +++ b/test/cli/watchFiles-option.test.js @@ -0,0 +1,49 @@ +'use strict'; + +const path = require('path'); +const { testBin, normalizeStderr } = require('../helpers/test-bin'); + +describe('"watchFiles" CLI option', () => { + it('should work using "--watch-files "', async () => { + const watchDirectory = path.resolve(__dirname, '../fixtures/static/static'); + + const { exitCode, stderr } = await testBin([ + '--watch-files', + watchDirectory, + ]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--watch-files --watch-files "', async () => { + const watchDirectory = path.resolve(__dirname, '../fixtures/static/static'); + const watchOtherDirectory = path.resolve( + __dirname, + '../fixtures/static/simple-config' + ); + + const { exitCode, stderr } = await testBin([ + '--watch-files', + watchDirectory, + '--watch-files', + watchOtherDirectory, + ]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); + + it('should work using "--watch-files-reset --watch-files "', async () => { + const watchDirectory = path.resolve(__dirname, '../fixtures/static/static'); + + const { exitCode, stderr } = await testBin([ + '--watch-files-reset', + '--watch-files', + watchDirectory, + ]); + + expect(exitCode).toEqual(0); + expect(normalizeStderr(stderr, { ipv6: true })).toMatchSnapshot('stderr'); + }); +}); diff --git a/test/cli/webSocketServer-option.test.js b/test/cli/webSocketServer-option.test.js new file mode 100644 index 0000000000..cdba401893 --- /dev/null +++ b/test/cli/webSocketServer-option.test.js @@ -0,0 +1,17 @@ +'use strict'; + +const { testBin } = require('../helpers/test-bin'); + +describe('"webSocketServer" CLI option', () => { + it('should work using "--web-socket-server sockjs"', async () => { + const { exitCode } = await testBin(['--web-socket-server', 'sockjs']); + + expect(exitCode).toEqual(0); + }); + + it('should work using "--web-socket-server ws"', async () => { + const { exitCode } = await testBin(['--web-socket-server', 'ws']); + + expect(exitCode).toEqual(0); + }); +}); diff --git a/test/client/__snapshots__/index.test.js.snap.webpack4 b/test/client/__snapshots__/index.test.js.snap.webpack4 index 8c2e9e9f25..503aad3211 100644 --- a/test/client/__snapshots__/index.test.js.snap.webpack4 +++ b/test/client/__snapshots__/index.test.js.snap.webpack4 @@ -14,30 +14,8 @@ exports[`index should run onSocketMessage.close 2`] = `"Close"`; exports[`index should run onSocketMessage.error 1`] = `"error!!"`; -exports[`index should run onSocketMessage.errors 1`] = `"Errors while compiling. Reload prevented."`; - -exports[`index should run onSocketMessage.errors 2`] = `"Errors"`; - -exports[`index should run onSocketMessage.errors 3`] = ` -Array [ - Array [ - "error1", - ], - Array [ - "error2", - ], - Array [ - "error3", - ], -] -`; - exports[`index should run onSocketMessage.hot 1`] = `"Hot Module Replacement enabled."`; -exports[`index should run onSocketMessage.invalid 1`] = `"App updated. Recompiling..."`; - -exports[`index should run onSocketMessage.invalid 2`] = `"Invalid"`; - exports[`index should run onSocketMessage.liveReload 1`] = `"Live Reloading enabled."`; exports[`index should run onSocketMessage.ok 1`] = `"Ok"`; diff --git a/test/client/__snapshots__/index.test.js.snap.webpack5 b/test/client/__snapshots__/index.test.js.snap.webpack5 index 8c2e9e9f25..503aad3211 100644 --- a/test/client/__snapshots__/index.test.js.snap.webpack5 +++ b/test/client/__snapshots__/index.test.js.snap.webpack5 @@ -14,30 +14,8 @@ exports[`index should run onSocketMessage.close 2`] = `"Close"`; exports[`index should run onSocketMessage.error 1`] = `"error!!"`; -exports[`index should run onSocketMessage.errors 1`] = `"Errors while compiling. Reload prevented."`; - -exports[`index should run onSocketMessage.errors 2`] = `"Errors"`; - -exports[`index should run onSocketMessage.errors 3`] = ` -Array [ - Array [ - "error1", - ], - Array [ - "error2", - ], - Array [ - "error3", - ], -] -`; - exports[`index should run onSocketMessage.hot 1`] = `"Hot Module Replacement enabled."`; -exports[`index should run onSocketMessage.invalid 1`] = `"App updated. Recompiling..."`; - -exports[`index should run onSocketMessage.invalid 2`] = `"Invalid"`; - exports[`index should run onSocketMessage.liveReload 1`] = `"Live Reloading enabled."`; exports[`index should run onSocketMessage.ok 1`] = `"Ok"`; diff --git a/test/client/__snapshots__/overlay.test.js.snap.webpack4 b/test/client/__snapshots__/overlay.test.js.snap.webpack4 deleted file mode 100644 index 3262ac5631..0000000000 --- a/test/client/__snapshots__/overlay.test.js.snap.webpack4 +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`overlay should run clear 1`] = `"
Failed to compile.

test!
"`; - -exports[`overlay should run clear 2`] = `""`; - -exports[`overlay should run showMessage 1`] = `""`; - -exports[`overlay should run showMessage 2`] = `"
Failed to compile.

test!
"`; diff --git a/test/client/__snapshots__/overlay.test.js.snap.webpack5 b/test/client/__snapshots__/overlay.test.js.snap.webpack5 deleted file mode 100644 index 3262ac5631..0000000000 --- a/test/client/__snapshots__/overlay.test.js.snap.webpack5 +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`overlay should run clear 1`] = `"
Failed to compile.

test!
"`; - -exports[`overlay should run clear 2`] = `""`; - -exports[`overlay should run showMessage 1`] = `""`; - -exports[`overlay should run showMessage 2`] = `"
Failed to compile.

test!
"`; diff --git a/test/client/clients/SockJSClient.test.js b/test/client/clients/SockJSClient.test.js index 3a9a924f6e..5bd2988011 100644 --- a/test/client/clients/SockJSClient.test.js +++ b/test/client/clients/SockJSClient.test.js @@ -1,9 +1,13 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; const http = require('http'); const express = require('express'); const sockjs = require('sockjs'); -const port = require('../../ports-map').sockJSClient; +const port = require('../../ports-map')['sockjs-client']; jest.setMock('../../../client-src/utils/log', { log: { diff --git a/test/client/clients/WebsocketClient.test.js b/test/client/clients/WebsocketClient.test.js index 3d8dc7772c..17f377afe7 100644 --- a/test/client/clients/WebsocketClient.test.js +++ b/test/client/clients/WebsocketClient.test.js @@ -1,9 +1,13 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; const http = require('http'); const express = require('express'); const ws = require('ws'); -const port = require('../../ports-map').WebsocketClient; +const port = require('../../ports-map')['web-socket-client']; jest.setMock('../../../client-src/utils/log', { log: { diff --git a/test/client/index.test.js b/test/client/index.test.js index 1f8db5cdc4..0f576d9d4c 100644 --- a/test/client/index.test.js +++ b/test/client/index.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; describe('index', () => { @@ -30,8 +34,8 @@ describe('index', () => { // overlay jest.setMock('../../client-src/overlay.js', { - clear: jest.fn(), - showMessage: jest.fn(), + hide: jest.fn(), + show: jest.fn(), }); overlay = require('../../client-src/overlay'); @@ -87,28 +91,16 @@ describe('index', () => { expect(log.log.info.mock.calls[0][0]).toMatchSnapshot(); }); - test('should run onSocketMessage.invalid', () => { - onSocketMessage.invalid(); - expect(log.log.info.mock.calls[0][0]).toMatchSnapshot(); - expect(sendMessage.mock.calls[0][0]).toMatchSnapshot(); - expect(overlay.clear).not.toBeCalled(); - - // change flags - onSocketMessage.overlay(true); - onSocketMessage.invalid(); - expect(overlay.clear).toBeCalled(); - }); - test("should run onSocketMessage['still-ok']", () => { onSocketMessage['still-ok'](); expect(log.log.info.mock.calls[0][0]).toMatchSnapshot(); expect(sendMessage.mock.calls[0][0]).toMatchSnapshot(); - expect(overlay.clear).not.toBeCalled(); + expect(overlay.hide).not.toBeCalled(); // change flags onSocketMessage.overlay(true); onSocketMessage['still-ok'](); - expect(overlay.clear).toBeCalled(); + expect(overlay.hide).toBeCalled(); }); test("should run onSocketMessage.progress and onSocketMessage['progress-update']", () => { @@ -147,17 +139,6 @@ describe('index', () => { expect(log.log.info.mock.calls[0][0]).toMatchSnapshot(); }); - test('should run onSocketMessage.overlay with an argument is Object', () => { - onSocketMessage.overlay({ - warnings: true, - errors: true, - }); - - // check if flags have changed - onSocketMessage.invalid(); - expect(overlay.clear).toBeCalled(); - }); - test('should run onSocketMessage.ok', () => { { const res = onSocketMessage.ok(); @@ -229,26 +210,11 @@ describe('index', () => { // eslint-disable-next-line no-undefined expect(res).toEqual(undefined); - expect(overlay.showMessage).toBeCalled(); + expect(overlay.show).toBeCalled(); expect(reloadApp).toBeCalled(); } }); - test('should run onSocketMessage.errors', () => { - onSocketMessage.errors(['error1', '\u001B[4error2\u001B[0m', 'error3']); - - expect(log.log.error.mock.calls[0][0]).toMatchSnapshot(); - expect(sendMessage.mock.calls[0][0]).toMatchSnapshot(); - expect(log.log.error.mock.calls.splice(1)).toMatchSnapshot(); - - // change flags - onSocketMessage.overlay({ - errors: true, - }); - onSocketMessage.errors([]); - expect(overlay.showMessage).toBeCalled(); - }); - test('should run onSocketMessage.error', () => { onSocketMessage.error('error!!'); expect(log.log.error.mock.calls[0][0]).toMatchSnapshot(); diff --git a/test/client/overlay.test.js b/test/client/overlay.test.js deleted file mode 100644 index aabd53f701..0000000000 --- a/test/client/overlay.test.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -const overlay = require('../../client-src/overlay'); - -describe('overlay', () => { - it('should run showMessage', async () => { - expect(document.body.innerHTML).toMatchSnapshot(); - - overlay.showMessage(['test!']); - - await new Promise((r) => setTimeout(() => r())); - - expect( - document.getElementsByTagName('iframe')[0].contentDocument.body.innerHTML - ).toMatchSnapshot(); - }); - - it('should run clear', async () => { - overlay.showMessage(['test!']); - - expect( - document.getElementsByTagName('iframe')[0].contentDocument.body.innerHTML - ).toMatchSnapshot(); - - overlay.clear(); - - await new Promise((r) => setTimeout(() => r())); - - expect(document.body.innerHTML).toMatchSnapshot(); - }); -}); diff --git a/test/client/socket-helper.test.js b/test/client/socket-helper.test.js index d4f303cce6..41e0084a4d 100644 --- a/test/client/socket-helper.test.js +++ b/test/client/socket-helper.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; describe('socket', () => { @@ -12,6 +16,7 @@ describe('socket', () => { const WebsocketClient = require('../../client/clients/WebsocketClient'); const mockHandler = jest.fn(); + socket('my.url', { example: mockHandler, }); diff --git a/test/client/utils/createSocketURL.test.js b/test/client/utils/createSocketURL.test.js index 2da4114039..8655992195 100644 --- a/test/client/utils/createSocketURL.test.js +++ b/test/client/utils/createSocketURL.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; describe("'createSocketURL' function ", () => { diff --git a/test/client/utils/getCurrentScriptSource.test.js b/test/client/utils/getCurrentScriptSource.test.js index 602c650091..8a1016f65a 100644 --- a/test/client/utils/getCurrentScriptSource.test.js +++ b/test/client/utils/getCurrentScriptSource.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; const getCurrentScriptSource = require('../../../client-src/utils/getCurrentScriptSource'); diff --git a/test/client/utils/log.test.js b/test/client/utils/log.test.js index 37e8b6c1fc..eda1c471f0 100644 --- a/test/client/utils/log.test.js +++ b/test/client/utils/log.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; describe("'log' function", () => { diff --git a/test/client/utils/parseURL.test.js b/test/client/utils/parseURL.test.js index 9292ed7b23..f6c7a060a7 100644 --- a/test/client/utils/parseURL.test.js +++ b/test/client/utils/parseURL.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; describe("'parseURL' function", () => { diff --git a/test/client/utils/reloadApp.test.js b/test/client/utils/reloadApp.test.js index d953198d00..9d7df2f00f 100644 --- a/test/client/utils/reloadApp.test.js +++ b/test/client/utils/reloadApp.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; describe("'reloadApp' function", () => { diff --git a/test/client/utils/sendMessage.test.js b/test/client/utils/sendMessage.test.js index d24b0de2d3..9dee503cc9 100644 --- a/test/client/utils/sendMessage.test.js +++ b/test/client/utils/sendMessage.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; const sendMessage = require('../../../client-src/utils/sendMessage'); diff --git a/test/e2e/DevServer.test.js b/test/e2e/DevServer.test.js deleted file mode 100644 index cd315d1661..0000000000 --- a/test/e2e/DevServer.test.js +++ /dev/null @@ -1,126 +0,0 @@ -'use strict'; - -const { testBin } = require('../helpers/test-bin'); -const isWebpack5 = require('../helpers/isWebpack5'); - -describe('DevServer', () => { - const webpack5Test = isWebpack5 ? it : it.skip; - - it('should add devServer entry points to a single entry point', (done) => { - testBin(null, './test/fixtures/dev-server/default-config.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('client/index.js?'); - done(); - }) - .catch(done); - }); - - webpack5Test( - 'should add devServer entry points to a multi entry point object', - (done) => { - testBin('--stats=verbose', './test/fixtures/dev-server/multi-entry.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('client/index.js?'); - expect(output.stdout).toContain('foo.js'); - done(); - }) - .catch(done); - } - ); - - webpack5Test( - 'should add devServer entry points to an empty entry object', - (done) => { - testBin(null, './test/fixtures/dev-server/empty-entry.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('client/index.js?'); - done(); - }) - .catch(done); - } - ); - - webpack5Test('should supports entry as descriptor', (done) => { - testBin( - '--stats detailed', - './test/fixtures/entry-as-descriptor/webpack.config' - ) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('foo.js'); - done(); - }) - .catch(done); - }); - - it('should only prepends devServer entry points to "web" target', (done) => { - testBin('--target web', './test/fixtures/dev-server/default-config.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('client/index.js?'); - expect(output.stdout).toContain('foo.js'); - done(); - }) - .catch(done); - }); - - it('should not prepend devServer entry points to "node" target', (done) => { - testBin('--target node', './test/fixtures/dev-server/default-config.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).not.toContain('client/index.js?'); - expect(output.stdout).toContain('foo.js'); - done(); - }) - .catch(done); - }); - - it('should prepends the hot runtime to "node" target as well', (done) => { - testBin( - '--target node --hot', - './test/fixtures/dev-server/default-config.js' - ) - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('webpack/hot/dev-server'); - done(); - }) - .catch(done); - }); - - it('should "/ws" web socket path by default', (done) => { - testBin(null, './test/fixtures/dev-server/client-default-path-config.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('ws%3A%2F%2F0.0.0.0%2Fws'); - done(); - }) - .catch(done); - }); - - it('should use client.path when custom', (done) => { - testBin(null, './test/fixtures/dev-server/client-custom-path-config.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('ws%3A%2F%2F0.0.0.0%2Fcustom%2Fpath'); - done(); - }) - .catch(done); - }); - - webpack5Test( - 'should prepend devServer entry points depending on targetProperties', - (done) => { - testBin(null, './test/fixtures/dev-server/target-config.js') - .then((output) => { - expect(output.exitCode).toEqual(0); - expect(output.stdout).toContain('client/index.js'); - done(); - }) - .catch(done); - } - ); -}); diff --git a/test/e2e/Progress.test.js b/test/e2e/Progress.test.js index c8f84099c0..9bdc37158f 100644 --- a/test/e2e/Progress.test.js +++ b/test/e2e/Progress.test.js @@ -1,89 +1,93 @@ 'use strict'; -/* eslint-disable - no-undef -*/ -const { resolve } = require('path'); -const fs = require('graceful-fs'); +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const Server = require('../../lib/Server'); const reloadConfig = require('../fixtures/reload-config-2/webpack.config'); const runBrowser = require('../helpers/run-browser'); -const port = require('../ports-map').Progress; -const { - reloadReadyDelay, - completeReloadDelay, -} = require('../helpers/puppeteer-constants'); - -const cssFilePath = resolve(__dirname, '../fixtures/reload-config-2/main.css'); - -describe('client progress', () => { - let testServer; - let processStderrMock; - - describe('using hot', () => { - beforeAll((done) => { - // ProgressPlugin uses process.stderr and reset webpack - jest.resetModules(); - processStderrMock = jest - .spyOn(process.stderr, 'write') - .mockImplementation(); - testServer = require('../helpers/test-server'); - - fs.writeFileSync( - cssFilePath, - 'body { background-color: rgb(0, 0, 255); }' - ); - - const options = { - port, - host: '0.0.0.0', - hot: true, - client: { - progress: true, - }, - }; - - // we need a delay between file writing and the start - // of the compilation due to a bug in webpack@4, as not doing - // so results in the done hook being called repeatedly - setTimeout(() => { - testServer.startAwaitingCompilation(reloadConfig, options, done); - }, 2000); +const port = require('../ports-map').progress; + +const cssFilePath = path.resolve( + __dirname, + '../fixtures/reload-config-2/main.css' +); + +describe('progress', () => { + it('should work and log progress in a browser console', async () => { + fs.writeFileSync(cssFilePath, 'body { background-color: rgb(0, 0, 255); }'); + + const compiler = webpack(reloadConfig); + const devServerOptions = { + port, + host: '0.0.0.0', + static: false, + hot: true, + client: { + progress: true, + }, + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + + let doHotUpdate = false; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('request', (requestObj) => { + if (/\.hot-update\.(json|js)$/.test(requestObj.url())) { + doHotUpdate = true; + } + }); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', }); - afterAll((done) => { - fs.unlinkSync(cssFilePath); - testServer.close(done); - processStderrMock.mockRestore(); + fs.writeFileSync(cssFilePath, 'body { background-color: rgb(255, 0, 0); }'); + + await new Promise((resolve) => { + const timer = setInterval(() => { + if (doHotUpdate) { + clearInterval(timer); + + resolve(); + } + }, 100); }); - describe('on browser client', () => { - it('should console.log progress', (done) => { - runBrowser().then(({ page, browser }) => { - const res = []; - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(reloadReadyDelay).then(() => { - fs.writeFileSync( - cssFilePath, - 'body { background-color: rgb(255, 0, 0); }' - ); - page.waitForTimeout(completeReloadDelay).then(() => { - browser.close().then(() => { - // check that there is some percentage progress output - const regExp = /^\[webpack-dev-server\] [0-9]{1,3}% - /; - const match = res.find((line) => regExp.test(line)); - // eslint-disable-next-line no-undefined - expect(match).not.toEqual(undefined); - done(); - }); - }); - }); - }); - - page.goto(`http://localhost:${port}/main`); - page.on('console', (data) => { - res.push(data.text()); - }); - }); + await browser.close(); + + const progressConsoleMessage = consoleMessages.filter((message) => + /^\[webpack-dev-server\] (\[[a-zA-Z]+\] )?[0-9]{1,3}% - /.test( + message.text() + ) + ); + + expect(progressConsoleMessage.length > 0).toBe(true); + + fs.unlinkSync(cssFilePath); + + await new Promise((resolve) => { + server.close(() => { + resolve(); }); }); }); diff --git a/test/e2e/ProvidePlugin.test.js b/test/e2e/ProvidePlugin.test.js deleted file mode 100644 index bd475a6992..0000000000 --- a/test/e2e/ProvidePlugin.test.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict'; - -const testServer = require('../helpers/test-server'); -const sockjsConfig = require('../fixtures/provide-plugin-sockjs-config/webpack.config'); -const wsConfig = require('../fixtures/provide-plugin-ws-config/webpack.config'); -const runBrowser = require('../helpers/run-browser'); -const port = require('../ports-map').ProvidePlugin; -const { beforeBrowserCloseDelay } = require('../helpers/puppeteer-constants'); - -describe('ProvidePlugin', () => { - describe('default client.transport (ws)', () => { - beforeAll((done) => { - const options = { - port, - host: '0.0.0.0', - }; - testServer.startAwaitingCompilation(wsConfig, options, done); - }); - - afterAll(testServer.close); - - describe('on browser client', () => { - it('should inject ws client implementation', (done) => { - runBrowser().then(({ page, browser }) => { - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - page - .evaluate(() => window.injectedClient === window.expectedClient) - .then((isCorrectClient) => { - browser.close().then(() => { - expect(isCorrectClient).toBeTruthy(); - done(); - }); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - }); - - describe('with client.transport sockjs', () => { - beforeAll((done) => { - const options = { - port, - host: '0.0.0.0', - client: { - transport: 'sockjs', - }, - }; - testServer.startAwaitingCompilation(sockjsConfig, options, done); - }); - - afterAll(testServer.close); - - describe('on browser client', () => { - it('should inject sockjs client implementation', (done) => { - runBrowser().then(({ page, browser }) => { - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - page - .evaluate(() => window.injectedClient === window.expectedClient) - .then((isCorrectClient) => { - browser.close().then(() => { - expect(isCorrectClient).toBeTruthy(); - done(); - }); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - }); -}); diff --git a/test/e2e/Socket-injection.test.js b/test/e2e/Socket-injection.test.js deleted file mode 100644 index ccf5642743..0000000000 --- a/test/e2e/Socket-injection.test.js +++ /dev/null @@ -1,407 +0,0 @@ -'use strict'; - -/* eslint-disable - no-unused-vars -*/ - -const express = require('express'); -const request = require('supertest'); -const testServer = require('../helpers/test-server'); -const runBrowser = require('../helpers/run-browser'); -const port = require('../ports-map').SocketInjection; -const config = require('../fixtures/client-config/webpack.config'); -const { beforeBrowserCloseDelay } = require('../helpers/puppeteer-constants'); - -const transportModeWSValidOptions = [ - {}, - { webSocketServer: 'ws' }, - { webSocketServer: { type: 'ws' } }, -]; - -describe('ws websocket client injection', () => { - for (const wsOption of transportModeWSValidOptions) { - let req; - let server; - const errorMsg = `WebSocket connection to 'ws://localhost:${port}/ws' failed: Error during WebSocket handshake: Unexpected response code: 404`; - const res = []; - - describe('testing default settings', () => { - beforeAll((done) => { - const options = { - port, - ...wsOption, - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - // TODO: listen for websocket requestType via puppeteer when added - // to puppeteer: https://github.com/puppeteer/puppeteer/issues/2974 - runBrowser().then(({ page, browser }) => { - page.on('console', ({ _text }) => { - res.push(_text); - }); - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - // if the error msg doesn't exist that means the ws websocket is working. - expect(res.includes(errorMsg)).toBe(false); - done(); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - - describe('testing when liveReload is enabled', () => { - beforeAll((done) => { - const options = { - port, - liveReload: true, - ...wsOption, - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - // TODO: listen for websocket requestType via puppeteer when added - // to puppeteer: https://github.com/puppeteer/puppeteer/issues/2974 - runBrowser().then(({ page, browser }) => { - page.on('console', ({ _text }) => { - res.push(_text); - }); - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - // if the error msg doesn't exist that means the ws websocket is working. - expect(res.includes(errorMsg)).toBe(false); - done(); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - - describe('testing when liveReload is disabled', () => { - beforeAll((done) => { - const options = { - port, - liveReload: false, - ...wsOption, - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - // TODO: listen for websocket requestType via puppeteer when added - // to puppeteer: https://github.com/puppeteer/puppeteer/issues/2974 - runBrowser().then(({ page, browser }) => { - page.on('console', ({ _text }) => { - res.push(_text); - }); - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - // if the error msg doesn't exist that means the ws websocket is working. - expect(res.includes(errorMsg)).toBe(false); - done(); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - - describe('testing when hot is enabled', () => { - beforeAll((done) => { - const options = { - port, - hot: true, - ...wsOption, - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - // TODO: listen for websocket requestType via puppeteer when added - // to puppeteer: https://github.com/puppeteer/puppeteer/issues/2974 - runBrowser().then(({ page, browser }) => { - page.on('console', ({ _text }) => { - res.push(_text); - }); - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - // if the error msg doesn't exist that means the ws websocket is working. - expect(res.includes(errorMsg)).toBe(false); - done(); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - - describe('testing when hot is enabled and liveReload is disabled', () => { - beforeAll((done) => { - const options = { - port, - hot: true, - liveReload: false, - ...wsOption, - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - // TODO: listen for websocket requestType via puppeteer when added - // to puppeteer: https://github.com/puppeteer/puppeteer/issues/2974 - runBrowser().then(({ page, browser }) => { - page.on('console', ({ _text }) => { - res.push(_text); - }); - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - // if the error msg doesn't exist that means the ws websocket is working. - expect(res.includes(errorMsg)).toBe(false); - done(); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - - describe('testing when hot is disabled and liveReload is enabled', () => { - beforeAll((done) => { - const options = { - port, - hot: false, - liveReload: true, - ...wsOption, - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - // TODO: listen for websocket requestType via puppeteer when added - // to puppeteer: https://github.com/puppeteer/puppeteer/issues/2974 - runBrowser().then(({ page, browser }) => { - page.on('console', ({ _text }) => { - res.push(_text); - }); - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - // if the error msg doesn't exist that means the ws websocket is working. - expect(res.includes(errorMsg)).toBe(false); - done(); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - - describe('testing when hot and liveReload are disabled', () => { - beforeAll((done) => { - const options = { - port, - hot: false, - liveReload: false, - ...wsOption, - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should not be injected', (done) => { - // TODO: listen for websocket requestType via puppeteer when added - // to puppeteer: https://github.com/puppeteer/puppeteer/issues/2974 - runBrowser().then(({ page, browser }) => { - page.on('console', ({ _text }) => { - res.push(_text); - }); - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - // if the error msg doesn't exist that means the ws websocket is working. - expect(res.includes(errorMsg)).toBe(true); - done(); - }); - }); - }); - page.goto(`http://localhost:${port}/main`); - }); - }); - }); - } -}); - -describe('sockjs websocket client injection', () => { - let req; - let server; - - describe('testing default settings', () => { - beforeAll((done) => { - const options = { - port, - webSocketServer: 'sockjs', - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - req.get('/ws').expect(200, 'Welcome to SockJS!\n', done); - }); - }); - - describe('testing when liveReload is enabled', () => { - beforeAll((done) => { - const options = { - port, - liveReload: true, - webSocketServer: 'sockjs', - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - req.get('/ws').expect(200, 'Welcome to SockJS!\n', done); - }); - }); - - describe('testing when liveReload is disabled', () => { - beforeAll((done) => { - const options = { - port, - liveReload: false, - webSocketServer: 'sockjs', - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - req.get('/ws').expect(200, 'Welcome to SockJS!\n', done); - }); - }); - - describe('testing when hot is enabled', () => { - beforeAll((done) => { - const options = { - port, - hot: true, - webSocketServer: 'sockjs', - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - req.get('/ws').expect(200, 'Welcome to SockJS!\n', done); - }); - }); - - describe('testing when hot is enabled and liveReload is disabled', () => { - beforeAll((done) => { - const options = { - port, - hot: true, - liveReload: false, - webSocketServer: 'sockjs', - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - req.get('/ws').expect(200, 'Welcome to SockJS!\n', done); - }); - }); - - describe('testing when hot is disabled and liveReload is enabled', () => { - beforeAll((done) => { - const options = { - port, - hot: false, - liveReload: true, - webSocketServer: 'sockjs', - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should be injected', (done) => { - req.get('/ws').expect(200, 'Welcome to SockJS!\n', done); - }); - }); - - describe('testing when hot and liveReload are disabled', () => { - beforeAll((done) => { - const options = { - port, - hot: false, - liveReload: false, - webSocketServer: 'sockjs', - }; - server = testServer.start(config, options, done); - req = request(`http://localhost:${port}`); - }); - - afterAll(testServer.close); - - it('should not be injected', (done) => { - req - .get('/ws') - .expect(404) - .then(({ res }) => { - expect(res.text.includes('Cannot GET /ws')).toBe(true); - done(); - }); - }); - }); -}); diff --git a/test/e2e/TransportMode.test.js b/test/e2e/TransportMode.test.js deleted file mode 100644 index 51c5082ae4..0000000000 --- a/test/e2e/TransportMode.test.js +++ /dev/null @@ -1,147 +0,0 @@ -'use strict'; - -const testServer = require('../helpers/test-server'); -const config = require('../fixtures/client-config/webpack.config'); -const runBrowser = require('../helpers/run-browser'); -const port = require('../ports-map').TransportMode; -const { - initConsoleDelay, - awaitServerCloseDelay, -} = require('../helpers/puppeteer-constants'); - -describe('transportMode client', () => { - const modes = [ - { - title: 'sockjs', - options: { - hot: false, - client: { transport: 'sockjs' }, - webSocketServer: 'sockjs', - }, - }, - { - title: 'ws', - options: { - hot: false, - client: { transport: 'ws' }, - webSocketServer: 'ws', - }, - }, - { - title: 'custom client', - options: { - hot: false, - client: { - transport: require.resolve( - '../fixtures/custom-client/CustomSockJSClient' - ), - }, - webSocketServer: 'sockjs', - }, - }, - ]; - - modes.forEach((mode) => { - describe(mode.title, () => { - beforeAll((done) => { - const options = Object.assign( - {}, - { - port, - host: '0.0.0.0', - }, - mode.options - ); - testServer.startAwaitingCompilation(config, options, done); - }); - - describe('on browser client', () => { - it('logs correctly', (done) => { - runBrowser().then(({ page, browser }) => { - const res = []; - page.goto(`http://localhost:${port}/main`); - page.on('console', ({ _text }) => { - res.push(_text); - }); - - page.waitForTimeout(initConsoleDelay).then(() => { - testServer.close(() => { - // make sure the client gets the close message - page.waitForTimeout(awaitServerCloseDelay).then(() => { - browser.close().then(() => { - for (let i = res.length - 1; i >= 0; i--) { - if (res[i] === '[webpack-dev-server] Disconnected!') { - break; - } else if ( - res[i] === 'close' || - res[i].includes('net::ERR_CONNECTION_REFUSED') || - // this indicates a WebSocket Error object that was logged - res[i].includes('JSHandle@object') - ) { - // remove additional logging for the now failing connection, - // since this could be a variable number of error messages - res.splice(i, 1); - } - } - expect(res).toMatchSnapshot(); - done(); - }); - }); - }); - }); - }); - }); - }); - }); - }); - - describe('unspecified port', () => { - beforeAll((done) => { - const options = { - host: '0.0.0.0', - hot: false, - client: { transport: 'sockjs' }, - webSocketServer: 'sockjs', - }; - testServer.startAwaitingCompilation(config, options, done); - }); - - describe('on browser client', () => { - it('logs correctly', (done) => { - runBrowser().then(({ page, browser }) => { - const res = []; - page.goto(`http://localhost:8080/main`); - page.on('console', ({ _text }) => { - res.push(_text); - }); - - page.waitForTimeout(initConsoleDelay).then(() => { - testServer.close(() => { - // make sure the client gets the close message - page.waitForTimeout(awaitServerCloseDelay).then(() => { - browser.close().then(() => { - for (let i = res.length - 1; i >= 0; i--) { - if (res[i] === '[webpack-dev-server] Disconnected!') { - break; - } else if ( - res[i] === 'close' || - res[i].includes('net::ERR_CONNECTION_REFUSED') || - // this indicates a WebSocket Error object that was logged - res[i].includes('JSHandle@object') - ) { - // remove additional logging for the now failing connection, - // since this could be a variable number of error messages - res.splice(i, 1); - } - } - expect(res).toMatchSnapshot(); - done(); - }); - }); - }); - }); - }); - }); - }); - }); -}); diff --git a/test/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack4 b/test/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack4 new file mode 100644 index 0000000000..eb77be8e8b --- /dev/null +++ b/test/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack4 @@ -0,0 +1,293 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (default): console messages 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (sockjs): console messages 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (ws): console messages 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled and hot disabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled and hot disabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using live reload (default): console messages 1`] = ` +Array [ + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using live reload when live reload disabled and hot enabled (sockjs): console messages 1`] = ` +Array [ + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload when live reload disabled and hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using live reload when live reload enabled and hot disabled (ws): console messages 1`] = ` +Array [ + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload when live reload enabled and hot disabled (ws): page errors 1`] = `Array []`; diff --git a/test/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 b/test/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 new file mode 100644 index 0000000000..eb77be8e8b --- /dev/null +++ b/test/e2e/__snapshots__/hot-and-live-reload.test.js.snap.webpack5 @@ -0,0 +1,293 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (default): console messages 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (sockjs): console messages 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (ws): console messages 1`] = `Array []`; + +exports[`hot and live reload should not refresh content when hot and no live reload disabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when hot enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload and hot enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload disabled and hot enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (sockjs): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (ws): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled (ws): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled and hot disabled (default): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App hot update...", + "[HMR] Checking for updates on the server...", + "[HMR] Updated modules:", + "[HMR] - ./main.css", + "[HMR] - ../../../node_modules/css-loader/dist/cjs.js!./main.css", + "", + "[HMR] App is up to date.", +] +`; + +exports[`hot and live reload should work and refresh content using hot module replacement when live reload enabled and hot disabled (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using live reload (default): console messages 1`] = ` +Array [ + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload (default): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using live reload when live reload disabled and hot enabled (sockjs): console messages 1`] = ` +Array [ + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload when live reload disabled and hot enabled (sockjs): page errors 1`] = `Array []`; + +exports[`hot and live reload should work and refresh content using live reload when live reload enabled and hot disabled (ws): console messages 1`] = ` +Array [ + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Recompiling...", + "[webpack-dev-server] App updated. Reloading...", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`hot and live reload should work and refresh content using live reload when live reload enabled and hot disabled (ws): page errors 1`] = `Array []`; diff --git a/test/e2e/__snapshots__/logging.test.js.snap.webpack4 b/test/e2e/__snapshots__/logging.test.js.snap.webpack4 index 4ce374ca58..46799fde52 100644 --- a/test/e2e/__snapshots__/logging.test.js.snap.webpack4 +++ b/test/e2e/__snapshots__/logging.test.js.snap.webpack4 @@ -1,148 +1,405 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`logging client logging is none (default) 1`] = ` +exports[`logging should work and do not log messages about hot and live reloading is enabled (default) 1`] = ` Array [ "Hey.", ] `; -exports[`logging client logging is none (sockjs) 1`] = ` +exports[`logging should work and do not log messages about hot and live reloading is enabled (sockjs) 1`] = ` Array [ "Hey.", ] `; -exports[`logging client logging is none (ws) 1`] = ` +exports[`logging should work and do not log messages about hot and live reloading is enabled (ws) 1`] = ` Array [ "Hey.", ] `; -exports[`logging hot disabled (default) 1`] = ` +exports[`logging should work and log errors by default (default) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log errors by default (sockjs) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging hot disabled (sockjs) 1`] = ` +exports[`logging should work and log errors by default (ws) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging hot disabled (ws) 1`] = ` +exports[`logging should work and log message about live reloading is enabled (default) 1`] = ` Array [ "Hey.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging hot enabled (default) 1`] = ` +exports[`logging should work and log message about live reloading is enabled (sockjs) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log message about live reloading is enabled (ws) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (default) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (default) 2`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (default) 3`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 2`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 3`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 2`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 3`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot is enabled (default) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", +] +`; + +exports[`logging should work and log messages about hot is enabled (sockjs) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", +] +`; + +exports[`logging should work and log messages about hot is enabled (ws) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", +] +`; + +exports[`logging should work and log only error (default) 1`] = ` Array [ "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log only error (sockjs) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log only error (ws) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log static changes (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] \\"/test/fixtures/client-config/static/foo.txt\\" from static directory was changed. Reloading...", + "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging hot enabled (sockjs) 1`] = ` +exports[`logging should work and log static changes (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] \\"/test/fixtures/client-config/static/foo.txt\\" from static directory was changed. Reloading...", "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging hot enabled (ws) 1`] = ` +exports[`logging should work and log static changes (ws) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] \\"/test/fixtures/client-config/static/foo.txt\\" from static directory was changed. Reloading...", "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload & hot are disabled (default) 1`] = ` +exports[`logging should work and log warning and errors (default) 1`] = ` Array [ "Hey.", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "[webpack-dev-server] Disconnected!", - "[webpack-dev-server] JSHandle@object", - "[webpack-dev-server] JSHandle@object", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging liveReload & hot are disabled (sockjs) 1`] = ` +exports[`logging should work and log warning and errors (sockjs) 1`] = ` Array [ - "Failed to load resource: the server responded with a status of 404 (Not Found)", - "Failed to load resource: the server responded with a status of 404 (Not Found)", "Hey.", - "[webpack-dev-server] Disconnected!", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging liveReload & hot are disabled (ws) 1`] = ` +exports[`logging should work and log warning and errors (ws) 1`] = ` Array [ "Hey.", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "[webpack-dev-server] Disconnected!", - "[webpack-dev-server] JSHandle@object", - "[webpack-dev-server] JSHandle@object", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging liveReload disabled (default) 1`] = ` +exports[`logging should work and log warnings by default (default) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", +] +`; + +exports[`logging should work and log warnings by default (sockjs) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", ] `; -exports[`logging liveReload disabled (sockjs) 1`] = ` +exports[`logging should work and log warnings by default (ws) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", +] +`; + +exports[`logging should work when the "client.logging" is "info" (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload disabled (ws) 1`] = ` +exports[`logging should work when the "client.logging" is "info" (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "info" (ws) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "log" (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload enabled (default) 1`] = ` +exports[`logging should work when the "client.logging" is "log" (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "log" (ws) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload enabled (sockjs) 1`] = ` +exports[`logging should work when the "client.logging" is "none" (default) 1`] = ` +Array [ + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "none" (sockjs) 1`] = ` +Array [ + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "none" (ws) 1`] = ` Array [ "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "verbose" (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload enabled (ws) 1`] = ` +exports[`logging should work when the "client.logging" is "verbose" (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "verbose" (ws) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] diff --git a/test/e2e/__snapshots__/logging.test.js.snap.webpack5 b/test/e2e/__snapshots__/logging.test.js.snap.webpack5 index 4ce374ca58..46799fde52 100644 --- a/test/e2e/__snapshots__/logging.test.js.snap.webpack5 +++ b/test/e2e/__snapshots__/logging.test.js.snap.webpack5 @@ -1,148 +1,405 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`logging client logging is none (default) 1`] = ` +exports[`logging should work and do not log messages about hot and live reloading is enabled (default) 1`] = ` Array [ "Hey.", ] `; -exports[`logging client logging is none (sockjs) 1`] = ` +exports[`logging should work and do not log messages about hot and live reloading is enabled (sockjs) 1`] = ` Array [ "Hey.", ] `; -exports[`logging client logging is none (ws) 1`] = ` +exports[`logging should work and do not log messages about hot and live reloading is enabled (ws) 1`] = ` Array [ "Hey.", ] `; -exports[`logging hot disabled (default) 1`] = ` +exports[`logging should work and log errors by default (default) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log errors by default (sockjs) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging hot disabled (sockjs) 1`] = ` +exports[`logging should work and log errors by default (ws) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging hot disabled (ws) 1`] = ` +exports[`logging should work and log message about live reloading is enabled (default) 1`] = ` Array [ "Hey.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging hot enabled (default) 1`] = ` +exports[`logging should work and log message about live reloading is enabled (sockjs) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log message about live reloading is enabled (ws) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (default) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (default) 2`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (default) 3`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 2`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (sockjs) 3`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 2`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot and live reloading is enabled (ws) 3`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work and log messages about hot is enabled (default) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", +] +`; + +exports[`logging should work and log messages about hot is enabled (sockjs) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", +] +`; + +exports[`logging should work and log messages about hot is enabled (ws) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", +] +`; + +exports[`logging should work and log only error (default) 1`] = ` Array [ "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log only error (sockjs) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log only error (ws) 1`] = ` +Array [ + "Hey.", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", +] +`; + +exports[`logging should work and log static changes (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] \\"/test/fixtures/client-config/static/foo.txt\\" from static directory was changed. Reloading...", + "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging hot enabled (sockjs) 1`] = ` +exports[`logging should work and log static changes (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] \\"/test/fixtures/client-config/static/foo.txt\\" from static directory was changed. Reloading...", "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging hot enabled (ws) 1`] = ` +exports[`logging should work and log static changes (ws) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] \\"/test/fixtures/client-config/static/foo.txt\\" from static directory was changed. Reloading...", "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload & hot are disabled (default) 1`] = ` +exports[`logging should work and log warning and errors (default) 1`] = ` Array [ "Hey.", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "[webpack-dev-server] Disconnected!", - "[webpack-dev-server] JSHandle@object", - "[webpack-dev-server] JSHandle@object", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging liveReload & hot are disabled (sockjs) 1`] = ` +exports[`logging should work and log warning and errors (sockjs) 1`] = ` Array [ - "Failed to load resource: the server responded with a status of 404 (Not Found)", - "Failed to load resource: the server responded with a status of 404 (Not Found)", "Hey.", - "[webpack-dev-server] Disconnected!", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging liveReload & hot are disabled (ws) 1`] = ` +exports[`logging should work and log warning and errors (ws) 1`] = ` Array [ "Hey.", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "WebSocket connection to 'ws://localhost:8098/ws' failed: Error during WebSocket handshake: Unexpected response code: 404", - "[webpack-dev-server] Disconnected!", - "[webpack-dev-server] JSHandle@object", - "[webpack-dev-server] JSHandle@object", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", + "[webpack-dev-server] Errors while compiling. Reload prevented.", + "[webpack-dev-server] Error from compilation", ] `; -exports[`logging liveReload disabled (default) 1`] = ` +exports[`logging should work and log warnings by default (default) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", +] +`; + +exports[`logging should work and log warnings by default (sockjs) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", ] `; -exports[`logging liveReload disabled (sockjs) 1`] = ` +exports[`logging should work and log warnings by default (ws) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", + "[webpack-dev-server] Warnings while compiling.", + "[webpack-dev-server] Warning from compilation", +] +`; + +exports[`logging should work when the "client.logging" is "info" (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload disabled (ws) 1`] = ` +exports[`logging should work when the "client.logging" is "info" (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "info" (ws) 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "log" (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload enabled (default) 1`] = ` +exports[`logging should work when the "client.logging" is "log" (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "log" (ws) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload enabled (sockjs) 1`] = ` +exports[`logging should work when the "client.logging" is "none" (default) 1`] = ` +Array [ + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "none" (sockjs) 1`] = ` +Array [ + "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "none" (ws) 1`] = ` Array [ "Hey.", +] +`; + +exports[`logging should work when the "client.logging" is "verbose" (default) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] `; -exports[`logging liveReload enabled (ws) 1`] = ` +exports[`logging should work when the "client.logging" is "verbose" (sockjs) 1`] = ` Array [ + "[HMR] Waiting for update signal from WDS...", "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`logging should work when the "client.logging" is "verbose" (ws) 1`] = ` +Array [ "[HMR] Waiting for update signal from WDS...", + "Hey.", "[webpack-dev-server] Hot Module Replacement enabled.", "[webpack-dev-server] Live Reloading enabled.", ] diff --git a/test/e2e/__snapshots__/overlay.test.js.snap.webpack4 b/test/e2e/__snapshots__/overlay.test.js.snap.webpack4 new file mode 100644 index 0000000000..288128e15c --- /dev/null +++ b/test/e2e/__snapshots__/overlay.test.js.snap.webpack4 @@ -0,0 +1,905 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`overlay should not show initially, then show on an error and allow to close: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

./foo.js + 1:1 Module parse failed: Unterminated template (1:1) You may need an + appropriate loader to handle this file type, currently no loaders are + configured to process this file. See + https://webpack.js.org/concepts#loaders > \`;


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html after close 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html initial 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html with error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

./foo.js + 1:1 Module parse failed: Unterminated template (1:1) You may need an + appropriate loader to handle this file type, currently no loaders are + configured to process this file. See + https://webpack.js.org/concepts#loaders > \`;


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html after fix error 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html initial 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html with error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

./foo.js + 1:1 Module parse failed: Unterminated template (1:1) You may need an + appropriate loader to handle this file type, currently no loaders are + configured to process this file. See + https://webpack.js.org/concepts#loaders > \`;


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: overlay html 2`] = ` +" +
+ Compiled with problems:

+
+ Error:

./foo.js + 1:1 Module parse failed: Unterminated template (1:1) You may need an + appropriate loader to handle this file type, currently no loaders are + configured to process this file. See + https://webpack.js.org/concepts#loaders > \`;a


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html after fix error 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html initial 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with other error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show on a warning when "client.overlay" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should not show on a warning when "client.overlay.warnings" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should not show on an error when "client.overlay" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should not show on an error when "client.overlay.errors" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should show on a warning and error for initial compilation: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ Warning:

Warning + from compilation


+
+
+ Error:

Error from + compilation


+
+
+ Error:

Error from + compilation


+
+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning and error for initial compilation: page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning for initial compilation: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning for initial compilation: page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning when "client.overlay" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning when "client.overlay" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning when "client.overlay.errors" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning when "client.overlay.errors" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning when "client.overlay.warnings" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning when "client.overlay.warnings" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error for initial compilation: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on an error for initial compilation: page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error when "client.overlay" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on an error when "client.overlay" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error when "client.overlay.errors" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on an error when "client.overlay.errors" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error when "client.overlay.warnings" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on an error when "client.overlay.warnings" is "true": page html 1`] = ` +" + + + +" +`; diff --git a/test/e2e/__snapshots__/overlay.test.js.snap.webpack5 b/test/e2e/__snapshots__/overlay.test.js.snap.webpack5 new file mode 100644 index 0000000000..49362074fd --- /dev/null +++ b/test/e2e/__snapshots__/overlay.test.js.snap.webpack5 @@ -0,0 +1,905 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`overlay should not show initially, then show on an error and allow to close: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Module + parse failed: Unterminated template (1:1) You may need an appropriate + loader to handle this file type, currently no loaders are configured to + process this file. See https://webpack.js.org/concepts#loaders > + \`;


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html after close 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html initial 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error and allow to close: page html with error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Module + parse failed: Unterminated template (1:1) You may need an appropriate + loader to handle this file type, currently no loaders are configured to + process this file. See https://webpack.js.org/concepts#loaders > + \`;


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html after fix error 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html initial 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then hide on fix: page html with error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Module + parse failed: Unterminated template (1:1) You may need an appropriate + loader to handle this file type, currently no loaders are configured to + process this file. See https://webpack.js.org/concepts#loaders > + \`;


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: overlay html 2`] = ` +" +
+ Compiled with problems:

+
+ Error:

Module + parse failed: Unterminated template (1:1) You may need an appropriate + loader to handle this file type, currently no loaders are configured to + process this file. See https://webpack.js.org/concepts#loaders > + \`;a


+
+
+ +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html after fix error 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html initial 1`] = ` +" + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show initially, then show on an error, then show other error, then hide on fix: page html with other error 1`] = ` +" + + + +" +`; + +exports[`overlay should not show on a warning when "client.overlay" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should not show on a warning when "client.overlay.warnings" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should not show on an error when "client.overlay" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should not show on an error when "client.overlay.errors" is "false": page html 1`] = ` +" + + +" +`; + +exports[`overlay should show on a warning and error for initial compilation: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ Warning:

Warning + from compilation


+
+
+ Error:

Error from + compilation


+
+
+ Error:

Error from + compilation


+
+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning and error for initial compilation: page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning for initial compilation: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning for initial compilation: page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning when "client.overlay" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning when "client.overlay" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning when "client.overlay.errors" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning when "client.overlay.errors" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on a warning when "client.overlay.warnings" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on a warning when "client.overlay.warnings" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error for initial compilation: overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on an error for initial compilation: page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error when "client.overlay" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on an error when "client.overlay" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error when "client.overlay.errors" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Error:

Error from + compilation


+
+
+ +" +`; + +exports[`overlay should show on an error when "client.overlay.errors" is "true": page html 1`] = ` +" + + + +" +`; + +exports[`overlay should show on an error when "client.overlay.warnings" is "true": overlay html 1`] = ` +" +
+ Compiled with problems:

+
+ Warning:

Warning + from compilation


+
+
+ +" +`; + +exports[`overlay should show on an error when "client.overlay.warnings" is "true": page html 1`] = ` +" + + + +" +`; diff --git a/test/e2e/__snapshots__/TransportMode.test.js.snap.webpack4 b/test/e2e/__snapshots__/transport-mode.test.js.snap.webpack4 similarity index 100% rename from test/e2e/__snapshots__/TransportMode.test.js.snap.webpack4 rename to test/e2e/__snapshots__/transport-mode.test.js.snap.webpack4 diff --git a/test/e2e/__snapshots__/TransportMode.test.js.snap.webpack5 b/test/e2e/__snapshots__/transport-mode.test.js.snap.webpack5 similarity index 100% rename from test/e2e/__snapshots__/TransportMode.test.js.snap.webpack5 rename to test/e2e/__snapshots__/transport-mode.test.js.snap.webpack5 diff --git a/test/e2e/__snapshots__/web-socket-server-and-transport.test.js.snap.webpack4 b/test/e2e/__snapshots__/web-socket-server-and-transport.test.js.snap.webpack4 new file mode 100644 index 0000000000..b570acebc0 --- /dev/null +++ b/test/e2e/__snapshots__/web-socket-server-and-transport.test.js.snap.webpack4 @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`web socket server and transport should use "sockjs" transport 1`] = `Array []`; + +exports[`web socket server and transport should use "sockjs" transport and "sockjs" web socket server 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server and transport should use "ws" transport 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server and transport should use "ws" transport and "ws" web socket server 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server and transport should use custom transport and "sockjs" web socket server 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "open", + "hot", + "[webpack-dev-server] Hot Module Replacement enabled.", + "liveReload", + "[webpack-dev-server] Live Reloading enabled.", + "overlay", + "hash", + "ok", +] +`; + +exports[`web socket server and transport should use default transport ("ws") 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; diff --git a/test/e2e/__snapshots__/web-socket-server-and-transport.test.js.snap.webpack5 b/test/e2e/__snapshots__/web-socket-server-and-transport.test.js.snap.webpack5 new file mode 100644 index 0000000000..b570acebc0 --- /dev/null +++ b/test/e2e/__snapshots__/web-socket-server-and-transport.test.js.snap.webpack5 @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`web socket server and transport should use "sockjs" transport 1`] = `Array []`; + +exports[`web socket server and transport should use "sockjs" transport and "sockjs" web socket server 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server and transport should use "ws" transport 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server and transport should use "ws" transport and "ws" web socket server 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server and transport should use custom transport and "sockjs" web socket server 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "open", + "hot", + "[webpack-dev-server] Hot Module Replacement enabled.", + "liveReload", + "[webpack-dev-server] Live Reloading enabled.", + "overlay", + "hash", + "ok", +] +`; + +exports[`web socket server and transport should use default transport ("ws") 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; diff --git a/test/e2e/__snapshots__/web-socket-server-url.test.js.snap.webpack4 b/test/e2e/__snapshots__/web-socket-server-url.test.js.snap.webpack4 new file mode 100644 index 0000000000..be00b714f7 --- /dev/null +++ b/test/e2e/__snapshots__/web-socket-server-url.test.js.snap.webpack4 @@ -0,0 +1,504 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "Failed to load resource: net::ERR_NAME_NOT_RESOLVED", + "[webpack-dev-server] Disconnected!", +] +`; + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "WebSocket connection to 'ws://unknown.unknown:/unknown' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED", + "[webpack-dev-server] JSHandle@object", + "[webpack-dev-server] Disconnected!", +] +`; + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("sockjs"): console messages 1`] = `Array []`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("sockjs"): page errors 1`] = ` +Array [ + "SyntaxError: The URL's scheme must be either 'http:' or 'https:'. 'unknown:' is not allowed.", +] +`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("ws"): console messages 1`] = `Array []`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("ws"): page errors 1`] = ` +Array [ + "DOMException: Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. 'unknown' is not allowed.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "The website requested a subresource from a network that it could only access because of its users' privileged network position. These requests expose non-public devices and servers to the internet, increasing the risk of a cross-site request forgery (CSRF) attack, and/or information leakage. To mitigate these risks, Chrome deprecates requests to non-public subresources when initiated from non-secure contexts, and will start blocking them in Chrome 92 (July 2021). See https://chromestatus.com/feature/5436853517811712 for more details.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "The website requested a subresource from a network that it could only access because of its users' privileged network position. These requests expose non-public devices and servers to the internet, increasing the risk of a cross-site request forgery (CSRF) attack, and/or information leakage. To mitigate these risks, Chrome deprecates requests to non-public subresources when initiated from non-secure contexts, and will start blocking them in Chrome 92 (July 2021). See https://chromestatus.com/feature/5436853517811712 for more details.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "host" option is IPv4 ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "host" option is IPv4 ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "host" option is IPv4 ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "host" option is IPv4 ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "port" option is "auto" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "port" option is "auto" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "port" option is "auto" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "port" option is "auto" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("ws"): page errors 1`] = `Array []`; diff --git a/test/e2e/__snapshots__/web-socket-server-url.test.js.snap.webpack5 b/test/e2e/__snapshots__/web-socket-server-url.test.js.snap.webpack5 new file mode 100644 index 0000000000..be00b714f7 --- /dev/null +++ b/test/e2e/__snapshots__/web-socket-server-url.test.js.snap.webpack5 @@ -0,0 +1,504 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "Failed to load resource: net::ERR_NAME_NOT_RESOLVED", + "[webpack-dev-server] Disconnected!", +] +`; + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "WebSocket connection to 'ws://unknown.unknown:/unknown' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED", + "[webpack-dev-server] JSHandle@object", + "[webpack-dev-server] Disconnected!", +] +`; + +exports[`web socket server URL should not work and output disconnect wrong web socket URL ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("sockjs"): console messages 1`] = `Array []`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("sockjs"): page errors 1`] = ` +Array [ + "SyntaxError: The URL's scheme must be either 'http:' or 'https:'. 'unknown:' is not allowed.", +] +`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("ws"): console messages 1`] = `Array []`; + +exports[`web socket server URL should work and throw an error on invalid web socket URL ("ws"): page errors 1`] = ` +Array [ + "DOMException: Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. 'unknown' is not allowed.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "The website requested a subresource from a network that it could only access because of its users' privileged network position. These requests expose non-public devices and servers to the internet, increasing the risk of a cross-site request forgery (CSRF) attack, and/or information leakage. To mitigate these risks, Chrome deprecates requests to non-public subresources when initiated from non-secure contexts, and will start blocking them in Chrome 92 (July 2021). See https://chromestatus.com/feature/5436853517811712 for more details.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are different ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "The website requested a subresource from a network that it could only access because of its users' privileged network position. These requests expose non-public devices and servers to the internet, increasing the risk of a cross-site request forgery (CSRF) attack, and/or information leakage. To mitigate these risks, Chrome deprecates requests to non-public subresources when initiated from non-secure contexts, and will start blocking them in Chrome 92 (July 2021). See https://chromestatus.com/feature/5436853517811712 for more details.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are different and ports are same ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work behind proxy, when hostnames are same and ports are different ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "host" option is IPv4 ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "host" option is IPv4 ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "host" option is IPv4 ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "host" option is IPv4 ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "port" option is "auto" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "port" option is "auto" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work when "port" option is "auto" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work when "port" option is "auto" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.*" options ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL" option as "string" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.password" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.path" option and custom web socket server "path" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option as string ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.port" option using "0" value ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "auto:" value ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("ws"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("sockjs"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("sockjs"): page errors 1`] = `Array []`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("ws"): console messages 1`] = ` +Array [ + "[HMR] Waiting for update signal from WDS...", + "Hey.", + "[webpack-dev-server] Hot Module Replacement enabled.", + "[webpack-dev-server] Live Reloading enabled.", +] +`; + +exports[`web socket server URL should work with the "client.webSocketURL.username" option ("ws"): page errors 1`] = `Array []`; diff --git a/test/e2e/hot-and-live-reload.test.js b/test/e2e/hot-and-live-reload.test.js index c2a21fbd76..6fb9e574b6 100644 --- a/test/e2e/hot-and-live-reload.test.js +++ b/test/e2e/hot-and-live-reload.test.js @@ -4,139 +4,422 @@ 'use strict'; -/* eslint-disable - no-undef -*/ -const { resolve } = require('path'); +const path = require('path'); +const WebSocket = require('ws'); +const SockJS = require('sockjs-client'); +const webpack = require('webpack'); +const request = require('supertest'); const fs = require('graceful-fs'); -const testServer = require('../helpers/test-server'); +const Server = require('../../lib/Server'); const reloadConfig = require('../fixtures/reload-config/webpack.config'); const runBrowser = require('../helpers/run-browser'); -const port = require('../ports-map').Client; -const { - reloadReadyDelay, - completeReloadDelay, -} = require('../helpers/puppeteer-constants'); +const port = require('../ports-map')['hot-and-live-reload']; -const cssFilePath = resolve(__dirname, '../fixtures/reload-config/main.css'); +const cssFilePath = path.resolve( + __dirname, + '../fixtures/reload-config/main.css' +); -describe('reload', () => { +describe('hot and live reload', () => { + // "sockjs" client cannot add additional headers const modes = [ { - title: 'hot with default transportMode.client (ws)', - shouldRefresh: false, + title: 'should work and refresh content using hot module replacement', }, + // Default web socket serve ("ws") { - title: 'hot with sockjs websocket server', + title: + 'should work and refresh content using hot module replacement when hot enabled', options: { - webSocketServer: 'sockjs', + hot: true, + }, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload enabled', + options: { + liveReload: true, + }, + }, + { + title: 'should not refresh content when hot and no live reload disabled', + options: { + hot: false, + liveReload: false, + }, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload disabled and hot enabled', + options: { + liveReload: false, + hot: true, + }, + }, + { + title: 'should work and refresh content using live reload', + options: { + liveReload: true, + hot: false, + }, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload enabled and hot disabled', + options: { + liveReload: true, + hot: true, + }, + }, + // "ws" web socket serve + { + title: + 'should work and refresh content using hot module replacement when hot enabled', + options: { + webSocketServer: 'ws', + hot: true, + }, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload enabled', + options: { + webSocketServer: 'ws', + liveReload: true, + }, + }, + { + title: 'should not refresh content when hot and no live reload disabled', + options: { + webSocketServer: 'ws', + hot: false, + liveReload: false, }, - shouldRefresh: false, }, { - title: 'hot with ws websocket server', + title: + 'should work and refresh content using hot module replacement when live reload disabled and hot enabled', options: { webSocketServer: 'ws', + liveReload: false, + hot: true, }, - shouldRefresh: false, }, { - title: 'reload without hot', + title: + 'should work and refresh content using live reload when live reload enabled and hot disabled', options: { + webSocketServer: 'ws', + liveReload: true, hot: false, }, - shouldRefresh: true, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload and hot enabled', + options: { + webSocketServer: 'ws', + liveReload: true, + hot: true, + }, + }, + // "sockjs" web socket serve + { + title: + 'should work and refresh content using hot module replacement when hot enabled', + options: { + allowedHosts: 'all', + + webSocketServer: 'sockjs', + hot: true, + }, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload enabled', + options: { + allowedHosts: 'all', + + webSocketServer: 'sockjs', + liveReload: true, + }, + }, + { + title: 'should not refresh content when hot and no live reload disabled', + options: { + allowedHosts: 'all', + + webSocketServer: 'sockjs', + hot: false, + liveReload: false, + }, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload disabled and hot enabled', + options: { + allowedHosts: 'all', + + webSocketServer: 'sockjs', + liveReload: false, + hot: true, + }, + }, + { + title: + 'should work and refresh content using live reload when live reload disabled and hot enabled', + options: { + allowedHosts: 'all', + + webSocketServer: 'sockjs', + liveReload: true, + hot: false, + }, + }, + { + title: + 'should work and refresh content using hot module replacement when live reload and hot enabled', + options: { + allowedHosts: 'all', + + webSocketServer: 'sockjs', + liveReload: true, + hot: true, + }, }, ]; modes.forEach((mode) => { - describe(mode.title, () => { - beforeAll((done) => { - fs.writeFileSync( - cssFilePath, - 'body { background-color: rgb(0, 0, 255); }' - ); - const options = Object.assign( - {}, - { - host: '0.0.0.0', - port, - static: false, - }, - mode.options - ); + const webSocketServerTitle = + mode.options && mode.options.webSocketServer + ? mode.options.webSocketServer + : 'default'; + + it(`${mode.title} (${webSocketServerTitle})`, async () => { + fs.writeFileSync( + cssFilePath, + 'body { background-color: rgb(0, 0, 255); }' + ); + + const compiler = webpack(reloadConfig); + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + }, + mode.options + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); - // we need a delay between file writing and the start - // of the compilation due to a bug in webpack@4, as not doing - // so results in the done hook being called repeatedly - setTimeout(() => { - testServer.startAwaitingCompilation(reloadConfig, options, done); - }, 2000); + return; + } + + resolve(); + }); }); - afterAll((done) => { - fs.unlinkSync(cssFilePath); - testServer.close(done); + await new Promise((resolve, reject) => { + request(`http://127.0.0.1:${devServerOptions.port}`) + .get('/main') + .expect(200, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); }); - describe('on browser client', () => { - it(`should reload ${ - mode.shouldRefresh ? 'with' : 'without' - } page refresh`, (done) => { - runBrowser().then(({ page, browser }) => { - let refreshed = false; - page.waitForNavigation({ waitUntil: 'load' }).then(() => { - page - .evaluate(() => { - const body = document.body; - const bgColor = getComputedStyle(body)['background-color']; - return bgColor; - }) - .then((color) => { - page.setRequestInterception(true).then(() => { - page.on('request', (req) => { - if ( - req.isNavigationRequest() && - req.frame() === page.mainFrame() && - req.url() === `http://localhost:${port}/main` - ) { - refreshed = true; - } - - req.continue(); - }); - page.waitForTimeout(reloadReadyDelay).then(() => { - fs.writeFileSync( - cssFilePath, - 'body { background-color: rgb(255, 0, 0); }' - ); - page.waitForTimeout(completeReloadDelay).then(() => { - page - .evaluate(() => { - const body = document.body; - const bgColor = - getComputedStyle(body)['background-color']; - - return bgColor; - }) - .then((color2) => { - expect(color).toEqual('rgb(0, 0, 255)'); - expect(color2).toEqual('rgb(255, 0, 0)'); - expect(refreshed).toEqual(mode.shouldRefresh); - - return browser.close(); - }) - .then(() => { - done(); - }); - }); - }); - }); - }); - }); - - page.goto(`http://localhost:${port}/main`); + const hot = + mode.options && typeof mode.options.hot !== 'undefined' + ? mode.options.hot + : true; + const liveReload = + mode.options && typeof mode.options.liveReload !== 'undefined' + ? mode.options.liveReload + : true; + + await new Promise((resolve) => { + const webSocketServer = + mode.options && typeof mode.options.webSocketServer !== 'undefined' + ? mode.options.webSocketServer + : 'ws'; + + const webSocketServerLaunched = hot || liveReload; + + if (webSocketServer === 'ws') { + const ws = new WebSocket( + `ws://127.0.0.1:${devServerOptions.port}/ws`, + { + headers: { + host: `127.0.0.1:${devServerOptions.port}`, + origin: `http://127.0.0.1:${devServerOptions.port}`, + }, + } + ); + + let opened = false; + let received = false; + let errored = false; + + ws.on('error', (error) => { + if (webSocketServerLaunched) { + errored = true; + } else if (!webSocketServerLaunched && /404/.test(error)) { + errored = true; + + ws.close(); + } + }); + + ws.on('open', () => { + opened = true; + }); + + ws.on('message', (data) => { + const message = JSON.parse(data); + + if (message.type === 'ok') { + received = true; + + ws.close(); + } }); + + ws.on('close', () => { + if (webSocketServerLaunched && opened && received && !errored) { + resolve(); + } else if (!webSocketServerLaunched && errored) { + resolve(); + } + }); + } else { + const sockjs = new SockJS( + `http://127.0.0.1:${devServerOptions.port}/ws` + ); + + let opened = false; + let received = false; + let errored = false; + + sockjs.onerror = () => { + errored = true; + }; + + sockjs.onopen = () => { + opened = true; + }; + + sockjs.onmessage = ({ data }) => { + const message = JSON.parse(data); + + if (message.type === 'ok') { + received = true; + + sockjs.close(); + } + }; + + sockjs.onclose = (event) => { + if (webSocketServerLaunched && opened && received && !errored) { + resolve(); + } else if ( + !webSocketServerLaunched && + event && + event.reason === 'Cannot connect to server' + ) { + resolve(); + } + }; + } + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + const pageErrors = []; + + let doneHotUpdate = false; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }) + .on('request', (requestObj) => { + if (/\.hot-update\.json$/.test(requestObj.url())) { + doneHotUpdate = true; + } + }); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const backgroundColorBefore = await page.evaluate(() => { + const body = document.body; + + return getComputedStyle(body)['background-color']; + }); + + expect(backgroundColorBefore).toEqual('rgb(0, 0, 255)'); + + fs.writeFileSync( + cssFilePath, + 'body { background-color: rgb(255, 0, 0); }' + ); + + let doNothing = false; + + if ((hot && liveReload) || (hot && !liveReload)) { + await page.waitForFunction( + () => + getComputedStyle(document.body)['background-color'] === + 'rgb(255, 0, 0)' + ); + + expect(doneHotUpdate).toBe(true); + } else if (liveReload) { + await page.waitForNavigation({ + waitUntil: 'networkidle0', + }); + } else { + doNothing = true; + } + + const backgroundColorAfter = await page.evaluate(() => { + const body = document.body; + + return getComputedStyle(body)['background-color']; + }); + + if (doNothing) { + expect(backgroundColorAfter).toEqual('rgb(0, 0, 255)'); + } else { + expect(backgroundColorAfter).toEqual('rgb(255, 0, 0)'); + } + + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + fs.unlinkSync(cssFilePath); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); }); }); }); diff --git a/test/e2e/logging.test.js b/test/e2e/logging.test.js index a3f877f7c9..fb852e4460 100644 --- a/test/e2e/logging.test.js +++ b/test/e2e/logging.test.js @@ -1,17 +1,15 @@ 'use strict'; -const testServer = require('../helpers/test-server'); +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const Server = require('../../lib/Server'); const config = require('../fixtures/client-config/webpack.config'); const runBrowser = require('../helpers/run-browser'); const port = require('../ports-map').logging; -const { beforeBrowserCloseDelay } = require('../helpers/puppeteer-constants'); describe('logging', () => { - const baseOptions = { - host: '0.0.0.0', - port, - }; - const webSocketServerTypesLog = [ + const webSocketServers = [ {}, { webSocketServer: 'sockjs' }, { webSocketServer: 'ws' }, @@ -19,74 +17,245 @@ describe('logging', () => { const cases = [ { - title: 'hot disabled', - options: { + title: 'should work and log message about live reloading is enabled', + devServerOptions: { hot: false, }, }, { - title: 'hot enabled', - options: { + title: + 'should work and log messages about hot and live reloading is enabled', + devServerOptions: { hot: true, }, }, { - title: 'liveReload disabled', - options: { + title: 'should work and log messages about hot is enabled', + devServerOptions: { liveReload: false, }, }, { - title: 'liveReload enabled', - options: { + title: + 'should work and log messages about hot and live reloading is enabled', + devServerOptions: { liveReload: true, }, }, { - title: 'liveReload & hot are disabled', - options: { + title: + 'should work and do not log messages about hot and live reloading is enabled', + devServerOptions: { liveReload: false, hot: false, }, }, { - title: 'client logging is none', - options: { + title: + 'should work and log messages about hot and live reloading is enabled', + devServerOptions: { + liveReload: true, + hot: true, + }, + }, + { + title: 'should work and log warnings by default', + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + 'warnings-webpack-plugin', + (compilation) => { + compilation.warnings.push( + new Error('Warning from compilation') + ); + } + ); + }, + }, + ], + }, + }, + { + title: 'should work and log errors by default', + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + 'warnings-webpack-plugin', + (compilation) => { + compilation.errors.push(new Error('Error from compilation')); + } + ); + }, + }, + ], + }, + }, + { + title: 'should work when the "client.logging" is "info"', + devServerOptions: { + client: { + logging: 'info', + }, + }, + }, + { + title: 'should work when the "client.logging" is "log"', + devServerOptions: { + client: { + logging: 'log', + }, + }, + }, + { + title: 'should work when the "client.logging" is "verbose"', + devServerOptions: { + client: { + logging: 'verbose', + }, + }, + }, + { + title: 'should work when the "client.logging" is "none"', + devServerOptions: { client: { logging: 'none', }, }, }, + { + title: 'should work and log only error', + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + 'warnings-webpack-plugin', + (compilation) => { + compilation.warnings.push( + new Error('Warning from compilation') + ); + compilation.errors.push(new Error('Error from compilation')); + } + ); + }, + }, + ], + }, + devServerOptions: { + client: { + logging: 'error', + }, + }, + }, + { + title: 'should work and log warning and errors', + webpackOptions: { + plugins: [ + { + apply(compiler) { + compiler.hooks.thisCompilation.tap( + 'warnings-webpack-plugin', + (compilation) => { + compilation.warnings.push( + new Error('Warning from compilation') + ); + compilation.errors.push(new Error('Error from compilation')); + } + ); + }, + }, + ], + }, + devServerOptions: { + client: { + logging: 'warn', + }, + }, + }, + { + title: 'should work and log static changes', + devServerOptions: { + static: path.resolve(__dirname, '../fixtures/client-config/static'), + }, + }, ]; - webSocketServerTypesLog.forEach(async (mode) => { - cases.forEach(async ({ title, options }) => { - title += ` (${ - Object.keys(mode).length ? mode.webSocketServer : 'default' - })`; + webSocketServers.forEach((webSocketServer) => { + cases.forEach((testCase) => { + it(`${testCase.title} (${ + webSocketServer.webSocketServer || 'default' + })`, async () => { + const compiler = webpack({ ...config, ...testCase.webpackOptions }); + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + }, + testCase.devServerOptions + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen( + devServerOptions.port, + devServerOptions.host, + (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + } + ); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; - options = { ...mode, ...options }; + page.on('console', (message) => { + consoleMessages.push(message); + }); - const testOptions = Object.assign({}, baseOptions, options); + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); - it(title, (done) => { - testServer.startAwaitingCompilation(config, testOptions, async () => { - const res = []; - const { page, browser } = await runBrowser(); + if (testCase.devServerOptions && testCase.devServerOptions.static) { + fs.writeFileSync( + path.join(testCase.devServerOptions.static, './foo.txt'), + 'Text' + ); - page.goto(`http://localhost:${port}/main`); - page.on('console', ({ _text }) => { - res.push(_text); + await page.waitForNavigation({ + waitUntil: 'networkidle0', }); + } - // wait for load before closing the browser - await page.waitForNavigation({ waitUntil: 'load' }); - await page.waitForTimeout(beforeBrowserCloseDelay); - await browser.close(); + expect( + consoleMessages.map((message) => + message + .text() + .replace(/\\/g, '/') + .replace( + new RegExp(process.cwd().replace(/\\/g, '/'), 'g'), + '' + ) + ) + ).toMatchSnapshot(); - // Order doesn't matter, maybe we should improve that in future - await expect(res.sort()).toMatchSnapshot(); - await testServer.close(done); + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); }); }); }); diff --git a/test/e2e/overlay.test.js b/test/e2e/overlay.test.js new file mode 100644 index 0000000000..257b9469c0 --- /dev/null +++ b/test/e2e/overlay.test.js @@ -0,0 +1,1040 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const prettier = require('prettier'); +const webpack = require('webpack'); +const Server = require('../../lib/Server'); +const config = require('../fixtures/overlay-config/webpack.config'); +const runBrowser = require('../helpers/run-browser'); +const port = require('../ports-map').overlay; + +class ErrorPlugin { + // eslint-disable-next-line class-methods-use-this + apply(compiler) { + compiler.hooks.thisCompilation.tap( + 'warnings-webpack-plugin', + (compilation) => { + compilation.errors.push(new Error('Error from compilation')); + } + ); + } +} + +class WarningPlugin { + // eslint-disable-next-line class-methods-use-this + apply(compiler) { + compiler.hooks.thisCompilation.tap( + 'warnings-webpack-plugin', + (compilation) => { + compilation.warnings.push(new Error('Warning from compilation')); + } + ); + } +} + +describe('overlay', () => { + it('should show on a warning for initial compilation', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on an error for initial compilation', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on a warning and error for initial compilation', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + new WarningPlugin().apply(compiler); + new ErrorPlugin().apply(compiler); + new ErrorPlugin().apply(compiler); + new ErrorPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should not show initially, then show on an error, then hide on fix', async () => { + const compiler = webpack(config); + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + let pageHtml = await page.evaluate(() => document.body.outerHTML); + let overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html initial' + ); + + const pathToFile = path.resolve( + __dirname, + '../fixtures/overlay-config/foo.js' + ); + const originalCode = fs.readFileSync(pathToFile); + + fs.writeFileSync(pathToFile, '`;'); + + await page.waitForSelector('#webpack-dev-server-client-overlay'); + + overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html with error' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + fs.writeFileSync(pathToFile, originalCode); + + await page.waitForSelector('#webpack-dev-server-client-overlay', { + hidden: true, + }); + + pageHtml = await page.evaluate(() => document.body.outerHTML); + overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html after fix error' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should not show initially, then show on an error, then show other error, then hide on fix', async () => { + const compiler = webpack(config); + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + let pageHtml = await page.evaluate(() => document.body.outerHTML); + let overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html initial' + ); + + const pathToFile = path.resolve( + __dirname, + '../fixtures/overlay-config/foo.js' + ); + const originalCode = fs.readFileSync(pathToFile); + + fs.writeFileSync(pathToFile, '`;'); + + await page.waitForSelector('#webpack-dev-server-client-overlay'); + + overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + let overlayFrame = await overlayHandle.contentFrame(); + let overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html with error' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + fs.writeFileSync(pathToFile, '`;a'); + + await page.waitForSelector('#webpack-dev-server-client-overlay', { + hidden: true, + }); + await page.waitForSelector('#webpack-dev-server-client-overlay'); + + overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + overlayFrame = await overlayHandle.contentFrame(); + overlayHtml = await overlayFrame.evaluate(() => document.body.outerHTML); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html with other error' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + fs.writeFileSync(pathToFile, originalCode); + + await page.waitForSelector('#webpack-dev-server-client-overlay', { + hidden: true, + }); + + pageHtml = await page.evaluate(() => document.body.outerHTML); + overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html after fix error' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should not show initially, then show on an error and allow to close', async () => { + const compiler = webpack(config); + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + let pageHtml = await page.evaluate(() => document.body.outerHTML); + let overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html initial' + ); + + const pathToFile = path.resolve( + __dirname, + '../fixtures/overlay-config/foo.js' + ); + const originalCode = fs.readFileSync(pathToFile); + + fs.writeFileSync(pathToFile, '`;'); + + await page.waitForSelector('#webpack-dev-server-client-overlay'); + + overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + pageHtml = await page.evaluate(() => document.body.outerHTML); + + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html with error' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + const frame = await page + .frames() + .find((item) => item.name() === 'webpack-dev-server-client-overlay'); + + const buttonHandle = await frame.$('button'); + + await buttonHandle.click(); + + await page.waitForSelector('#webpack-dev-server-client-overlay', { + hidden: true, + }); + + pageHtml = await page.evaluate(() => document.body.outerHTML); + overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html after close' + ); + + fs.writeFileSync(pathToFile, originalCode); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should not show on a warning when "client.overlay" is "false"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: false, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should not show on a warning when "client.overlay.warnings" is "false"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: { + warnings: false, + }, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on a warning when "client.overlay" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: true, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on a warning when "client.overlay.warnings" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: { + warnings: true, + }, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on a warning when "client.overlay.errors" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: { + errors: true, + }, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should not show on an error when "client.overlay" is "false"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: false, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should not show on an error when "client.overlay.errors" is "false"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: { + errors: false, + }, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + + expect(overlayHandle).toBe(null); + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on an error when "client.overlay" is "true"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: true, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on an error when "client.overlay.errors" is "true"', async () => { + const compiler = webpack(config); + + new ErrorPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: { + errors: true, + }, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should show on an error when "client.overlay.warnings" is "true"', async () => { + const compiler = webpack(config); + + new WarningPlugin().apply(compiler); + + const devServerOptions = Object.assign( + {}, + { + host: '0.0.0.0', + port, + client: { + overlay: { + warnings: true, + }, + }, + } + ); + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const pageHtml = await page.evaluate(() => document.body.outerHTML); + const overlayHandle = await page.$('#webpack-dev-server-client-overlay'); + const overlayFrame = await overlayHandle.contentFrame(); + const overlayHtml = await overlayFrame.evaluate( + () => document.body.outerHTML + ); + + expect(prettier.format(pageHtml, { parser: 'html' })).toMatchSnapshot( + 'page html' + ); + expect(prettier.format(overlayHtml, { parser: 'html' })).toMatchSnapshot( + 'overlay html' + ); + + await browser.close(); + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); +}); diff --git a/test/e2e/web-socket-server-and-transport.test.js b/test/e2e/web-socket-server-and-transport.test.js new file mode 100644 index 0000000000..6ca3e1135a --- /dev/null +++ b/test/e2e/web-socket-server-and-transport.test.js @@ -0,0 +1,320 @@ +'use strict'; + +const webpack = require('webpack'); +const Server = require('../../lib/Server'); +const defaultConfig = require('../fixtures/provide-plugin-default/webpack.config'); +const sockjsConfig = require('../fixtures/provide-plugin-sockjs-config/webpack.config'); +const wsConfig = require('../fixtures/provide-plugin-ws-config/webpack.config'); +const customConfig = require('../fixtures/provide-plugin-custom/webpack.config'); +const runBrowser = require('../helpers/run-browser'); +const port = require('../ports-map')['web-socket-server-and-transport.test']; + +describe('web socket server and transport', () => { + it('should use default transport ("ws")', async () => { + const compiler = webpack(defaultConfig); + const devServerOptions = { + port, + host: '0.0.0.0', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + + page.on('console', (message) => { + consoleMessages.push(message); + }); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const isCorrectTransport = await page.evaluate( + () => window.injectedClient === window.expectedClient + ); + + expect(isCorrectTransport).toBe(true); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(); + + await browser.close(); + + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should use "sockjs" transport', async () => { + const compiler = webpack(sockjsConfig); + const devServerOptions = { + port, + host: '0.0.0.0', + client: { + transport: 'sockjs', + }, + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + + page.on('console', (message) => { + consoleMessages.push(message); + }); + + await page.goto(`http://localhost:${port}/main.js`, { + waitUntil: 'networkidle0', + }); + + const isCorrectTransport = await page.evaluate( + () => window.injectedClient === window.expectedClient + ); + + expect(isCorrectTransport).toBe(true); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(); + + await browser.close(); + + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should use "ws" transport', async () => { + const compiler = webpack(wsConfig); + const devServerOptions = { + port, + host: '0.0.0.0', + client: { + transport: 'ws', + }, + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + + page.on('console', (message) => { + consoleMessages.push(message); + }); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const isCorrectTransport = await page.evaluate( + () => window.injectedClient === window.expectedClient + ); + + expect(isCorrectTransport).toBe(true); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(); + + await browser.close(); + + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should use "sockjs" transport and "sockjs" web socket server', async () => { + const compiler = webpack(sockjsConfig); + const devServerOptions = { + port, + host: '0.0.0.0', + client: { + transport: 'sockjs', + }, + webSocketServer: 'sockjs', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + + page.on('console', (message) => { + consoleMessages.push(message); + }); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const isCorrectTransport = await page.evaluate( + () => window.injectedClient === window.expectedClient + ); + + expect(isCorrectTransport).toBe(true); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(); + + await browser.close(); + + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should use "ws" transport and "ws" web socket server', async () => { + const compiler = webpack(wsConfig); + const devServerOptions = { + port, + host: '0.0.0.0', + client: { + transport: 'ws', + }, + webSocketServer: 'ws', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + + page.on('console', (message) => { + consoleMessages.push(message); + }); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const isCorrectTransport = await page.evaluate( + () => window.injectedClient === window.expectedClient + ); + + expect(isCorrectTransport).toBe(true); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(); + + await browser.close(); + + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); + + it('should use custom transport and "sockjs" web socket server', async () => { + const compiler = webpack(customConfig); + const devServerOptions = { + port, + host: '0.0.0.0', + client: { + transport: require.resolve( + '../fixtures/custom-client/CustomSockJSClient' + ), + }, + webSocketServer: 'sockjs', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const consoleMessages = []; + + page.on('console', (message) => { + consoleMessages.push(message); + }); + + await page.goto(`http://localhost:${port}/main`, { + waitUntil: 'networkidle0', + }); + + const isCorrectTransport = await page.evaluate( + () => window.injectedClient === window.expectedClient + ); + + expect(isCorrectTransport).toBe(true); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(); + + await browser.close(); + + await new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }); +}); diff --git a/test/e2e/web-socket-server-and-url.test.js b/test/e2e/web-socket-server-and-url.test.js deleted file mode 100644 index d4f6230ce6..0000000000 --- a/test/e2e/web-socket-server-and-url.test.js +++ /dev/null @@ -1,603 +0,0 @@ -'use strict'; - -const express = require('express'); -const internalIp = require('internal-ip'); -const { createProxyMiddleware } = require('http-proxy-middleware'); -const testServer = require('../helpers/test-server'); -const config = require('../fixtures/client-config/webpack.config'); -const runBrowser = require('../helpers/run-browser'); -const [port1, port2, port3] = require('../ports-map').ClientOptions; -const { beforeBrowserCloseDelay } = require('../helpers/puppeteer-constants'); - -const webSocketServerTypes = ['ws', 'sockjs']; - -for (const webSocketServerType of webSocketServerTypes) { - const websocketUrlProtocol = webSocketServerType === 'ws' ? 'ws' : 'http'; - - // Using Chrome DevTools protocol directly for now: - // TODO refactor, we should wait ws connection to specific location then wait it will be finished success and run callback - const waitForTest = (browser, page, filter, callback) => { - if (webSocketServerType === 'sockjs') { - return page - .waitForRequest((requestObj) => requestObj.url().match(filter)) - .then((requestObj) => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => { - callback(requestObj.url()); - }); - }); - }); - } - - const client = page._client; - - client.on('Network.webSocketCreated', (event) => { - page.waitForTimeout(beforeBrowserCloseDelay).then(() => { - browser.close().then(() => callback(event.url)); - }); - }); - }; - - describe(`should work behind proxy, when hostnames are same and ports are different (${webSocketServerType})`, () => { - const devServerHost = '127.0.0.1'; - const devServerPort = port1; - const proxyHost = devServerHost; - const proxyPort = port2; - - function startProxy(cb) { - const proxy = express(); - - proxy.use( - '/', - createProxyMiddleware({ - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: 'warn', - }) - ); - - return proxy.listen(proxyPort, proxyHost, cb); - } - - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: devServerPort, - host: devServerHost, - allowedHosts: 'all', - hot: true, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('behind a proxy', () => { - let proxy; - - beforeAll((done) => { - proxy = startProxy(() => { - done(); - }); - }); - - afterAll((done) => { - proxy.close(() => { - done(); - }); - }); - - it('requests websocket through the proxy', (done) => { - runBrowser().then(async ({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://${devServerHost}:${devServerPort}/ws` - ); - - done(); - }); - - page.goto(`http://${proxyHost}:${proxyPort}/main`); - }); - }); - }); - }); - - describe(`should work behind proxy, when hostnames are different and ports are same (${webSocketServerType})`, () => { - const devServerHost = '127.0.0.1'; - const devServerPort = port1; - const proxyHost = internalIp.v4.sync(); - const proxyPort = port1; - - function startProxy(cb) { - const proxy = express(); - - proxy.use( - '/', - createProxyMiddleware({ - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: 'warn', - }) - ); - - return proxy.listen(proxyPort, proxyHost, cb); - } - - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: devServerPort, - host: devServerHost, - allowedHosts: 'all', - hot: true, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('behind a proxy', () => { - let proxy; - - beforeAll((done) => { - proxy = startProxy(() => { - done(); - }); - }); - - afterAll((done) => { - proxy.close(() => { - done(); - }); - }); - - it('requests websocket through the proxy', (done) => { - runBrowser().then(async ({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://${devServerHost}:${devServerPort}/ws` - ); - - done(); - }); - - page.goto(`http://${proxyHost}:${proxyPort}/main`); - }); - }); - }); - }); - - describe(`should work behind proxy, when hostnames are different and ports are different (${webSocketServerType})`, () => { - const devServerHost = '127.0.0.1'; - const devServerPort = port1; - const proxyHost = internalIp.v4.sync(); - const proxyPort = port2; - - function startProxy(cb) { - const proxy = express(); - - proxy.use( - '/', - createProxyMiddleware({ - target: `http://${devServerHost}:${devServerPort}`, - ws: true, - changeOrigin: true, - logLevel: 'warn', - }) - ); - - return proxy.listen(proxyPort, proxyHost, cb); - } - - beforeAll((done) => { - const options = { - client: { - webSocketURL: { - host: devServerHost, - }, - }, - port: devServerPort, - host: devServerHost, - webSocketServer: webSocketServerType, - allowedHosts: 'all', - hot: true, - static: true, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('behind a proxy', () => { - let proxy; - - beforeAll((done) => { - proxy = startProxy(() => { - done(); - }); - }); - - afterAll((done) => { - proxy.close(() => { - done(); - }); - }); - - it('requests websocket through the proxy', (done) => { - runBrowser().then(async ({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://${devServerHost}:${devServerPort}/ws` - ); - - done(); - }); - - page.goto(`http://${proxyHost}:${proxyPort}/main`); - }); - }); - }); - }); - - describe('should work with the "client.webSocketURL.protocol" option', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - protocol: 'ws:', - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://localhost:${port2}/ws` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with the "client.webSocketURL.protocol" option using "auto:" value', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - protocol: 'auto:', - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://localhost:${port2}/ws` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws"', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - protocol: 'http:', - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://localhost:${port2}/ws` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with the "client.webSocketURL.host" option', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - host: 'myhost.test', - }, - }, - }; - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://myhost.test:${port2}/ws` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with the "client.webSocketURL.port" option', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - port: port3, - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://localhost:${port3}/ws` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with the "client.webSocketURL.port" option as "string"', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - port: `${port3}`, - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://localhost:${port3}/ws` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with "client.webSocketURL.port" and "client.webSocketURL.path" options', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - path: '/foo/test/bar/', - port: port3, - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /foo\/test\/bar/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://localhost:${port3}/foo/test/bar` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string', () => { - beforeAll((done) => { - const options = { - webSocketServer: { - type: webSocketServerType, - options: { - host: '0.0.0.0', - port: `${port2}`, - }, - }, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - port: `${port3}`, - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /ws/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://localhost:${port3}/ws` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with "client.webSocketURL.host", "webSocketServer.options.port" and "webSocketServer.options.path" options', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: { - host: 'myhost', - port: port3, - path: '/foo/test/bar/', - }, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('uses correct host, port, and path', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /foo\/test\/bar/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://myhost:${port3}/foo/test/bar` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); - - describe('should work with the "client.webSocketURL" option as "string"', () => { - beforeAll((done) => { - const options = { - webSocketServer: webSocketServerType, - port: port2, - host: '0.0.0.0', - client: { - webSocketURL: `ws://myhost.test:${port2}/foo/test/bar/`, - }, - }; - - testServer.startAwaitingCompilation(config, options, done); - }); - - afterAll(testServer.close); - - describe('browser client', () => { - it('should work', (done) => { - runBrowser().then(({ page, browser }) => { - waitForTest(browser, page, /foo\/test\/bar/, (websocketUrl) => { - expect(websocketUrl).toContain( - `${websocketUrlProtocol}://myhost.test:${port2}/foo/test/bar` - ); - - done(); - }); - - page.goto(`http://localhost:${port2}/main`); - }); - }); - }); - }); -} diff --git a/test/e2e/web-socket-server-url.test.js b/test/e2e/web-socket-server-url.test.js new file mode 100644 index 0000000000..9d7cbff5d1 --- /dev/null +++ b/test/e2e/web-socket-server-url.test.js @@ -0,0 +1,1988 @@ +'use strict'; + +const express = require('express'); +const webpack = require('webpack'); +const internalIp = require('internal-ip'); +const { createProxyMiddleware } = require('http-proxy-middleware'); +const Server = require('../../lib/Server'); +const config = require('../fixtures/client-config/webpack.config'); +const runBrowser = require('../helpers/run-browser'); +const [port1, port2] = require('../ports-map')['web-socket-server-url']; + +const webSocketServers = ['ws', 'sockjs']; + +describe('web socket server URL', () => { + for (const webSocketServer of webSocketServers) { + const websocketURLProtocol = webSocketServer === 'ws' ? 'ws' : 'http'; + + it(`should work behind proxy, when hostnames are same and ports are different ("${webSocketServer}")`, async () => { + const devServerHost = '127.0.0.1'; + const devServerPort = port1; + const proxyHost = devServerHost; + const proxyPort = port2; + + function startProxy(callback) { + const app = express(); + app.use( + '/', + createProxyMiddleware({ + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: 'warn', + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise((resolve) => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const compiler = webpack(config); + const devServerOptions = { + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://${proxyHost}:${proxyPort}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://${devServerHost}:${devServerPort}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + proxy.close(); + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work behind proxy, when hostnames are different and ports are same ("${webSocketServer}")`, async () => { + const devServerHost = '127.0.0.1'; + const devServerPort = port1; + const proxyHost = internalIp.v4.sync(); + const proxyPort = port1; + + function startProxy(callback) { + const app = express(); + app.use( + '/', + createProxyMiddleware({ + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: 'warn', + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise((resolve) => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const compiler = webpack(config); + const devServerOptions = { + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://${proxyHost}:${proxyPort}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://${devServerHost}:${devServerPort}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + proxy.close(); + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work behind proxy, when hostnames are different and ports are different ("${webSocketServer}")`, async () => { + const devServerHost = '127.0.0.1'; + const devServerPort = port1; + const proxyHost = internalIp.v4.sync(); + const proxyPort = port2; + + function startProxy(callback) { + const app = express(); + app.use( + '/', + createProxyMiddleware({ + target: `http://${devServerHost}:${devServerPort}`, + ws: true, + changeOrigin: true, + logLevel: 'warn', + }) + ); + + return app.listen(proxyPort, proxyHost, callback); + } + + const proxy = await new Promise((resolve) => { + const proxyCreated = startProxy(() => { + resolve(proxyCreated); + }); + }); + + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + host: devServerHost, + }, + }, + webSocketServer, + port: devServerPort, + host: devServerHost, + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://${proxyHost}:${proxyPort}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://${devServerHost}:${devServerPort}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + proxy.close(); + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.protocol" option ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + protocol: 'ws:', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://localhost:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://localhost:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.protocol" option using "auto:" value ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + protocol: 'auto:', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://localhost:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://localhost:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.protocol" option using "http:" value and covert to "ws:" ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + protocol: 'http:', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://localhost:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://localhost:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.host" option ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + host: '127.0.0.1', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.host" option using "0.0.0.0" value ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + host: '0.0.0.0', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.port" option ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: port1, + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.port" option as string ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: `${port1}`, + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with "client.webSocketURL.port" and "webSocketServer.options.port" options as string ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + webSocketServer: { + type: webSocketServer, + options: { + host: '0.0.0.0', + // "sockjs" doesn't support external server + port: webSocketServer === 'sockjs' ? `${port1}` : `${port2}`, + }, + }, + port: port1, + host: '0.0.0.0', + client: { + webSocketURL: { + port: webSocketServer === 'sockjs' ? `${port1}` : `${port2}`, + }, + }, + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + webSocketServer === 'sockjs' + ? `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + : `${websocketURLProtocol}://127.0.0.1:${port2}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.port" option using "0" value ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + port: 0, + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.path" option ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + path: '/ws', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.username" option ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + username: 'zenitsu', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://zenitsu@127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.password" option ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + password: 'chuntaro', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + // "sockjs" has bug with parsing URL + webSocketServer === 'ws' + ? `${websocketURLProtocol}://:chuntaro@127.0.0.1:${port1}/ws` + : `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.username" and "client.webSocketURL.password" option ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + username: 'zenitsu', + password: 'chuntaro', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://zenitsu:chuntaro@127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL.path" option and custom web socket server "path" ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + path: '/custom-ws', + }, + }, + webSocketServer: { + type: webSocketServer, + options: { + path: '/custom-ws', + }, + }, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/custom-ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/custom-ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work when "port" option is "auto" ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + webSocketServer, + port: 'auto', + host: '0.0.0.0', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:8080/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:8080/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work when "host" option is IPv4 ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + webSocketServer, + port: port1, + host: internalIp.v4.sync(), + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://${internalIp.v4.sync()}:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://${internalIp.v4.sync()}:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with "client.webSocketURL.*" options ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: { + protocol: 'ws:', + host: '127.0.0.1', + port: port1, + path: '/ws', + }, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work with the "client.webSocketURL" option as "string" ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: `ws://127.0.0.1:${port1}/ws`, + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + const webSocketRequests = []; + + if (webSocketServer === 'ws') { + const client = page._client; + + client.on('Network.webSocketCreated', (test) => { + webSocketRequests.push(test); + }); + } else { + page.on('request', (request) => { + if (/\/ws\//.test(request.url())) { + webSocketRequests.push({ url: request.url() }); + } + }); + } + + await page.goto(`http://127.0.0.1:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + const webSocketRequest = webSocketRequests[0]; + + expect(webSocketRequest.url).toContain( + `${websocketURLProtocol}://127.0.0.1:${port1}/ws` + ); + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect(pageErrors).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should work and throw an error on invalid web socket URL ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: 'unknown://unknown.unknown/unknown', + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + await page.goto(`http://localhost:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + expect(consoleMessages.map((message) => message.text())).toMatchSnapshot( + 'console messages' + ); + expect( + pageErrors.map((pageError) => pageError.message.split('\n')[0]) + ).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + + it(`should not work and output disconnect wrong web socket URL ("${webSocketServer}")`, async () => { + const compiler = webpack(config); + const devServerOptions = { + client: { + webSocketURL: 'ws://unknown.unknown/unknown', + }, + webSocketServer, + port: port1, + host: '0.0.0.0', + allowedHosts: 'all', + }; + const server = new Server(devServerOptions, compiler); + + await new Promise((resolve, reject) => { + server.listen(devServerOptions.port, devServerOptions.host, (error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + + const { page, browser } = await runBrowser(); + + const pageErrors = []; + const consoleMessages = []; + + page + .on('console', (message) => { + consoleMessages.push(message); + }) + .on('pageerror', (error) => { + pageErrors.push(error); + }); + + await page.goto(`http://localhost:${port1}/main`, { + waitUntil: 'networkidle0', + }); + + expect( + consoleMessages.map((message) => + message.text().replace(/:[\d]+/g, ':') + ) + ).toMatchSnapshot('console messages'); + expect( + pageErrors.map((pageError) => pageError.message.split('\n')[0]) + ).toMatchSnapshot('page errors'); + + await browser.close(); + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + + return; + } + + resolve(); + }); + }); + }); + } +}); diff --git a/test/fixtures/client-config/static/foo.txt b/test/fixtures/client-config/static/foo.txt new file mode 100644 index 0000000000..4add785daf --- /dev/null +++ b/test/fixtures/client-config/static/foo.txt @@ -0,0 +1 @@ +Text \ No newline at end of file diff --git a/test/fixtures/custom-client/CustomSockJSClient.js b/test/fixtures/custom-client/CustomSockJSClient.js index b3d22e653d..53f88bd713 100644 --- a/test/fixtures/custom-client/CustomSockJSClient.js +++ b/test/fixtures/custom-client/CustomSockJSClient.js @@ -4,21 +4,14 @@ no-unused-vars */ const SockJS = require('sockjs-client/dist/sockjs'); -const BaseClient = require('../../../client/clients/BaseClient'); -module.exports = class SockJSClient extends BaseClient { +module.exports = class SockJSClient { constructor(url) { - super(); - this.sock = new SockJS( url.replace(/^ws:/i, 'http://').replace(/^wss:/i, 'https://') ); } - static getClientPath(options) { - return require.resolve('./CustomSockJSClient'); - } - onOpen(f) { this.sock.onopen = () => { console.log('open'); diff --git a/test/fixtures/overlay-config/foo.js b/test/fixtures/overlay-config/foo.js new file mode 100644 index 0000000000..eab26534f3 --- /dev/null +++ b/test/fixtures/overlay-config/foo.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('Hey.'); diff --git a/test/fixtures/overlay-config/webpack.config.js b/test/fixtures/overlay-config/webpack.config.js new file mode 100644 index 0000000000..386d693e66 --- /dev/null +++ b/test/fixtures/overlay-config/webpack.config.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = { + mode: 'development', + context: __dirname, + stats: 'none', + entry: './foo.js', + output: { + path: '/', + }, + infrastructureLogging: { + level: 'warn', + }, +}; diff --git a/test/fixtures/provide-plugin-custom/foo.js b/test/fixtures/provide-plugin-custom/foo.js new file mode 100644 index 0000000000..33a9ea7e29 --- /dev/null +++ b/test/fixtures/provide-plugin-custom/foo.js @@ -0,0 +1,8 @@ +'use strict'; + +// 'npm run prepare' must be run for this to work during testing +const CustomClient = require('../../fixtures/custom-client/CustomSockJSClient'); + +window.expectedClient = CustomClient; +// eslint-disable-next-line camelcase, no-undef +window.injectedClient = __webpack_dev_server_client__; diff --git a/test/fixtures/provide-plugin-custom/webpack.config.js b/test/fixtures/provide-plugin-custom/webpack.config.js new file mode 100644 index 0000000000..c6d889a916 --- /dev/null +++ b/test/fixtures/provide-plugin-custom/webpack.config.js @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = { + mode: 'development', + context: __dirname, + stats: 'none', + entry: './foo.js', + output: { + path: '/', + }, + node: false, + infrastructureLogging: { + level: 'warn', + }, +}; diff --git a/test/fixtures/provide-plugin-default/foo.js b/test/fixtures/provide-plugin-default/foo.js new file mode 100644 index 0000000000..dbc1f86da8 --- /dev/null +++ b/test/fixtures/provide-plugin-default/foo.js @@ -0,0 +1,8 @@ +'use strict'; + +// 'npm run prepare' must be run for this to work during testing +const WebsocketClient = require('../../../client/clients/WebsocketClient'); + +window.expectedClient = WebsocketClient; +// eslint-disable-next-line camelcase, no-undef +window.injectedClient = __webpack_dev_server_client__; diff --git a/test/fixtures/provide-plugin-default/webpack.config.js b/test/fixtures/provide-plugin-default/webpack.config.js new file mode 100644 index 0000000000..c6d889a916 --- /dev/null +++ b/test/fixtures/provide-plugin-default/webpack.config.js @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = { + mode: 'development', + context: __dirname, + stats: 'none', + entry: './foo.js', + output: { + path: '/', + }, + node: false, + infrastructureLogging: { + level: 'warn', + }, +}; diff --git a/test/helpers/run-browser.js b/test/helpers/run-browser.js index 74f63652c3..da04638119 100644 --- a/test/helpers/run-browser.js +++ b/test/helpers/run-browser.js @@ -25,11 +25,13 @@ function runBrowser(config) { }) .then((launchedBrowser) => { browser = launchedBrowser; + return browser.newPage(); }) .then((newPage) => { page = newPage; page.emulate(options); + resolve({ page, browser }); }) .catch(reject); diff --git a/test/helpers/test-bin.js b/test/helpers/test-bin.js index acfc16e4c0..078019cb73 100644 --- a/test/helpers/test-bin.js +++ b/test/helpers/test-bin.js @@ -14,7 +14,7 @@ const basicConfigPath = path.resolve( '../fixtures/cli/webpack.config.js' ); -function testBin(testArgs, configPath) { +const testBin = (testArgs, configPath) => { const cwd = process.cwd(); const env = { WEBPACK_CLI_HELP_WIDTH: 2048, @@ -39,9 +39,9 @@ function testBin(testArgs, configPath) { } return execa('node', args, { cwd, env, timeout: 10000 }); -} +}; -function normalizeStderr(stderr, options = {}) { +const normalizeStderr = (stderr, options = {}) => { let normalizedStderr = stripAnsi(stderr); normalizedStderr = normalizedStderr @@ -76,17 +76,22 @@ function normalizeStderr(stderr, options = {}) { ); } + normalizedStderr = normalizedStderr.split('\n'); + normalizedStderr = normalizedStderr.filter( + (item) => !/.+wait until bundle finished.*(\n)?/g.test(item) + ); + + normalizedStderr = normalizedStderr.join('\n'); + normalizedStderr = normalizedStderr.replace(/:[0-9]+\//g, ':/'); if (options.https) { // We have deprecation warning on windows in some cases normalizedStderr = normalizedStderr.split('\n'); - normalizedStderr = normalizedStderr.filter( (item) => !/DeprecationWarning: The legacy HTTP parser is deprecated/g.test(item) ); - normalizedStderr = normalizedStderr.join('\n'); } @@ -110,6 +115,6 @@ function normalizeStderr(stderr, options = {}) { } return normalizedStderr; -} +}; module.exports = { normalizeStderr, testBin }; diff --git a/test/helpers/test-server.js b/test/helpers/test-server.js index 90620a24d5..4b916cc538 100644 --- a/test/helpers/test-server.js +++ b/test/helpers/test-server.js @@ -58,6 +58,7 @@ function startAwaitingCompilationFullSetup(config, options, done) { const ready = () => { readyCount += 1; + if (readyCount === 2) { done(); } diff --git a/test/integration/ModuleFederation.test.js b/test/integration/ModuleFederation.test.js index bf4faa5bbf..afca1fe535 100644 --- a/test/integration/ModuleFederation.test.js +++ b/test/integration/ModuleFederation.test.js @@ -6,7 +6,7 @@ const testServer = require('../helpers/test-server'); const simpleConfig = require('../fixtures/module-federation-config/webpack.config'); const objectEntryConfig = require('../fixtures/module-federation-config/webpack.object-entry.config'); const multiConfig = require('../fixtures/module-federation-config/webpack.multi.config'); -const port = require('../ports-map').ModuleFederation; +const port = require('../ports-map')['module-federation']; const isWebpack5 = require('../helpers/isWebpack5'); let pluginConfig; diff --git a/test/integration/MultiCompiler.test.js b/test/integration/MultiCompiler.test.js index dc472a5a13..58b8d14ef9 100644 --- a/test/integration/MultiCompiler.test.js +++ b/test/integration/MultiCompiler.test.js @@ -3,7 +3,7 @@ const request = require('supertest'); const testServer = require('../helpers/test-server'); const config = require('../fixtures/multi-compiler-config/webpack.config'); -const port = require('../ports-map').MultiCompiler; +const port = require('../ports-map')['multi-compiler']; describe('multi compiler', () => { let server; @@ -16,7 +16,6 @@ describe('multi compiler', () => { afterAll(testServer.close); - // TODO: this is a very basic test, optimally it should test multiple configs etc. it('should handle GET request to bundle', (done) => { req .get('/main.js') diff --git a/test/integration/UniversalCompiler.test.js b/test/integration/UniversalCompiler.test.js index 3d07354870..bba7092248 100644 --- a/test/integration/UniversalCompiler.test.js +++ b/test/integration/UniversalCompiler.test.js @@ -3,7 +3,7 @@ const request = require('supertest'); const testServer = require('../helpers/test-server'); const config = require('../fixtures/universal-compiler-config/webpack.config'); -const port = require('../ports-map').UniversalCompiler; +const port = require('../ports-map')['universal-compiler']; describe('universal compiler', () => { let server; diff --git a/test/ports-map.js b/test/ports-map.js index 29b8fa2bd1..4eb929a2d9 100644 --- a/test/ports-map.js +++ b/test/ports-map.js @@ -1,58 +1,59 @@ 'use strict'; -// test-file-name: the number of ports // important: new port mappings must be added to the bottom of this list -const portsList = { - cli: 2, - sockJSClient: 1, - SockJSServer: 1, - Client: 1, - ClientOptions: 3, +const listOfTests = { + // CLI tests + 'cli-basic': 1, + 'cli-port-option': 1, + // e2e tests + bundle: 1, + 'sockjs-client': 1, + 'web-socket-client': 1, + 'hot-and-live-reload': 1, logging: 1, - MultiCompiler: 1, - UniversalCompiler: 1, - Server: 1, - routes: 1, - 'onAfterSetupMiddleware-option': 1, - 'onBeforeSetupMiddleware-option': 1, + overlay: 1, + progress: 1, + 'web-socket-server-and-transport.test': 1, + 'web-socket-server-url': 2, + // integration tests + 'module-federation': 1, + 'multi-compiler': 1, + 'universal-compiler': 1, + // unit tests + bonjour: 1, + 'client-option': 1, 'compress-option': 1, - 'static-directory-option': 1, 'headers-option': 1, - 'historyApiFallback-option': 1, + 'history-api-fallback-option': 1, 'host-option': 1, 'hot-option': 1, 'http2-option': 1, 'https-option': 1, - 'liveReload-option': 1, - 'mineTypes-option': 1, - 'onListening-option': 1, + 'mine-types-option': 1, + 'on-after-setup-middleware-option': 1, + 'on-before-setup-middleware-option': 1, + 'on-listening-option': 1, 'open-option': 1, 'port-option': 1, 'proxy-option': 4, - 'webSocketServer-option': 1, - 'client-option': 1, + server: 1, + 'setup-exit-signals-option': 1, + 'static-directory-option': 1, + 'static-public-path-option': 1, 'stats-option': 1, - ProvidePlugin: 1, - WebsocketClient: 1, - WebsocketServer: 1, - TransportMode: 1, - Progress: 1, - Iframe: 1, - SocketInjection: 1, - 'static-publicPath-option': 1, - 'contentBasePublicPath-option': 1, - bundle: 1, - ModuleFederation: 1, - 'setupExitSignals-option': 1, - 'watchFiles-option': 1, - bonjour: 1, + 'watch-files-option': 1, + 'web-socket-server-option': 1, + 'sockjs-server': 1, + 'web-socket-server': 1, + routes: 1, }; let startPort = 8089; + const ports = {}; -Object.keys(portsList).forEach((key) => { - const value = portsList[key]; +Object.keys(listOfTests).forEach((key) => { + const value = listOfTests[key]; ports[key] = value === 1 @@ -60,4 +61,14 @@ Object.keys(portsList).forEach((key) => { : [...new Array(value)].map(() => (startPort += 1)); }); -module.exports = ports; +module.exports = new Proxy(ports, { + get(target, name) { + if (!target[name]) { + throw new Error( + `Requested "${name}" port(s) for tests not found, please update "test/ports-map.js".` + ); + } + + return target[name]; + }, +}); diff --git a/test/server/Server.test.js b/test/server/Server.test.js index e7e62069c8..400542bb3e 100644 --- a/test/server/Server.test.js +++ b/test/server/Server.test.js @@ -8,11 +8,9 @@ const sockjs = require('sockjs/lib/transport'); const findPort = require('../../lib/utils/findPort'); const Server = require('../../lib/Server'); const config = require('../fixtures/simple-config/webpack.config'); -const port = require('../ports-map').Server; +const port = require('../ports-map').server; const isWebpack5 = require('../helpers/isWebpack5'); -const getFreePort = Server.getFreePort; - jest.mock('sockjs/lib/transport'); const baseDevConfig = { @@ -127,6 +125,8 @@ describe('Server', () => { const emitError = () => server.server.emit('error', new Error('Error !!!')); expect(emitError).toThrowError(); + + server.close(); }); // issue: https://github.com/webpack/webpack-dev-server/issues/1724 @@ -473,11 +473,12 @@ describe('Server', () => { }); }); - describe('getFreePort', () => { + describe('Server.getFreePort', () => { let dummyServers = []; afterEach(() => { - delete process.env.DEFAULT_PORT_RETRY; + delete process.env.WEBPACK_DEV_SERVER_BASE_PORT; + delete process.env.WEBPACK_DEV_SERVER_PORT_RETRY; return dummyServers .reduce( @@ -496,6 +497,8 @@ describe('Server', () => { }); function createDummyServers(n) { + process.env.WEBPACK_DEV_SERVER_BASE_PORT = 60000; + return (Array.isArray(n) ? n : [...new Array(n)]).reduce( (p, _, i) => p.then( @@ -505,7 +508,7 @@ describe('Server', () => { dummyServers.push(server); - server.listen(8080 + i, () => { + server.listen(60000 + i, '0.0.0.0', () => { resolve(); }); @@ -518,79 +521,66 @@ describe('Server', () => { ); } - it('should returns the port when the port is specified', () => { - process.env.DEFAULT_PORT_RETRY = 5; + it('should returns the port when the port is specified', async () => { + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 1; - return getFreePort(8082).then((freePort) => { - expect(freePort).toEqual(8082); - }); + const freePort = await Server.getFreePort(8082); + expect(freePort).toEqual(8082); }); - it('should returns the port when the port is null', () => { + it('should returns the port when the port is null', async () => { const retryCount = 2; - process.env.DEFAULT_PORT_RETRY = 2; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 2; - return createDummyServers(retryCount) - .then(() => getFreePort(null)) - .then((freePort) => { - expect(freePort).toEqual(8080 + retryCount); - }); + await createDummyServers(retryCount); + const freePort = await Server.getFreePort(null); + expect(freePort).toEqual(60000 + retryCount); }); - it('should returns the port when the port is undefined', () => { - const retryCount = 2; + it('should returns the port when the port is undefined', async () => { + const retryCount = 3; - process.env.DEFAULT_PORT_RETRY = 2; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 3; - return ( - createDummyServers(retryCount) - // eslint-disable-next-line no-undefined - .then(() => getFreePort(undefined)) - .then((freePort) => { - expect(freePort).toEqual(8080 + retryCount); - }) - ); + await createDummyServers(retryCount); + // eslint-disable-next-line no-undefined + const freePort = await Server.getFreePort(undefined); + expect(freePort).toEqual(60000 + retryCount); }); - it('should retry finding the port for up to defaultPortRetry times (number)', () => { + it('should retry finding the port for up to defaultPortRetry times (number)', async () => { const retryCount = 3; - process.env.DEFAULT_PORT_RETRY = retryCount; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = retryCount; - return createDummyServers(retryCount) - .then(() => getFreePort()) - .then((freePort) => { - expect(freePort).toEqual(8080 + retryCount); - }); + await createDummyServers(retryCount); + const freePort = await Server.getFreePort(); + expect(freePort).toEqual(60000 + retryCount); }); - it('should retry finding the port for up to defaultPortRetry times (string)', () => { + it('should retry finding the port for up to defaultPortRetry times (string)', async () => { const retryCount = 3; - process.env.DEFAULT_PORT_RETRY = `${retryCount}`; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = `${retryCount}`; - return createDummyServers(retryCount) - .then(() => getFreePort()) - .then((freePort) => { - expect(freePort).toEqual(8080 + retryCount); - }); + await createDummyServers(retryCount); + const freePort = await Server.getFreePort(); + expect(freePort).toEqual(60000 + retryCount); }); // TODO: fix me, Flaky on CI - it.skip('should retry finding the port when serial ports are busy', () => { - const busyPorts = [8080, 8081, 8082, 8083]; + it('should retry finding the port when serial ports are busy', async () => { + const busyPorts = [60000, 60001, 60002, 60003, 60004, 60005, 60006]; - process.env.DEFAULT_PORT_RETRY = 3; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 6; - return createDummyServers(busyPorts) - .then(() => getFreePort()) - .then((freePort) => { - expect(freePort).toEqual(8080 + busyPorts.length); - }); + await createDummyServers(busyPorts); + const freePort = await Server.getFreePort(); + expect(freePort).toEqual(60000 + busyPorts.length); }); - it("should throws the error when the port isn't found", () => { + it("should throws the error when the port isn't found", async () => { expect.assertions(1); jest.mock('portfinder', () => { @@ -599,23 +589,20 @@ describe('Server', () => { }; }); - const retryCount = 1; + process.env.WEBPACK_DEV_SERVER_PORT_RETRY = 1; - process.env.DEFAULT_PORT_RETRY = 0; - - return createDummyServers(retryCount) - .then(() => getFreePort()) - .catch((err) => { - expect(err.message).toMatchSnapshot(); - }); + try { + await Server.getFreePort(); + } catch (err) { + expect(err.message).toMatchSnapshot(); + } }); - it('should work with findPort util', () => { + it('should work with findPort util', async () => { process.env.DEFAULT_PORT_RETRY = 5; - return findPort(8082).then((freePort) => { - expect(freePort).toEqual(8082); - }); + const freePort = await findPort(8082); + expect(freePort).toEqual(8082); }); }); }); diff --git a/test/server/__snapshots__/Server.test.js.snap.webpack4 b/test/server/__snapshots__/Server.test.js.snap.webpack4 index 009429125f..58d66ff2f7 100644 --- a/test/server/__snapshots__/Server.test.js.snap.webpack4 +++ b/test/server/__snapshots__/Server.test.js.snap.webpack4 @@ -4,7 +4,7 @@ exports[`Server DevServerPlugin add hot option 1`] = ` Array [ Array [ "client", - "index.js?ws%3A%2F%2Flocalhost%3A8101%2Fws", + "index.js?ws%3A%2F%2Flocalhost%3A8124%2Fws", ], Array [ "node_modules", @@ -22,7 +22,7 @@ exports[`Server DevServerPlugin add hot-only option 1`] = ` Array [ Array [ "client", - "index.js?ws%3A%2F%2Flocalhost%3A8101%2Fws", + "index.js?ws%3A%2F%2Flocalhost%3A8124%2Fws", ], Array [ "node_modules", @@ -40,7 +40,7 @@ exports[`Server DevServerPlugin should create and run server with old parameters Array [ Array [ "client", - "index.js?ws%3A%2F%2Flocalhost%3A8101%2Fws", + "index.js?ws%3A%2F%2Flocalhost%3A8124%2Fws", ], Array [ "node_modules", @@ -54,4 +54,4 @@ Array [ ] `; -exports[`Server getFreePort should throws the error when the port isn't found 1`] = `"busy"`; +exports[`Server Server.getFreePort should throws the error when the port isn't found 1`] = `"busy"`; diff --git a/test/server/__snapshots__/Server.test.js.snap.webpack5 b/test/server/__snapshots__/Server.test.js.snap.webpack5 index 009429125f..58d66ff2f7 100644 --- a/test/server/__snapshots__/Server.test.js.snap.webpack5 +++ b/test/server/__snapshots__/Server.test.js.snap.webpack5 @@ -4,7 +4,7 @@ exports[`Server DevServerPlugin add hot option 1`] = ` Array [ Array [ "client", - "index.js?ws%3A%2F%2Flocalhost%3A8101%2Fws", + "index.js?ws%3A%2F%2Flocalhost%3A8124%2Fws", ], Array [ "node_modules", @@ -22,7 +22,7 @@ exports[`Server DevServerPlugin add hot-only option 1`] = ` Array [ Array [ "client", - "index.js?ws%3A%2F%2Flocalhost%3A8101%2Fws", + "index.js?ws%3A%2F%2Flocalhost%3A8124%2Fws", ], Array [ "node_modules", @@ -40,7 +40,7 @@ exports[`Server DevServerPlugin should create and run server with old parameters Array [ Array [ "client", - "index.js?ws%3A%2F%2Flocalhost%3A8101%2Fws", + "index.js?ws%3A%2F%2Flocalhost%3A8124%2Fws", ], Array [ "node_modules", @@ -54,4 +54,4 @@ Array [ ] `; -exports[`Server getFreePort should throws the error when the port isn't found 1`] = `"busy"`; +exports[`Server Server.getFreePort should throws the error when the port isn't found 1`] = `"busy"`; diff --git a/test/server/client-option.test.js b/test/server/client-option.test.js index c11769c17d..93bca4a9c8 100644 --- a/test/server/client-option.test.js +++ b/test/server/client-option.test.js @@ -80,13 +80,10 @@ describe('client option', () => { }, port, }, - () => { - request(server.app) - .get('/main.js') - .then((res) => { - expect(res.text).not.toMatch(/client\/index\.js/); - }) - .then(done, done); + async () => { + const res = await request(server.app).get('/main.js'); + expect(res.text).not.toMatch(/client\/index\.js/); + done(); } ); }); @@ -100,13 +97,10 @@ describe('client option', () => { }, port, }, - () => { - request(server.app) - .get('/main.js') - .then((res) => { - expect(res.text).not.toMatch(/webpack\/hot\/dev-server\.js/); - }) - .then(done, done); + async () => { + const res = await request(server.app).get('/main.js'); + expect(res.text).not.toMatch(/webpack\/hot\/dev-server\.js/); + done(); } ); }); diff --git a/test/server/historyApiFallback-option.test.js b/test/server/historyApiFallback-option.test.js index edc5a7e221..d6812a8078 100644 --- a/test/server/historyApiFallback-option.test.js +++ b/test/server/historyApiFallback-option.test.js @@ -6,7 +6,7 @@ const testServer = require('../helpers/test-server'); const config = require('../fixtures/historyapifallback-config/webpack.config'); const config2 = require('../fixtures/historyapifallback-2-config/webpack.config'); const config3 = require('../fixtures/historyapifallback-3-config/webpack.config'); -const port = require('../ports-map')['historyApiFallback-option']; +const port = require('../ports-map')['history-api-fallback-option']; describe('historyApiFallback option', () => { let server; diff --git a/test/server/hot-option.test.js b/test/server/hot-option.test.js index 4d2d9463b6..54430baefd 100644 --- a/test/server/hot-option.test.js +++ b/test/server/hot-option.test.js @@ -77,14 +77,10 @@ describe('hot option', () => { afterAll(testServer.close); - it('should NOT include hot script in the bundle', (done) => { - req - .get('/main.js') - .expect(200) - .then(({ text }) => { - expect(text).not.toMatch(/webpack\/hot\/dev-server\.js/); - done(); - }); + it('should NOT include hot script in the bundle', async () => { + const res = await req.get('/main.js'); + expect(res.status).toEqual(200); + expect(res.text).not.toMatch(/webpack\/hot\/dev-server\.js/); }); }); diff --git a/test/server/http2-option.test.js b/test/server/http2-option.test.js index 19fd74f61f..1fb36752eb 100644 --- a/test/server/http2-option.test.js +++ b/test/server/http2-option.test.js @@ -38,6 +38,7 @@ describe('http2 option', () => { const client = http2.connect(`https://localhost:${port}`, { rejectUnauthorized: false, }); + client.on('error', (err) => console.error(err)); const http2Req = client.request({ ':path': '/' }); @@ -47,7 +48,9 @@ describe('http2 option', () => { }); http2Req.setEncoding('utf8'); + let data = ''; + http2Req.on('data', (chunk) => { data += chunk; }); @@ -103,14 +106,11 @@ describe('http2 option', () => { req = request(server.app); }); - it('Request to index', (done) => { - req - .get('/') - .expect(200, /Heyo/) - .then(({ res }) => { - expect(res.httpVersion).not.toEqual('2.0'); - done(); - }); + it('Request to index', async () => { + const res = await req.get('/'); + expect(res.status).toEqual(200); + expect(res.text).toContain('Heyo'); + expect(res.res.httpVersion).not.toEqual('2.0'); }); afterAll(testServer.close); diff --git a/test/server/liveReload-option.test.js b/test/server/liveReload-option.test.js deleted file mode 100644 index 5c824439a7..0000000000 --- a/test/server/liveReload-option.test.js +++ /dev/null @@ -1,124 +0,0 @@ -'use strict'; - -const path = require('path'); -const fs = require('graceful-fs'); -const testServer = require('../helpers/test-server'); -const config = require('../fixtures/contentbase-config/webpack.config'); -const port = require('../ports-map')['liveReload-option']; - -const contentBasePublic = path.resolve( - __dirname, - '../fixtures/contentbase-config/public' -); - -describe('liveReload option', () => { - let server; - - describe('Test disabling live reloading', () => { - const nestedFile = path.join(contentBasePublic, 'assets/example.txt'); - - beforeAll((done) => { - server = testServer.start( - config, - { - static: contentBasePublic, - liveReload: false, - port, - }, - done - ); - }); - - afterAll((done) => { - testServer.close(done); - fs.truncateSync(nestedFile); - }); - - it('Should not reload on changing files', (done) => { - let reloaded = false; - - server.staticWatchers[0].on('change', () => { - // it means that file has changed - - // simulating server behaviour - if (server.options.liveReload) { - // issue: https://github.com/facebook/jest/issues/9471 - Object.defineProperty(window, 'location', { - writable: true, - value: { assign: jest.fn() }, - }); - - Object.defineProperty(window.location, 'reload', { - writable: true, - value: { assign: jest.fn() }, - }); - window.location.reload = jest.fn(); - window.location.reload(); - reloaded = true; - } - expect(reloaded).toBe(false); - - done(); - }); - - // change file content - setTimeout(() => { - fs.writeFileSync(nestedFile, 'Heyo', 'utf8'); - }, 1000); - }); - }); - - describe('Testing live reloading', () => { - const nestedFile = path.join(contentBasePublic, 'assets/example.txt'); - - beforeAll((done) => { - server = testServer.start( - config, - { - static: contentBasePublic, - liveReload: true, - port, - }, - done - ); - }); - - afterAll((done) => { - testServer.close(done); - fs.truncateSync(nestedFile); - }); - - it('Should reload on changing files', (done) => { - let reloaded = false; - - server.staticWatchers[0].on('change', () => { - // it means that files has changed - - // simulating server behaviour - if (server.options.liveReload) { - Object.defineProperty(window, 'location', { - writable: true, - value: { assign: jest.fn() }, - }); - - Object.defineProperty(window.location, 'reload', { - writable: true, - value: { assign: jest.fn() }, - }); - - window.location.reload = jest.fn(); - window.location.reload(); - reloaded = true; - } - expect(reloaded).toBe(true); - - done(); - }); - - // change file content - setTimeout(() => { - fs.writeFileSync(nestedFile, 'Heyo', 'utf8'); - }, 1000); - }); - }); -}); diff --git a/test/server/mimeTypes-option.test.js b/test/server/mimeTypes-option.test.js index 10c925558a..6c31191c52 100644 --- a/test/server/mimeTypes-option.test.js +++ b/test/server/mimeTypes-option.test.js @@ -3,7 +3,7 @@ const request = require('supertest'); const testServer = require('../helpers/test-server'); const config = require('../fixtures/mime-types-config/webpack.config'); -const port = require('../ports-map')['mineTypes-option']; +const port = require('../ports-map')['mine-types-option']; describe('mimeTypes option', () => { describe('as an object with a remapped type', () => { diff --git a/test/server/onAfterSetupMiddleware-option.test.js b/test/server/onAfterSetupMiddleware-option.test.js index 7f39bf1ad0..7a05d2d17c 100644 --- a/test/server/onAfterSetupMiddleware-option.test.js +++ b/test/server/onAfterSetupMiddleware-option.test.js @@ -3,7 +3,7 @@ const request = require('supertest'); const testServer = require('../helpers/test-server'); const config = require('../fixtures/simple-config/webpack.config'); -const port = require('../ports-map')['onAfterSetupMiddleware-option']; +const port = require('../ports-map')['on-after-setup-middleware-option']; describe('onAfterSetupMiddleware option', () => { let server; @@ -39,21 +39,17 @@ describe('onAfterSetupMiddleware option', () => { afterAll(testServer.close); - it('should handle after route', () => - req - .get('/after/some/path') - .expect('Content-Type', 'text/html; charset=utf-8') - .expect(200) - .then((response) => { - expect(response.text).toBe('after'); - })); - - it('should handle POST requests to after route', () => - req - .post('/after/some/path') - .expect('Content-Type', 'text/html; charset=utf-8') - .expect(200) - .then((response) => { - expect(response.text).toBe('after POST'); - })); + it('should handle after route', async () => { + const res = await req.get('/after/some/path'); + expect(res.headers['content-type']).toEqual('text/html; charset=utf-8'); + expect(res.status).toEqual(200); + expect(res.text).toBe('after'); + }); + + it('should handle POST requests to after route', async () => { + const res = await req.post('/after/some/path'); + expect(res.headers['content-type']).toEqual('text/html; charset=utf-8'); + expect(res.status).toEqual(200); + expect(res.text).toBe('after POST'); + }); }); diff --git a/test/server/onBeforeSetupMiddleware-option.test.js b/test/server/onBeforeSetupMiddleware-option.test.js index a0fdfec5e6..e87cfb2708 100644 --- a/test/server/onBeforeSetupMiddleware-option.test.js +++ b/test/server/onBeforeSetupMiddleware-option.test.js @@ -3,7 +3,7 @@ const request = require('supertest'); const testServer = require('../helpers/test-server'); const config = require('../fixtures/simple-config/webpack.config'); -const port = require('../ports-map')['onBeforeSetupMiddleware-option']; +const port = require('../ports-map')['on-before-setup-middleware-option']; describe('onBeforeSetupMiddleware option', () => { let server; @@ -35,12 +35,10 @@ describe('onBeforeSetupMiddleware option', () => { afterAll(testServer.close); - it('should handle before route', () => - req - .get('/before/some/path') - .expect('Content-Type', 'text/html; charset=utf-8') - .expect(200) - .then((response) => { - expect(response.text).toBe('before'); - })); + it('should handle before route', async () => { + const res = await req.get('/before/some/path'); + expect(res.headers['content-type']).toEqual('text/html; charset=utf-8'); + expect(res.status).toEqual(200); + expect(res.text).toBe('before'); + }); }); diff --git a/test/server/onListening-option.test.js b/test/server/onListening-option.test.js index d6d66b1565..cf72b68164 100644 --- a/test/server/onListening-option.test.js +++ b/test/server/onListening-option.test.js @@ -2,7 +2,7 @@ const testServer = require('../helpers/test-server'); const config = require('../fixtures/simple-config/webpack.config'); -const port = require('../ports-map')['onListening-option']; +const port = require('../ports-map')['on-listening-option']; describe('onListening option', () => { let onListeningIsRunning = false; diff --git a/test/server/port-option.test.js b/test/server/port-option.test.js index 1874fca8d3..cce02e8042 100644 --- a/test/server/port-option.test.js +++ b/test/server/port-option.test.js @@ -148,7 +148,7 @@ describe('port', () => { directory: staticDirectory, watch: false, }, - port: '33333', + port: 33333, }, done ); diff --git a/test/server/servers/SockJSServer.test.js b/test/server/servers/SockJSServer.test.js index 1c3d7d50cb..5a32aa94fc 100644 --- a/test/server/servers/SockJSServer.test.js +++ b/test/server/servers/SockJSServer.test.js @@ -1,10 +1,14 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; const http = require('http'); const express = require('express'); const SockJS = require('sockjs-client/dist/sockjs'); const SockJSServer = require('../../../lib/servers/SockJSServer'); -const port = require('../../ports-map').SockJSServer; +const port = require('../../ports-map')['sockjs-server']; describe('SockJSServer', () => { describe("should work with the 'path' option", () => { @@ -48,7 +52,7 @@ describe('SockJSServer', () => { socketServer.send(connection, 'hello world'); setTimeout(() => { // the server closes the connection with the client - socketServer.close(connection); + socketServer.closeConnection(connection); }, 1000); }); @@ -97,7 +101,7 @@ describe('SockJSServer', () => { socketServer.onConnection(cb); expect(() => { - socketServer.socket.emit('connection', null); + socketServer.implementation.emit('connection', null); }).not.toThrow(); expect(cb.mock.calls[0]).toEqual([null, null]); }); @@ -149,7 +153,7 @@ describe('SockJSServer', () => { socketServer.send(connection, 'hello world'); setTimeout(() => { // the server closes the connection with the client - socketServer.close(connection); + socketServer.closeConnection(connection); }, 1000); }); @@ -198,7 +202,7 @@ describe('SockJSServer', () => { socketServer.onConnection(cb); expect(() => { - socketServer.socket.emit('connection', null); + socketServer.implementation.emit('connection', null); }).not.toThrow(); expect(cb.mock.calls[0]).toEqual([null, null]); }); diff --git a/test/server/servers/WebsocketServer.test.js b/test/server/servers/WebsocketServer.test.js index 8b73bdcb6d..17d2c01d91 100644 --- a/test/server/servers/WebsocketServer.test.js +++ b/test/server/servers/WebsocketServer.test.js @@ -1,10 +1,14 @@ +/** + * @jest-environment jsdom + */ + 'use strict'; const http = require('http'); const express = require('express'); const ws = require('ws'); const WebsocketServer = require('../../../lib/servers/WebsocketServer'); -const port = require('../../ports-map').WebsocketServer; +const port = require('../../ports-map')['web-socket-server']; describe('WebsocketServer', () => { let socketServer; @@ -41,7 +45,7 @@ describe('WebsocketServer', () => { socketServer.send(connection, 'hello world'); setTimeout(() => { // the server closes the connection with the client - socketServer.close(connection); + socketServer.closeConnection(connection); }, 1000); }); diff --git a/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack4 b/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack4 index 83233b656d..077534b65b 100644 --- a/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack4 +++ b/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack4 @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SockJSServer should work with the 'path' option server should receive connection, send message, and close client 1`] = `"localhost:8093"`; +exports[`SockJSServer should work with the 'path' option server should receive connection, send message, and close client 1`] = `"localhost:8131"`; exports[`SockJSServer should work with the 'path' option server should receive connection, send message, and close client 2`] = ` Array [ @@ -10,7 +10,7 @@ Array [ ] `; -exports[`SockJSServer should work with the 'prefix' option server should receive connection, send message, and close client 1`] = `"localhost:8093"`; +exports[`SockJSServer should work with the 'prefix' option server should receive connection, send message, and close client 1`] = `"localhost:8131"`; exports[`SockJSServer should work with the 'prefix' option server should receive connection, send message, and close client 2`] = ` Array [ diff --git a/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack5 b/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack5 index 83233b656d..077534b65b 100644 --- a/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack5 +++ b/test/server/servers/__snapshots__/SockJSServer.test.js.snap.webpack5 @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SockJSServer should work with the 'path' option server should receive connection, send message, and close client 1`] = `"localhost:8093"`; +exports[`SockJSServer should work with the 'path' option server should receive connection, send message, and close client 1`] = `"localhost:8131"`; exports[`SockJSServer should work with the 'path' option server should receive connection, send message, and close client 2`] = ` Array [ @@ -10,7 +10,7 @@ Array [ ] `; -exports[`SockJSServer should work with the 'prefix' option server should receive connection, send message, and close client 1`] = `"localhost:8093"`; +exports[`SockJSServer should work with the 'prefix' option server should receive connection, send message, and close client 1`] = `"localhost:8131"`; exports[`SockJSServer should work with the 'prefix' option server should receive connection, send message, and close client 2`] = ` Array [ diff --git a/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack4 b/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack4 index c056d6dab1..c3d5fdbcd5 100644 --- a/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack4 +++ b/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack4 @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`WebsocketServer should receive connection, send message, and close client 1`] = `"localhost:8127"`; +exports[`WebsocketServer should receive connection, send message, and close client 1`] = `"localhost:8132"`; exports[`WebsocketServer should receive connection, send message, and close client 2`] = ` Array [ diff --git a/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack5 b/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack5 index c056d6dab1..c3d5fdbcd5 100644 --- a/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack5 +++ b/test/server/servers/__snapshots__/WebsocketServer.test.js.snap.webpack5 @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`WebsocketServer should receive connection, send message, and close client 1`] = `"localhost:8127"`; +exports[`WebsocketServer should receive connection, send message, and close client 1`] = `"localhost:8132"`; exports[`WebsocketServer should receive connection, send message, and close client 2`] = ` Array [ diff --git a/test/server/setupExitSignals-option.test.js b/test/server/setupExitSignals-option.test.js index 92e9a1aaad..0ca253000e 100644 --- a/test/server/setupExitSignals-option.test.js +++ b/test/server/setupExitSignals-option.test.js @@ -2,7 +2,7 @@ const config = require('../fixtures/simple-config/webpack.config'); const testServer = require('../helpers/test-server'); -const port = require('../ports-map')['setupExitSignals-option']; +const port = require('../ports-map')['setup-exit-signals-option']; describe('setupExitSignals option', () => { let server; diff --git a/test/server/static-publicPath-option.test.js b/test/server/static-publicPath-option.test.js index 5abe3c8dfc..698db614ac 100644 --- a/test/server/static-publicPath-option.test.js +++ b/test/server/static-publicPath-option.test.js @@ -4,7 +4,7 @@ const path = require('path'); const request = require('supertest'); const testServer = require('../helpers/test-server'); const config = require('../fixtures/contentbase-config/webpack.config'); -const port = require('../ports-map')['static-publicPath-option']; +const port = require('../ports-map')['static-public-path-option']; const staticDirectory = path.resolve( __dirname, diff --git a/test/server/utils/DevServerPlugin.test.js b/test/server/utils/DevServerPlugin.test.js index 53a4965cfa..6e0075cd72 100644 --- a/test/server/utils/DevServerPlugin.test.js +++ b/test/server/utils/DevServerPlugin.test.js @@ -14,7 +14,7 @@ describe('DevServerPlugin util', () => { return compiler.options.entry; } - it('should preserves dynamic entry points', (done) => { + it('should preserves dynamic entry points', async () => { let i = 0; const webpackOptions = { // simulate dynamic entry @@ -25,6 +25,7 @@ describe('DevServerPlugin util', () => { }; const compiler = webpack(webpackOptions); const devServerOptions = { + hot: true, client: { transport: 'sockjs', webSocketURL: {}, @@ -38,34 +39,30 @@ describe('DevServerPlugin util', () => { }; const plugin = new DevServerPlugin(devServerOptions); + plugin.apply(compiler); - getEntries(compiler).then((entries) => { - expect(typeof entries).toEqual('function'); - - entries() - .then((entryFirstRun) => - entries().then((entrySecondRun) => { - if (isWebpack5) { - expect(entryFirstRun.main.import.length).toEqual(1); - expect(entryFirstRun.main.import[0]).toEqual('./src-1.js'); - - expect(entrySecondRun.main.import.length).toEqual(1); - expect(entrySecondRun.main.import[0]).toEqual('./src-2.js'); - } else { - expect(entryFirstRun.length).toEqual(2); - expect(entryFirstRun[1]).toEqual('./src-1.js'); - - expect(entrySecondRun.length).toEqual(2); - expect(entrySecondRun[1]).toEqual('./src-2.js'); - } - done(); - }) - ) - .catch(done); - }); + + const entries = await getEntries(compiler); + expect(typeof entries).toEqual('function'); + + const entryFirstRun = await entries(); + const entrySecondRun = await entries(); + if (isWebpack5) { + expect(entryFirstRun.main.import.length).toEqual(1); + expect(entryFirstRun.main.import[0]).toEqual('./src-1.js'); + + expect(entrySecondRun.main.import.length).toEqual(1); + expect(entrySecondRun.main.import[0]).toEqual('./src-2.js'); + } else { + expect(entryFirstRun.length).toEqual(3); + expect(entryFirstRun[2]).toEqual('./src-1.js'); + + expect(entrySecondRun.length).toEqual(3); + expect(entrySecondRun[2]).toEqual('./src-2.js'); + } }); - it('should preserves asynchronous dynamic entry points', (done) => { + it('should preserves asynchronous dynamic entry points', async () => { let i = 0; const webpackOptions = { // simulate async dynamic entry @@ -78,6 +75,7 @@ describe('DevServerPlugin util', () => { const compiler = webpack(webpackOptions); const devServerOptions = { + hot: true, client: { transport: 'sockjs', webSocketURL: {}, @@ -92,30 +90,25 @@ describe('DevServerPlugin util', () => { const plugin = new DevServerPlugin(devServerOptions); plugin.apply(compiler); - getEntries(compiler).then((entries) => { - expect(typeof entries).toEqual('function'); - - entries() - .then((entryFirstRun) => - entries().then((entrySecondRun) => { - if (isWebpack5) { - expect(entryFirstRun.main.import.length).toEqual(1); - expect(entryFirstRun.main.import[0]).toEqual('./src-1.js'); - - expect(entrySecondRun.main.import.length).toEqual(1); - expect(entrySecondRun.main.import[0]).toEqual('./src-2.js'); - } else { - expect(entryFirstRun.length).toEqual(2); - expect(entryFirstRun[1]).toEqual('./src-1.js'); - - expect(entrySecondRun.length).toEqual(2); - expect(entrySecondRun[1]).toEqual('./src-2.js'); - } - done(); - }) - ) - .catch(done); - }); + + const entries = await getEntries(compiler); + expect(typeof entries).toEqual('function'); + + const entryFirstRun = await entries(); + const entrySecondRun = await entries(); + if (isWebpack5) { + expect(entryFirstRun.main.import.length).toEqual(1); + expect(entryFirstRun.main.import[0]).toEqual('./src-1.js'); + + expect(entrySecondRun.main.import.length).toEqual(1); + expect(entrySecondRun.main.import[0]).toEqual('./src-2.js'); + } else { + expect(entryFirstRun.length).toEqual(3); + expect(entryFirstRun[2]).toEqual('./src-1.js'); + + expect(entrySecondRun.length).toEqual(3); + expect(entrySecondRun[2]).toEqual('./src-2.js'); + } }); it("should doesn't add the HMR plugin if not hot and no plugins", () => { diff --git a/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack4 b/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack4 index 91a974cfcd..a4f16ef6e4 100644 --- a/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack4 +++ b/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack4 @@ -1418,6 +1418,44 @@ Object { } `; +exports[`normalizeOptions username and password should set correct options 1`] = ` +Object { + "allowedHosts": "auto", + "client": Object { + "hotEntry": true, + "overlay": true, + "webSocketURL": Object { + "password": "chuntaro", + "username": "zenitsu", + }, + }, + "compress": true, + "devMiddleware": Object {}, + "hot": true, + "liveReload": true, + "setupExitSignals": true, + "static": Array [ + Object { + "directory": "CWD", + "publicPath": Array [ + "/", + ], + "serveIndex": Object { + "icons": true, + }, + "staticOptions": Object {}, + "watch": Object {}, + }, + ], + "webSocketServer": Object { + "options": Object { + "path": "/ws", + }, + "type": "ws", + }, +} +`; + exports[`normalizeOptions webSocketServer custom server class should set correct options 1`] = ` Object { "allowedHosts": "auto", diff --git a/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack5 b/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack5 index 91a974cfcd..a4f16ef6e4 100644 --- a/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack5 +++ b/test/server/utils/__snapshots__/normalizeOptions.test.js.snap.webpack5 @@ -1418,6 +1418,44 @@ Object { } `; +exports[`normalizeOptions username and password should set correct options 1`] = ` +Object { + "allowedHosts": "auto", + "client": Object { + "hotEntry": true, + "overlay": true, + "webSocketURL": Object { + "password": "chuntaro", + "username": "zenitsu", + }, + }, + "compress": true, + "devMiddleware": Object {}, + "hot": true, + "liveReload": true, + "setupExitSignals": true, + "static": Array [ + Object { + "directory": "CWD", + "publicPath": Array [ + "/", + ], + "serveIndex": Object { + "icons": true, + }, + "staticOptions": Object {}, + "watch": Object {}, + }, + ], + "webSocketServer": Object { + "options": Object { + "path": "/ws", + }, + "type": "ws", + }, +} +`; + exports[`normalizeOptions webSocketServer custom server class should set correct options 1`] = ` Object { "allowedHosts": "auto", diff --git a/test/server/utils/getSocketClientPath.test.js b/test/server/utils/getSocketClientPath.test.js index 28b932b973..ca9b5daebd 100644 --- a/test/server/utils/getSocketClientPath.test.js +++ b/test/server/utils/getSocketClientPath.test.js @@ -5,7 +5,6 @@ const getSocketClientPath = require('../../../lib/utils/getSocketClientPath'); const sockjsClientPath = require.resolve( '../../../client/clients/SockJSClient' ); -const baseClientPath = require.resolve('../../../client/clients/BaseClient'); describe('getSocketClientPath', () => { it("should work with client.transport: 'sockjs'", () => { @@ -64,10 +63,12 @@ describe('getSocketClientPath', () => { expect(() => { getSocketClientPath({ client: { - transport: baseClientPath, + transport: 'foo', }, webSocketServer: 'sockjs', }); - }).toThrow('Client needs implementation'); + }).toThrow( + 'When you use custom web socket implementation you must explicitly specify client.transport' + ); }); }); diff --git a/test/server/utils/normalizeOptions.test.js b/test/server/utils/normalizeOptions.test.js index 28518a448f..a922ef5968 100644 --- a/test/server/utils/normalizeOptions.test.js +++ b/test/server/utils/normalizeOptions.test.js @@ -152,6 +152,19 @@ describe('normalizeOptions', () => { }, optionsResults: null, }, + { + title: 'username and password', + multiCompiler: false, + options: { + client: { + webSocketURL: { + username: 'zenitsu', + password: 'chuntaro', + }, + }, + }, + optionsResults: null, + }, { title: 'client path without leading/ending slashes', multiCompiler: false, diff --git a/test/server/utils/routes.test.js b/test/server/utils/routes.test.js index e050602eb9..8ab4251470 100644 --- a/test/server/utils/routes.test.js +++ b/test/server/utils/routes.test.js @@ -18,89 +18,67 @@ describe('routes util', () => { afterAll(testServer.close); - it('should handles GET request to sockjs bundle', (done) => { - req.get('/__webpack_dev_server__/sockjs.bundle.js').then(({ res }) => { - expect(res.headers['content-type']).toEqual('application/javascript'); - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handles GET request to sockjs bundle', async () => { + const res = await req.get('/__webpack_dev_server__/sockjs.bundle.js'); + expect(res.headers['content-type']).toEqual('application/javascript'); + expect(res.statusCode).toEqual(200); }); - it('should handle HEAD request to sockjs bundle', (done) => { - req.head('/__webpack_dev_server__/sockjs.bundle.js').then(({ res }) => { - expect(res.headers['content-type']).toEqual('application/javascript'); - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle HEAD request to sockjs bundle', async () => { + const res = await req.head('/__webpack_dev_server__/sockjs.bundle.js'); + expect(res.headers['content-type']).toEqual('application/javascript'); + expect(res.statusCode).toEqual(200); }); - it('should handle GET request to invalidate endpoint', (done) => { - req.get('/webpack-dev-server/invalidate').then(({ res }) => { - expect(res.headers['content-type']).not.toEqual('text/html'); - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle GET request to invalidate endpoint', async () => { + const res = await req.get('/webpack-dev-server/invalidate'); + expect(res.headers['content-type']).not.toEqual('text/html'); + expect(res.statusCode).toEqual(200); }); - it('should handle GET request to live html', (done) => { - req.get('/webpack-dev-server/').then(({ res }) => { - expect(res.headers['content-type']).toEqual('text/html'); - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle GET request to live html', async () => { + const res = await req.get('/webpack-dev-server/'); + expect(res.headers['content-type']).toEqual('text/html'); + expect(res.statusCode).toEqual(200); }); - it('should handle HEAD request to live html', (done) => { - req.head('/webpack-dev-server/').then(({ res }) => { - expect(res.headers['content-type']).toEqual('text/html'); - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle HEAD request to live html', async () => { + const res = await req.head('/webpack-dev-server/'); + expect(res.headers['content-type']).toEqual('text/html'); + expect(res.statusCode).toEqual(200); }); - it('should handle GET request to directory index', (done) => { - req.get('/webpack-dev-server').then(({ res }) => { - expect(res.headers['content-type']).toEqual('text/html'); - expect(res.statusCode).toEqual(200); - expect(res.text).toMatchSnapshot(); - done(); - }); + it('should handle GET request to directory index', async () => { + const res = await req.get('/webpack-dev-server'); + expect(res.headers['content-type']).toEqual('text/html'); + expect(res.statusCode).toEqual(200); + expect(res.text).toMatchSnapshot(); }); - it('should handle HEAD request to directory index', (done) => { - req.head('/webpack-dev-server').then(({ res }) => { - expect(res.headers['content-type']).toEqual('text/html'); - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle HEAD request to directory index', async () => { + const res = await req.head('/webpack-dev-server'); + expect(res.headers['content-type']).toEqual('text/html'); + expect(res.statusCode).toEqual(200); }); - it('should handle GET request to magic html', (done) => { - req.get('/main').then(({ res }) => { - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle GET request to magic async html', async () => { + const res = await req.get('/main'); + expect(res.statusCode).toEqual(200); }); - it('should handle HEAD request to magic html', (done) => { - req.head('/main').then(({ res }) => { - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle HEAD request to magic async html', async () => { + const res = await req.head('/main'); + expect(res.statusCode).toEqual(200); }); - it('should handle GET request to main chunk', (done) => { - req.get('/main.js').then(({ res }) => { - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle GET request to main async chunk', async () => { + const res = await req.get('/main.js'); + expect(res.statusCode).toEqual(200); }); - it('should handle HEAD request to main chunk', (done) => { - req.head('/main.js').then(({ res }) => { - expect(res.statusCode).toEqual(200); - done(); - }); + it('should handle HEAD request to main async chunk', async () => { + const res = await req.head('/main.js'); + expect(res.statusCode).toEqual(200); }); }); @@ -112,13 +90,11 @@ describe('routes util', () => { afterAll(testServer.close); - it('should handle GET request to directory index and list all middleware directories', (done) => { - req.get('/webpack-dev-server').then(({ res }) => { - expect(res.headers['content-type']).toEqual('text/html'); - expect(res.statusCode).toEqual(200); - expect(res.text).toMatchSnapshot(); - done(); - }); + it('should handle GET request to directory index and list all middleware directories', async () => { + const res = await req.get('/webpack-dev-server'); + expect(res.headers['content-type']).toEqual('text/html'); + expect(res.statusCode).toEqual(200); + expect(res.text).toMatchSnapshot(); }); }); }); diff --git a/test/server/watchFiles-option.test.js b/test/server/watchFiles-option.test.js index 87ce8236de..f2e3c5155b 100644 --- a/test/server/watchFiles-option.test.js +++ b/test/server/watchFiles-option.test.js @@ -5,7 +5,7 @@ const fs = require('graceful-fs'); const chokidar = require('chokidar'); const testServer = require('../helpers/test-server'); const config = require('../fixtures/contentbase-config/webpack.config'); -const port = require('../ports-map')['watchFiles-option']; +const port = require('../ports-map')['watch-files-option']; const watchDir = path.resolve( __dirname, @@ -134,7 +134,7 @@ describe("'watchFiles' option", () => { }); it('should reload on file content changed', (done) => { - server.staticWatchers[0].on('change', (changedPath) => { + server.staticWatchers[0].once('change', (changedPath) => { expect(changedPath).toBe(nonExistFile); done(); diff --git a/test/server/webSocketServer-option.test.js b/test/server/webSocketServer-option.test.js index c3b4d70647..17d8644520 100644 --- a/test/server/webSocketServer-option.test.js +++ b/test/server/webSocketServer-option.test.js @@ -10,10 +10,10 @@ const SockJS = require('sockjs-client/dist/sockjs'); const SockJSServer = require('../../lib/servers/SockJSServer'); const config = require('../fixtures/simple-config/webpack.config'); const BaseServer = require('../../lib/servers/BaseServer'); -const port = require('../ports-map')['webSocketServer-option']; +const port = require('../ports-map')['web-socket-server-option']; describe('webSocketServer', () => { - describe.only('server', () => { + describe('server', () => { let mockedTestServer; let testServer; let server; @@ -56,6 +56,7 @@ describe('webSocketServer', () => { class MockServer { // eslint-disable-next-line no-empty-function onConnection() {} + close() {} } ); }); @@ -199,7 +200,7 @@ describe('webSocketServer', () => { constructor(serv) { super(serv); - this.socket = sockjs.createServer({ + this.implementation = sockjs.createServer({ // Use provided up-to-date sockjs-client sockjs_url: '/__webpack_dev_server__/sockjs.bundle.js', // Limit useless logs @@ -214,23 +215,33 @@ describe('webSocketServer', () => { }, }); - this.socket.installHandlers(this.server.server, { + this.implementation.installHandlers(this.server.server, { prefix: 'ws', }); customServerUsed = true; } - send(connection, message) { - connection.write(message); + close(callback) { + [...this.server.webSocketConnections].forEach((socket) => { + this.closeConnection(socket); + }); + + if (callback) { + callback(); + } } - close(connection) { + closeConnection(connection) { connection.close(); } + send(connection, message) { + connection.write(message); + } + onConnection(f) { - this.socket.on('connection', (connection) => { + this.implementation.on('connection', (connection) => { f(connection, connection.headers); }); } @@ -266,7 +277,7 @@ describe('webSocketServer', () => { }); }); - describe('without a header', () => { + describe.skip('without a header', () => { let mockWarn; beforeAll((done) => { @@ -278,21 +289,22 @@ describe('webSocketServer', () => { webSocketServer: class MySockJSServer extends BaseServer { constructor(serv) { super(serv); - - this.socket = sockjs.createServer({ + this.implementation = sockjs.createServer({ // Use provided up-to-date sockjs-client sockjs_url: '/__webpack_dev_server__/sockjs.bundle.js', // Limit useless logs log: (severity, line) => { if (severity === 'error') { this.server.logger.error(line); + } else if (severity === 'info') { + this.server.logger.log(line); } else { this.server.logger.debug(line); } }, }); - this.socket.installHandlers(this.server.server, { + this.implementation.installHandlers(this.server.server, { prefix: '/ws', }); } @@ -301,12 +313,22 @@ describe('webSocketServer', () => { connection.write(message); } - close(connection) { + close(callback) { + [...this.server.webSocketConnections].forEach((socket) => { + this.closeConnection(socket); + }); + + if (callback) { + callback(); + } + } + + closeConnection(connection) { connection.close(); } onConnection(f) { - this.socket.on('connection', (connection) => { + this.implementation.on('connection', (connection) => { f(connection); }); } @@ -367,7 +389,7 @@ describe('webSocketServer', () => { }); }); - describe('with a bad host header', () => { + describe.skip('with a bad host header', () => { beforeAll((done) => { server = testServer.start( config, @@ -377,7 +399,7 @@ describe('webSocketServer', () => { webSocketServer: class MySockJSServer extends BaseServer { constructor(serv) { super(serv); - this.socket = sockjs.createServer({ + this.implementation = sockjs.createServer({ // Use provided up-to-date sockjs-client sockjs_url: '/__webpack_dev_server__/sockjs.bundle.js', // Limit useless logs @@ -392,7 +414,7 @@ describe('webSocketServer', () => { }, }); - this.socket.installHandlers(this.server.server, { + this.implementation.installHandlers(this.server.server, { prefix: '/ws', }); } @@ -401,12 +423,22 @@ describe('webSocketServer', () => { connection.write(message); } - close(connection) { + close(callback) { + [...this.server.webSocketConnections].forEach((socket) => { + this.closeConnection(socket); + }); + + if (callback) { + callback(); + } + } + + closeConnection(connection) { connection.close(); } onConnection(f) { - this.socket.on('connection', (connection) => { + this.implementation.on('connection', (connection) => { f(connection, { host: null, }); @@ -483,13 +515,13 @@ describe('webSocketServer', () => { origin: `http://localhost:${port}`, }); - expect(server.sockets.length).toEqual(1); - expect(server.sockets).toMatchSnapshot(); + expect(server.webSocketConnections.length).toEqual(1); + expect(server.webSocketConnections).toMatchSnapshot(); // this simulates a client leaving the server mockServerInstance.onConnectionClose.mock.calls[0][1](connectionObj); - expect(server.sockets.length).toEqual(0); + expect(server.webSocketConnections.length).toEqual(0); // check that the dev server was passed to the socket server implementation constructor expect(MockWebsocketServer.mock.calls[0].length).toEqual(1); @@ -524,13 +556,13 @@ describe('webSocketServer', () => { host: null, } ); - expect(server.sockets.length).toEqual(0); + expect(server.webSocketConnections.length).toEqual(0); expect(MockWebsocketServer.mock.calls[0].length).toEqual(1); expect(MockWebsocketServer.mock.calls[0][0].options.port).toEqual(port); expect(mockServerInstance.onConnection.mock.calls).toMatchSnapshot(); // the only call to send() here should be an invalid header message expect(mockServerInstance.send.mock.calls).toMatchSnapshot(); - expect(mockServerInstance.close.mock.calls).toMatchSnapshot(); + expect(mockServerInstance.closeConnection.mock.calls).toMatchSnapshot(); // onConnectionClose should never get called since the client should be closed first expect(mockServerInstance.onConnectionClose.mock.calls.length).toEqual( 0 diff --git a/test/testSequencer.js b/test/testSequencer.js deleted file mode 100644 index 316c5ec9e0..0000000000 --- a/test/testSequencer.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -/* eslint-disable import/no-extraneous-dependencies, class-methods-use-this */ - -const Sequencer = require('@jest/test-sequencer').default; - -// The purpose of this sequencer is to spread end to end (e2e) tests evenly amongst -// other tests during the test run. Jest runs tests concurrently, but we want e2e tests -// to overlap as little as possible during this concurrent testing since e2e -// tests use lots of memory and tend to be more unstable -class CustomSequencer extends Sequencer { - sort(tests) { - const copyTests = Array.from(tests); - const len = copyTests.length; - - const isEndToEndTest = (test) => - // backslash test for Windows - test.path.includes('/e2e/') || test.path.includes('\\e2e\\'); - // separate e2e and non-e2e tests into two separate arrays - const endToEndTests = copyTests.filter(isEndToEndTest); - const nonEndToEndTests = copyTests.filter((test) => !isEndToEndTest(test)); - - // bring the most unstable test to the front - endToEndTests.sort((testA, testB) => { - // backslash test for Windows - if ( - testB.path.includes('e2e/Client.test.js') || - testB.path.includes('e2e\\Client.test.js') - ) { - return 1; - } - - return -1; - }); - - const res = []; - - // an e2e test will be placed into the resulting array at this spacing interval - const spacing = Math.ceil(len / endToEndTests.length); - - let endToEndIndex = 0; - let nonEndToEndIndex = 0; - for (let i = 0; i < len; i++) { - // push an e2e test into the resulting array if we have reached the correct index, - // otherwise push a non-e2e test - if (i % spacing === 0 && endToEndIndex < endToEndTests.length) { - res.push(endToEndTests[endToEndIndex]); - endToEndIndex += 1; - } else if (nonEndToEndIndex < nonEndToEndTests.length) { - res.push(nonEndToEndTests[nonEndToEndIndex]); - nonEndToEndIndex += 1; - } - } - - return res; - } -} - -module.exports = CustomSequencer; diff --git a/test/validate-options.test.js b/test/validate-options.test.js index d2d4e7d472..e256bb4f4e 100644 --- a/test/validate-options.test.js +++ b/test/validate-options.test.js @@ -57,7 +57,7 @@ const tests = { }, { overlay: { - error: true, + errors: true, }, }, { @@ -65,11 +65,6 @@ const tests = { warnings: true, }, }, - { - overlay: { - arbitrary: '', - }, - }, { needClientEntry: true, }, @@ -103,6 +98,9 @@ const tests = { { webSocketURL: { host: 'localhost', port: 8080, path: '/my-path/' }, }, + { + webSocketURL: { username: 'zoro', password: 'roronoa' }, + }, ], failure: [ 'whoops!', @@ -131,6 +129,11 @@ const tests = { warnings: '', }, }, + { + overlay: { + arbitrary: '', + }, + }, { needClientEntry: [''], }, @@ -155,6 +158,9 @@ const tests = { { webSocketURL: { port: '' }, }, + { + webSocketURL: { username: 123, password: 976 }, + }, ], }, compress: { @@ -167,7 +173,7 @@ const tests = { }, allowedHosts: { success: ['auto', 'all', ['foo'], 'bar'], - failure: [true, false, 123], + failure: [true, false, 123, [], ['']], }, headers: { success: [{}, { foo: 'bar' }, () => {}], @@ -264,11 +270,17 @@ const tests = { }, proxy: { success: [ + [ + { + context: ['/auth', '/api'], + target: 'http://localhost:3000', + }, + ], { '/api': 'http://localhost:3000', }, ], - failure: [[], () => {}, false], + failure: [() => {}, false], }, static: { success: [