From 7a22d8a83302616f07cc5198a83b26ec5afcd7e3 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Thu, 21 Apr 2022 10:15:51 -0700 Subject: [PATCH 01/13] feat: webpack config split Signed-off-by: Carina Ursu --- env.js | 3 + index.js | 40 - package.json | 15 +- src/{server.tsx => server.ts} | 0 webpack.config.ts => webpack.common.config.ts | 130 +-- webpack.dev.config.ts | 68 ++ webpack.prod.config.ts | 51 ++ yarn.lock | 766 ++++++++++-------- 8 files changed, 576 insertions(+), 497 deletions(-) rename src/{server.tsx => server.ts} (100%) rename webpack.config.ts => webpack.common.config.ts (62%) create mode 100644 webpack.dev.config.ts create mode 100644 webpack.prod.config.ts diff --git a/env.js b/env.js index 86e01ad69..ff5cd38de 100644 --- a/env.js +++ b/env.js @@ -11,6 +11,8 @@ const ADMIN_API_URL = process.env.ADMIN_API_URL; // Use this to create SSL server const ADMIN_API_USE_SSL = process.env.ADMIN_API_USE_SSL || 'http'; +const LOCAL_DEV_HOST = process.env.LOCAL_DEV_HOST; + const BASE_URL = process.env.BASE_URL || ''; // Defines a file to be required which will provide implementations for @@ -42,5 +44,6 @@ module.exports = { GA_TRACKING_ID, NODE_ENV, STATUS_URL, + LOCAL_DEV_HOST, }, }; diff --git a/index.js b/index.js index 2e79691fe..3b4f1fcfa 100644 --- a/index.js +++ b/index.js @@ -35,46 +35,6 @@ if (process.env.NODE_ENV === 'production') { }), ); app.use(serverRenderer({ clientStats, currentDirectory: __dirname })); -} else { - process.env.NODE_ENV = 'development'; - console.log('Server is running in development mode'); - const webpack = require('webpack'); - const webpackDevMiddleware = require('webpack-dev-middleware'); - const webpackHotMiddleWare = require('webpack-hot-middleware'); - const webpackHotServerMiddleware = require('webpack-hot-server-middleware'); - - require('ts-node').register({ - compilerOptions: { module: 'commonjs' }, - cacheDirectory: '/tmp', - }); - const { default: configs, clientConfig } = require('./webpack.config'); - - const compiler = webpack( - configs.map((c) => - Object.assign({}, c, { - mode: 'development', - }), - ), - ); - const clientCompiler = compiler.compilers.find(({ name }) => name === 'client'); - - const devMiddleware = webpackDevMiddleware(compiler, { - serverSideRender: true, - publicPath: clientConfig.output.publicPath, - }); - - app.use(devMiddleware); - app.use(webpackHotMiddleWare(clientCompiler)); - app.use( - webpackHotServerMiddleware(compiler, { - serverRendererOptions: { - // Send client compiler FS for reading index.html for emitted assets - fileSystem: clientCompiler.outputFileSystem, - // Helps with finding the output folder in memory-fs - currentDirectory: __dirname, - }, - }), - ); } /* Set ADMIN_API_USE_SSL to https for CORS support */ diff --git a/package.json b/package.json index 2985e01c1..c9ee8f09f 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ "scripts": { "clean": "rm -rf dist", "prebuild": "yarn run clean", - "build": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' webpack --config webpack.config.ts --mode=development", - "build:prod": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' NODE_ENV=production webpack --config webpack.config.ts --mode=production", + "build": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' webpack --config webpack.dev.config.ts --mode=development", + "build:prod": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' NODE_ENV=production webpack --config webpack.prod.config.ts --mode=production --progress", "build:storybook": "build-storybook", - "start": "node -r dotenv/config index.js", + "start": "webpack serve --open --config webpack.dev.config.ts --hot", "storybook": "start-storybook -p 6006", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|jsx|ts|tsx|json)\"", @@ -104,7 +104,6 @@ "@testing-library/react": "^10.0.3", "@testing-library/react-hooks": "^7.0.2", "@types/cheerio": "^0.22.2", - "@types/compression-webpack-plugin": "^9.1.1", "@types/d3-shape": "^1.2.6", "@types/debug": "^0.0.30", "@types/dom-helpers": "^3.4.1", @@ -136,7 +135,6 @@ "@typescript-eslint/eslint-plugin": "^5.15.0", "@typescript-eslint/parser": "^5.15.0", "@xstate/react": "^1.0.0", - "add-asset-html-webpack-plugin": "^3.2.0", "autoprefixer": "^8.3.0", "axios": "^0.21.2", "axios-mock-adapter": "^1.16.0", @@ -165,7 +163,6 @@ "fork-ts-checker-webpack-plugin": "^7.2.1", "html-webpack-plugin": "^5.5.0", "husky": "^4.2.5", - "identity-obj-proxy": "^3.0.0", "intersection-observer": "^0.7.0", "jest": "^26.0.0", "linkify-it": "^2.2.0", @@ -205,11 +202,9 @@ "use-react-router": "^1.0.7", "webpack": "^5.68.0", "webpack-cli": "^4.9.2", - "webpack-dev-middleware": "^5.3.1", - "webpack-hot-middleware": "^2.25.1", - "webpack-hot-server-middleware": "^0.6.1", + "webpack-dev-server": "^4.8.1", + "webpack-merge": "^5.8.0", "webpack-node-externals": "^3.0.0", - "webpack-plugin-serve": "^1.6.0", "webpack-stats-plugin": "^1.0.3", "xstate": "^4.11.0" }, diff --git a/src/server.tsx b/src/server.ts similarity index 100% rename from src/server.tsx rename to src/server.ts diff --git a/webpack.config.ts b/webpack.common.config.ts similarity index 62% rename from webpack.config.ts rename to webpack.common.config.ts index f4be5dc25..323ad1fb7 100644 --- a/webpack.config.ts +++ b/webpack.common.config.ts @@ -1,19 +1,15 @@ // tslint:disable:no-var-requires // tslint:disable:no-console import chalk from 'chalk'; -import * as CompressionWebpackPlugin from 'compression-webpack-plugin'; -import * as HTMLWebpackPlugin from 'html-webpack-plugin'; import * as path from 'path'; import * as webpack from 'webpack'; +import { processEnv as env } from './env'; -const { WebpackPluginServe: ServePlugin } = require('webpack-plugin-serve'); const { StatsWriterPlugin } = require('webpack-stats-plugin'); const FavIconWebpackPlugin = require('favicons-webpack-plugin'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const nodeExternals = require('webpack-node-externals'); -import { processEnv as env } from './env'; - const packageJson: { dependencies: { [libName: string]: string }; devDependencies: { [libName: string]: string }; @@ -30,17 +26,14 @@ export const dist = path.join(__dirname, 'dist'); */ export const publicPath = `${env.BASE_URL}/assets/`; -/** True if we are in development mode */ -export const isDev = env.NODE_ENV === 'development'; +// /** True if we are in development mode */ +// export const isDev = env.NODE_ENV === 'development'; -/** True if we are in production mode */ -export const isProd = env.NODE_ENV === 'production'; +// /** True if we are in production mode */ +// export const isProd = env.NODE_ENV === 'production'; /** CSS module class name pattern */ -export const localIdentName = isDev ? '[local]_[fullhash:base64:3]' : '[fullhash:base64:6]'; - -/** Sourcemap configuration */ -const devtool = isDev ? 'cheap-source-map' : undefined; +// export const localIdentName = isDev ? '[local]_[fullhash:base64:3]' : '[fullhash:base64:6]'; // Report current configuration console.log(chalk.cyan('Exporting Webpack config with following configurations:')); @@ -48,16 +41,6 @@ console.log(chalk.blue('Environment:'), chalk.green(env.NODE_ENV)); console.log(chalk.blue('Output directory:'), chalk.green(path.resolve(dist))); console.log(chalk.blue('Public path:'), chalk.green(publicPath)); -/** Common webpack resolve options */ -export const resolve: webpack.ResolveOptions = { - /** Base directories that Webpack will look to resolve absolutely imported modules */ - modules: ['src', 'node_modules'], - /** Extension that are allowed to be omitted from import statements */ - extensions: ['.ts', '.tsx', '.js', '.jsx'], - /** "main" fields in package.json files to resolve a CommonJS module for */ - mainFields: ['browser', 'module', 'main'], -}; - /** Get clean version of a version string of package.json entry for a package by * extracting only alphanumerics, hyphen, and period. Note that this won't * produce a valid URL for all possible NPM version strings, but should be fine @@ -76,15 +59,6 @@ const cdnReactDOM = `https://unpkg.com/react-dom@${absoluteVersion( packageJson.devDependencies['react-dom'], )}/umd/react-dom.production.min.js`; -/** Minification options for HTMLWebpackPlugin */ -export const htmlMinifyConfig: HTMLWebpackPlugin.MinifyOptions = { - minifyCSS: true, - minifyJS: false, - removeComments: true, - collapseInlineTagWhitespace: true, - collapseWhitespace: true, -}; - /** Adds sourcemap support */ export const sourceMapRule: webpack.RuleSetRule = { test: /\.js$/, @@ -98,15 +72,6 @@ export const imageAndFontsRule: webpack.RuleSetRule = { type: 'asset/resource', }; -/** Generates HTML file that includes webpack assets */ -export const htmlPlugin = new HTMLWebpackPlugin({ - template: './src/assets/index.html', - inject: 'body', - minify: isProd ? htmlMinifyConfig : false, - hash: false, - showErrors: isDev, -}); - export const favIconPlugin = new FavIconWebpackPlugin({ logo: path.resolve(__dirname, 'src/assets/favicon.png'), // we can add '[fullhash:8]/' to the end of the file in future @@ -120,14 +85,6 @@ export const statsWriterPlugin = new StatsWriterPlugin({ fields: ['chunks', 'publicPath', 'assets', 'assetsByChunkName', 'assetsByChunkId'], }); -/** Gzip assets */ -export const compressionPlugin = new CompressionWebpackPlugin({ - algorithm: 'gzip', - test: /\.(js|css|html)$/, - threshold: 10240, - minRatio: 0.8, -}); - /** Define "process.env" in client app. Only provide things that can be public */ export const getDefinePlugin = (isServer: boolean) => new webpack.DefinePlugin({ @@ -143,9 +100,6 @@ export const getDefinePlugin = (isServer: boolean) => __isServer: isServer, }); -/** Enables Webpack HMR */ -export const hmrPlugin = new webpack.HotModuleReplacementPlugin(); - /** Limit server chunks to be only one. No need to split code in server */ export const limitChunksPlugin = new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, @@ -154,7 +108,8 @@ export const limitChunksPlugin = new webpack.optimize.LimitChunkCountPlugin({ const typescriptRule = { test: /\.tsx?$/, exclude: /node_modules/, - use: ['babel-loader', { loader: 'ts-loader', options: { transpileOnly: true } }], + include: path.resolve(__dirname, 'src'), + use: [{ loader: 'ts-loader', options: { transpileOnly: true } }], }; /** @@ -163,25 +118,21 @@ const typescriptRule = { * Client is compiled into multiple chunks that are result to dynamic imports. */ export const clientConfig: webpack.Configuration = { - devtool, - resolve, name: 'client', target: 'web', - get entry() { - const entry = ['babel-polyfill', './src/client']; - - if (isDev) { - return ['webpack-hot-middleware/client', ...entry]; - } - - return entry; + resolve: { + /** Base directories that Webpack will look to resolve absolutely imported modules */ + modules: ['src', 'node_modules'], + /** Extension that are allowed to be omitted from import statements */ + extensions: ['.ts', '.tsx', '.js', '.jsx'], + /** "main" fields in package.json files to resolve a CommonJS module for */ + mainFields: ['browser', 'module', 'main'], }, - mode: isDev ? 'development' : 'production', + entry: ['babel-polyfill', './src/client'], module: { rules: [sourceMapRule, typescriptRule, imageAndFontsRule], }, optimization: { - emitOnErrors: isProd, splitChunks: { cacheGroups: { vendor: { @@ -199,32 +150,15 @@ export const clientConfig: webpack.Configuration = { path: dist, filename: '[name]-[fullhash:8].js', chunkFilename: '[name]-[chunkhash].chunk.js', - crossOriginLoading: 'anonymous', - }, - get plugins() { - const plugins: webpack.WebpackPluginInstance[] = [ - htmlPlugin, - new ForkTsCheckerWebpackPlugin(), - favIconPlugin, - statsWriterPlugin, - getDefinePlugin(false), - new ServePlugin({ - middleware: (app, builtins) => - app.use(async (ctx, next) => { - ctx.setHeader('Content-Type', 'application/javascript; charset=UTF-8'); - await next(); - }), - port: 7777, - }), - ]; - - // Apply production specific configs - if (isProd) { - plugins.push(compressionPlugin); - } - - return plugins; + // crossOriginLoading: 'anonymous', + clean: true, }, + plugins: [ + new ForkTsCheckerWebpackPlugin(), + favIconPlugin, + statsWriterPlugin, + getDefinePlugin(false), + ], }; /** @@ -233,23 +167,29 @@ export const clientConfig: webpack.Configuration = { * Server bundle is compiled as a CommonJS package that exports an Express middleware */ export const serverConfig: webpack.Configuration = { - resolve, name: 'server', target: 'node', - mode: isDev ? 'development' : 'production', - devtool: isProd ? devtool : undefined, + resolve: { + /** Base directories that Webpack will look to resolve absolutely imported modules */ + modules: ['src', 'node_modules'], + /** Extension that are allowed to be omitted from import statements */ + extensions: ['.ts', '.tsx', '.js', '.jsx'], + /** "main" fields in package.json files to resolve a CommonJS module for */ + mainFields: ['browser', 'module', 'main'], + }, entry: ['babel-polyfill', './src/server'], module: { rules: [sourceMapRule, typescriptRule, imageAndFontsRule], }, + externalsPresets: { node: true }, externals: [nodeExternals({ allowlist: /lyft/ })], output: { path: dist, + publicPath: '/', filename: 'server.js', libraryTarget: 'commonjs2', - // assetModuleFilename: `${publicPath}/[fullhash:8].[ext]` }, plugins: [limitChunksPlugin, new ForkTsCheckerWebpackPlugin(), getDefinePlugin(true)], }; -export default [clientConfig, serverConfig]; +export default { clientConfig, serverConfig }; diff --git a/webpack.dev.config.ts b/webpack.dev.config.ts new file mode 100644 index 000000000..a4efd2db8 --- /dev/null +++ b/webpack.dev.config.ts @@ -0,0 +1,68 @@ +import * as webpack from 'webpack'; +import * as HTMLWebpackPlugin from 'html-webpack-plugin'; +import * as path from 'path'; +import { processEnv as env } from './env'; + +const { merge } = require('webpack-merge'); +const fs = require('fs'); +const common = require('./webpack.common.config').default; + +const devtool = 'eval-cheap-module-source-map'; + +/** + * Client configuration + * + * Client is compiled into multiple chunks that are result to dynamic imports. + */ +export const clientConfig: webpack.Configuration = merge(common.clientConfig, { + mode: 'development', + devtool, + devServer: { + hot: true, + static: path.join(__dirname, 'dist'), + compress: true, + port: 3000, + host: env.LOCAL_DEV_HOST, + historyApiFallback: true, + server: { + type: 'https', + options: { + key: fs.readFileSync('script/server.key'), + cert: fs.readFileSync('script/server.crt'), + }, + }, + client: { + logging: 'verbose', + overlay: { errors: true, warnings: false }, + progress: true, + }, + devMiddleware: { + serverSideRender: true, + }, + }, + optimization: { + emitOnErrors: false, + runtimeChunk: 'single', + }, + plugins: [ + new HTMLWebpackPlugin({ + template: './src/assets/index.html', + inject: 'body', + minify: false, + hash: false, + showErrors: true, + }), + ], +}); + +/** + * Server configuration + * + * Server bundle is compiled as a CommonJS package that exports an Express middleware + */ +export const serverConfig: webpack.Configuration = merge(common.serverConfig, { + mode: 'development', + devtool: devtool, +}); + +export default [clientConfig, serverConfig]; diff --git a/webpack.prod.config.ts b/webpack.prod.config.ts new file mode 100644 index 000000000..4be73b457 --- /dev/null +++ b/webpack.prod.config.ts @@ -0,0 +1,51 @@ +import * as webpack from 'webpack'; +import * as CompressionWebpackPlugin from 'compression-webpack-plugin'; +import * as HTMLWebpackPlugin from 'html-webpack-plugin'; + +const { merge } = require('webpack-merge'); + +const common = require('./webpack.common.config').default; + +/** + * Client configuration + * + * Client is compiled into multiple chunks that are result to dynamic imports. + */ +export const clientConfig: webpack.Configuration = merge(common.clientConfig, { + mode: 'production', + optimization: { + emitOnErrors: true, + }, + plugins: [ + new CompressionWebpackPlugin({ + algorithm: 'gzip', + test: /\.(js|css|html)$/, + threshold: 10240, + minRatio: 0.8, + }), + new HTMLWebpackPlugin({ + template: './src/assets/index.html', + inject: 'body', + minify: { + minifyCSS: true, + minifyJS: false, + removeComments: true, + collapseInlineTagWhitespace: true, + collapseWhitespace: true, + }, + hash: false, + showErrors: false, + }), + ], +}); + +/** + * Server configuration + * + * Server bundle is compiled as a CommonJS package that exports an Express middleware + */ +export const serverConfig: webpack.Configuration = merge(common.serverConfig, { + mode: 'production', +}); + +export default [clientConfig, serverConfig]; diff --git a/yarn.lock b/yarn.lock index 6e6d1741d..ffa3ad0ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2277,6 +2277,11 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" + integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== + "@marionebl/sander@^0.6.0": version "0.6.1" resolved "https://registry.yarnpkg.com/@marionebl/sander/-/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b" @@ -3884,6 +3889,13 @@ "@types/connect" "*" "@types/node" "*" +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + "@types/cheerio@^0.22.2": version "0.22.22" resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.22.tgz#ae71cf4ca59b8bbaf34c99af7a5d6c8894988f5f" @@ -3903,12 +3915,13 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/compression-webpack-plugin@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/compression-webpack-plugin/-/compression-webpack-plugin-9.1.1.tgz#c73bf509c13e51fe05e0b84722ed88503cfa3bcc" - integrity sha512-cCZFFPFgZ42nWv+uHNgUenQl4gjo+oIvdPwLkGnsJBD6IpaN8dKxanLksHtc5fvlo74a5/sOuX6H320r/GROUw== +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== dependencies: - compression-webpack-plugin "*" + "@types/express-serve-static-core" "*" + "@types/node" "*" "@types/connect@*": version "3.4.33" @@ -3974,6 +3987,25 @@ "@types/qs" "*" "@types/range-parser" "*" +"@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/express@^4.17.2": version "4.17.9" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.9.tgz#f5f2df6add703ff28428add52bdec8a1091b0a78" @@ -4028,10 +4060,10 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/http-proxy@^1.17.5": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" - integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== +"@types/http-proxy@^1.17.8": + version "1.17.8" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" + integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== dependencies: "@types/node" "*" @@ -4371,6 +4403,13 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + "@types/serve-static@*", "@types/serve-static@^1.7.31": version "1.13.8" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.8.tgz#851129d434433c7082148574ffec263d58309c46" @@ -4384,6 +4423,13 @@ resolved "https://registry.yarnpkg.com/@types/shallowequal/-/shallowequal-0.2.4.tgz#f0e7d265b574f7b2b85cb008af4e76653fe99eeb" integrity sha512-q1GRm+R3hWk334SeLAoy3EFpyCbsKMb5bGxwglrIOrp9Zu4WDwqPxrcrGz1ccCmQ57dn2+yDpWEQKpjqb4cU3Q== +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -4460,6 +4506,13 @@ anymatch "^3.0.0" source-map "^0.6.0" +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -4878,15 +4931,7 @@ abbrev@1, abbrev@~1.1.1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@^1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -4894,6 +4939,14 @@ accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -4932,15 +4985,6 @@ acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== -add-asset-html-webpack-plugin@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/add-asset-html-webpack-plugin/-/add-asset-html-webpack-plugin-3.2.0.tgz#e4ca5fae61ab1725e69dde18066fb99b90571fd5" - integrity sha512-Qb+4dSuCYmxJcZrdS3eY2WGb7U4LYnRKGX6Ye1aV4qi22UBReZOGt16VpULdjJ0kNts/KRUPqwsUTxMMGxx88Q== - dependencies: - globby "^9.0.0" - micromatch "^3.1.3" - p-each-series "^1.0.0" - address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -5284,6 +5328,11 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -5418,6 +5467,13 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async@^2.6.2: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -5748,6 +5804,11 @@ batch-processor@1.0.0: resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -5877,6 +5938,16 @@ body-parser@1.19.2: raw-body "2.4.3" type-is "~1.6.18" +bonjour-service@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.11.tgz#5418e5c1ac91c89a406f853a942e7892829c0d89" + integrity sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.4" + boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -6146,7 +6217,7 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0, bytes@^3.0.0: +bytes@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== @@ -6234,14 +6305,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cache-content-type@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" - integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== - dependencies: - mime-types "^2.1.18" - ylru "^1.2.0" - cache@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/cache/-/cache-2.3.1.tgz#78334a30b2c9daca2d10abbe8f9a0b610ddf91ba" @@ -6956,14 +7019,14 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compressible@^2.0.0, compressible@~2.0.16: +compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" -compression-webpack-plugin@*, compression-webpack-plugin@^9.2.0: +compression-webpack-plugin@^9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz#57fd539d17c5907eebdeb4e83dcfe2d7eceb9ef6" integrity sha512-R/Oi+2+UHotGfu72fJiRoVpuRifZT0tTC6UqFD/DUo+mv8dbOow9rVOuTvDv5nPPm3GZhHL/fKkwxwIHnJ8Nyw== @@ -7048,7 +7111,7 @@ confusing-browser-globals@^1.0.10: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -connect-history-api-fallback@^1.5.0: +connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== @@ -7068,7 +7131,7 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -content-disposition@0.5.3, content-disposition@~0.5.2: +content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== @@ -7082,7 +7145,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@^1.0.4, content-type@~1.0.4: +content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== @@ -7191,14 +7254,6 @@ cookie@^0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== -cookies@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== - dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -7957,13 +8012,6 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@*, debug@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -7985,13 +8033,20 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" -debug@^3.0.0, debug@^3.1.0, debug@^3.2.7: +debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -8032,11 +8087,6 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -8057,6 +8107,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -8064,6 +8121,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -8117,16 +8179,16 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -8140,7 +8202,7 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@^1.0.4, destroy@~1.0.4: +destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= @@ -8172,6 +8234,11 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + detect-port@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" @@ -8221,6 +8288,18 @@ dir-glob@^3.0.0, dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -8550,7 +8629,7 @@ emotion@^10.0.17: babel-plugin-emotion "^10.0.27" create-emotion "^10.0.27" -encodeurl@^1.0.2, encodeurl@~1.0.2: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= @@ -8753,12 +8832,12 @@ es6-shim@^0.35.5: resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0" integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA== -escalade@^3.1.0, escalade@^3.1.1: +escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@^1.0.3, escape-html@~1.0.3: +escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -9115,7 +9194,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0, execa@^4.0.3: +execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -9215,7 +9294,7 @@ express@^4.14.0: utils-merge "1.0.1" vary "~1.1.2" -express@^4.17.1: +express@^4.17.1, express@^4.17.3: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== @@ -9391,6 +9470,13 @@ favicons@^6.2.0: vinyl "^2.2.1" xml2js "^0.4.23" +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -9690,7 +9776,7 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -fresh@0.5.2, fresh@~0.5.2: +fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= @@ -10170,7 +10256,7 @@ globby@^11.0.2, globby@^11.0.4: merge2 "^1.4.1" slash "^3.0.0" -globby@^9.0.0, globby@^9.2.0: +globby@^9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== @@ -10211,6 +10297,11 @@ graceful-fs@^4.1.9, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.2.6: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + graphlib@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" @@ -10228,6 +10319,11 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + handlebars@^4.7.6, handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -10258,11 +10354,6 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -harmony-reflect@^1.4.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" - integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -10516,6 +10607,16 @@ hosted-git-info@^3.0.0, hosted-git-info@^3.0.6: dependencies: lru-cache "^6.0.0" +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -10528,6 +10629,11 @@ html-entities@^2.1.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -10617,19 +10723,16 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -http-assert@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" - integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== - dependencies: - deep-equal "~1.0.1" - http-errors "~1.8.0" - http-cache-semantics@^3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -10652,17 +10755,6 @@ http-errors@1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -http-errors@^1.6.3, http-errors@^1.7.3, http-errors@^1.8.0, http-errors@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" - integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -10684,6 +10776,11 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-parser-js@>=0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" @@ -10701,12 +10798,12 @@ http-proxy-agent@^4.0.0: agent-base "6" debug "4" -http-proxy-middleware@^1.0.3: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" - integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== +http-proxy-middleware@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.5.tgz#2d12fb41a414889372643a1f54279a2f6470aa93" + integrity sha512-ORErEaxkjyrhifofwCuQttHPUSestLtiPDwV0qQOFB0ww6695H953wIGRnkakw1K+GAP+t8/RPbfDB75RFL4Fg== dependencies: - "@types/http-proxy" "^1.17.5" + "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" is-glob "^4.0.1" is-plain-obj "^3.0.0" @@ -10822,13 +10919,6 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -identity-obj-proxy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= - dependencies: - harmony-reflect "^1.4.6" - ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -11052,6 +11142,11 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + is-absolute-url@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" @@ -11238,6 +11333,11 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== +is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-dom@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" @@ -11290,13 +11390,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^3.0.0, is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -11451,11 +11544,6 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -12427,13 +12515,6 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -12475,95 +12556,6 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -koa-compose@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" - integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== - -koa-compress@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-5.1.0.tgz#7b9fe24f4c1b28d9cae90864597da472c2fcf701" - integrity sha512-G3Ppo9jrUwlchp6qdoRgQNMiGZtM0TAHkxRZQ7EoVvIG8E47J4nAsMJxXHAUQ+0oc7t0MDxSdONWTFcbzX7/Bg== - dependencies: - bytes "^3.0.0" - compressible "^2.0.0" - http-errors "^1.8.0" - koa-is-json "^1.0.0" - statuses "^2.0.1" - -koa-connect@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/koa-connect/-/koa-connect-2.1.0.tgz#16bce0a917c4cb24233aaac83fbc5b83804b4a1c" - integrity sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ== - -koa-convert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" - integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== - dependencies: - co "^4.6.0" - koa-compose "^4.1.0" - -koa-is-json@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" - integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= - -koa-route@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/koa-route/-/koa-route-3.2.0.tgz#76298b99a6bcfa9e38cab6fe5c79a8733e758bce" - integrity sha1-dimLmaa8+p44yrb+XHmocz51i84= - dependencies: - debug "*" - methods "~1.1.0" - path-to-regexp "^1.2.0" - -koa-send@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79" - integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== - dependencies: - debug "^4.1.1" - http-errors "^1.7.3" - resolve-path "^1.4.0" - -koa-static@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" - integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== - dependencies: - debug "^3.1.0" - koa-send "^5.0.0" - -koa@^2.5.3: - version "2.13.4" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" - integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== - dependencies: - accepts "^1.3.5" - cache-content-type "^1.0.0" - content-disposition "~0.5.2" - content-type "^1.0.4" - cookies "~0.8.0" - debug "^4.3.2" - delegates "^1.0.0" - depd "^2.0.0" - destroy "^1.0.4" - encodeurl "^1.0.2" - escape-html "^1.0.3" - fresh "~0.5.2" - http-assert "^1.3.0" - http-errors "^1.6.3" - is-generator-function "^1.0.7" - koa-compose "^4.1.0" - koa-convert "^2.0.0" - on-finished "^2.3.0" - only "~0.0.2" - parseurl "^1.3.2" - statuses "^1.5.0" - type-is "^1.6.16" - vary "^1.1.2" - language-subtag-registry@~0.3.2: version "0.3.21" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" @@ -13100,7 +13092,7 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: +lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -13128,11 +13120,6 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -loglevelnext@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-4.0.1.tgz#4406c6348c243a35272ac75d7d8e4e60ecbcd011" - integrity sha512-/tlMUn5wqgzg9msy0PiWc+8fpVXEuYPq49c2RGyw2NAh0hSrgq6j/Z3YPnwWsILMoFJ+ZT6ePHnWUonkjDnq2Q== - long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -13499,7 +13486,7 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@~1.1.0, methods@~1.1.2: +methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -13509,7 +13496,7 @@ microevent.ts@~0.1.1: resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== -micromatch@^3.1.10, micromatch@^3.1.3, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -13530,16 +13517,21 @@ mime-db@1.44.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== -mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": - version "1.50.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" - integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== - mime-db@1.51.0: version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" @@ -13547,13 +13539,6 @@ mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: dependencies: mime-db "1.44.0" -mime-types@^2.1.18: - version "2.1.33" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" - integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== - dependencies: - mime-db "1.50.0" - mime-types@^2.1.27, mime-types@^2.1.30, mime-types@^2.1.31, mime-types@~2.1.34: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" @@ -13561,6 +13546,13 @@ mime-types@^2.1.27, mime-types@^2.1.30, mime-types@^2.1.31, mime-types@~2.1.34: dependencies: mime-db "1.51.0" +mime-types@~2.1.17: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -13839,6 +13831,14 @@ msw@^0.24.1: statuses "^2.0.0" yargs "^16.1.1" +multicast-dns@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.4.tgz#cf0b115c31e922aeb20b64e6556cbeb34cf0dd19" + integrity sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -13849,7 +13849,7 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nanoid@^3.1.23, nanoid@^3.1.3: +nanoid@^3.1.23: version "3.2.0" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== @@ -13949,6 +13949,11 @@ node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + node-gyp@^5.0.2, node-gyp@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" @@ -14514,12 +14519,17 @@ objectorarray@^1.0.5: resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.5.tgz#2c05248bbefabd8f43ad13b41085951aac5e68a5" integrity sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg== +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + omggif@^1.0.10, omggif@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== -on-finished@^2.3.0, on-finished@~2.3.0: +on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= @@ -14552,11 +14562,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -only@~0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" - integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= - open@^7.0.3: version "7.3.0" resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" @@ -14565,6 +14570,15 @@ open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" @@ -14648,18 +14662,6 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= -p-defer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" - integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" - p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -14762,11 +14764,6 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - p-reduce@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" @@ -14780,6 +14777,14 @@ p-retry@^4.0.0: "@types/retry" "^0.12.0" retry "^0.12.0" +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + p-timeout@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" @@ -14974,7 +14979,7 @@ parse5@^6.0.0, parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -15017,7 +15022,7 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@1.0.1, path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -15047,7 +15052,7 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-to-regexp@^1.2.0, path-to-regexp@^1.7.0: +path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== @@ -15220,6 +15225,15 @@ popper.js@1.16.1-lts: resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + postcss-flexbugs-fixes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" @@ -16283,7 +16297,7 @@ read@1, read@~1.0.1, read@~1.0.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -16683,7 +16697,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.1, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -16744,14 +16758,6 @@ resolve-global@1.0.0, resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" -resolve-path@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" - integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= - dependencies: - http-errors "~1.6.2" - path-is-absolute "1.0.1" - resolve-pathname@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" @@ -16821,6 +16827,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -16894,7 +16905,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -16992,6 +17003,18 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== + dependencies: + node-forge "^1" + semantic-release@^17.2.3: version "17.2.3" resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.2.3.tgz#11f10b851d4e75b1015b17515c433049b3df994c" @@ -17149,6 +17172,19 @@ serve-favicon@^2.5.0: parseurl "~1.3.2" safe-buffer "5.1.1" +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + serve-static@1.14.1, serve-static@^1.12.3: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -17391,6 +17427,15 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + socks-proxy-agent@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" @@ -17466,7 +17511,7 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.17, source-map-support@^0.5.3, source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -17530,6 +17575,29 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" @@ -17632,7 +17700,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0, statuses@~1.5.0: +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -17642,11 +17710,6 @@ statuses@^2.0.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.0.tgz#aa7b107e018eb33e08e8aee2e7337e762dda1028" integrity sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA== -statuses@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -17976,11 +18039,6 @@ style-to-object@0.3.0, style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -superstruct@^0.12.1: - version "0.12.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.12.2.tgz#214d419e2c1eabd87d7a3774150664dfe53506e0" - integrity sha512-yu+WNa/nSbFa+VBeR2KibfCeIQSKh/aD7G5eFD4Rx4W36MWE3G6SzU3BixDOArLv56u2bz6YEePsHSsioojuXw== - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -18255,6 +18313,11 @@ through@2, "through@>=2.2.7 <3": resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -18516,11 +18579,6 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -18594,7 +18652,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -19030,7 +19088,7 @@ uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.0: +uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -19108,7 +19166,7 @@ value-equal@^1.0.1: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== -vary@^1.1.2, vary@~1.1.2: +vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= @@ -19216,6 +19274,13 @@ watchpack@^2.2.0, watchpack@^2.3.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + wcwidth@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -19295,6 +19360,41 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" +webpack-dev-server@^4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz#58f9d797710d6e25fa17d6afab8708f958c11a29" + integrity sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + webpack-filter-warnings-plugin@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb" @@ -19310,15 +19410,6 @@ webpack-hot-middleware@^2.25.1: querystring "^0.2.0" strip-ansi "^6.0.0" -webpack-hot-server-middleware@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/webpack-hot-server-middleware/-/webpack-hot-server-middleware-0.6.1.tgz#1515b2d5db3277b583b01fc59bb0d5b87dc46494" - integrity sha512-YOKwdS0hnmADsNCsReGkMOBkoz2YVrQZvnVcViM2TDXlK9NnaOGXmnrLFjzwsHFa0/iuJy/QJFEoMxzk8R1Mgg== - dependencies: - debug "^3.1.0" - require-from-string "^2.0.1" - source-map-support "^0.5.3" - webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -19327,7 +19418,7 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-merge@^5.7.3: +webpack-merge@^5.7.3, webpack-merge@^5.8.0: version "5.8.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== @@ -19340,44 +19431,6 @@ webpack-node-externals@^3.0.0: resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== -webpack-plugin-ramdisk@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/webpack-plugin-ramdisk/-/webpack-plugin-ramdisk-0.2.0.tgz#8fb9c5dfd5343a7c9a2cdf6bf3a0aaddeaa00bbf" - integrity sha512-I5OTfDuaQdiZQUm19Ok/8oCBmYCGqFu8e2sY6ytGT9xehZQJXB6cqdf+rHUr98gzwhcC2O96Wuhs6BQTmOy2hg== - dependencies: - chalk "^4.1.0" - execa "^4.0.3" - superstruct "^0.12.1" - -webpack-plugin-serve@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/webpack-plugin-serve/-/webpack-plugin-serve-1.6.0.tgz#81d467f4ab1cbb549657bff0e0be6129886a87bf" - integrity sha512-0163GYEpDdRmd0D82XCeYalpSrRg9+oqEtoVUeCnn1o1lnGjqFoKdgSZBhXNOg2at52l4ESwLskPhPp3cHLAqA== - dependencies: - chalk "^4.0.0" - connect-history-api-fallback "^1.5.0" - escalade "^3.1.0" - globby "^11.0.0" - http-proxy-middleware "^1.0.3" - is-path-cwd "^2.2.0" - is-promise "^4.0.0" - json-stringify-safe "^5.0.1" - koa "^2.5.3" - koa-compress "^5.0.1" - koa-connect "^2.0.1" - koa-route "^3.2.0" - koa-static "^5.0.0" - loglevelnext "^4.0.1" - nanoid "^3.1.3" - onetime "^5.1.0" - open "^7.0.3" - p-defer "^3.0.0" - rimraf "^3.0.2" - strip-ansi "^6.0.0" - superstruct "^0.12.1" - webpack-plugin-ramdisk "^0.2.0" - ws "^7.5.3" - webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" @@ -19467,6 +19520,20 @@ webpack@^5, webpack@^5.68.0, webpack@^5.9.0: watchpack "^2.3.1" webpack-sources "^3.2.3" +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -19655,12 +19722,12 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^7.2.3, ws@^7.5.3: +ws@^7.2.3: version "7.5.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== -ws@^8.2.3: +ws@^8.2.3, ws@^8.4.2: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== @@ -19872,11 +19939,6 @@ yargs@^8.0.2: y18n "^3.2.1" yargs-parser "^7.0.0" -ylru@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" - integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 287aa24de07303f533bf24ec72b07a0c8dd001e6 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Thu, 21 Apr 2022 10:35:20 -0700 Subject: [PATCH 02/13] chore: update eslintignore Signed-off-by: Carina Ursu --- .eslintignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.eslintignore b/.eslintignore index 62f64cb7b..24392da2f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,4 +4,6 @@ src/generated/ dist/ node_modules/ tsd/ -webpack.config.ts \ No newline at end of file +webpack.common.config.ts +webpack.dev.config.ts +webpack.prod.config.ts \ No newline at end of file From 758545f9f3a8871a22606c874b616949bea7a81b Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Thu, 21 Apr 2022 13:25:05 -0700 Subject: [PATCH 03/13] chore: fix aggressive cleam Signed-off-by: Carina Ursu --- webpack.common.config.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/webpack.common.config.ts b/webpack.common.config.ts index 323ad1fb7..9e67e0901 100644 --- a/webpack.common.config.ts +++ b/webpack.common.config.ts @@ -150,8 +150,9 @@ export const clientConfig: webpack.Configuration = { path: dist, filename: '[name]-[fullhash:8].js', chunkFilename: '[name]-[chunkhash].chunk.js', - // crossOriginLoading: 'anonymous', - clean: true, + clean: { + keep: 'server.js', + }, }, plugins: [ new ForkTsCheckerWebpackPlugin(), @@ -167,8 +168,6 @@ export const clientConfig: webpack.Configuration = { * Server bundle is compiled as a CommonJS package that exports an Express middleware */ export const serverConfig: webpack.Configuration = { - name: 'server', - target: 'node', resolve: { /** Base directories that Webpack will look to resolve absolutely imported modules */ modules: ['src', 'node_modules'], @@ -177,6 +176,8 @@ export const serverConfig: webpack.Configuration = { /** "main" fields in package.json files to resolve a CommonJS module for */ mainFields: ['browser', 'module', 'main'], }, + name: 'server', + target: 'node', entry: ['babel-polyfill', './src/server'], module: { rules: [sourceMapRule, typescriptRule, imageAndFontsRule], @@ -185,9 +186,9 @@ export const serverConfig: webpack.Configuration = { externals: [nodeExternals({ allowlist: /lyft/ })], output: { path: dist, - publicPath: '/', filename: 'server.js', libraryTarget: 'commonjs2', + clean: true, }, plugins: [limitChunksPlugin, new ForkTsCheckerWebpackPlugin(), getDefinePlugin(true)], }; From 2abe8e43d8f7df49c1fa5686fb5cc990c182e351 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Thu, 21 Apr 2022 13:29:40 -0700 Subject: [PATCH 04/13] chore: client clean not needed Signed-off-by: Carina Ursu --- webpack.common.config.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/webpack.common.config.ts b/webpack.common.config.ts index 9e67e0901..e43e7d8c8 100644 --- a/webpack.common.config.ts +++ b/webpack.common.config.ts @@ -150,9 +150,6 @@ export const clientConfig: webpack.Configuration = { path: dist, filename: '[name]-[fullhash:8].js', chunkFilename: '[name]-[chunkhash].chunk.js', - clean: { - keep: 'server.js', - }, }, plugins: [ new ForkTsCheckerWebpackPlugin(), From f1a10f9f21d17503130a1bf61b90dca6512ef50c Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Thu, 21 Apr 2022 16:15:24 -0700 Subject: [PATCH 05/13] chore: cleanup Signed-off-by: Carina Ursu --- index.js | 16 +++ index.js.orig | 81 ++++++++++++++ webpack.common.config.ts.orig | 203 ++++++++++++++++++++++++++++++++++ 3 files changed, 300 insertions(+) create mode 100644 index.js.orig create mode 100644 webpack.common.config.ts.orig diff --git a/index.js b/index.js index 3b4f1fcfa..adc78c58f 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,11 @@ /* eslint-disable no-console */ const morgan = require('morgan'); const express = require('express'); +const path = require('path'); +const expressStaticGzip = require('express-static-gzip'); +const serverRenderer = require('./dist/server.js').default; +const clientStats = require('./dist/client-stats.json'); + const env = require('./env'); const { applyMiddleware } = require('./plugins'); @@ -21,6 +26,7 @@ if (typeof applyMiddleware === 'function') { applyMiddleware(app); } +<<<<<<< HEAD if (process.env.NODE_ENV === 'production') { const path = require('path'); const expressStaticGzip = require('express-static-gzip'); @@ -36,6 +42,16 @@ if (process.env.NODE_ENV === 'production') { ); app.use(serverRenderer({ clientStats, currentDirectory: __dirname })); } +======= +const distPath = path.join(__dirname, 'dist'); +app.use( + `${env.BASE_URL}/assets`, + expressStaticGzip(distPath, { + maxAge: '1d', + }), +); +app.use(serverRenderer({ clientStats, currentDirectory: __dirname })); +>>>>>>> 2162608 (chore: cleanup) /* Set ADMIN_API_USE_SSL to https for CORS support */ let server; diff --git a/index.js.orig b/index.js.orig new file mode 100644 index 000000000..ea46e6165 --- /dev/null +++ b/index.js.orig @@ -0,0 +1,81 @@ +/** + * @file + * This file is NOT compiled and is run directly by Node.js. Make sure you are not using JavaScript features that + * does not exist in Node.js runtime. + */ +/* eslint-disable no-console */ +const morgan = require('morgan'); +const express = require('express'); +const env = require('./env'); +const { applyMiddleware } = require('./plugins'); + +const app = express(); + +// Enable logging for HTTP access +app.use(morgan('combined')); +app.use(express.json()); +app.get(`${env.BASE_URL}/healthz`, (_req, res) => res.status(200).send()); + +if (typeof applyMiddleware === 'function') { + console.log('Found middleware plugins, applying...'); + applyMiddleware(app); +} + +if (process.env.NODE_ENV === 'production') { + const path = require('path'); + const expressStaticGzip = require('express-static-gzip'); + const serverRenderer = require('./dist/server.js').default; + const clientStats = require('./dist/client-stats.json'); + const distPath = path.join(__dirname, 'dist'); + app.use( +<<<<<<< HEAD + // This path should be in sync with the `publicPath` from webpack config. +======= +>>>>>>> 01bcbdc (chore: add /assets fix) + `${env.BASE_URL}/assets`, + expressStaticGzip(distPath, { + maxAge: '1d', + }), + ); + app.use(serverRenderer({ clientStats, currentDirectory: __dirname })); +} + +/* Set ADMIN_API_USE_SSL to https for CORS support */ +let server; +const port = process.env.PORT || 3000; +if (env.ADMIN_API_USE_SSL === 'https') { + const fs = require('fs'); + const https = require('https'); + var privateKey = fs.readFileSync('script/server.key'); + var certificate = fs.readFileSync('script/server.crt'); + + server = https + .createServer( + { + key: privateKey, + cert: certificate, + }, + app, + ) + .listen(port); + console.log(`Server started with SSL: https://localhost:${port}/`); +} else { + server = app.listen(port, (error) => { + if (error) { + throw error; + } + console.log(`Server started: http://localhost:${port}/`); + }); +} + +process.on('SIGTERM', () => { + console.info('SIGTERM signal received. Shutting down.'); + server.close((error) => { + if (error) { + console.error('Failed to close server:', error); + process.exit(1); + } + console.log('Server closed'); + process.exit(0); + }); +}); diff --git a/webpack.common.config.ts.orig b/webpack.common.config.ts.orig new file mode 100644 index 000000000..567ce941d --- /dev/null +++ b/webpack.common.config.ts.orig @@ -0,0 +1,203 @@ +// tslint:disable:no-var-requires +// tslint:disable:no-console +import chalk from 'chalk'; +import * as path from 'path'; +import * as webpack from 'webpack'; +import { processEnv as env } from './env'; + +const { StatsWriterPlugin } = require('webpack-stats-plugin'); +const FavIconWebpackPlugin = require('favicons-webpack-plugin'); +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +const nodeExternals = require('webpack-node-externals'); + +const packageJson: { + dependencies: { [libName: string]: string }; + devDependencies: { [libName: string]: string }; +} = require(require.resolve('./package.json')); + +/** Current service name */ +export const serviceName = process.env.SERVICE_NAME || 'not set'; + +/** Absolute path to webpack output folder */ +export const dist = path.join(__dirname, 'dist'); + +<<<<<<< HEAD +/** Webpack public path. All emitted assets will have relative path to this path + * every time it is changed - the index.js app.use should also be updated. + */ +======= +/** Webpack public path. All emitted assets will have relative path to this path */ +>>>>>>> 01bcbdc (chore: add /assets fix) +export const publicPath = `${env.BASE_URL}/assets/`; + +// /** True if we are in development mode */ +// export const isDev = env.NODE_ENV === 'development'; + +// /** True if we are in production mode */ +// export const isProd = env.NODE_ENV === 'production'; + +/** CSS module class name pattern */ +// export const localIdentName = isDev ? '[local]_[fullhash:base64:3]' : '[fullhash:base64:6]'; + +// Report current configuration +console.log(chalk.cyan('Exporting Webpack config with following configurations:')); +console.log(chalk.blue('Environment:'), chalk.green(env.NODE_ENV)); +console.log(chalk.blue('Output directory:'), chalk.green(path.resolve(dist))); +console.log(chalk.blue('Public path:'), chalk.green(publicPath)); + +/** Get clean version of a version string of package.json entry for a package by + * extracting only alphanumerics, hyphen, and period. Note that this won't + * produce a valid URL for all possible NPM version strings, but should be fine + * on those that are absolute version references. + * Examples: '1', '1.0', '1.2.3', '1.2.3-alpha.0' + */ +export function absoluteVersion(version: string) { + return version.replace(/[^\d.\-a-z]/g, ''); +} + +/** CDN path in case we would use minified react and react-DOM */ +const cdnReact = `https://unpkg.com/react@${absoluteVersion( + packageJson.devDependencies.react, +)}/umd/react.production.min.js`; +const cdnReactDOM = `https://unpkg.com/react-dom@${absoluteVersion( + packageJson.devDependencies['react-dom'], +)}/umd/react-dom.production.min.js`; + +/** Adds sourcemap support */ +export const sourceMapRule: webpack.RuleSetRule = { + test: /\.js$/, + enforce: 'pre', + use: ['source-map-loader'], +}; + +/** Rule for images, icons and fonts */ +export const imageAndFontsRule: webpack.RuleSetRule = { + test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/, + type: 'asset/resource', +}; + +export const favIconPlugin = new FavIconWebpackPlugin({ + logo: path.resolve(__dirname, 'src/assets/favicon.png'), +<<<<<<< HEAD + // we can add '[fullhash:8]/' to the end of the file in future + // if this one will be changed - ensure that OneClick will still be working + prefix: './', +======= + prefix: './', // we can add '[fullhash:8]/' to the end of the file in future +>>>>>>> 01bcbdc (chore: add /assets fix) +}); + +/** Write client stats to a JSON file for production */ +export const statsWriterPlugin = new StatsWriterPlugin({ + filename: 'client-stats.json', + fields: ['chunks', 'publicPath', 'assets', 'assetsByChunkName', 'assetsByChunkId'], +}); + +/** Define "process.env" in client app. Only provide things that can be public */ +export const getDefinePlugin = (isServer: boolean) => + new webpack.DefinePlugin({ + 'process.env': isServer + ? 'process.env' + : Object.keys(env).reduce( + (result, key: string) => ({ + ...result, + [key]: JSON.stringify((env as any)[key]), + }), + {}, + ), + __isServer: isServer, + }); + +/** Limit server chunks to be only one. No need to split code in server */ +export const limitChunksPlugin = new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, +}); + +const typescriptRule = { + test: /\.tsx?$/, + exclude: /node_modules/, + include: path.resolve(__dirname, 'src'), + use: [{ loader: 'ts-loader', options: { transpileOnly: true } }], +}; + +/** + * Client configuration + * + * Client is compiled into multiple chunks that are result to dynamic imports. + */ +export const clientConfig: webpack.Configuration = { + name: 'client', + target: 'web', + resolve: { + /** Base directories that Webpack will look to resolve absolutely imported modules */ + modules: ['src', 'node_modules'], + /** Extension that are allowed to be omitted from import statements */ + extensions: ['.ts', '.tsx', '.js', '.jsx'], + /** "main" fields in package.json files to resolve a CommonJS module for */ + mainFields: ['browser', 'module', 'main'], + }, + entry: ['babel-polyfill', './src/client'], + module: { + rules: [sourceMapRule, typescriptRule, imageAndFontsRule], + }, + optimization: { + splitChunks: { + cacheGroups: { + vendor: { + chunks: 'initial', + enforce: true, + name: 'vendor', + priority: 10, + test: /[\\/]node_modules/, + }, + }, + }, + }, + output: { + publicPath, + path: dist, + filename: '[name]-[fullhash:8].js', + chunkFilename: '[name]-[chunkhash].chunk.js', + // crossOriginLoading: 'anonymous', + clean: true, + }, + plugins: [ + new ForkTsCheckerWebpackPlugin(), + favIconPlugin, + statsWriterPlugin, + getDefinePlugin(false), + ], +}; + +/** + * Server configuration + * + * Server bundle is compiled as a CommonJS package that exports an Express middleware + */ +export const serverConfig: webpack.Configuration = { + name: 'server', + target: 'node', + resolve: { + /** Base directories that Webpack will look to resolve absolutely imported modules */ + modules: ['src', 'node_modules'], + /** Extension that are allowed to be omitted from import statements */ + extensions: ['.ts', '.tsx', '.js', '.jsx'], + /** "main" fields in package.json files to resolve a CommonJS module for */ + mainFields: ['browser', 'module', 'main'], + }, + entry: ['babel-polyfill', './src/server'], + module: { + rules: [sourceMapRule, typescriptRule, imageAndFontsRule], + }, + externalsPresets: { node: true }, + externals: [nodeExternals({ allowlist: /lyft/ })], + output: { + path: dist, + publicPath: '/', + filename: 'server.js', + libraryTarget: 'commonjs2', + }, + plugins: [limitChunksPlugin, new ForkTsCheckerWebpackPlugin(), getDefinePlugin(true)], +}; + +export default { clientConfig, serverConfig }; From 1d2b9598f66f33dd9aede169250a5281c546f03f Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Thu, 21 Apr 2022 19:43:42 -0700 Subject: [PATCH 06/13] chore: import react from cdn Signed-off-by: Carina Ursu --- src/assets/index.html | 12 ++++++++++-- webpack.common.config.ts | 23 ----------------------- webpack.dev.config.ts | 6 +++--- webpack.prod.config.ts | 35 ++++++++++++++++++++++++++++++++--- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/assets/index.html b/src/assets/index.html index 9b6ddd5fc..6e388fb4e 100644 --- a/src/assets/index.html +++ b/src/assets/index.html @@ -1,10 +1,18 @@ - - + +
+ <% if (htmlWebpackPlugin.options.cdnReact) { %> + + <% } %> <% if (htmlWebpackPlugin.options.cdnReactDOM) { %> + + <% } %> diff --git a/webpack.common.config.ts b/webpack.common.config.ts index e43e7d8c8..6eb9088bd 100644 --- a/webpack.common.config.ts +++ b/webpack.common.config.ts @@ -10,11 +10,6 @@ const FavIconWebpackPlugin = require('favicons-webpack-plugin'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const nodeExternals = require('webpack-node-externals'); -const packageJson: { - dependencies: { [libName: string]: string }; - devDependencies: { [libName: string]: string }; -} = require(require.resolve('./package.json')); - /** Current service name */ export const serviceName = process.env.SERVICE_NAME || 'not set'; @@ -41,24 +36,6 @@ console.log(chalk.blue('Environment:'), chalk.green(env.NODE_ENV)); console.log(chalk.blue('Output directory:'), chalk.green(path.resolve(dist))); console.log(chalk.blue('Public path:'), chalk.green(publicPath)); -/** Get clean version of a version string of package.json entry for a package by - * extracting only alphanumerics, hyphen, and period. Note that this won't - * produce a valid URL for all possible NPM version strings, but should be fine - * on those that are absolute version references. - * Examples: '1', '1.0', '1.2.3', '1.2.3-alpha.0' - */ -export function absoluteVersion(version: string) { - return version.replace(/[^\d.\-a-z]/g, ''); -} - -/** CDN path in case we would use minified react and react-DOM */ -const cdnReact = `https://unpkg.com/react@${absoluteVersion( - packageJson.devDependencies.react, -)}/umd/react.production.min.js`; -const cdnReactDOM = `https://unpkg.com/react-dom@${absoluteVersion( - packageJson.devDependencies['react-dom'], -)}/umd/react-dom.production.min.js`; - /** Adds sourcemap support */ export const sourceMapRule: webpack.RuleSetRule = { test: /\.js$/, diff --git a/webpack.dev.config.ts b/webpack.dev.config.ts index a4efd2db8..19f66ee03 100644 --- a/webpack.dev.config.ts +++ b/webpack.dev.config.ts @@ -5,7 +5,7 @@ import { processEnv as env } from './env'; const { merge } = require('webpack-merge'); const fs = require('fs'); -const common = require('./webpack.common.config').default; +const common = require('./webpack.common.config'); const devtool = 'eval-cheap-module-source-map'; @@ -14,7 +14,7 @@ const devtool = 'eval-cheap-module-source-map'; * * Client is compiled into multiple chunks that are result to dynamic imports. */ -export const clientConfig: webpack.Configuration = merge(common.clientConfig, { +export const clientConfig: webpack.Configuration = merge(common.default.clientConfig, { mode: 'development', devtool, devServer: { @@ -60,7 +60,7 @@ export const clientConfig: webpack.Configuration = merge(common.clientConfig, { * * Server bundle is compiled as a CommonJS package that exports an Express middleware */ -export const serverConfig: webpack.Configuration = merge(common.serverConfig, { +export const serverConfig: webpack.Configuration = merge(common.default.serverConfig, { mode: 'development', devtool: devtool, }); diff --git a/webpack.prod.config.ts b/webpack.prod.config.ts index 4be73b457..b83ed778e 100644 --- a/webpack.prod.config.ts +++ b/webpack.prod.config.ts @@ -4,14 +4,37 @@ import * as HTMLWebpackPlugin from 'html-webpack-plugin'; const { merge } = require('webpack-merge'); -const common = require('./webpack.common.config').default; +const common = require('./webpack.common.config'); + +const packageJson: { + dependencies: { [libName: string]: string }; + devDependencies: { [libName: string]: string }; +} = require(require.resolve('./package.json')); + +/** Get clean version of a version string of package.json entry for a package by + * extracting only alphanumerics, hyphen, and period. Note that this won't + * produce a valid URL for all possible NPM version strings, but should be fine + * on those that are absolute version references. + * Examples: '1', '1.0', '1.2.3', '1.2.3-alpha.0' + */ +function absoluteVersion(version: string) { + return version.replace(/[^\d.\-a-z]/g, ''); +} + +/** CDN path in case we would use minified react and react-DOM */ +const cdnReact = `https://unpkg.com/react@${absoluteVersion( + packageJson.devDependencies.react, +)}/umd/react.production.min.js`; +const cdnReactDOM = `https://unpkg.com/react-dom@${absoluteVersion( + packageJson.devDependencies['react-dom'], +)}/umd/react-dom.production.min.js`; /** * Client configuration * * Client is compiled into multiple chunks that are result to dynamic imports. */ -export const clientConfig: webpack.Configuration = merge(common.clientConfig, { +export const clientConfig: webpack.Configuration = merge(common.default.clientConfig, { mode: 'production', optimization: { emitOnErrors: true, @@ -35,8 +58,14 @@ export const clientConfig: webpack.Configuration = merge(common.clientConfig, { }, hash: false, showErrors: false, + cdnReact, + cdnReactDOM, }), ], + externals: { + 'react-dom': 'ReactDOM', + react: 'React', + }, }); /** @@ -44,7 +73,7 @@ export const clientConfig: webpack.Configuration = merge(common.clientConfig, { * * Server bundle is compiled as a CommonJS package that exports an Express middleware */ -export const serverConfig: webpack.Configuration = merge(common.serverConfig, { +export const serverConfig: webpack.Configuration = merge(common.default.serverConfig, { mode: 'production', }); From 5eee126d573db1b73c984be1a7c42f17ef152cd5 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Fri, 22 Apr 2022 09:33:11 -0700 Subject: [PATCH 07/13] chore: update readmes Signed-off-by: Carina Ursu --- CONTRIBUTING.md | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f0c5e563a..34d40bfeb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -139,6 +139,7 @@ yarn install ``` export ADMIN_API_URL=https://different.admin.service.com export ADMIN_API_USE_SSL="https" + export LOCAL_DEV_HOST=localhost.different.admin.service.com ``` _NOTE:_ Add these to your local profile (e.g., `./profile`) to prevent having to do this step each time diff --git a/README.md b/README.md index c047de553..7deb56ae2 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,7 @@ More info on each section could be found at [CONTRIBUTING.md](CONTRIBUTING.md) ```bash export ADMIN_API_URL=https://different.admin.service.com export ADMIN_API_USE_SSL="https" + export LOCAL_DEV_HOST=localhost.different.admin.service.com ``` > **Hint:** Add these to your local profile (eg, `./profile`) to prevent having to do this step each time From 891b614d6d24814868efa929e3ba8171757c7e25 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Fri, 22 Apr 2022 09:56:47 -0700 Subject: [PATCH 08/13] chore: add script to start prod build locally Signed-off-by: Carina Ursu --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c9ee8f09f..77f235bba 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "build:prod": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' NODE_ENV=production webpack --config webpack.prod.config.ts --mode=production --progress", "build:storybook": "build-storybook", "start": "webpack serve --open --config webpack.dev.config.ts --hot", + "start:start:prodmode": "NODE_ENV=production node -r dotenv/config index.js", "storybook": "start-storybook -p 6006", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|jsx|ts|tsx|json)\"", From 1dbc0f034e36e19e20586212595ba25840c677b1 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Fri, 22 Apr 2022 10:00:49 -0700 Subject: [PATCH 09/13] chore: fix merge Signed-off-by: Carina Ursu --- index.js | 19 +--- index.js.orig | 81 -------------- webpack.common.config.ts.orig | 203 ---------------------------------- 3 files changed, 1 insertion(+), 302 deletions(-) delete mode 100644 index.js.orig delete mode 100644 webpack.common.config.ts.orig diff --git a/index.js b/index.js index adc78c58f..64b4a0e06 100644 --- a/index.js +++ b/index.js @@ -26,32 +26,15 @@ if (typeof applyMiddleware === 'function') { applyMiddleware(app); } -<<<<<<< HEAD -if (process.env.NODE_ENV === 'production') { - const path = require('path'); - const expressStaticGzip = require('express-static-gzip'); - const serverRenderer = require('./dist/server.js').default; - const clientStats = require('./dist/client-stats.json'); - const distPath = path.join(__dirname, 'dist'); - app.use( - // This path should be in sync with the `publicPath` from webpack config. - `${env.BASE_URL}/assets`, - expressStaticGzip(distPath, { - maxAge: '1d', - }), - ); - app.use(serverRenderer({ clientStats, currentDirectory: __dirname })); -} -======= const distPath = path.join(__dirname, 'dist'); app.use( + // This path should be in sync with the `publicPath` from webpack config. `${env.BASE_URL}/assets`, expressStaticGzip(distPath, { maxAge: '1d', }), ); app.use(serverRenderer({ clientStats, currentDirectory: __dirname })); ->>>>>>> 2162608 (chore: cleanup) /* Set ADMIN_API_USE_SSL to https for CORS support */ let server; diff --git a/index.js.orig b/index.js.orig deleted file mode 100644 index ea46e6165..000000000 --- a/index.js.orig +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file - * This file is NOT compiled and is run directly by Node.js. Make sure you are not using JavaScript features that - * does not exist in Node.js runtime. - */ -/* eslint-disable no-console */ -const morgan = require('morgan'); -const express = require('express'); -const env = require('./env'); -const { applyMiddleware } = require('./plugins'); - -const app = express(); - -// Enable logging for HTTP access -app.use(morgan('combined')); -app.use(express.json()); -app.get(`${env.BASE_URL}/healthz`, (_req, res) => res.status(200).send()); - -if (typeof applyMiddleware === 'function') { - console.log('Found middleware plugins, applying...'); - applyMiddleware(app); -} - -if (process.env.NODE_ENV === 'production') { - const path = require('path'); - const expressStaticGzip = require('express-static-gzip'); - const serverRenderer = require('./dist/server.js').default; - const clientStats = require('./dist/client-stats.json'); - const distPath = path.join(__dirname, 'dist'); - app.use( -<<<<<<< HEAD - // This path should be in sync with the `publicPath` from webpack config. -======= ->>>>>>> 01bcbdc (chore: add /assets fix) - `${env.BASE_URL}/assets`, - expressStaticGzip(distPath, { - maxAge: '1d', - }), - ); - app.use(serverRenderer({ clientStats, currentDirectory: __dirname })); -} - -/* Set ADMIN_API_USE_SSL to https for CORS support */ -let server; -const port = process.env.PORT || 3000; -if (env.ADMIN_API_USE_SSL === 'https') { - const fs = require('fs'); - const https = require('https'); - var privateKey = fs.readFileSync('script/server.key'); - var certificate = fs.readFileSync('script/server.crt'); - - server = https - .createServer( - { - key: privateKey, - cert: certificate, - }, - app, - ) - .listen(port); - console.log(`Server started with SSL: https://localhost:${port}/`); -} else { - server = app.listen(port, (error) => { - if (error) { - throw error; - } - console.log(`Server started: http://localhost:${port}/`); - }); -} - -process.on('SIGTERM', () => { - console.info('SIGTERM signal received. Shutting down.'); - server.close((error) => { - if (error) { - console.error('Failed to close server:', error); - process.exit(1); - } - console.log('Server closed'); - process.exit(0); - }); -}); diff --git a/webpack.common.config.ts.orig b/webpack.common.config.ts.orig deleted file mode 100644 index 567ce941d..000000000 --- a/webpack.common.config.ts.orig +++ /dev/null @@ -1,203 +0,0 @@ -// tslint:disable:no-var-requires -// tslint:disable:no-console -import chalk from 'chalk'; -import * as path from 'path'; -import * as webpack from 'webpack'; -import { processEnv as env } from './env'; - -const { StatsWriterPlugin } = require('webpack-stats-plugin'); -const FavIconWebpackPlugin = require('favicons-webpack-plugin'); -const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); -const nodeExternals = require('webpack-node-externals'); - -const packageJson: { - dependencies: { [libName: string]: string }; - devDependencies: { [libName: string]: string }; -} = require(require.resolve('./package.json')); - -/** Current service name */ -export const serviceName = process.env.SERVICE_NAME || 'not set'; - -/** Absolute path to webpack output folder */ -export const dist = path.join(__dirname, 'dist'); - -<<<<<<< HEAD -/** Webpack public path. All emitted assets will have relative path to this path - * every time it is changed - the index.js app.use should also be updated. - */ -======= -/** Webpack public path. All emitted assets will have relative path to this path */ ->>>>>>> 01bcbdc (chore: add /assets fix) -export const publicPath = `${env.BASE_URL}/assets/`; - -// /** True if we are in development mode */ -// export const isDev = env.NODE_ENV === 'development'; - -// /** True if we are in production mode */ -// export const isProd = env.NODE_ENV === 'production'; - -/** CSS module class name pattern */ -// export const localIdentName = isDev ? '[local]_[fullhash:base64:3]' : '[fullhash:base64:6]'; - -// Report current configuration -console.log(chalk.cyan('Exporting Webpack config with following configurations:')); -console.log(chalk.blue('Environment:'), chalk.green(env.NODE_ENV)); -console.log(chalk.blue('Output directory:'), chalk.green(path.resolve(dist))); -console.log(chalk.blue('Public path:'), chalk.green(publicPath)); - -/** Get clean version of a version string of package.json entry for a package by - * extracting only alphanumerics, hyphen, and period. Note that this won't - * produce a valid URL for all possible NPM version strings, but should be fine - * on those that are absolute version references. - * Examples: '1', '1.0', '1.2.3', '1.2.3-alpha.0' - */ -export function absoluteVersion(version: string) { - return version.replace(/[^\d.\-a-z]/g, ''); -} - -/** CDN path in case we would use minified react and react-DOM */ -const cdnReact = `https://unpkg.com/react@${absoluteVersion( - packageJson.devDependencies.react, -)}/umd/react.production.min.js`; -const cdnReactDOM = `https://unpkg.com/react-dom@${absoluteVersion( - packageJson.devDependencies['react-dom'], -)}/umd/react-dom.production.min.js`; - -/** Adds sourcemap support */ -export const sourceMapRule: webpack.RuleSetRule = { - test: /\.js$/, - enforce: 'pre', - use: ['source-map-loader'], -}; - -/** Rule for images, icons and fonts */ -export const imageAndFontsRule: webpack.RuleSetRule = { - test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/, - type: 'asset/resource', -}; - -export const favIconPlugin = new FavIconWebpackPlugin({ - logo: path.resolve(__dirname, 'src/assets/favicon.png'), -<<<<<<< HEAD - // we can add '[fullhash:8]/' to the end of the file in future - // if this one will be changed - ensure that OneClick will still be working - prefix: './', -======= - prefix: './', // we can add '[fullhash:8]/' to the end of the file in future ->>>>>>> 01bcbdc (chore: add /assets fix) -}); - -/** Write client stats to a JSON file for production */ -export const statsWriterPlugin = new StatsWriterPlugin({ - filename: 'client-stats.json', - fields: ['chunks', 'publicPath', 'assets', 'assetsByChunkName', 'assetsByChunkId'], -}); - -/** Define "process.env" in client app. Only provide things that can be public */ -export const getDefinePlugin = (isServer: boolean) => - new webpack.DefinePlugin({ - 'process.env': isServer - ? 'process.env' - : Object.keys(env).reduce( - (result, key: string) => ({ - ...result, - [key]: JSON.stringify((env as any)[key]), - }), - {}, - ), - __isServer: isServer, - }); - -/** Limit server chunks to be only one. No need to split code in server */ -export const limitChunksPlugin = new webpack.optimize.LimitChunkCountPlugin({ - maxChunks: 1, -}); - -const typescriptRule = { - test: /\.tsx?$/, - exclude: /node_modules/, - include: path.resolve(__dirname, 'src'), - use: [{ loader: 'ts-loader', options: { transpileOnly: true } }], -}; - -/** - * Client configuration - * - * Client is compiled into multiple chunks that are result to dynamic imports. - */ -export const clientConfig: webpack.Configuration = { - name: 'client', - target: 'web', - resolve: { - /** Base directories that Webpack will look to resolve absolutely imported modules */ - modules: ['src', 'node_modules'], - /** Extension that are allowed to be omitted from import statements */ - extensions: ['.ts', '.tsx', '.js', '.jsx'], - /** "main" fields in package.json files to resolve a CommonJS module for */ - mainFields: ['browser', 'module', 'main'], - }, - entry: ['babel-polyfill', './src/client'], - module: { - rules: [sourceMapRule, typescriptRule, imageAndFontsRule], - }, - optimization: { - splitChunks: { - cacheGroups: { - vendor: { - chunks: 'initial', - enforce: true, - name: 'vendor', - priority: 10, - test: /[\\/]node_modules/, - }, - }, - }, - }, - output: { - publicPath, - path: dist, - filename: '[name]-[fullhash:8].js', - chunkFilename: '[name]-[chunkhash].chunk.js', - // crossOriginLoading: 'anonymous', - clean: true, - }, - plugins: [ - new ForkTsCheckerWebpackPlugin(), - favIconPlugin, - statsWriterPlugin, - getDefinePlugin(false), - ], -}; - -/** - * Server configuration - * - * Server bundle is compiled as a CommonJS package that exports an Express middleware - */ -export const serverConfig: webpack.Configuration = { - name: 'server', - target: 'node', - resolve: { - /** Base directories that Webpack will look to resolve absolutely imported modules */ - modules: ['src', 'node_modules'], - /** Extension that are allowed to be omitted from import statements */ - extensions: ['.ts', '.tsx', '.js', '.jsx'], - /** "main" fields in package.json files to resolve a CommonJS module for */ - mainFields: ['browser', 'module', 'main'], - }, - entry: ['babel-polyfill', './src/server'], - module: { - rules: [sourceMapRule, typescriptRule, imageAndFontsRule], - }, - externalsPresets: { node: true }, - externals: [nodeExternals({ allowlist: /lyft/ })], - output: { - path: dist, - publicPath: '/', - filename: 'server.js', - libraryTarget: 'commonjs2', - }, - plugins: [limitChunksPlugin, new ForkTsCheckerWebpackPlugin(), getDefinePlugin(true)], -}; - -export default { clientConfig, serverConfig }; From 85a31293d5cd2fcf1bed44335353ab99d9855af2 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Fri, 22 Apr 2022 12:50:13 -0700 Subject: [PATCH 10/13] chore: cleanup Signed-off-by: Carina Ursu --- env.js | 8 ++++- index.js | 2 +- package.json | 6 +--- src/assets/index.html | 4 +++ src/components/App/App.tsx | 5 --- src/server.ts | 40 ++-------------------- webpack.common.config.ts | 45 ++++++++---------------- webpack.dev.config.ts | 5 +-- webpack.prod.config.ts | 3 +- yarn.lock | 70 ++++---------------------------------- 10 files changed, 42 insertions(+), 146 deletions(-) diff --git a/env.js b/env.js index ff5cd38de..4cc3d8b22 100644 --- a/env.js +++ b/env.js @@ -15,6 +15,11 @@ const LOCAL_DEV_HOST = process.env.LOCAL_DEV_HOST; const BASE_URL = process.env.BASE_URL || ''; +/** All emitted assets will have relative path to this path + * every time it is changed - the index.js app.use should also be updated. + */ +const ASSETS_PATH = `${BASE_URL}/assets/`; + // Defines a file to be required which will provide implementations for // any user-definable code. const PLUGINS_MODULE = process.env.PLUGINS_MODULE; @@ -37,6 +42,8 @@ module.exports = { STATUS_URL, ENABLE_GA, GA_TRACKING_ID, + ASSETS_PATH, + LOCAL_DEV_HOST, processEnv: { ADMIN_API_URL, BASE_URL, @@ -44,6 +51,5 @@ module.exports = { GA_TRACKING_ID, NODE_ENV, STATUS_URL, - LOCAL_DEV_HOST, }, }; diff --git a/index.js b/index.js index 64b4a0e06..2f1fb0024 100644 --- a/index.js +++ b/index.js @@ -29,7 +29,7 @@ if (typeof applyMiddleware === 'function') { const distPath = path.join(__dirname, 'dist'); app.use( // This path should be in sync with the `publicPath` from webpack config. - `${env.BASE_URL}/assets`, + env.ASSETS_PATH, expressStaticGzip(distPath, { maxAge: '1d', }), diff --git a/package.json b/package.json index 77f235bba..0348910ec 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "build:prod": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' NODE_ENV=production webpack --config webpack.prod.config.ts --mode=production --progress", "build:storybook": "build-storybook", "start": "webpack serve --open --config webpack.dev.config.ts --hot", - "start:start:prodmode": "NODE_ENV=production node -r dotenv/config index.js", + "start:prodmode": "NODE_ENV=production node -r dotenv/config index.js", "storybook": "start-storybook -p 6006", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|jsx|ts|tsx|json)\"", @@ -51,7 +51,6 @@ "chalk": "^2.0.1", "chart.js": "^3.6.2", "chartjs-plugin-datalabels": "^2.0.0", - "cheerio": "^1.0.0-rc.2", "cookie-parser": "^1.4.3", "dagre-d3": "^0.6.4", "dotenv": "^5.0.1", @@ -60,12 +59,10 @@ "fuzzysort": "^1.1.1", "js-yaml": "^3.13.1", "lodash": "^4.17.21", - "memory-fs": "^0.4.1", "morgan": "^1.8.2", "react-chartjs-2": "^4.0.0", "react-flow-renderer": "10.1.1", "react-ga4": "^1.4.1", - "react-helmet": "^5.1.3", "react-responsive": "^4.1.0", "react-transition-group": "^2.3.1", "serve-static": "^1.12.3", @@ -123,7 +120,6 @@ "@types/pure-render-decorator": "^0.2.27", "@types/react": "^16.9.34", "@types/react-dom": "^16.9.7", - "@types/react-helmet": "^5.0.3", "@types/react-hot-loader": "^3.0.3", "@types/react-json-tree": "^0.6.8", "@types/react-responsive": "^3.0.1", diff --git a/src/assets/index.html b/src/assets/index.html index 6e388fb4e..542366775 100644 --- a/src/assets/index.html +++ b/src/assets/index.html @@ -2,10 +2,14 @@ + Flyte Console + + +
diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index 5a7b94b83..395a9ce0a 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -12,7 +12,6 @@ import { SystemStatusBanner } from 'components/Notifications/SystemStatusBanner' import { skeletonColor, skeletonHighlightColor } from 'components/Theme/constants'; import { muiTheme } from 'components/Theme/muiTheme'; import * as React from 'react'; -import { Helmet } from 'react-helmet'; import { hot } from 'react-hot-loader'; import { SkeletonTheme } from 'react-loading-skeleton'; import { QueryClientProvider } from 'react-query'; @@ -44,10 +43,6 @@ export const AppComponent: React.FC = () => { - - Flyte Console - - diff --git a/src/server.ts b/src/server.ts index cdc16907b..c69bce007 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,56 +1,22 @@ -import * as cheerio from 'cheerio'; import * as express from 'express'; import * as fs from 'fs'; -import MemoryFileSystem from 'memory-fs'; import * as path from 'path'; -import { Helmet } from 'react-helmet'; -import { processEnv } from '../env'; - -interface Stats { - publicPath: string; - assets: Array<{ name: string }>; -} interface ServerRendererArguments { - clientStats: Stats; - fileSystem: MemoryFileSystem; currentDirectory: string; } /** * Universal render function in development mode */ -export default function serverRenderer({ fileSystem, currentDirectory }: ServerRendererArguments) { - const env = process.env.NODE_ENV || 'development'; - const isDev = env === 'development'; - const isProd = env === 'production'; - let html = ''; - if (isProd) { - html = fs.readFileSync(path.join(currentDirectory, 'dist/index.html')).toString(); - } +export default function serverRenderer({ currentDirectory }: ServerRendererArguments) { + const html = fs.readFileSync(path.join(currentDirectory, 'dist/index.html')).toString(); return (_req: express.Request, res: express.Response) => { - if (isDev) { - const indexPath = path.join(currentDirectory, 'dist', 'index.html'); - html = fileSystem.readFileSync(indexPath).toString(); - } - if (html === '') { throw new ReferenceError('Could not find index.html to render'); } - // populate the app content... - const $ = cheerio.load(html); - - // populate Helmet content - const helmet = Helmet.renderStatic(); - $('head').append( - $.parseHTML(`${helmet.title.toString()} ${helmet.meta.toString()} ${helmet.link.toString()}`), - ); - - // Populate process.env into window.env - $('head').append($(``)); - - res.status(200).send($.html()); + res.status(200).send(html); }; } diff --git a/webpack.common.config.ts b/webpack.common.config.ts index 6eb9088bd..8d0ced3e0 100644 --- a/webpack.common.config.ts +++ b/webpack.common.config.ts @@ -3,7 +3,7 @@ import chalk from 'chalk'; import * as path from 'path'; import * as webpack from 'webpack'; -import { processEnv as env } from './env'; +import { processEnv as env, ASSETS_PATH as publicPath, processEnv } from './env'; const { StatsWriterPlugin } = require('webpack-stats-plugin'); const FavIconWebpackPlugin = require('favicons-webpack-plugin'); @@ -16,20 +16,6 @@ export const serviceName = process.env.SERVICE_NAME || 'not set'; /** Absolute path to webpack output folder */ export const dist = path.join(__dirname, 'dist'); -/** Webpack public path. All emitted assets will have relative path to this path - * every time it is changed - the index.js app.use should also be updated. - */ -export const publicPath = `${env.BASE_URL}/assets/`; - -// /** True if we are in development mode */ -// export const isDev = env.NODE_ENV === 'development'; - -// /** True if we are in production mode */ -// export const isProd = env.NODE_ENV === 'production'; - -/** CSS module class name pattern */ -// export const localIdentName = isDev ? '[local]_[fullhash:base64:3]' : '[fullhash:base64:6]'; - // Report current configuration console.log(chalk.cyan('Exporting Webpack config with following configurations:')); console.log(chalk.blue('Environment:'), chalk.green(env.NODE_ENV)); @@ -89,6 +75,15 @@ const typescriptRule = { use: [{ loader: 'ts-loader', options: { transpileOnly: true } }], }; +const resolve = { + /** Base directories that Webpack will look into resolve absolutely imported modules */ + modules: ['src', 'node_modules'], + /** Extension that are allowed to be omitted from import statements */ + extensions: ['.ts', '.tsx', '.js', '.jsx'], + /** "main" fields in package.json files to resolve a CommonJS module for */ + mainFields: ['browser', 'module', 'main'], +}; + /** * Client configuration * @@ -97,14 +92,7 @@ const typescriptRule = { export const clientConfig: webpack.Configuration = { name: 'client', target: 'web', - resolve: { - /** Base directories that Webpack will look to resolve absolutely imported modules */ - modules: ['src', 'node_modules'], - /** Extension that are allowed to be omitted from import statements */ - extensions: ['.ts', '.tsx', '.js', '.jsx'], - /** "main" fields in package.json files to resolve a CommonJS module for */ - mainFields: ['browser', 'module', 'main'], - }, + resolve, entry: ['babel-polyfill', './src/client'], module: { rules: [sourceMapRule, typescriptRule, imageAndFontsRule], @@ -142,14 +130,7 @@ export const clientConfig: webpack.Configuration = { * Server bundle is compiled as a CommonJS package that exports an Express middleware */ export const serverConfig: webpack.Configuration = { - resolve: { - /** Base directories that Webpack will look to resolve absolutely imported modules */ - modules: ['src', 'node_modules'], - /** Extension that are allowed to be omitted from import statements */ - extensions: ['.ts', '.tsx', '.js', '.jsx'], - /** "main" fields in package.json files to resolve a CommonJS module for */ - mainFields: ['browser', 'module', 'main'], - }, + resolve, name: 'server', target: 'node', entry: ['babel-polyfill', './src/server'], @@ -167,4 +148,6 @@ export const serverConfig: webpack.Configuration = { plugins: [limitChunksPlugin, new ForkTsCheckerWebpackPlugin(), getDefinePlugin(true)], }; +export const clientEnv = JSON.stringify(processEnv); + export default { clientConfig, serverConfig }; diff --git a/webpack.dev.config.ts b/webpack.dev.config.ts index 19f66ee03..0de90939c 100644 --- a/webpack.dev.config.ts +++ b/webpack.dev.config.ts @@ -1,7 +1,7 @@ import * as webpack from 'webpack'; import * as HTMLWebpackPlugin from 'html-webpack-plugin'; import * as path from 'path'; -import { processEnv as env } from './env'; +import { processEnv as env, LOCAL_DEV_HOST } from './env'; const { merge } = require('webpack-merge'); const fs = require('fs'); @@ -22,7 +22,7 @@ export const clientConfig: webpack.Configuration = merge(common.default.clientCo static: path.join(__dirname, 'dist'), compress: true, port: 3000, - host: env.LOCAL_DEV_HOST, + host: LOCAL_DEV_HOST, historyApiFallback: true, server: { type: 'https', @@ -51,6 +51,7 @@ export const clientConfig: webpack.Configuration = merge(common.default.clientCo minify: false, hash: false, showErrors: true, + clientEnv: common.clientEnv, }), ], }); diff --git a/webpack.prod.config.ts b/webpack.prod.config.ts index b83ed778e..829b2a0f4 100644 --- a/webpack.prod.config.ts +++ b/webpack.prod.config.ts @@ -21,7 +21,7 @@ function absoluteVersion(version: string) { return version.replace(/[^\d.\-a-z]/g, ''); } -/** CDN path in case we would use minified react and react-DOM */ +/** CDN path to use minified react and react-DOM instead of prebuild version */ const cdnReact = `https://unpkg.com/react@${absoluteVersion( packageJson.devDependencies.react, )}/umd/react.production.min.js`; @@ -60,6 +60,7 @@ export const clientConfig: webpack.Configuration = merge(common.default.clientCo showErrors: false, cdnReact, cdnReactDOM, + clientEnv: common.clientEnv, }), ], externals: { diff --git a/yarn.lock b/yarn.lock index ffa3ad0ae..243b90304 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4287,13 +4287,6 @@ dependencies: "@types/react" "^16" -"@types/react-helmet@^5.0.3": - version "5.0.16" - resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-5.0.16.tgz#dafac5f043665b880559285a27c71a69abd1f29e" - integrity sha512-++KMqwodVBg75hT2ZT4jobvDPi6iPUl/Lhrn0nP1XTcmFLtccaDb4FTAxzrj3egL7WQYTDnpHuPj52FSFkJqzA== - dependencies: - "@types/react" "*" - "@types/react-hot-loader@^3.0.3": version "3.0.6" resolved "https://registry.yarnpkg.com/@types/react-hot-loader/-/react-hot-loader-3.0.6.tgz#23b1875a327c32cbab705fbf660d8f207ede4d69" @@ -6547,18 +6540,6 @@ chartjs-plugin-datalabels@^2.0.0: resolved "https://registry.yarnpkg.com/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.0.0.tgz#caacefb26803d968785071eab012dde8746c5939" integrity sha512-WBsWihphzM0Y8fmQVm89+iy99mmgejmj5/jcsYqwxSioLRL/zqJ4Scv/eXq5ZqvG3TpojlGzZLeaOaSvDm7fwA== -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.1" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -7541,7 +7522,7 @@ css-mediaquery@^0.1.2: resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" integrity sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA= -css-select@^1.1.0, css-select@~1.2.0: +css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= @@ -8363,14 +8344,6 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -dom-serializer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -8381,7 +8354,7 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: +domelementtype@1, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== @@ -8674,7 +8647,7 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.2: graceful-fs "^4.2.4" tapable "^2.2.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -10701,7 +10674,7 @@ html-webpack-plugin@^4.0.0: tapable "^1.1.3" util.promisify "1.0.0" -htmlparser2@^3.3.0, htmlparser2@^3.9.1: +htmlparser2@^3.3.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -13092,7 +13065,7 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -14967,13 +14940,6 @@ parse5@5.1.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== - dependencies: - "@types/node" "*" - parse5@^6.0.0, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -15530,7 +15496,7 @@ prop-types@^15.0.0, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -15889,11 +15855,6 @@ react-error-boundary@^3.1.0: dependencies: "@babel/runtime" "^7.12.5" -react-fast-compare@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== - react-fast-compare@^3.0.1, react-fast-compare@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" @@ -15927,16 +15888,6 @@ react-helmet-async@^1.0.7: react-fast-compare "^3.2.0" shallowequal "^1.1.0" -react-helmet@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.2.1.tgz#16a7192fdd09951f8e0fe22ffccbf9bb3e591ffa" - integrity sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA== - dependencies: - object-assign "^4.1.1" - prop-types "^15.5.4" - react-fast-compare "^2.0.2" - react-side-effect "^1.1.0" - react-hot-loader@^4.1.2: version "4.13.0" resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.13.0.tgz#c27e9408581c2a678f5316e69c061b226dc6a202" @@ -16091,13 +16042,6 @@ react-router@6.2.2, react-router@^6.0.0: dependencies: history "^5.2.0" -react-side-effect@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.2.0.tgz#0e940c78faba0c73b9b0eba9cd3dda8dfb7e7dae" - integrity sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w== - dependencies: - shallowequal "^1.0.1" - react-sizeme@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-3.0.2.tgz#4a2f167905ba8f8b8d932a9e35164e459f9020e4" @@ -17262,7 +17206,7 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shallowequal@^1.0.1, shallowequal@^1.1.0: +shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== From c4a7535a92dba456c17ff01b5a2856d684aadb21 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Fri, 22 Apr 2022 13:07:17 -0700 Subject: [PATCH 11/13] chore: cleanup Signed-off-by: Carina Ursu --- jest.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/jest.config.js b/jest.config.js index 1878b0f10..935230cac 100644 --- a/jest.config.js +++ b/jest.config.js @@ -33,6 +33,7 @@ module.exports = { '/dist', '/build', '/src/tsd', + '/src/server.js', '/.eslintrc.js', '\\.config.js$', ], From 4241176a7dae719c96ddc2d6726d72439e41f7e4 Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Fri, 22 Apr 2022 13:09:53 -0700 Subject: [PATCH 12/13] chore: cleanup Signed-off-by: Carina Ursu --- jest.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jest.config.js b/jest.config.js index 935230cac..fb18e6794 100644 --- a/jest.config.js +++ b/jest.config.js @@ -33,7 +33,7 @@ module.exports = { '/dist', '/build', '/src/tsd', - '/src/server.js', + '/src/server.ts', '/.eslintrc.js', '\\.config.js$', ], From 66df04a763117f649a4ac49aaa1706b94a07d8ce Mon Sep 17 00:00:00 2001 From: Carina Ursu Date: Fri, 22 Apr 2022 13:28:22 -0700 Subject: [PATCH 13/13] chore: rename start prod script Signed-off-by: Carina Ursu --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0348910ec..acac2e8ff 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "build:prod": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' NODE_ENV=production webpack --config webpack.prod.config.ts --mode=production --progress", "build:storybook": "build-storybook", "start": "webpack serve --open --config webpack.dev.config.ts --hot", - "start:prodmode": "NODE_ENV=production node -r dotenv/config index.js", + "start:prod": "NODE_ENV=production node -r dotenv/config index.js", "storybook": "start-storybook -p 6006", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|jsx|ts|tsx|json)\"",