From 957fef1fc6cef32c232e9725ba232347c886b820 Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Mon, 2 May 2022 20:53:37 +0300 Subject: [PATCH 01/13] feat(issue-351): create auth-app of reactjs --- src/WebApps/smalltalk/auth-app/.babelrc | 6 + src/WebApps/smalltalk/auth-app/.gitignore | 116 + src/WebApps/smalltalk/auth-app/package.json | 38 + .../{ => auth-app}/postcss.config.js | 0 src/WebApps/smalltalk/auth-app/src/App.jsx | 14 + src/WebApps/smalltalk/auth-app/src/index.html | 14 + .../smalltalk/{ => auth-app}/src/index.js | 0 .../smalltalk/{ => auth-app}/src/index.scss | 0 .../{ => auth-app}/tailwind.config.js | 0 .../smalltalk/auth-app/webpack.config.js | 64 + src/WebApps/smalltalk/auth-app/yarn.lock | 4232 +++++++++++++++++ src/WebApps/smalltalk/{ => chat}/package.json | 0 src/WebApps/smalltalk/chat/postcss.config.js | 6 + src/WebApps/smalltalk/{ => chat}/src/App.jsx | 0 .../{ => chat}/src/assets/Denis_prox.jpg | Bin .../{ => chat}/src/assets/SmallTalk-Logo.png | Bin .../assets/SmallTalk-Logo_no_signature.png | Bin .../src/assets/attachment_black_24dp.svg | 0 .../{ => chat}/src/assets/avatar-1.jpeg | Bin .../src/assets/bookmarks_black_24dp.svg | 0 .../src/assets/insert_emoticon_black_24dp.svg | 0 .../src/assets/manage_accounts_black_24dp.svg | 0 .../assets/power_settings_new_black_24dp.svg | 0 .../src/assets/search_black_24dp.svg | 0 .../{ => chat}/src/assets/send_black_24dp.svg | 0 .../src/assets/settings_black_24dp.svg | 0 .../{ => chat}/src/assets/sms_black_24dp.svg | 0 .../{ => chat}/src/components/MessageItem.jsx | 0 .../{ => chat}/src/components/SessionItem.jsx | 0 .../smalltalk/{ => chat}/src/index.html | 0 src/WebApps/smalltalk/chat/src/index.js | 1 + src/WebApps/smalltalk/chat/src/index.scss | 7 + src/WebApps/smalltalk/chat/tailwind.config.js | 11 + .../smalltalk/{ => chat}/webpack.config.js | 0 src/WebApps/smalltalk/{ => chat}/yarn.lock | 0 35 files changed, 4509 insertions(+) create mode 100644 src/WebApps/smalltalk/auth-app/.babelrc create mode 100644 src/WebApps/smalltalk/auth-app/.gitignore create mode 100644 src/WebApps/smalltalk/auth-app/package.json rename src/WebApps/smalltalk/{ => auth-app}/postcss.config.js (100%) create mode 100644 src/WebApps/smalltalk/auth-app/src/App.jsx create mode 100644 src/WebApps/smalltalk/auth-app/src/index.html rename src/WebApps/smalltalk/{ => auth-app}/src/index.js (100%) rename src/WebApps/smalltalk/{ => auth-app}/src/index.scss (100%) rename src/WebApps/smalltalk/{ => auth-app}/tailwind.config.js (100%) create mode 100644 src/WebApps/smalltalk/auth-app/webpack.config.js create mode 100644 src/WebApps/smalltalk/auth-app/yarn.lock rename src/WebApps/smalltalk/{ => chat}/package.json (100%) create mode 100644 src/WebApps/smalltalk/chat/postcss.config.js rename src/WebApps/smalltalk/{ => chat}/src/App.jsx (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/Denis_prox.jpg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/SmallTalk-Logo.png (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/SmallTalk-Logo_no_signature.png (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/attachment_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/avatar-1.jpeg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/bookmarks_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/insert_emoticon_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/manage_accounts_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/power_settings_new_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/search_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/send_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/settings_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/assets/sms_black_24dp.svg (100%) rename src/WebApps/smalltalk/{ => chat}/src/components/MessageItem.jsx (100%) rename src/WebApps/smalltalk/{ => chat}/src/components/SessionItem.jsx (100%) rename src/WebApps/smalltalk/{ => chat}/src/index.html (100%) create mode 100644 src/WebApps/smalltalk/chat/src/index.js create mode 100644 src/WebApps/smalltalk/chat/src/index.scss create mode 100644 src/WebApps/smalltalk/chat/tailwind.config.js rename src/WebApps/smalltalk/{ => chat}/webpack.config.js (100%) rename src/WebApps/smalltalk/{ => chat}/yarn.lock (100%) diff --git a/src/WebApps/smalltalk/auth-app/.babelrc b/src/WebApps/smalltalk/auth-app/.babelrc new file mode 100644 index 00000000..fd926413 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": ["@babel/preset-react", "@babel/preset-env"], + "plugins": [ + ["@babel/transform-runtime"] + ] +} diff --git a/src/WebApps/smalltalk/auth-app/.gitignore b/src/WebApps/smalltalk/auth-app/.gitignore new file mode 100644 index 00000000..1f22b9c2 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/.gitignore @@ -0,0 +1,116 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* diff --git a/src/WebApps/smalltalk/auth-app/package.json b/src/WebApps/smalltalk/auth-app/package.json new file mode 100644 index 00000000..d5034e64 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/package.json @@ -0,0 +1,38 @@ +{ + "name": "auth-app", + "version": "1.0.0", + "scripts": { + "build": "webpack --mode production", + "build:dev": "webpack --mode development", + "build:start": "cd dist && PORT=3003 npx serve", + "start": "webpack serve --open --mode development", + "start:live": "webpack serve --open --mode development --live-reload --hot" + }, + "license": "MIT", + "author": { + "name": "Jack Herrington", + "email": "jherr@pobox.com" + }, + "devDependencies": { + "@babel/core": "^7.15.8", + "@babel/plugin-transform-runtime": "^7.15.8", + "@babel/preset-env": "^7.15.8", + "@babel/preset-react": "^7.14.5", + "autoprefixer": "^10.1.0", + "babel-loader": "^8.2.2", + "css-loader": "^6.3.0", + "html-webpack-plugin": "^5.3.2", + "postcss": "^8.2.1", + "postcss-loader": "^4.1.0", + "style-loader": "^3.3.0", + "webpack": "^5.57.1", + "webpack-cli": "^4.9.0", + "webpack-dev-server": "^4.3.1", + "tailwindcss": "^2.0.2" + }, + "dependencies": { + "@babel/runtime": "^7.13.10", + "react": "^17.0.2", + "react-dom": "^17.0.2" + } +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/postcss.config.js b/src/WebApps/smalltalk/auth-app/postcss.config.js similarity index 100% rename from src/WebApps/smalltalk/postcss.config.js rename to src/WebApps/smalltalk/auth-app/postcss.config.js diff --git a/src/WebApps/smalltalk/auth-app/src/App.jsx b/src/WebApps/smalltalk/auth-app/src/App.jsx new file mode 100644 index 00000000..41090213 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/App.jsx @@ -0,0 +1,14 @@ +import React from "react"; +import ReactDOM from "react-dom"; + +import "./index.scss"; + +const App = () => ( +
+
Name: auth-app
+
Framework: react
+
Language: JavaScript
+
CSS: Tailwind
+
+); +ReactDOM.render(, document.getElementById("app")); diff --git a/src/WebApps/smalltalk/auth-app/src/index.html b/src/WebApps/smalltalk/auth-app/src/index.html new file mode 100644 index 00000000..c5668f42 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/index.html @@ -0,0 +1,14 @@ + + + + + + + auth-app + + + +
+ + + diff --git a/src/WebApps/smalltalk/src/index.js b/src/WebApps/smalltalk/auth-app/src/index.js similarity index 100% rename from src/WebApps/smalltalk/src/index.js rename to src/WebApps/smalltalk/auth-app/src/index.js diff --git a/src/WebApps/smalltalk/src/index.scss b/src/WebApps/smalltalk/auth-app/src/index.scss similarity index 100% rename from src/WebApps/smalltalk/src/index.scss rename to src/WebApps/smalltalk/auth-app/src/index.scss diff --git a/src/WebApps/smalltalk/tailwind.config.js b/src/WebApps/smalltalk/auth-app/tailwind.config.js similarity index 100% rename from src/WebApps/smalltalk/tailwind.config.js rename to src/WebApps/smalltalk/auth-app/tailwind.config.js diff --git a/src/WebApps/smalltalk/auth-app/webpack.config.js b/src/WebApps/smalltalk/auth-app/webpack.config.js new file mode 100644 index 00000000..ef99f4cd --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/webpack.config.js @@ -0,0 +1,64 @@ +const HtmlWebPackPlugin = require("html-webpack-plugin"); +const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin"); + +const deps = require("./package.json").dependencies; +module.exports = { + output: { + publicPath: "http://localhost:3003/", + }, + + resolve: { + extensions: [".tsx", ".ts", ".jsx", ".js", ".json"], + }, + + devServer: { + port: 3003, + historyApiFallback: true, + }, + + module: { + rules: [ + { + test: /\.m?js/, + type: "javascript/auto", + resolve: { + fullySpecified: false, + }, + }, + { + test: /\.(css|s[ac]ss)$/i, + use: ["style-loader", "css-loader", "postcss-loader"], + }, + { + test: /\.(ts|tsx|js|jsx)$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + }, + }, + ], + }, + + plugins: [ + new ModuleFederationPlugin({ + name: "auth_app", + filename: "remoteEntry.js", + remotes: {}, + exposes: {}, + shared: { + ...deps, + react: { + singleton: true, + requiredVersion: deps.react, + }, + "react-dom": { + singleton: true, + requiredVersion: deps["react-dom"], + }, + }, + }), + new HtmlWebPackPlugin({ + template: "./src/index.html", + }), + ], +}; diff --git a/src/WebApps/smalltalk/auth-app/yarn.lock b/src/WebApps/smalltalk/auth-app/yarn.lock new file mode 100644 index 00000000..690c3c64 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/yarn.lock @@ -0,0 +1,4232 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/core@^7.15.8": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" + integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.10" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.10" + "@babel/types" "^7.17.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== + dependencies: + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" + integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" + integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" + integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.9" + "@babel/types" "^7.17.0" + +"@babel/highlight@^7.16.7": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.16.7", "@babel/parser@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.17.6": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" + integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.6" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" + integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== + dependencies: + "@babel/compat-data" "^7.17.0" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" + integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" + integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== + dependencies: + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.17.8": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" + integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4" + integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.0" + +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.16.7": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" + integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-regenerator@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" + integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== + dependencies: + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-runtime@^7.15.8": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz#b89d821c55d61b5e3d3c3d1d636d8d5a81040ae1" + integrity sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.15.8": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c" + integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.17.6" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.17.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.17.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.17.9" + "@babel/plugin-transform-modules-systemjs" "^7.17.8" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.17.9" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.17.10" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.14.5": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.4.4": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== + +"@jridgewell/set-array@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" + integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@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== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@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/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: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" + integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@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/html-minifier-terser@^6.0.0": + version "6.1.0" + 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.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" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*": + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@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@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@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/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" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +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== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +array-flatten@1.1.1: + version "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== + +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" + +autoprefixer@^10.1.0: + version "10.4.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== + dependencies: + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +babel-loader@^8.2.2: + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== + 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: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.2, bytes@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: + version "1.0.30001335" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a" + integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clean-css@^5.2.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + dependencies: + source-map "~0.6.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.0.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.0.0, commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +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@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +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== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +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== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.22.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.3.tgz#9b10d786052d042bc97ee8df9c0d1fb6a49c2005" + integrity sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-loader@^6.3.0: + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1: + 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.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +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" + +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.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +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= + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +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== + +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +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" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.4.118: + version "1.4.129" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz#c675793885721beefff99da50f57c6525c2cd238" + integrity sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +enhanced-resolve@^5.9.2: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +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: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.7: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +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" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +follow-redirects@^1.0.0: + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3, glob@^7.1.7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +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== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +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" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +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-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +html-webpack-plugin@^5.3.2: + version "5.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +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@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +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-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ipaddr.js@1.9.1: + version "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-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-color-stop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0, 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-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +lilconfig@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.topath@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak= + +lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" + integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== + dependencies: + fs-monkey "1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + 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: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +modern-normalize@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" + integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +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" + +nanoid@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +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-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +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== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +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" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +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== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^4.0.0: + version "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.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= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +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-js@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" + integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== + dependencies: + camelcase-css "^2.0.1" + postcss "^8.1.6" + +postcss-load-config@^3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-loader@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" + integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.4" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.1.6, postcss@^8.2.1, postcss@^8.3.5, postcss@^8.4.7: + version "8.4.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575" + integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== + dependencies: + nanoid "^3.3.3" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +purgecss@^4.0.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.1.3.tgz#683f6a133c8c4de7aa82fe2746d1393b214918f7" + integrity sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw== + dependencies: + commander "^8.0.0" + glob "^7.1.7" + postcss "^8.3.5" + postcss-selector-parser "^6.0.6" + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +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== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +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" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + 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.1.0, safe-buffer@^5.1.0, 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== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +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" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.4, semver@^7.3.5: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +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.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +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" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +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" + +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== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +style-loader@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@^2.0.2: + version "2.2.19" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.19.tgz#540e464832cd462bb9649c1484b0a38315c2653c" + integrity sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw== + dependencies: + arg "^5.0.1" + bytes "^3.0.0" + chalk "^4.1.2" + chokidar "^3.5.2" + color "^4.0.1" + cosmiconfig "^7.0.1" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.7" + fs-extra "^10.0.0" + glob-parent "^6.0.1" + html-tags "^3.1.0" + is-color-stop "^1.1.0" + is-glob "^4.0.1" + lodash "^4.17.21" + lodash.topath "^4.5.2" + modern-normalize "^1.1.0" + node-emoji "^1.11.0" + normalize-path "^3.0.0" + object-hash "^2.2.0" + postcss-js "^3.0.3" + postcss-load-config "^3.1.0" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.6" + postcss-value-parser "^4.1.0" + pretty-hrtime "^1.0.3" + purgecss "^4.0.3" + quick-lru "^5.1.1" + reduce-css-calc "^2.1.8" + resolve "^1.20.0" + tmp "^0.2.1" + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== + dependencies: + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.10.0, terser@^5.7.2: + version "5.13.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== + dependencies: + acorn "^8.5.0" + commander "^2.20.0" + source-map "~0.8.0-beta.0" + source-map-support "~0.5.20" + +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== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tslib@^2.0.3: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +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== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +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== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + 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" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-cli@^4.9.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" + integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== + dependencies: + colorette "^2.0.10" + memfs "^3.4.1" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.3.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-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.57.1: + version "5.72.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.0.tgz#f8bc40d9c6bb489a4b7a8a685101d6022b8b6e28" + integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.2" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + 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-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^8.4.2: + version "8.6.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== diff --git a/src/WebApps/smalltalk/package.json b/src/WebApps/smalltalk/chat/package.json similarity index 100% rename from src/WebApps/smalltalk/package.json rename to src/WebApps/smalltalk/chat/package.json diff --git a/src/WebApps/smalltalk/chat/postcss.config.js b/src/WebApps/smalltalk/chat/postcss.config.js new file mode 100644 index 00000000..f405d1e4 --- /dev/null +++ b/src/WebApps/smalltalk/chat/postcss.config.js @@ -0,0 +1,6 @@ +const autoprefixer = require("autoprefixer"); +const tailwindcss = require("tailwindcss"); + +module.exports = { + plugins: [tailwindcss, autoprefixer], +}; diff --git a/src/WebApps/smalltalk/src/App.jsx b/src/WebApps/smalltalk/chat/src/App.jsx similarity index 100% rename from src/WebApps/smalltalk/src/App.jsx rename to src/WebApps/smalltalk/chat/src/App.jsx diff --git a/src/WebApps/smalltalk/src/assets/Denis_prox.jpg b/src/WebApps/smalltalk/chat/src/assets/Denis_prox.jpg similarity index 100% rename from src/WebApps/smalltalk/src/assets/Denis_prox.jpg rename to src/WebApps/smalltalk/chat/src/assets/Denis_prox.jpg diff --git a/src/WebApps/smalltalk/src/assets/SmallTalk-Logo.png b/src/WebApps/smalltalk/chat/src/assets/SmallTalk-Logo.png similarity index 100% rename from src/WebApps/smalltalk/src/assets/SmallTalk-Logo.png rename to src/WebApps/smalltalk/chat/src/assets/SmallTalk-Logo.png diff --git a/src/WebApps/smalltalk/src/assets/SmallTalk-Logo_no_signature.png b/src/WebApps/smalltalk/chat/src/assets/SmallTalk-Logo_no_signature.png similarity index 100% rename from src/WebApps/smalltalk/src/assets/SmallTalk-Logo_no_signature.png rename to src/WebApps/smalltalk/chat/src/assets/SmallTalk-Logo_no_signature.png diff --git a/src/WebApps/smalltalk/src/assets/attachment_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/attachment_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/attachment_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/attachment_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/avatar-1.jpeg b/src/WebApps/smalltalk/chat/src/assets/avatar-1.jpeg similarity index 100% rename from src/WebApps/smalltalk/src/assets/avatar-1.jpeg rename to src/WebApps/smalltalk/chat/src/assets/avatar-1.jpeg diff --git a/src/WebApps/smalltalk/src/assets/bookmarks_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/bookmarks_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/bookmarks_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/bookmarks_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/insert_emoticon_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/insert_emoticon_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/insert_emoticon_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/insert_emoticon_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/manage_accounts_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/manage_accounts_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/manage_accounts_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/manage_accounts_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/power_settings_new_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/power_settings_new_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/power_settings_new_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/power_settings_new_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/search_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/search_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/search_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/search_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/send_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/send_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/send_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/send_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/settings_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/settings_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/settings_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/settings_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/assets/sms_black_24dp.svg b/src/WebApps/smalltalk/chat/src/assets/sms_black_24dp.svg similarity index 100% rename from src/WebApps/smalltalk/src/assets/sms_black_24dp.svg rename to src/WebApps/smalltalk/chat/src/assets/sms_black_24dp.svg diff --git a/src/WebApps/smalltalk/src/components/MessageItem.jsx b/src/WebApps/smalltalk/chat/src/components/MessageItem.jsx similarity index 100% rename from src/WebApps/smalltalk/src/components/MessageItem.jsx rename to src/WebApps/smalltalk/chat/src/components/MessageItem.jsx diff --git a/src/WebApps/smalltalk/src/components/SessionItem.jsx b/src/WebApps/smalltalk/chat/src/components/SessionItem.jsx similarity index 100% rename from src/WebApps/smalltalk/src/components/SessionItem.jsx rename to src/WebApps/smalltalk/chat/src/components/SessionItem.jsx diff --git a/src/WebApps/smalltalk/src/index.html b/src/WebApps/smalltalk/chat/src/index.html similarity index 100% rename from src/WebApps/smalltalk/src/index.html rename to src/WebApps/smalltalk/chat/src/index.html diff --git a/src/WebApps/smalltalk/chat/src/index.js b/src/WebApps/smalltalk/chat/src/index.js new file mode 100644 index 00000000..fc3cee10 --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/index.js @@ -0,0 +1 @@ +import("./App"); diff --git a/src/WebApps/smalltalk/chat/src/index.scss b/src/WebApps/smalltalk/chat/src/index.scss new file mode 100644 index 00000000..a54c4abd --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/index.scss @@ -0,0 +1,7 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + font-family: Arial, Helvetica, sans-serif; +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/tailwind.config.js b/src/WebApps/smalltalk/chat/tailwind.config.js new file mode 100644 index 00000000..62dfdaf3 --- /dev/null +++ b/src/WebApps/smalltalk/chat/tailwind.config.js @@ -0,0 +1,11 @@ +module.exports = { + purge: [], + darkMode: false, // or 'media' or 'class' + theme: { + extend: {}, + }, + variants: { + extend: {}, + }, + plugins: [], +} diff --git a/src/WebApps/smalltalk/webpack.config.js b/src/WebApps/smalltalk/chat/webpack.config.js similarity index 100% rename from src/WebApps/smalltalk/webpack.config.js rename to src/WebApps/smalltalk/chat/webpack.config.js diff --git a/src/WebApps/smalltalk/yarn.lock b/src/WebApps/smalltalk/chat/yarn.lock similarity index 100% rename from src/WebApps/smalltalk/yarn.lock rename to src/WebApps/smalltalk/chat/yarn.lock From ff57a65828fbebaf078af02da0cf15fb69bfb8a2 Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Tue, 3 May 2022 22:04:17 +0300 Subject: [PATCH 02/13] feat(issue-351): update react client - smalltalk app --- src/WebApps/smalltalk/auth-app/package.json | 13 +- src/WebApps/smalltalk/auth-app/src/App.jsx | 45 +++- .../auth-app/src/actions/authActions.js | 41 +++ .../smalltalk/auth-app/src/actions/types.js | 5 + .../smalltalk/auth-app/src/pages/home.js | 41 +++ .../smalltalk/auth-app/src/pages/login.js | 32 +++ .../auth-app/src/pages/signin-oidc.js | 22 ++ .../auth-app/src/pages/signout-oidc.js | 22 ++ .../auth-app/src/reducers/authReducer.js | 38 +++ .../smalltalk/auth-app/src/reducers/index.js | 6 + .../auth-app/src/services/apiService.js | 10 + .../auth-app/src/services/userService.js | 53 ++++ src/WebApps/smalltalk/auth-app/src/store.js | 13 + .../auth-app/src/utils/authProvider.js | 56 ++++ .../auth-app/src/utils/axiosHeaders.js | 5 + .../smalltalk/auth-app/src/utils/jsonUtils.js | 3 + .../auth-app/src/utils/protectedRoute.js | 13 + src/WebApps/smalltalk/auth-app/yarn.lock | 245 +++++++++++++++++- 18 files changed, 645 insertions(+), 18 deletions(-) create mode 100644 src/WebApps/smalltalk/auth-app/src/actions/authActions.js create mode 100644 src/WebApps/smalltalk/auth-app/src/actions/types.js create mode 100644 src/WebApps/smalltalk/auth-app/src/pages/home.js create mode 100644 src/WebApps/smalltalk/auth-app/src/pages/login.js create mode 100644 src/WebApps/smalltalk/auth-app/src/pages/signin-oidc.js create mode 100644 src/WebApps/smalltalk/auth-app/src/pages/signout-oidc.js create mode 100644 src/WebApps/smalltalk/auth-app/src/reducers/authReducer.js create mode 100644 src/WebApps/smalltalk/auth-app/src/reducers/index.js create mode 100644 src/WebApps/smalltalk/auth-app/src/services/apiService.js create mode 100644 src/WebApps/smalltalk/auth-app/src/services/userService.js create mode 100644 src/WebApps/smalltalk/auth-app/src/store.js create mode 100644 src/WebApps/smalltalk/auth-app/src/utils/authProvider.js create mode 100644 src/WebApps/smalltalk/auth-app/src/utils/axiosHeaders.js create mode 100644 src/WebApps/smalltalk/auth-app/src/utils/jsonUtils.js create mode 100644 src/WebApps/smalltalk/auth-app/src/utils/protectedRoute.js diff --git a/src/WebApps/smalltalk/auth-app/package.json b/src/WebApps/smalltalk/auth-app/package.json index d5034e64..5a1f6fe3 100644 --- a/src/WebApps/smalltalk/auth-app/package.json +++ b/src/WebApps/smalltalk/auth-app/package.json @@ -25,14 +25,19 @@ "postcss": "^8.2.1", "postcss-loader": "^4.1.0", "style-loader": "^3.3.0", + "tailwindcss": "^2.0.2", "webpack": "^5.57.1", "webpack-cli": "^4.9.0", - "webpack-dev-server": "^4.3.1", - "tailwindcss": "^2.0.2" + "webpack-dev-server": "^4.3.1" }, "dependencies": { "@babel/runtime": "^7.13.10", + "axios": "^0.27.2", + "oidc-client": "^1.11.5", "react": "^17.0.2", - "react-dom": "^17.0.2" + "react-dom": "^17.0.2", + "react-redux": "^8.0.1", + "react-router-dom": "^5.1.0", + "redux": "^4.2.0" } -} \ No newline at end of file +} diff --git a/src/WebApps/smalltalk/auth-app/src/App.jsx b/src/WebApps/smalltalk/auth-app/src/App.jsx index 41090213..e0ad1f1e 100644 --- a/src/WebApps/smalltalk/auth-app/src/App.jsx +++ b/src/WebApps/smalltalk/auth-app/src/App.jsx @@ -1,14 +1,41 @@ -import React from "react"; + import ReactDOM from "react-dom"; import "./index.scss"; +import React, { useEffect } from 'react'; +import { BrowserRouter as Router, Route, Switch } from 'react-router-dom' +import SigninOidc from './pages/signin-oidc' +import SignoutOidc from './pages/signout-oidc' +import Home from './pages/home' +import Login from './pages/login' +import { Provider } from 'react-redux'; +import store from './store'; +import userManager, { loadUserFromStorage } from './services/userService' +import AuthProvider from './utils/authProvider' +import PrivateRoute from './utils/protectedRoute' + +function App() { + + useEffect(() => { + // fetch current user from cookies + loadUserFromStorage(store) + }, []) + + return ( + + + + + + + + + + + + + ); +} -const App = () => ( -
-
Name: auth-app
-
Framework: react
-
Language: JavaScript
-
CSS: Tailwind
-
-); +export default App; ReactDOM.render(, document.getElementById("app")); diff --git a/src/WebApps/smalltalk/auth-app/src/actions/authActions.js b/src/WebApps/smalltalk/auth-app/src/actions/authActions.js new file mode 100644 index 00000000..382c659a --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/actions/authActions.js @@ -0,0 +1,41 @@ +import { + STORE_USER, + USER_SIGNED_OUT, + USER_EXPIRED, + STORE_USER_ERROR, + LOADING_USER +} from './types' +import { setAuthHeader } from '../utils/axiosHeaders' + +export function storeUser(user) { + setAuthHeader(user.access_token) + return { + type: STORE_USER, + payload: user + } +} + +export function loadingUser() { + return { + type: LOADING_USER + } +} + +export function storeUserError() { + return { + type: STORE_USER_ERROR + } +} + +export function userExpired() { + return { + type: USER_EXPIRED + } +} + +export function userSignedOut() { + return { + type: USER_SIGNED_OUT + } +} + diff --git a/src/WebApps/smalltalk/auth-app/src/actions/types.js b/src/WebApps/smalltalk/auth-app/src/actions/types.js new file mode 100644 index 00000000..c41d4f8b --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/actions/types.js @@ -0,0 +1,5 @@ +export const STORE_USER = 'STORE_USER' +export const USER_SIGNED_OUT = 'USER_SIGNED_OUT' +export const USER_EXPIRED = 'USER_EXPIRED' +export const STORE_USER_ERROR = 'STORE_USER_ERROR' +export const LOADING_USER = 'LOADING_USER' diff --git a/src/WebApps/smalltalk/auth-app/src/pages/home.js b/src/WebApps/smalltalk/auth-app/src/pages/home.js new file mode 100644 index 00000000..bda53383 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/pages/home.js @@ -0,0 +1,41 @@ +import React, { useState } from 'react' +import { signoutRedirect } from '../services/userService' +import { useSelector } from 'react-redux' +import * as apiService from '../services/apiService' +import { prettifyJson } from '../utils/jsonUtils' + +function Home() { + const user = useSelector(state => state.auth.user) + const [doughnutData, setDoughnutData] = useState(null) + function signOut() { + signoutRedirect() + } + + async function getDoughnuts() { + const doughnuts = await apiService.getDoughnutsFromApi() + setDoughnutData(doughnuts) + } + + return ( +
+

Home

+

Hello, {user.profile.given_name}.

+

I have given you a token to call your favourite doughnut based API 🍩

+ +

💡 Tip: Use the Redux dev tools and network tab to inspect what user data was returned from identity and stored in the client.

+ + + + +
+        
+          {prettifyJson(doughnutData ? doughnutData : 'No doughnuts yet :(')}
+        
+      
+

Github Repo

+ +
+ ) +} + +export default Home diff --git a/src/WebApps/smalltalk/auth-app/src/pages/login.js b/src/WebApps/smalltalk/auth-app/src/pages/login.js new file mode 100644 index 00000000..78fe454f --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/pages/login.js @@ -0,0 +1,32 @@ +import React from 'react' +import { signinRedirect } from '../services/userService' +import { Redirect } from 'react-router-dom' +import { useSelector } from 'react-redux' + +function Login() { + const user = useSelector(state => state.auth.user) + + function login() { + signinRedirect() + } + + return ( + (user) ? + () + : + ( +
+

Hello!

+

Welcome to We Want Doughnuts.

+

A demo of using React and Identity Server 4 to authenticate a user via OpenID Connect to gain access to a web API (and some lovely doughnuts).

+

Start by signing in.

+

💡 Tip: User: 'alice', Pass: 'alice'

+ + +

Github Repo

+
+ ) + ) +} + +export default Login diff --git a/src/WebApps/smalltalk/auth-app/src/pages/signin-oidc.js b/src/WebApps/smalltalk/auth-app/src/pages/signin-oidc.js new file mode 100644 index 00000000..ee9d0d6c --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/pages/signin-oidc.js @@ -0,0 +1,22 @@ +import React, { useEffect } from 'react' +import { signinRedirectCallback } from '../services/userService' +import { useHistory } from 'react-router-dom' + +function SigninOidc() { + const history = useHistory() + useEffect(() => { + async function signinAsync() { + await signinRedirectCallback() + history.push('/') + } + signinAsync() + }, [history]) + + return ( +
+ Redirecting... +
+ ) +} + +export default SigninOidc diff --git a/src/WebApps/smalltalk/auth-app/src/pages/signout-oidc.js b/src/WebApps/smalltalk/auth-app/src/pages/signout-oidc.js new file mode 100644 index 00000000..d2b1b0f0 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/pages/signout-oidc.js @@ -0,0 +1,22 @@ +import React, { useEffect } from 'react' +import { signoutRedirectCallback } from '../services/userService' +import { useHistory } from 'react-router-dom' + +function SignoutOidc() { + const history = useHistory() + useEffect(() => { + async function signoutAsync() { + await signoutRedirectCallback() + history.push('/') + } + signoutAsync() + }, [history]) + + return ( +
+ Redirecting... +
+ ) +} + +export default SignoutOidc diff --git a/src/WebApps/smalltalk/auth-app/src/reducers/authReducer.js b/src/WebApps/smalltalk/auth-app/src/reducers/authReducer.js new file mode 100644 index 00000000..d0d3677a --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/reducers/authReducer.js @@ -0,0 +1,38 @@ +import { + USER_SIGNED_OUT, + STORE_USER_ERROR, + USER_EXPIRED, + STORE_USER, + LOADING_USER +} from '../actions/types' + +const initialState = { + user: null, + isLoadingUser: false +}; + +export default function (state = initialState, action) { + switch (action.type) { + case STORE_USER: + return { + ...state, + isLoadingUser: false, + user: action.payload + } + case LOADING_USER: + return { + ...state, + isLoadingUser: true + } + case USER_EXPIRED: + case STORE_USER_ERROR: + case USER_SIGNED_OUT: + return { + ...state, + user: null, + isLoadingUser: false + } + default: + return state + } +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/reducers/index.js b/src/WebApps/smalltalk/auth-app/src/reducers/index.js new file mode 100644 index 00000000..2b02ecd8 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/reducers/index.js @@ -0,0 +1,6 @@ +import { combineReducers } from 'redux'; +import authReducer from './authReducer'; + +export default combineReducers({ + auth: authReducer +}) diff --git a/src/WebApps/smalltalk/auth-app/src/services/apiService.js b/src/WebApps/smalltalk/auth-app/src/services/apiService.js new file mode 100644 index 00000000..cb18f70b --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/services/apiService.js @@ -0,0 +1,10 @@ +import axios from 'axios' + +async function getDoughnutsFromApi() { + const response = await axios.get('https://localhost:5002/doughnuts'); + return response.data; +} + +export { + getDoughnutsFromApi +} diff --git a/src/WebApps/smalltalk/auth-app/src/services/userService.js b/src/WebApps/smalltalk/auth-app/src/services/userService.js new file mode 100644 index 00000000..d7cecf8a --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/services/userService.js @@ -0,0 +1,53 @@ +import { UserManager } from 'oidc-client'; +import { storeUserError, storeUser } from '../actions/authActions' + +// const config = { +// authority: "https://localhost:10001", +// client_id: 'smalltalk_client_reactjs', +// response_type: 'code', +// scope: 'openid profile', +// redirect_uri: "http://localhost:3003/signin-oidc" +// }; +const config = { +authority: "http://localhost:5001/", + client_id: "smalltalk_client_reactjs", + redirect_uri: "http://localhost:3003/signin-oidc", + response_type: "id_token token", + scope: "openid profile", + loadUserInfo: true, + post_logout_redirect_uri: "http://localhost:3003/signout-oidc"} + +const userManager = new UserManager(config) + +export async function loadUserFromStorage(store) { + try { + let user = await userManager.getUser() + if (!user) { return store.dispatch(storeUserError()) } + store.dispatch(storeUser(user)) + } catch (e) { + console.error(`User not found: ${e}`) + store.dispatch(storeUserError()) + } +} + +export function signinRedirect() { + return userManager.signinRedirect() +} + +export function signinRedirectCallback() { + return userManager.signinRedirectCallback() +} + +export function signoutRedirect() { + userManager.clearStaleState() + userManager.removeUser() + return userManager.signoutRedirect() +} + +export function signoutRedirectCallback() { + userManager.clearStaleState() + userManager.removeUser() + return userManager.signoutRedirectCallback() +} + +export default userManager \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/store.js b/src/WebApps/smalltalk/auth-app/src/store.js new file mode 100644 index 00000000..aac3dc36 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/store.js @@ -0,0 +1,13 @@ +import { createStore, compose } from 'redux'; +import rootReducer from './reducers' + +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; +const initialState = {} + +const store = createStore( + rootReducer, + initialState, + composeEnhancers() +) + +export default store; \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/utils/authProvider.js b/src/WebApps/smalltalk/auth-app/src/utils/authProvider.js new file mode 100644 index 00000000..2a750119 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/utils/authProvider.js @@ -0,0 +1,56 @@ +import React, { useEffect, useRef } from 'react'; +import { storeUser } from '../actions/authActions' +import { setAuthHeader } from './axiosHeaders'; +import {prettifyJson} from "./jsonUtils"; + +export default function AuthProvider({ userManager: manager, store, children }) { + + let userManager = useRef(); + + useEffect(() => { + userManager.current = manager + + const onUserLoaded = (user) => { + console.log(`user loaded: ${user}`) + console.log(`user loaded: ${prettifyJson(user)}`) + store.dispatch(storeUser(user)) + } + + const onUserUnloaded = () => { + setAuthHeader(null) + console.log(`user unloaded`) + } + + const onAccessTokenExpiring = () => { + console.log(`user token expiring`) + } + + const onAccessTokenExpired = () => { + console.log(`user token expired`) + } + + const onUserSignedOut = () => { + console.log(`user signed out`) + } + + // events for user + userManager.current.events.addUserLoaded(onUserLoaded) + userManager.current.events.addUserUnloaded(onUserUnloaded) + userManager.current.events.addAccessTokenExpiring(onAccessTokenExpiring) + userManager.current.events.addAccessTokenExpired(onAccessTokenExpired) + userManager.current.events.addUserSignedOut(onUserSignedOut) + + // Specify how to clean up after this effect: + return function cleanup() { + userManager.current.events.removeUserLoaded(onUserLoaded); + userManager.current.events.removeUserUnloaded(onUserUnloaded); + userManager.current.events.removeAccessTokenExpiring(onAccessTokenExpiring) + userManager.current.events.removeAccessTokenExpired(onAccessTokenExpired) + userManager.current.events.removeUserSignedOut(onUserSignedOut) + }; + }, [manager, store]); + + return ( + React.Children.only(children) + ) +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/utils/axiosHeaders.js b/src/WebApps/smalltalk/auth-app/src/utils/axiosHeaders.js new file mode 100644 index 00000000..d986f87f --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/utils/axiosHeaders.js @@ -0,0 +1,5 @@ +import axios from 'axios' + +export function setAuthHeader(token) { + axios.defaults.headers.common['Authorization'] = token ? 'Bearer ' + token : '' +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/utils/jsonUtils.js b/src/WebApps/smalltalk/auth-app/src/utils/jsonUtils.js new file mode 100644 index 00000000..fac82dfe --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/utils/jsonUtils.js @@ -0,0 +1,3 @@ +export const prettifyJson = (value) => { + return JSON.stringify(value, null, 2); +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/utils/protectedRoute.js b/src/WebApps/smalltalk/auth-app/src/utils/protectedRoute.js new file mode 100644 index 00000000..219f709d --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/utils/protectedRoute.js @@ -0,0 +1,13 @@ +import React from 'react' +import { Route, Redirect } from 'react-router-dom' +import { useSelector } from 'react-redux' + +function ProtectedRoute({ children, component: Component, ...rest }) { + const user = useSelector(state => state.auth.user) + + return user + ? () + : () +} + +export default ProtectedRoute \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/yarn.lock b/src/WebApps/smalltalk/auth-app/yarn.lock index 690c3c64..1b64a47e 100644 --- a/src/WebApps/smalltalk/auth-app/yarn.lock +++ b/src/WebApps/smalltalk/auth-app/yarn.lock @@ -912,7 +912,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.16.7" "@babel/plugin-transform-react-pure-annotations" "^7.16.7" -"@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== @@ -1084,6 +1084,14 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" @@ -1116,6 +1124,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -1126,11 +1139,25 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/react@*": + version "18.0.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.8.tgz#a051eb380a9fbcaa404550543c58e1cf5ce4ab87" + integrity sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/scheduler@*": + version "0.16.2" + 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" @@ -1153,6 +1180,11 @@ dependencies: "@types/node" "*" +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/ws@^8.5.1": version "8.5.3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" @@ -1335,7 +1367,7 @@ acorn-walk@^7.0.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.0.0: +acorn@^7.0.0, acorn@^7.4.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -1438,6 +1470,11 @@ async@^2.6.2: 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" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + autoprefixer@^10.1.0: version "10.4.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" @@ -1450,6 +1487,14 @@ autoprefixer@^10.1.0: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + babel-loader@^8.2.2: version "8.2.5" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" @@ -1496,6 +1541,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -1714,6 +1764,13 @@ colorette@^2.0.10, colorette@^2.0.14: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -1801,6 +1858,11 @@ core-js-compat@^3.21.0, core-js-compat@^3.22.1: browserslist "^4.20.3" semver "7.0.0" +core-js@^3.8.3: + version "3.22.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.4.tgz#f4b3f108d45736935aa028444a69397e40d8c531" + integrity sha512-1uLykR+iOfYja+6Jn/57743gc9n73EWiOnSJJ4ba3B4fOEYDBv25MagmEZBxTp5cWq4b/KPx/l77zgsp28ju4w== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -1826,6 +1888,11 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -1871,6 +1938,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csstype@^3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" + integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1917,6 +1989,11 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -2252,11 +2329,20 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.9: version "1.14.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -2405,6 +2491,25 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -2668,6 +2773,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2802,7 +2912,7 @@ lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loose-envify@^1.1.0: +loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -2875,7 +2985,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: 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== @@ -2892,6 +3002,14 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -3043,6 +3161,17 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +oidc-client@^1.11.5: + version "1.11.5" + resolved "https://registry.yarnpkg.com/oidc-client/-/oidc-client-1.11.5.tgz#020aa193d68a3e1f87a24fcbf50073b738de92bb" + integrity sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg== + dependencies: + acorn "^7.4.1" + base64-js "^1.5.1" + core-js "^3.8.3" + crypto-js "^4.0.0" + serialize-javascript "^4.0.0" + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -3168,6 +3297,13 @@ 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.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== + dependencies: + isarray "0.0.1" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3306,6 +3442,15 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +prop-types@^15.6.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -3377,6 +3522,57 @@ react-dom@^17.0.2: object-assign "^4.1.1" scheduler "^0.20.2" +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + +react-redux@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.1.tgz#2bc029f5ada9b443107914c373a2750f6bc0f40c" + integrity sha512-LMZMsPY4DYdZfLJgd7i79n5Kps5N9XVLCJJeWAaPYTV+Eah2zTuBjTxKtNEbjiyitbq80/eIkm55CYSLqAub3w== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" + +react-router-dom@^5.1.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.1.tgz#0151baf2365c5fcd8493f6ec9b9b31f34d0f8ae1" + integrity sha512-f0pj/gMAbv9e8gahTmCEY20oFhxhrmHwYeIwH5EO5xu0qme+wXtsdB8YfUOAZzUz4VaXmb58m3ceiLtjMhqYmQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.1" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.1.tgz#b13e84a016c79b9e80dde123ca4112c4f117e3cf" + integrity sha512-v+zwjqb7bakqgF+wMVKlAPTca/cEmPOvQ9zt7gpSNyPXau1+0qvuYZ5BWzzNDP1y6s15zDwgb9rPN63+SIniRQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + react@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -3429,6 +3625,13 @@ reduce-css-calc@^2.1.8: css-unit-converter "^1.1.1" postcss-value-parser "^3.3.0" +redux@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" + integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== + dependencies: + "@babel/runtime" "^7.9.2" + regenerate-unicode-properties@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" @@ -3520,6 +3723,11 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" @@ -3662,6 +3870,13 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -3935,6 +4150,16 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tiny-invariant@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tmp@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -4019,6 +4244,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-sync-external-store@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz#3343c3fe7f7e404db70f8c687adf5c1652d34e82" + integrity sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4039,6 +4269,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +value-equal@^1.0.1: + version "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: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" From 7f4892ef6c7e3beb884e5810ec69187331e3841d Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Tue, 3 May 2022 22:04:57 +0300 Subject: [PATCH 03/13] feat(issue-351): update auth config with clients --- .../Extensions/IdentityExtensions.cs | 11 ++-- .../Extensions/IdentityServerExtensions.cs | 53 +++++++++++-------- .../Pages/{ => Account}/Login.cshtml | 0 .../Pages/{ => Account}/Login.cshtml.cs | 0 .../Pages/Register.cshtml.cs | 8 +-- .../Properties/launchSettings.json | 2 +- .../auth/O2NextGen.Auth.Web/Startup.cs | 20 +++++-- .../auth/O2NextGen.Auth.Web/appsettings.json | 2 +- .../auth/O2NextGen.Auth.Web/tempkey.rsa | 1 + 9 files changed, 60 insertions(+), 37 deletions(-) rename src/Services/auth/O2NextGen.Auth.Web/Pages/{ => Account}/Login.cshtml (100%) rename src/Services/auth/O2NextGen.Auth.Web/Pages/{ => Account}/Login.cshtml.cs (100%) create mode 100644 src/Services/auth/O2NextGen.Auth.Web/tempkey.rsa diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs index 8f7cd08e..aa86eec5 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs @@ -1,12 +1,8 @@ -using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using O2NextGen.Auth.Web.Data; -using O2NextGen.Auth.Web.Helpers; -using O2NextGen.Auth.Web.Utilities; namespace O2NextGen.Auth.Web.Extensions { @@ -19,6 +15,7 @@ public static IServiceCollection AddConfiguredIdentity(this IServiceCollection s options.UseSqlServer(configuration["ConnectionString"])); services + .AddIdentity(options => { options.Password.RequireDigit = false; @@ -31,10 +28,8 @@ public static IServiceCollection AddConfiguredIdentity(this IServiceCollection s .AddEntityFrameworkStores() .AddDefaultTokenProviders(); - services.AddSingleton(); - services.AddSingleton(); - - + services.AddConfiguredIdentityServer(configuration); + return services; } } diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs index 35ad5ff3..6b9f23f0 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs @@ -2,10 +2,8 @@ using System.Linq; using IdentityServer4; using IdentityServer4.Models; -using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.AspNetCore.Hosting; using O2NextGen.Auth.Web.Data; namespace O2NextGen.Auth.Web.Extensions @@ -13,17 +11,19 @@ namespace O2NextGen.Auth.Web.Extensions public static class IdentityServerExtensions { public static IServiceCollection AddConfiguredIdentityServer(this IServiceCollection services, - IHostingEnvironment environment, IConfiguration configuration) + IConfiguration configuration) { var builder = services.AddIdentityServer(options => { - options.Events.RaiseErrorEvents = true; - options.Events.RaiseInformationEvents = true; - options.Events.RaiseFailureEvents = true; - options.Events.RaiseSuccessEvents = true; + // options.Events.RaiseErrorEvents = true; + // options.Events.RaiseInformationEvents = true; + // options.Events.RaiseFailureEvents = true; + // options.Events.RaiseSuccessEvents = true; }) // using in memory, but we could also get it, for example, from the database + .AddDeveloperSigningCredential() + .AddInMemoryPersistedGrants() // access to data regarding the user's identity .AddInMemoryIdentityResources(GetIdentityResources()) // APIs that may be accessed @@ -31,14 +31,14 @@ public static IServiceCollection AddConfiguredIdentityServer(this IServiceCollec // client applications that may access users data and APIs on the user's behalf .AddInMemoryClients(GetClients()) // configures IdentityServer integration with ASP.NET Core Identity - .AddAspNetIdentity() - + .AddAspNetIdentity(); + // to avoid bombarding the db with checks, make use of cache - .AddInMemoryCaching(); + //.AddInMemoryCaching(); // more about EF integration: // - http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html // - http://docs.identityserver.io/en/latest/reference/ef.html?highlight=dbcontext - + return services; } @@ -69,21 +69,32 @@ private static IEnumerable GetClients() { new Client { - ClientId = "WebFrontend", - AllowedGrantTypes = GrantTypes.Code, - ClientSecrets = {new Secret("secret".Sha256())}, - RedirectUris = new[] {"https://localhost:1001/signin-oidc"}, - RefreshTokenUsage = TokenUsage.OneTimeOnly, + ClientId = "smalltalk_client_reactjs", + // AllowedGrantTypes = GrantTypes.Code, + + //ClientSecrets = {new Secret("secret".Sha256())}, + AllowedGrantTypes = GrantTypes.Implicit, + + RequireClientSecret = false, + // RequireClientSecret=false, + RequireConsent = false, + // RequirePkce = true, + RedirectUris = new[] {"http://localhost:3003/signin-oidc"}, + AllowedCorsOrigins = new []{"http://localhost:3003"}, + PostLogoutRedirectUris = new []{"http://localhost:3003/signout-oidc"}, + + //RefreshTokenUsage = TokenUsage.OneTimeOnly, AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, - "GroupManagement", - IdentityServerConstants.StandardScopes.OfflineAccess + //"GroupManagement", + //IdentityServerConstants.StandardScopes.OfflineAccess }, - AllowOfflineAccess = true, - AccessTokenLifetime = 60, - RefreshTokenExpiration = TokenExpiration.Sliding, + AllowAccessTokensViaBrowser = true, + //AllowOfflineAccess = true, + //AccessTokenLifetime = 60, + //RefreshTokenExpiration = TokenExpiration.Sliding, //RequireConsent = false } }; diff --git a/src/Services/auth/O2NextGen.Auth.Web/Pages/Login.cshtml b/src/Services/auth/O2NextGen.Auth.Web/Pages/Account/Login.cshtml similarity index 100% rename from src/Services/auth/O2NextGen.Auth.Web/Pages/Login.cshtml rename to src/Services/auth/O2NextGen.Auth.Web/Pages/Account/Login.cshtml diff --git a/src/Services/auth/O2NextGen.Auth.Web/Pages/Login.cshtml.cs b/src/Services/auth/O2NextGen.Auth.Web/Pages/Account/Login.cshtml.cs similarity index 100% rename from src/Services/auth/O2NextGen.Auth.Web/Pages/Login.cshtml.cs rename to src/Services/auth/O2NextGen.Auth.Web/Pages/Account/Login.cshtml.cs diff --git a/src/Services/auth/O2NextGen.Auth.Web/Pages/Register.cshtml.cs b/src/Services/auth/O2NextGen.Auth.Web/Pages/Register.cshtml.cs index 19ef8499..12165b49 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Pages/Register.cshtml.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Pages/Register.cshtml.cs @@ -1,3 +1,4 @@ +using System; using System.ComponentModel.DataAnnotations; using System.Text.Encodings.Web; using System.Threading.Tasks; @@ -83,9 +84,10 @@ public async Task OnPostAsync(string returnUrl = null) pageHandler: null, values: new { userId = user.Id, code = code }, protocol: Request.Scheme); - - await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", - $"Please confirm your account by clicking here."); + + Console.WriteLine(HtmlEncoder.Default.Encode(callbackUrl)); + //await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", + // $"Please confirm your account by clicking here."); await _signInManager.SignInAsync(user, isPersistent: false); diff --git a/src/Services/auth/O2NextGen.Auth.Web/Properties/launchSettings.json b/src/Services/auth/O2NextGen.Auth.Web/Properties/launchSettings.json index c1a63ed6..8a789bcb 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Properties/launchSettings.json +++ b/src/Services/auth/O2NextGen.Auth.Web/Properties/launchSettings.json @@ -6,7 +6,7 @@ "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "https://localhost:10001;http://localhost:5001" + "applicationUrl": "http://localhost:5001" }, "Docker": { "commandName": "Docker", diff --git a/src/Services/auth/O2NextGen.Auth.Web/Startup.cs b/src/Services/auth/O2NextGen.Auth.Web/Startup.cs index 63216870..7d0eff51 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Startup.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Startup.cs @@ -10,6 +10,7 @@ using O2NextGen.Auth.Web.Data; using O2NextGen.Auth.Web.Extensions; using O2NextGen.Auth.Web.Helpers; +using O2NextGen.Auth.Web.Utilities; namespace O2NextGen.Auth.Web { @@ -32,15 +33,26 @@ public void ConfigureServices(IServiceCollection services) } ); services.AddApplicationServices(_configuration); - + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder + .AllowAnyMethod() + .AllowAnyHeader() + .SetIsOriginAllowed((host) => true) + .AllowCredentials()); + }); services.ConfigureApplicationCookie(options => { options.LoginPath = "/Login"; options.LogoutPath = "/Logout"; options.AccessDeniedPath = "/AccessDenied"; }) - .AddConfiguredIdentity( _configuration); + + .AddConfiguredIdentity(_configuration); services.AddConfiguredLocalization(); + + services.AddSingleton(); services.AddSingleton(); } @@ -52,13 +64,15 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) } app.UseHsts(); app.UseHttpsRedirection(); + app.UseCors("CorsPolicy"); app.UseStaticFiles(); - //app.UseIdentityServer(); + app.UseIdentityServer(); var v = app.ApplicationServices .GetRequiredService>().Value; app.UseRequestLocalization(v); app.UseCookiePolicy(); app.UseAuthentication(); + app.UseMvcWithDefaultRoute(); } } diff --git a/src/Services/auth/O2NextGen.Auth.Web/appsettings.json b/src/Services/auth/O2NextGen.Auth.Web/appsettings.json index 98f6bbeb..0063880a 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/appsettings.json +++ b/src/Services/auth/O2NextGen.Auth.Web/appsettings.json @@ -26,7 +26,7 @@ }, "AllowedHosts": "*", "urls": { - "ESenderUrl": "https://e-sender" + "ESenderUrl": "https://e-sender.o2bus.com" }, "ConnectionString": "Server=localhost;Initial Catalog=O2NextGen.AuthDb;Persist Security Info=False;User ID=sa;Password=your@Password;Connection Timeout=30;", "Auth-Config": { diff --git a/src/Services/auth/O2NextGen.Auth.Web/tempkey.rsa b/src/Services/auth/O2NextGen.Auth.Web/tempkey.rsa new file mode 100644 index 00000000..0af2f248 --- /dev/null +++ b/src/Services/auth/O2NextGen.Auth.Web/tempkey.rsa @@ -0,0 +1 @@ +{"KeyId":"1dfb7972d343e1b75af2d7ef4534580c","Parameters":{"D":"diHZFyVRa/kTk1Dw4zny6ekMK/YxPTaWORSsQyT5UkNvbBvpFtzowKqLMfaoCKXAsLxHCK8UWCbkqLsa+ryEulYY7IWzgJk9O7IXWLWoPqMXbOa4Szx8ADgVU/18mNe5/dbjiNbPtFUG0KC2yQ9dcIS7P05ck3YZ1VwY4L/5AyU+7MEutbPR+iIPCilso9isi0LYik52Bb8Gr+6BjM0SSNy/K0xBuB64B+AzrX046qOlhITSR+V1cawIi+PwpwYIJqX8ReRD1jtcFQUpwW0sMAKPkqP5BdtrcTpfOq7m3EVJmTSV7INb3VWAF0DaEfSXVWsEj4HEft1H3/IhUuGXQQ==","DP":"T/70ZuBHdQG9ABszsPzMQuWgSdYsLFxUq8rdmmvPeGms2CAA90lZotLiPm2ajyuxB2y1wHhDp/PNIkbcwZ11erbnT+aq8CP7ILuSGkIpxJrqhfBVqRe/XXW1nI+arXUy8SxGw8KvTlIGR2hnxw8xgGyLsKcKQpsfi/0bDTCjKqM=","DQ":"oAAvTXd+psk3FpgkHkNITbl+MyXXdPNGqPXvxcmd6ePMpbddaSBQT+EoRsr+AJBDpvv9eNrVXIWksQMjWQBYT18h46JjYJx5ig+TUcfPfLsPF6efy3oii781uNMM6TjGG3n3dICy4UElub01OS0Fv1D5rNWwgPQrldqUKdFEdTE=","Exponent":"AQAB","InverseQ":"F5kGAFCyXIWAyioGwiJQDd1jvYAcVXIyQPpJYZqorNLUh+irjysXODNOJwpWLHaWQ9whVYwNfYcxf4RQQQLetVxlPHjt1fBT7BNrjhU43hmHxHQAHlnCIPorZdDgqCk6rPwD9aX4TdMB+Sjo1LH1kCABftuI1UVBigk76wlD3JQ=","Modulus":"vXoeR7cTVIwKAHq51GlLoj7xEeIo3v5K1KMhtMYpZXPRe8xOaKSZdaH+n/O7h0qdk0P9UxDlzmYt9bkzSWasHPA08hUaByWnQ6LKnLbAjAM+7bgBt2cSZjmgF1/pr2FUkPWbtBRNjxqcEP0QbRrUxMtFEaDKtM7jYHKRlfJHCv9nJWHY3rWZxoYlJ8rkf21zyCiYYQNJKEYVRMsHnKyso7mDZofIzkRbKaoeafEtEgttRAy+jZrDeDztqdzlHwCbTVoG+YnE5XFWObJXZknJvJjFWNFLPqoa1a+pynjahsU7P8gy2h+zK23EzdyWhucXD9Au1wM9oPsqNjp4rY5Gew==","P":"3EWdu5QfVbnqOn4T8YGh1wpe4eC42xShS8qfeuaasWtYnYSOW1eSw/SnPv7RFJ8lTXM39DC0LzDan891jkqdRh8bME3nJCOHispOFexcL5dbkuFfsErzogxm+rthV1NO8PG0bgbEIgu69n0J7AEq7CftTDaKvyV22nVWBIkekjM=","Q":"3DXM6gxYHbftVUWXoVWGvd9mGI7ux3f7a7rYdmk9xNm0E2spsGZTdbvwbjTcvbQBHTvArIKx0ShslyHs3JzcVVOl/0U08wryU3cAnsNJ97EDW8jyEi6A6G4GWBCh3ZoWMad7WiiIWU7nuelDojWl2uXd3FIW+yIDIQgg9+7Jgpk="}} \ No newline at end of file From f0c25956254dee87a41cc81d5b3044efede37dfa Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Wed, 4 May 2022 04:49:54 +0300 Subject: [PATCH 04/13] feat(issue-351): include microfront-end for smalltalk --- src/WebApps/smalltalk/auth-app/package.json | 3 +- src/WebApps/smalltalk/auth-app/src/App.jsx | 3 + .../auth-app/src/pages/{home.js => home.jsx} | 22 + .../smalltalk/auth-app/src/pages/test.jsx | 29 + .../smalltalk/auth-app/webpack.config.js | 7 +- src/WebApps/smalltalk/auth-app/yarn.lock | 27 + src/WebApps/smalltalk/{ => chat}/.babelrc | 0 src/WebApps/smalltalk/chat/webpack.config.js | 9 +- src/WebApps/smalltalk/chat/yarn.lock | 1308 ++++++++--------- src/WebApps/smalltalk/yarn.lock | 4 + 10 files changed, 679 insertions(+), 733 deletions(-) rename src/WebApps/smalltalk/auth-app/src/pages/{home.js => home.jsx} (68%) create mode 100644 src/WebApps/smalltalk/auth-app/src/pages/test.jsx rename src/WebApps/smalltalk/{ => chat}/.babelrc (100%) create mode 100644 src/WebApps/smalltalk/yarn.lock diff --git a/src/WebApps/smalltalk/auth-app/package.json b/src/WebApps/smalltalk/auth-app/package.json index 5a1f6fe3..3f08d280 100644 --- a/src/WebApps/smalltalk/auth-app/package.json +++ b/src/WebApps/smalltalk/auth-app/package.json @@ -38,6 +38,7 @@ "react-dom": "^17.0.2", "react-redux": "^8.0.1", "react-router-dom": "^5.1.0", - "redux": "^4.2.0" + "redux": "^4.2.0", + "smalltalk": "^4.0.7" } } diff --git a/src/WebApps/smalltalk/auth-app/src/App.jsx b/src/WebApps/smalltalk/auth-app/src/App.jsx index e0ad1f1e..ad58c1c1 100644 --- a/src/WebApps/smalltalk/auth-app/src/App.jsx +++ b/src/WebApps/smalltalk/auth-app/src/App.jsx @@ -13,6 +13,8 @@ import store from './store'; import userManager, { loadUserFromStorage } from './services/userService' import AuthProvider from './utils/authProvider' import PrivateRoute from './utils/protectedRoute' +import test from "./pages/test"; + function App() { @@ -30,6 +32,7 @@ function App() { + diff --git a/src/WebApps/smalltalk/auth-app/src/pages/home.js b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx similarity index 68% rename from src/WebApps/smalltalk/auth-app/src/pages/home.js rename to src/WebApps/smalltalk/auth-app/src/pages/home.jsx index bda53383..ae70538b 100644 --- a/src/WebApps/smalltalk/auth-app/src/pages/home.js +++ b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx @@ -3,10 +3,25 @@ import { signoutRedirect } from '../services/userService' import { useSelector } from 'react-redux' import * as apiService from '../services/apiService' import { prettifyJson } from '../utils/jsonUtils' +import {useRef} from "react"; +import MessageItem from "smalltalk/MessageItem"; + function Home() { const user = useSelector(state => state.auth.user) const [doughnutData, setDoughnutData] = useState(null) + + const [connection, setConnection] = useState(null); + const messageRef = useRef(); + + const [messages, setMessages] = useState([ + { id: 1, message: 'it is me', senderId: 1, recipientId: 2, }, + { id: 2, message: 'Who?', senderId: 2, recipientId: 1, }, + { id: 3, message: 'denis prokhorchik2', senderId: 1, recipientId: 2, }, + ]); + + const [message, setMessage] = useState(''); + function signOut() { signoutRedirect() } @@ -16,6 +31,8 @@ function Home() { setDoughnutData(doughnuts) } + + return (

Home

@@ -32,6 +49,11 @@ function Home() { {prettifyJson(doughnutData ? doughnutData : 'No doughnuts yet :(')} +
+ {messages.map((item) => + + )} +

Github Repo

diff --git a/src/WebApps/smalltalk/auth-app/src/pages/test.jsx b/src/WebApps/smalltalk/auth-app/src/pages/test.jsx new file mode 100644 index 00000000..7575294c --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/pages/test.jsx @@ -0,0 +1,29 @@ +import React, {useRef, useState} from 'react'; +import MessageItem from "smalltalk/MessageItem"; +import SessionItem from "smalltalk/SessionItem"; +const Test = () => { + + const [connection, setConnection] = useState(null); + const messageRef = useRef(); + + const [messages, setMessages] = useState([ + { id: 1, message: 'it is me', senderId: 1, recipientId: 2, }, + { id: 2, message: 'Who?', senderId: 2, recipientId: 1, }, + { id: 3, message: 'denis prokhorchik2', senderId: 1, recipientId: 2, }, + ]) + + const [message, setMessage] = useState('') + + return ( +
+ test +
+ {messages.map((item) => + + )} +
+
+ ); +}; + +export default Test; \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/webpack.config.js b/src/WebApps/smalltalk/auth-app/webpack.config.js index ef99f4cd..d28bd900 100644 --- a/src/WebApps/smalltalk/auth-app/webpack.config.js +++ b/src/WebApps/smalltalk/auth-app/webpack.config.js @@ -43,8 +43,11 @@ module.exports = { new ModuleFederationPlugin({ name: "auth_app", filename: "remoteEntry.js", - remotes: {}, - exposes: {}, + remotes: { + "smalltalk": "smalltalk@http://localhost:3002/remoteEntry.js", + }, + exposes: { + }, shared: { ...deps, react: { diff --git a/src/WebApps/smalltalk/auth-app/yarn.lock b/src/WebApps/smalltalk/auth-app/yarn.lock index 1b64a47e..ce43ef7b 100644 --- a/src/WebApps/smalltalk/auth-app/yarn.lock +++ b/src/WebApps/smalltalk/auth-app/yarn.lock @@ -952,6 +952,14 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@cloudcmd/create-element@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cloudcmd/create-element/-/create-element-2.0.2.tgz#071b26cafafe4a79cdd056d05dee4bb6ac1a2271" + integrity sha512-5b74qCgwEUx+GxzXC9Gwamgh4Rx5ouLSrCW+QbaBHWpxA5s1sw5i6MbSODfuts1MSX5RoaZjJAjNY5y3et1iXw== + dependencies: + currify "^4.0.0" + fullstore "^3.0.0" + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -1943,6 +1951,11 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== +currify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/currify/-/currify-4.0.0.tgz#54637df9a9752de8a0d59efbfb5ce59384a1e306" + integrity sha512-ABfH28PWp5oqqp31cLXJQdeMqoFNej9rJOu84wKhN3jPCH7FAZg3zY1MVI27PTFoqfPlxOyhGmh9PzOVv+yN2g== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2382,6 +2395,11 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fullstore@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fullstore/-/fullstore-3.0.0.tgz#680d5fe282c5f51f67900dbad3fd53e62c954770" + integrity sha512-EEIdG+HWpyygWRwSLIZy+x4u0xtghjHNfhQb0mI5825Mmjq6oFESFUY0hoZigEgd3KH8GX+ZOCK9wgmOiS7VBQ== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3957,6 +3975,15 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +smalltalk@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/smalltalk/-/smalltalk-4.0.7.tgz#4a4c9297ca040493731ef75a96fd310249e7a5b4" + integrity sha512-aYZLc6qegvJzbUK68Ay4/TnXRkiSKfXH7XTjiBR5DQrUSvtMA/j/y5Y6CiI23pYZifYzlm8oBQW3l1WoPf6J8w== + dependencies: + "@cloudcmd/create-element" "^2.0.0" + currify "^4.0.0" + fullstore "^3.0.0" + sockjs@^0.3.21: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" diff --git a/src/WebApps/smalltalk/.babelrc b/src/WebApps/smalltalk/chat/.babelrc similarity index 100% rename from src/WebApps/smalltalk/.babelrc rename to src/WebApps/smalltalk/chat/.babelrc diff --git a/src/WebApps/smalltalk/chat/webpack.config.js b/src/WebApps/smalltalk/chat/webpack.config.js index 0cef1ae4..ff765d61 100644 --- a/src/WebApps/smalltalk/chat/webpack.config.js +++ b/src/WebApps/smalltalk/chat/webpack.config.js @@ -49,8 +49,13 @@ module.exports = { new ModuleFederationPlugin({ name: "smalltalk", filename: "remoteEntry.js", - remotes: {}, - exposes: {}, + remotes: { + + }, + exposes: { + './SessionItem':"./src/components/SessionItem.jsx", + './MessageItem': "./src/components/MessageItem.jsx" + }, shared: { ...deps, react: { diff --git a/src/WebApps/smalltalk/chat/yarn.lock b/src/WebApps/smalltalk/chat/yarn.lock index e6792533..4ad41c70 100644 --- a/src/WebApps/smalltalk/chat/yarn.lock +++ b/src/WebApps/smalltalk/chat/yarn.lock @@ -2,13 +2,13 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.0.3.tgz#899999b5b7a5ce570d6d9bafdcc1e62cea466cf3" - integrity sha512-DmIAguV77yFP0MGVFWknCMgSLAtsLR3VlRTteR6xgMpIfYtwaZuMvjGv5YlpiqN7S/5q87DHyuIx8oa15kiyag== +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.9" - "@jridgewell/trace-mapping" "^0.2.7" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" "@aspnet/signalr@^1.0.27": version "1.0.27" @@ -22,40 +22,40 @@ dependencies: "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" - integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== "@babel/core@^7.15.8": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.0.tgz#16b8772b0a567f215839f689c5ded6bb20e864d5" - integrity sha512-x/5Ea+RO5MvF9ize5DeVICJoVrNv0Mi2RnIABrZEKYvPEpldXwauPkgvYA17cKa6WpU3LoYvYbuEMFtSNFsarA== + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" + integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== dependencies: - "@ampproject/remapping" "^2.0.0" + "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.0" - "@babel/parser" "^7.17.0" + "@babel/generator" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.10" "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" + "@babel/traverse" "^7.17.10" + "@babel/types" "^7.17.10" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" + json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.0.tgz#7bd890ba706cd86d3e2f727322346ffdbf98f65e" - integrity sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw== +"@babel/generator@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" jsesc "^2.5.1" - source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" @@ -72,30 +72,30 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== dependencies: - "@babel/compat-data" "^7.16.4" + "@babel/compat-data" "^7.17.10" "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" + browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz#9699f14a88833a7e055ce57dcd3ffdcd25186b21" - integrity sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ== +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" + integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" "@babel/helper-optimise-call-expression" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-create-regexp-features-plugin@^7.16.7": +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== @@ -131,21 +131,13 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== dependencies: - "@babel/helper-get-function-arity" "^7.16.7" "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.17.0" "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" @@ -154,12 +146,12 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" - integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== +"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.17.0" "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": version "7.16.7" @@ -168,19 +160,19 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" + integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== dependencies: "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" @@ -214,12 +206,12 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.17.0" "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" @@ -255,28 +247,28 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.0.tgz#79cdf6c66a579f3a7b5e739371bc63ca0306886b" - integrity sha512-Xe/9NFxjPwELUvW2dsukcMZIp6XwPSbI4ojFBJuX5ramHuVE22SVcZIwqzdWo5uCgeTXW8qV97lMvSOjq+1+nQ== +"@babel/helpers@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== dependencies: "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" + "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" "@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== dependencies: "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.7", "@babel/parser@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.0.tgz#f0ac33eddbe214e4105363bb17c3341c5ffcc43c" - integrity sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw== +"@babel/parser@^7.16.7", "@babel/parser@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" @@ -311,12 +303,12 @@ "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" - integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== +"@babel/plugin-proposal-class-static-block@^7.17.6": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" + integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.17.6" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -368,12 +360,12 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" - integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== +"@babel/plugin-proposal-object-rest-spread@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" + integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== dependencies: - "@babel/compat-data" "^7.16.4" + "@babel/compat-data" "^7.17.0" "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" @@ -578,10 +570,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" - integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== +"@babel/plugin-transform-destructuring@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" + integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -647,23 +639,23 @@ "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" - integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== +"@babel/plugin-transform-modules-commonjs@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" + integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== dependencies: - "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-module-transforms" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== +"@babel/plugin-transform-modules-systemjs@^7.17.8": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" + integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== dependencies: "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-module-transforms" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" @@ -676,12 +668,12 @@ "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4" + integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.17.0" "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" @@ -727,15 +719,15 @@ "@babel/plugin-transform-react-jsx" "^7.16.7" "@babel/plugin-transform-react-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" - integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" + integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/types" "^7.17.0" "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" @@ -745,12 +737,12 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== +"@babel/plugin-transform-regenerator@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" + integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== dependencies: - regenerator-transform "^0.14.2" + regenerator-transform "^0.15.0" "@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" @@ -760,9 +752,9 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.15.8": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" - integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz#b89d821c55d61b5e3d3c3d1d636d8d5a81040ae1" + integrity sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" @@ -823,26 +815,26 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/preset-env@^7.15.8": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c" + integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" "@babel/plugin-proposal-async-generator-functions" "^7.16.8" "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.17.6" "@babel/plugin-proposal-dynamic-import" "^7.16.7" "@babel/plugin-proposal-export-namespace-from" "^7.16.7" "@babel/plugin-proposal-json-strings" "^7.16.7" "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.17.3" "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" "@babel/plugin-proposal-optional-chaining" "^7.16.7" "@babel/plugin-proposal-private-methods" "^7.16.11" @@ -868,7 +860,7 @@ "@babel/plugin-transform-block-scoping" "^7.16.7" "@babel/plugin-transform-classes" "^7.16.7" "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.17.7" "@babel/plugin-transform-dotall-regex" "^7.16.7" "@babel/plugin-transform-duplicate-keys" "^7.16.7" "@babel/plugin-transform-exponentiation-operator" "^7.16.7" @@ -877,15 +869,15 @@ "@babel/plugin-transform-literals" "^7.16.7" "@babel/plugin-transform-member-expression-literals" "^7.16.7" "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.17.9" + "@babel/plugin-transform-modules-systemjs" "^7.17.8" "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10" "@babel/plugin-transform-new-target" "^7.16.7" "@babel/plugin-transform-object-super" "^7.16.7" "@babel/plugin-transform-parameters" "^7.16.7" "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.17.9" "@babel/plugin-transform-reserved-words" "^7.16.7" "@babel/plugin-transform-shorthand-properties" "^7.16.7" "@babel/plugin-transform-spread" "^7.16.7" @@ -895,11 +887,11 @@ "@babel/plugin-transform-unicode-escapes" "^7.16.7" "@babel/plugin-transform-unicode-regex" "^7.16.7" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" + "@babel/types" "^7.17.10" babel-plugin-polyfill-corejs2 "^0.3.0" babel-plugin-polyfill-corejs3 "^0.5.0" babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" + core-js-compat "^3.22.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -926,9 +918,9 @@ "@babel/plugin-transform-react-pure-annotations" "^7.16.7" "@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.0.tgz#b8d142fc0f7664fb3d9b5833fd40dcbab89276c0" - integrity sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== dependencies: regenerator-runtime "^0.13.4" @@ -941,52 +933,70 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.0.tgz#3143e5066796408ccc880a33ecd3184f3e75cd30" - integrity sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== dependencies: "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.0" + "@babel/generator" "^7.17.10" "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.0" - "@babel/types" "^7.17.0" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.4.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.4.4": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== dependencies: "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@discoveryjs/json-ext@^0.5.0": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/resolve-uri@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz#b876e3feefb9c8d3aa84014da28b5e52a0640d72" - integrity sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== -"@jridgewell/sourcemap-codec@^1.4.9": - version "1.4.9" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.9.tgz#6963babca1e1b8a8dc1c379bd4bd2bf9c21c356a" - integrity sha512-iKsUDLGOrC5pSdVTyb8zJI/f55wItTzGtfGWiWPWTc8h2P4oucax7XOGSRq9V2aA1nwE8qMaGvwdXk3PZRtgjg== +"@jridgewell/set-array@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" + integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== -"@jridgewell/trace-mapping@^0.2.7": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.2.7.tgz#d45be64544788e32c7ea5c8faa16a7000d840b5b" - integrity sha512-ZKfRhw6eK2vvdWqpU7DQq49+BZESqh5rmkYpNhuzkz01tapssl2sNNy6uMUIgrTtUWQDijomWJzJRCoevVrfgw== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz#7ed98f6fa525ffb7c56a2cbecb5f7bb91abd2baf" + integrity sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.9" + "@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== "@microsoft/signalr@^6.0.4": version "6.0.4" @@ -1050,7 +1060,7 @@ dependencies: "@types/node" "*" -"@types/eslint-scope@^3.7.0": +"@types/eslint-scope@^3.7.3": version "3.7.3" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== @@ -1059,17 +1069,17 @@ "@types/estree" "*" "@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== + version "8.4.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575" + integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": version "4.17.28" @@ -1096,16 +1106,16 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@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== + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== dependencies: "@types/node" "*" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/mime@^1": version "1.3.2" @@ -1113,9 +1123,9 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/node@*": - version "17.0.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.15.tgz#97779282c09c09577120a2162e71d8380003590a" - integrity sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA== + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1132,10 +1142,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/serve-index@^1.9.1": version "1.9.1" @@ -1159,10 +1169,10 @@ dependencies: "@types/node" "*" -"@types/ws@^8.2.2": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" - integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== +"@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" "*" @@ -1321,7 +1331,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: +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== @@ -1353,18 +1363,10 @@ acorn@^7.0.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" +acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== ajv-formats@^2.1.1: version "2.1.1" @@ -1396,9 +1398,9 @@ ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.8.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" - integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1415,11 +1417,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1452,20 +1449,15 @@ 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.0: +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-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" @@ -1475,32 +1467,32 @@ asynckit@^0.4.0: integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= autoprefixer@^10.1.0: - version "10.4.2" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.2.tgz#25e1df09a31a9fba5c40b578936b90d35c9d4d3b" - integrity sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ== + version "10.4.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== dependencies: - browserslist "^4.19.1" - caniuse-lite "^1.0.30001297" - fraction.js "^4.1.2" + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" axios@^0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.1.tgz#badcc8cc38cfa812320221b600776452141ea5d4" - integrity sha512-ePNMai55xo5GsXajb/k756AqZqpqeDaGwGcdvbZLSSELbbYwsIn2jNmGfUPEwd8j/yu4OoMstLLIVa4t0MneEA== + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== dependencies: follow-redirects "^1.14.9" form-data "^4.0.0" babel-loader@^8.2.2: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" - integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== dependencies: find-cache-dir "^3.3.1" - loader-utils "^1.4.0" + loader-utils "^2.0.0" make-dir "^3.1.0" schema-utils "^2.6.5" @@ -1555,33 +1547,33 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" - integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: - bytes "3.1.1" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.6" - raw-body "2.4.2" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= +bonjour-service@^1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" + array-flatten "^2.1.2" dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.4" boolbase@^1.0.0: version "1.0.0" @@ -1596,22 +1588,22 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== +browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" escalade "^3.1.1" - node-releases "^2.0.1" + node-releases "^2.0.3" picocolors "^1.0.0" buffer-from@^1.0.0: @@ -1619,27 +1611,17 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" - integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== - -bytes@^3.0.0: +bytes@3.1.2, bytes@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.0, call-bind@^1.0.2: +call-bind@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -1665,10 +1647,10 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001297: - version "1.0.30001307" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001307.tgz#27a67f13ebc4aa9c977e6b8256a11d5eafb30f27" - integrity sha512-+MXEMczJ4FuxJAUp0jvAl6Df0NI/OfW1RWEE61eSmzS7hw6lz4IKutbhbXendwq8BljfFuHtu26VWsg4afQ7Ng== +caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: + version "1.0.30001335" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a" + integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w== chalk@^2.0.0: version "2.4.2" @@ -1708,17 +1690,12 @@ chrome-trace-event@^1.0.2: integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== clean-css@^5.2.2: - version "5.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.4.tgz#982b058f8581adb2ae062520808fb2429bd487a4" - integrity sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg== + version "5.3.0" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -1753,17 +1730,17 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" color@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.0.tgz#0c782459a3e98838ea01e4bc0fb43310ca35af78" - integrity sha512-hHTcrbvEnGjC7WBMk6ibQWFVDgEFTVmjrz2Q5HlU6ltwxv0JJN2Z8I7uRbWeQLF04dikxs8zgyZkazRJvSMtyQ== + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" color-string "^1.9.0" @@ -1854,17 +1831,17 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.0.tgz#bcc86aa5a589cee358e7a7fa0a4979d5a76c3885" - integrity sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A== +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.22.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.4.tgz#d700f451e50f1d7672dcad0ac85d910e6691e579" + integrity sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA== dependencies: - browserslist "^4.19.1" + browserslist "^4.20.3" semver "7.0.0" core-util-is@~1.0.0: @@ -1898,12 +1875,12 @@ css-color-names@^0.0.4: integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= css-loader@^6.3.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.6.0.tgz#c792ad5510bd1712618b49381bd0310574fafbd3" - integrity sha512-FK7H2lisOixPT406s5gZM1S3l8GrfhEBT3ZiL2UX1Ng1XWs0y2GPllz/OTyvbaHe12VgQrIXIzuEGVlbUhodqg== + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== dependencies: icss-utils "^5.1.0" - postcss "^8.4.5" + postcss "^8.4.7" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" @@ -1912,13 +1889,13 @@ css-loader@^6.3.0: semver "^7.3.5" css-select@^4.1.3: - version "4.2.1" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" - integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" - css-what "^5.1.0" - domhandler "^4.3.0" + css-what "^6.0.1" + domhandler "^4.3.1" domutils "^2.8.0" nth-check "^2.0.1" @@ -1927,10 +1904,10 @@ css-unit-converter@^1.1.1: resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== -css-what@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" @@ -1952,24 +1929,12 @@ debug@^3.1.1: ms "^2.1.1" debug@^4.1.0, debug@^4.1.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -1983,45 +1948,37 @@ define-lazy-prop@^2.0.0: integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +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= -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-node@^2.0.4: version "2.1.0" @@ -2042,13 +1999,6 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - dlv@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" @@ -2059,20 +2009,12 @@ dns-equal@^1.0.0: resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= +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: - buffer-indexof "^1.0.0" + "@leichtgewicht/ip-codec" "^2.0.1" dom-converter@^0.2.0: version "0.2.0" @@ -2082,23 +2024,23 @@ dom-converter@^0.2.0: utila "~0.4" dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" entities "^2.0.0" domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" @@ -2124,10 +2066,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.4.17: - version "1.4.65" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.65.tgz#c0820db06e268e0a2fd4dbce38fb5376d38ca449" - integrity sha512-0/d8Skk8sW3FxXP0Dd6MnBlrwx7Qo9cqQec3BlIAlvKnrmS3pHsIbaroEi+nd0kZkGpQ6apMEre7xndzjlEnLw== +electron-to-chromium@^1.4.118: + version "1.4.131" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.131.tgz#ca42d22eac0fe545860fbc636a6f4a7190ba70a9" + integrity sha512-oi3YPmaP87hiHn0c4ePB67tXaF+ldGhxvZnT19tW9zX6/Ej+pLN0Afja5rQ6S+TND7I9EuwQTT8JYn1k7R7rrw== emojis-list@^3.0.0: version "3.0.0" @@ -2139,10 +2081,10 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== +enhanced-resolve@^5.9.2: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2256,38 +2198,39 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -express@^4.17.1: - version "4.17.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" - integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== +express@^4.17.3: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.1" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.1" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.6" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -2297,7 +2240,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.7, fast-glob@^3.2.9: +fast-glob@^3.2.7: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -2354,17 +2297,17 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^3.3.1: @@ -2384,12 +2327,7 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" -follow-redirects@^1.0.0: - version "1.14.8" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" - integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== - -follow-redirects@^1.14.9: +follow-redirects@^1.0.0, follow-redirects@^1.14.9: version "1.14.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== @@ -2408,10 +2346,10 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" - integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== fresh@0.5.2: version "0.5.2" @@ -2419,9 +2357,9 @@ fresh@0.5.2: integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -2452,7 +2390,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -2502,22 +2440,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== handle-thing@^2.0.0: version "2.0.1" @@ -2534,17 +2460,17 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-tostringtag@^1.0.0: +has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: - has-symbols "^1.0.2" + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has@^1.0.3: version "1.0.3" @@ -2584,9 +2510,9 @@ hsla-regex@^1.0.0: integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== html-minifier-terser@^6.0.2: version "6.1.0" @@ -2602,9 +2528,9 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== html-webpack-plugin@^5.3.2: version "5.5.0" @@ -2632,15 +2558,15 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-errors@~1.6.2: @@ -2654,14 +2580,14 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== + 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-middleware@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz#94d7593790aad6b3de48164f13792262f656c332" - integrity sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g== +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -2695,11 +2621,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== -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -2716,11 +2637,6 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2744,11 +2660,6 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -ip@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -2759,14 +2670,6 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2797,19 +2700,12 @@ is-color-stop@^1.1.0: rgba-regex "^1.0.0" is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -2832,16 +2728,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -2854,14 +2740,6 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.0.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -2890,9 +2768,9 @@ isobject@^3.0.1: integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= jest-worker@^27.4.5: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" - integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" merge-stream "^2.0.0" @@ -2933,19 +2811,10 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" +json5@^2.1.2, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== jsonfile@^6.0.1: version "6.1.0" @@ -2966,10 +2835,10 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -lilconfig@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== +lilconfig@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== lines-and-columns@^1.1.6: version "1.2.4" @@ -2977,18 +2846,9 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: version "2.0.2" @@ -3011,6 +2871,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.topath@^4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" @@ -3071,7 +2936,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -3082,37 +2947,25 @@ methods@~1.1.2: integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.2" + picomatch "^2.3.1" -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - 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: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: 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-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -3129,23 +2982,23 @@ minimalistic-assert@^1.0.0: integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== mkdirp@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" modern-normalize@^1.1.0: version "1.1.0" @@ -3167,23 +3020,18 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== +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 "^1.3.1" + dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" - integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== +nanoid@^3.3.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== negotiator@0.6.3: version "0.6.3" @@ -3217,15 +3065,15 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-forge@^1.2.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-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -3261,15 +3109,12 @@ object-hash@^2.2.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -3289,10 +3134,10 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -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= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -3345,19 +3190,12 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.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== + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - "@types/retry" "^0.12.0" + "@types/retry" "0.12.0" retry "^0.13.1" p-try@^2.0.0: @@ -3438,7 +3276,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -3468,11 +3306,11 @@ postcss-js@^3.0.3: postcss "^8.1.6" postcss-load-config@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.1.tgz#2f53a17f2f543d9e63864460af42efdac0d41f87" - integrity sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg== + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== dependencies: - lilconfig "^2.0.4" + lilconfig "^2.0.5" yaml "^1.10.2" postcss-loader@^4.1.0: @@ -3522,9 +3360,9 @@ postcss-nested@5.0.6: postcss-selector-parser "^6.0.6" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -3539,12 +3377,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.6, postcss@^8.2.1, postcss@^8.3.5, postcss@^8.4.5: - version "8.4.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.6.tgz#c5ff3c3c457a23864f32cb45ac9b741498a09ae1" - integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA== +postcss@^8.1.6, postcss@^8.2.1, postcss@^8.3.5, postcss@^8.4.7: + version "8.4.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575" + integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== dependencies: - nanoid "^3.2.0" + nanoid "^3.3.3" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -3594,10 +3432,12 @@ purgecss@^4.0.3: postcss "^8.3.5" postcss-selector-parser "^6.0.6" -qs@6.9.6: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" querystringify@^2.1.1: version "2.2.0" @@ -3626,13 +3466,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" - integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.1" - http-errors "1.8.1" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -3714,21 +3554,13 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - regexpu-core@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" @@ -3844,7 +3676,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.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, 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== @@ -3895,12 +3727,12 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.0.tgz#e927cd5377cbb0a1075302cff8df1042cc2bce5b" - integrity sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ== +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.2.0" + node-forge "^1" semver@7.0.0: version "7.0.0" @@ -3913,30 +3745,30 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-javascript@^6.0.0: version "6.0.0" @@ -3958,15 +3790,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" setprototypeof@1.1.0: version "1.1.0" @@ -3997,6 +3829,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -4009,11 +3850,6 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - sockjs@^0.3.21: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -4036,20 +3872,17 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@~0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" spdy-transport@^3.0.0: version "3.0.0" @@ -4074,7 +3907,12 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +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== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -4100,13 +3938,6 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -4198,12 +4029,13 @@ terser-webpack-plugin@^5.1.3: terser "^5.7.2" terser@^5.10.0, terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + version "5.13.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== dependencies: + acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" + source-map "~0.8.0-beta.0" source-map-support "~0.5.20" thunky@^1.0.2: @@ -4244,15 +4076,22 @@ toidentifier@1.0.1: punycode "^2.1.1" universalify "^0.1.2" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== type-is@~1.6.18: version "1.6.18" @@ -4369,6 +4208,11 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webpack-cli@^4.9.0: version "4.9.2" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" @@ -4399,38 +4243,37 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.3.1: - version "4.7.4" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz#d0ef7da78224578384e795ac228d8efb63d5f945" - integrity sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A== + 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.2.2" + "@types/ws" "^8.5.1" ansi-html-community "^0.0.8" - bonjour "^3.5.0" + 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" - del "^6.0.0" - express "^4.17.1" + express "^4.17.3" graceful-fs "^4.2.6" html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" + 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.0" + selfsigned "^2.0.1" serve-index "^1.9.1" sockjs "^0.3.21" spdy "^4.0.2" - strip-ansi "^7.0.0" webpack-dev-middleware "^5.3.1" ws "^8.4.2" @@ -4448,12 +4291,12 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.57.1: - version "5.68.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.68.0.tgz#a653a58ed44280062e47257f260117e4be90d560" - integrity sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g== + version "5.72.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.0.tgz#f8bc40d9c6bb489a4b7a8a685101d6022b8b6e28" + integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w== dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" @@ -4461,7 +4304,7 @@ webpack@^5.57.1: acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" + enhanced-resolve "^5.9.2" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -4499,6 +4342,15 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -4522,9 +4374,9 @@ ws@^7.4.5: integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== ws@^8.4.2: - version "8.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" - integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== + version "8.6.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== xtend@^4.0.2: version "4.0.2" diff --git a/src/WebApps/smalltalk/yarn.lock b/src/WebApps/smalltalk/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/src/WebApps/smalltalk/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + From 70bd62c175d482b1840f14f84896d687e0af0eef Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Wed, 4 May 2022 05:52:02 +0300 Subject: [PATCH 05/13] feat(issue-351): update login page for smalltalk react app --- src/WebApps/smalltalk/auth-app/package.json | 2 ++ src/WebApps/smalltalk/auth-app/src/App.jsx | 2 +- .../assets/SmallTalk-Logo_no_signature.png | Bin 0 -> 16115 bytes .../smalltalk/auth-app/src/pages/login.js | 34 +++++++++++++----- .../smalltalk/auth-app/webpack.config.js | 6 ++++ src/WebApps/smalltalk/auth-app/yarn.lock | 17 +++++++++ .../chat/src/components/MessageItem.jsx | 2 +- 7 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 src/WebApps/smalltalk/auth-app/src/assets/SmallTalk-Logo_no_signature.png diff --git a/src/WebApps/smalltalk/auth-app/package.json b/src/WebApps/smalltalk/auth-app/package.json index 3f08d280..edf1cefc 100644 --- a/src/WebApps/smalltalk/auth-app/package.json +++ b/src/WebApps/smalltalk/auth-app/package.json @@ -21,10 +21,12 @@ "autoprefixer": "^10.1.0", "babel-loader": "^8.2.2", "css-loader": "^6.3.0", + "file-loader": "^6.2.0", "html-webpack-plugin": "^5.3.2", "postcss": "^8.2.1", "postcss-loader": "^4.1.0", "style-loader": "^3.3.0", + "url-loader": "^4.1.1", "tailwindcss": "^2.0.2", "webpack": "^5.57.1", "webpack-cli": "^4.9.0", diff --git a/src/WebApps/smalltalk/auth-app/src/App.jsx b/src/WebApps/smalltalk/auth-app/src/App.jsx index ad58c1c1..73869d1a 100644 --- a/src/WebApps/smalltalk/auth-app/src/App.jsx +++ b/src/WebApps/smalltalk/auth-app/src/App.jsx @@ -32,7 +32,7 @@ function App() { - + diff --git a/src/WebApps/smalltalk/auth-app/src/assets/SmallTalk-Logo_no_signature.png b/src/WebApps/smalltalk/auth-app/src/assets/SmallTalk-Logo_no_signature.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5229800ef7fb23f8a0fb56c1ce31ce5e81af09 GIT binary patch literal 16115 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 literal 0 HcmV?d00001 diff --git a/src/WebApps/smalltalk/auth-app/src/pages/login.js b/src/WebApps/smalltalk/auth-app/src/pages/login.js index 78fe454f..9868fcb9 100644 --- a/src/WebApps/smalltalk/auth-app/src/pages/login.js +++ b/src/WebApps/smalltalk/auth-app/src/pages/login.js @@ -2,7 +2,7 @@ import React from 'react' import { signinRedirect } from '../services/userService' import { Redirect } from 'react-router-dom' import { useSelector } from 'react-redux' - +import logo from '.././assets/SmallTalk-Logo_no_signature.png' function Login() { const user = useSelector(state => state.auth.user) @@ -15,15 +15,31 @@ function Login() { () : ( -
-

Hello!

-

Welcome to We Want Doughnuts.

-

A demo of using React and Identity Server 4 to authenticate a user via OpenID Connect to gain access to a web API (and some lovely doughnuts).

-

Start by signing in.

-

💡 Tip: User: 'alice', Pass: 'alice'

+
+ +
+
+
+ +
+
+
+
Welcome to SmallTalk!
+
+

Start chatting right now...

+

Create your account and add your friends to stay connected...

+

💡 Tip: User: 'alice', Pass: 'alice'

+
+
- -

Github Repo

+
+ +
+
+ +
+
+
) ) diff --git a/src/WebApps/smalltalk/auth-app/webpack.config.js b/src/WebApps/smalltalk/auth-app/webpack.config.js index d28bd900..7958f89c 100644 --- a/src/WebApps/smalltalk/auth-app/webpack.config.js +++ b/src/WebApps/smalltalk/auth-app/webpack.config.js @@ -36,6 +36,12 @@ module.exports = { loader: "babel-loader", }, }, + { + test: /\.(jpg|jpeg|png|gif|mp3|svg)$/, + use: { + loader: "url-loader" + }, + }, ], }, diff --git a/src/WebApps/smalltalk/auth-app/yarn.lock b/src/WebApps/smalltalk/auth-app/yarn.lock index ce43ef7b..e4b46151 100644 --- a/src/WebApps/smalltalk/auth-app/yarn.lock +++ b/src/WebApps/smalltalk/auth-app/yarn.lock @@ -2305,6 +2305,14 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -4271,6 +4279,15 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + use-sync-external-store@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz#3343c3fe7f7e404db70f8c687adf5c1652d34e82" diff --git a/src/WebApps/smalltalk/chat/src/components/MessageItem.jsx b/src/WebApps/smalltalk/chat/src/components/MessageItem.jsx index 47716fd9..dae588e6 100644 --- a/src/WebApps/smalltalk/chat/src/components/MessageItem.jsx +++ b/src/WebApps/smalltalk/chat/src/components/MessageItem.jsx @@ -24,7 +24,7 @@ const MessageItem = (props) => {
-
+
{/* < p > sender: { props.message.senderId }

recipient: {props.message.recipientId}

*/}

Denis Prokharchyk ({props.message.recipientId})

From 006c139b0cbe9384410f128206fa6b87a4d3f21c Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Wed, 4 May 2022 06:34:52 +0300 Subject: [PATCH 06/13] feat(issue-351): update services and auth for smalltalk react app --- .../Extensions/IdentityServerExtensions.cs | 23 ++++++----- .../Controllers/ChatController.cs | 2 + .../O2NextGen.SmallTalk.Api/Startup.cs | 29 +++++++++++++- src/WebApps/smalltalk/auth-app/src/App.jsx | 2 +- .../auth-app/src/pages/check-api.jsx | 11 ++++++ .../smalltalk/auth-app/src/pages/home.jsx | 38 ++++++++++--------- .../auth-app/src/services/apiService.js | 2 +- .../auth-app/src/services/userService.js | 2 +- 8 files changed, 78 insertions(+), 31 deletions(-) create mode 100644 src/WebApps/smalltalk/auth-app/src/pages/check-api.jsx diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs index 6b9f23f0..c6146e0b 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs @@ -53,16 +53,21 @@ private static IEnumerable GetIdentityResources() }; } - private static IEnumerable GetApis() - { - var apiResource = new ApiResource("GroupManagement", "Group Management"); - apiResource.Scopes.First().Required = true; - return new[] + // private static IEnumerable GetApis() + // { + // var apiResource = new ApiResource("smalltalkapi", "smalltalkapi"); + // apiResource.Scopes.First().Required = true; + // return new[] + // { + // apiResource + // }; + // } + public static IEnumerable GetApis() => + new List { - apiResource + new ApiResource("smalltalkapi", "smalltalkapi") }; - } - + private static IEnumerable GetClients() { return new[] @@ -88,7 +93,7 @@ private static IEnumerable GetClients() { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, - //"GroupManagement", + "smalltalkapi", //IdentityServerConstants.StandardScopes.OfflineAccess }, AllowAccessTokensViaBrowser = true, diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs index 217192f4..86981fb6 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs @@ -8,9 +8,11 @@ using O2NextGen.SmallTalk.Business.Services; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; namespace O2NextGen.SmallTalk.Api.Controllers { + [Authorize] [Route("api/chat")] [ApiController] public class ChatController : ControllerBase diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs index e9b3b783..7ea2fd64 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs @@ -36,6 +36,30 @@ public void ConfigureServices(IServiceCollection services) TermsOfService = "Terms of Service" }); }); + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder + .AllowAnyMethod() + .AllowAnyHeader() + .SetIsOriginAllowed((host) => true) + .AllowCredentials()); + }); + // adds DI services to DI and configures bearer as the default scheme + services.AddAuthentication("Bearer") + .AddJwtBearer("Bearer", options => + { + // identity server issuing token + options.Authority = "http://localhost:5001"; + options.RequireHttpsMetadata = false; + + // // allow self-signed SSL certs + // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; + + // the scope id of this api + options.Audience = "smalltalkapi"; + }); + services.AddAuthorization(); services.AddApplicationServices(Configuration); } @@ -49,7 +73,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHsts(); } - + app.UseCors("CorsPolicy"); app.UseStaticFiles(); app.UseSwagger() .UseSwaggerUI(c => { c.SwaggerEndpoint($"/swagger/v1/swagger.json", "SmallTalk API V1"); }); @@ -64,7 +88,8 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) await next.Invoke(); }); - + // adds authentication middleware to the pipeline so authentication will be performed on every request + app.UseAuthentication(); app.UseMvc(); } } diff --git a/src/WebApps/smalltalk/auth-app/src/App.jsx b/src/WebApps/smalltalk/auth-app/src/App.jsx index 73869d1a..ad58c1c1 100644 --- a/src/WebApps/smalltalk/auth-app/src/App.jsx +++ b/src/WebApps/smalltalk/auth-app/src/App.jsx @@ -32,7 +32,7 @@ function App() { - + diff --git a/src/WebApps/smalltalk/auth-app/src/pages/check-api.jsx b/src/WebApps/smalltalk/auth-app/src/pages/check-api.jsx new file mode 100644 index 00000000..906f3a6b --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/pages/check-api.jsx @@ -0,0 +1,11 @@ +import React from 'react'; + +const CheckApi = () => { + return ( +
+ Test API +
+ ); +}; + +export default CheckApi; \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx index ae70538b..3261464d 100644 --- a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx +++ b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx @@ -3,24 +3,25 @@ import { signoutRedirect } from '../services/userService' import { useSelector } from 'react-redux' import * as apiService from '../services/apiService' import { prettifyJson } from '../utils/jsonUtils' -import {useRef} from "react"; +import { useRef } from "react"; import MessageItem from "smalltalk/MessageItem"; +import CheckApi from "./check-api"; function Home() { const user = useSelector(state => state.auth.user) const [doughnutData, setDoughnutData] = useState(null) - const [connection, setConnection] = useState(null); - const messageRef = useRef(); + const [connection, setConnection] = useState(null); + const messageRef = useRef(); - const [messages, setMessages] = useState([ - { id: 1, message: 'it is me', senderId: 1, recipientId: 2, }, - { id: 2, message: 'Who?', senderId: 2, recipientId: 1, }, - { id: 3, message: 'denis prokhorchik2', senderId: 1, recipientId: 2, }, - ]); + const [messages, setMessages] = useState([ + { id: 1, message: 'it is me', senderId: 1, recipientId: 2, }, + { id: 2, message: 'Who?', senderId: 2, recipientId: 1, }, + { id: 3, message: 'denis prokhorchik2', senderId: 1, recipientId: 2, }, + ]); - const [message, setMessage] = useState(''); + const [message, setMessage] = useState(''); function signOut() { signoutRedirect() @@ -41,21 +42,24 @@ function Home() {

💡 Tip: Use the Redux dev tools and network tab to inspect what user data was returned from identity and stored in the client.

- - +
+
+
+ +
         
           {prettifyJson(doughnutData ? doughnutData : 'No doughnuts yet :(')}
         
       
-
- {messages.map((item) => - - )} -
+
+ {messages.map((item) => + + )} +

Github Repo

- +
) } diff --git a/src/WebApps/smalltalk/auth-app/src/services/apiService.js b/src/WebApps/smalltalk/auth-app/src/services/apiService.js index cb18f70b..ad7486c2 100644 --- a/src/WebApps/smalltalk/auth-app/src/services/apiService.js +++ b/src/WebApps/smalltalk/auth-app/src/services/apiService.js @@ -1,7 +1,7 @@ import axios from 'axios' async function getDoughnutsFromApi() { - const response = await axios.get('https://localhost:5002/doughnuts'); + const response = await axios.get('http://localhost:5003/api/chat/session/1/messages'); return response.data; } diff --git a/src/WebApps/smalltalk/auth-app/src/services/userService.js b/src/WebApps/smalltalk/auth-app/src/services/userService.js index d7cecf8a..29269e87 100644 --- a/src/WebApps/smalltalk/auth-app/src/services/userService.js +++ b/src/WebApps/smalltalk/auth-app/src/services/userService.js @@ -13,7 +13,7 @@ authority: "http://localhost:5001/", client_id: "smalltalk_client_reactjs", redirect_uri: "http://localhost:3003/signin-oidc", response_type: "id_token token", - scope: "openid profile", + scope: "openid profile smalltalkapi", loadUserInfo: true, post_logout_redirect_uri: "http://localhost:3003/signout-oidc"} From 2524d89d06fc950b423e863dd61bd30e99e28529 Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Sat, 7 May 2022 11:33:08 +0300 Subject: [PATCH 07/13] feat(issue-351): before change the type auth --- .../Extensions/IdentityServerExtensions.cs | 36 +++--- .../O2NextGen.SmallTalk.Api/appsettings.json | 2 +- .../Hubs/ChatHub.cs | 47 ++++++-- .../Properties/launchSettings.json | 2 +- .../O2NextGen.SmallTalk.SignalrHub/Startup.cs | 56 +++++++-- src/WebApps/smalltalk/auth-app/package.json | 3 +- src/WebApps/smalltalk/auth-app/src/App.jsx | 16 ++- .../smalltalk/auth-app/src/pages/home.jsx | 41 ++++++- .../auth-app/src/services/userService.js | 10 +- src/WebApps/smalltalk/auth-app/yarn.lock | 108 +++++++++++++++++- src/WebApps/smalltalk/chat/src/App.jsx | 19 --- 11 files changed, 273 insertions(+), 67 deletions(-) diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs index c6146e0b..ee5ad0e4 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs @@ -65,7 +65,8 @@ private static IEnumerable GetIdentityResources() public static IEnumerable GetApis() => new List { - new ApiResource("smalltalkapi", "smalltalkapi") + new ApiResource("smalltalkapi", "smalltalkapi"), + new ApiResource("smalltalkapisignalr","smalltalkapisignalr") }; private static IEnumerable GetClients() @@ -75,28 +76,35 @@ private static IEnumerable GetClients() new Client { ClientId = "smalltalk_client_reactjs", - // AllowedGrantTypes = GrantTypes.Code, - - //ClientSecrets = {new Secret("secret".Sha256())}, - AllowedGrantTypes = GrantTypes.Implicit, - + AllowedGrantTypes = GrantTypes.Code, + //ClientSecrets = { new Secret("secret".Sha256())}, RequireClientSecret = false, - // RequireClientSecret=false, - RequireConsent = false, - // RequirePkce = true, RedirectUris = new[] {"http://localhost:3003/signin-oidc"}, - AllowedCorsOrigins = new []{"http://localhost:3003"}, - PostLogoutRedirectUris = new []{"http://localhost:3003/signout-oidc"}, - - //RefreshTokenUsage = TokenUsage.OneTimeOnly, + RefreshTokenUsage = TokenUsage.OneTimeOnly, AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "smalltalkapi", + "smalltalkapisignalr", //IdentityServerConstants.StandardScopes.OfflineAccess }, - AllowAccessTokensViaBrowser = true, + //AllowOfflineAccess = true, + // AccessTokenLifetime = 60, + // RefreshTokenExpiration = TokenExpiration.Sliding, + RequireConsent = false, + AllowedCorsOrigins = new []{"http://localhost:3003"}, + // PostLogoutRedirectUris = new []{"http://localhost:3003/signout-oidc"}, + RequirePkce = true, + // RequireClientSecret=false, + + // + + + + //, + + // AllowAccessTokensViaBrowser = true, //AllowOfflineAccess = true, //AccessTokenLifetime = 60, //RefreshTokenExpiration = TokenExpiration.Sliding, diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json index ceffcaa4..0e1e4a40 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json @@ -6,7 +6,7 @@ }, "AllowedHosts": "*", "urls": { - "SignalRUrl": "http://localhost:5000" + "SignalRUrl": "http://localhost:5103" } } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs index 297638a5..74b98446 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs @@ -1,34 +1,61 @@ using Microsoft.AspNetCore.SignalR; using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; namespace O2NextGen.SmallTalk.SignalrHub.Hubs { public interface IChatHub { - Task UpdateMessages(); + //Task UpdateMessages(string recipientId); + } + + [Authorize] public class ChatHub : Hub, IChatHub { - string username; - public async Task NewUserAsync(string username) + public override async Task OnConnectedAsync() { - await Groups.AddToGroupAsync(Context.ConnectionId, username); - this.username = username; + await Groups.AddToGroupAsync(Context.ConnectionId, Context.User.Identity.Name); + Console.WriteLine($"Connect... session, {Context.User.Identity.Name}"); await base.OnConnectedAsync(); } - public override Task OnConnectedAsync() + public override async Task OnDisconnectedAsync(Exception ex) { - - return base.OnConnectedAsync(); + await Groups.RemoveFromGroupAsync(Context.ConnectionId, Context.User.Identity.Name); + Console.WriteLine($"Disconnect... session, {Context.User.Identity.Name}"); + await base.OnDisconnectedAsync(ex); } - public async Task UpdateMessages() + #region UserState + + public async Task SendStateUser() { - await Clients.Group(username).SendAsync("OnUpdateMessage"); + Console.WriteLine($"SendStateUser... session, {Context.User.Identity.Name}"); + await Clients.All.SendAsync("OnUserUpdateState", Context.User.Identities.GetEnumerator().Current); //await Groups..All.SendAsync("OnUpdateMessage"); } + #endregion + // string username; + // public async Task NewUserAsync(string username) + // { + // await Groups.AddToGroupAsync(Context.ConnectionId, username); + // this.username = username; + // await base.OnConnectedAsync(); + // } + // + // public override Task OnConnectedAsync() + // { + // + // return base.OnConnectedAsync(); + // } + // public async Task UpdateMessages(string recipientId) + // { + // await Clients.Group(recipientId).SendAsync("OnUpdateMessage"); + // //await Groups..All.SendAsync("OnUpdateMessage"); + // } + //public override async Task OnConnectedAsync() //{ // await Groups.AddToGroupAsync(Context.ConnectionId, Context.User.Identity.Name); diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Properties/launchSettings.json b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Properties/launchSettings.json index e4caa173..14d625ed 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Properties/launchSettings.json +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Properties/launchSettings.json @@ -18,7 +18,7 @@ "O2NextGen.SmallTalk.SignalrHub": { "commandName": "Project", "launchBrowser": true, - "applicationUrl": "http://localhost:5000", + "applicationUrl": "http://localhost:5103", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs index fb75a795..ab1d4ffe 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs @@ -1,7 +1,9 @@ -using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using O2NextGen.SmallTalk.SignalrHub.Hubs; namespace O2NextGen.SmallTalk.SignalrHub @@ -21,13 +23,47 @@ public void ConfigureServices(IServiceCollection services) { options.AddPolicy("CorsPolicy", builder => builder - .AllowAnyMethod() - .AllowAnyHeader() - .SetIsOriginAllowed((host) => true) - .AllowCredentials()); + .AllowAnyMethod() + .AllowAnyHeader() + .SetIsOriginAllowed((host) => true) + .AllowCredentials()); }); services.AddSingleton(); services.AddSignalR(); + // // adds DI services to DI and configures bearer as the default scheme + // services.AddAuthentication(options => + // { + // options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + // options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + // + // }).AddJwtBearer(options => + // { + // // identity server issuing token + // options.Authority = "http://localhost:5001"; + // options.RequireHttpsMetadata = false; + // + // // // allow self-signed SSL certs + // // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; + // + // // the scope id of this api + // options.Audience = "smalltalkapisignalr"; + // }); + // adds DI services to DI and configures bearer as the default scheme + services.AddAuthentication("Bearer") + .AddJwtBearer("Bearer", options => + { + // identity server issuing token + options.Authority = "http://localhost:5001"; + options.RequireHttpsMetadata = false; + + // // allow self-signed SSL certs + // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; + + // the scope id of this api + options.Audience = "smalltalkapisignalr"; + }); + services.AddAuthorization(); + services.AddAuthorization(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -42,14 +78,20 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) // app.UseHsts(); //} app.UseCors("CorsPolicy"); - + // adds authentication middleware to the pipeline so authentication will be performed on every request + app.UseAuthentication(); + //app.UseRouting(); //app.UseAuthentication(); //app.UseAuthorization(); app.UseSignalR((routes) => { - routes.MapHub("/chathub"); + routes.MapHub("/chathub",options => + { + //options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransports.All; + }); + }); app.UseMvc(); //app.UseEndpoints(endpoints => diff --git a/src/WebApps/smalltalk/auth-app/package.json b/src/WebApps/smalltalk/auth-app/package.json index edf1cefc..75f6f0c2 100644 --- a/src/WebApps/smalltalk/auth-app/package.json +++ b/src/WebApps/smalltalk/auth-app/package.json @@ -26,14 +26,15 @@ "postcss": "^8.2.1", "postcss-loader": "^4.1.0", "style-loader": "^3.3.0", - "url-loader": "^4.1.1", "tailwindcss": "^2.0.2", + "url-loader": "^4.1.1", "webpack": "^5.57.1", "webpack-cli": "^4.9.0", "webpack-dev-server": "^4.3.1" }, "dependencies": { "@babel/runtime": "^7.13.10", + "@microsoft/signalr": "^6.0.4", "axios": "^0.27.2", "oidc-client": "^1.11.5", "react": "^17.0.2", diff --git a/src/WebApps/smalltalk/auth-app/src/App.jsx b/src/WebApps/smalltalk/auth-app/src/App.jsx index ad58c1c1..9a150cf4 100644 --- a/src/WebApps/smalltalk/auth-app/src/App.jsx +++ b/src/WebApps/smalltalk/auth-app/src/App.jsx @@ -8,20 +8,26 @@ import SigninOidc from './pages/signin-oidc' import SignoutOidc from './pages/signout-oidc' import Home from './pages/home' import Login from './pages/login' -import { Provider } from 'react-redux'; +import {Provider, useSelector} from 'react-redux'; import store from './store'; import userManager, { loadUserFromStorage } from './services/userService' import AuthProvider from './utils/authProvider' import PrivateRoute from './utils/protectedRoute' import test from "./pages/test"; +import * as signalR from '@microsoft/signalr'; +import {HttpTransportType} from "@microsoft/signalr"; function App() { + // const user = useSelector(state => state.auth.user) + // // const user = useSelector(state => state.auth.user) + // useEffect(() => { + // + // + // + // }, []); + - useEffect(() => { - // fetch current user from cookies - loadUserFromStorage(store) - }, []) return ( diff --git a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx index 3261464d..b04cbfec 100644 --- a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx +++ b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx @@ -1,19 +1,50 @@ -import React, { useState } from 'react' -import { signoutRedirect } from '../services/userService' +import React, { useState,useEffect } from 'react' +import {loadUserFromStorage, signoutRedirect} from '../services/userService' import { useSelector } from 'react-redux' import * as apiService from '../services/apiService' import { prettifyJson } from '../utils/jsonUtils' import { useRef } from "react"; import MessageItem from "smalltalk/MessageItem"; import CheckApi from "./check-api"; +import store from "../store"; +import * as signalR from "@microsoft/signalr"; function Home() { const user = useSelector(state => state.auth.user) const [doughnutData, setDoughnutData] = useState(null) + const [connection, setConnection] = useState(null); + const messageRef = useRef(); + + useEffect(() => { + // fetch current user from cookies + loadUserFromStorage(store).then(()=>{ + let connect = new signalR.HubConnectionBuilder() + .withUrl("http://localhost:5103/chathub", + { + // skipNegotiation: true, + // transport: signalR.HttpTransportType.LongPolling, + accessTokenFactory: () => user.access_token + }) + .configureLogging(signalR.LogLevel.Information) + .withAutomaticReconnect() + .build(); + connect.start().then(() => { + connect.invoke("SendStateUser","") + console.log('Connection started!') + }) + .catch(err => { + console.log(err); + }); + console.log("invoke is called") + connect.on("OnUserUpdateState", (userId)=>{ + console.log(userId) + }) + setConnection(connect) + }) + }, []) + - const [connection, setConnection] = useState(null); - const messageRef = useRef(); const [messages, setMessages] = useState([ { id: 1, message: 'it is me', senderId: 1, recipientId: 2, }, @@ -25,6 +56,7 @@ function Home() { function signOut() { signoutRedirect() + connection.stop() } async function getDoughnuts() { @@ -38,6 +70,7 @@ function Home() {

Home

Hello, {user.profile.given_name}.

+ {/*

{connection}

*/}

I have given you a token to call your favourite doughnut based API 🍩

💡 Tip: Use the Redux dev tools and network tab to inspect what user data was returned from identity and stored in the client.

diff --git a/src/WebApps/smalltalk/auth-app/src/services/userService.js b/src/WebApps/smalltalk/auth-app/src/services/userService.js index 29269e87..641a0e6e 100644 --- a/src/WebApps/smalltalk/auth-app/src/services/userService.js +++ b/src/WebApps/smalltalk/auth-app/src/services/userService.js @@ -9,13 +9,15 @@ import { storeUserError, storeUser } from '../actions/authActions' // redirect_uri: "http://localhost:3003/signin-oidc" // }; const config = { -authority: "http://localhost:5001/", + authority: "http://localhost:5001/", client_id: "smalltalk_client_reactjs", redirect_uri: "http://localhost:3003/signin-oidc", - response_type: "id_token token", - scope: "openid profile smalltalkapi", + response_type: "code", + //client_secret: "secret", + scope: "openid profile smalltalkapi smalltalkapisignalr", loadUserInfo: true, - post_logout_redirect_uri: "http://localhost:3003/signout-oidc"} + // post_logout_redirect_uri: "http://localhost:3003/signout-oidc" + } const userManager = new UserManager(config) diff --git a/src/WebApps/smalltalk/auth-app/yarn.lock b/src/WebApps/smalltalk/auth-app/yarn.lock index e4b46151..4740863e 100644 --- a/src/WebApps/smalltalk/auth-app/yarn.lock +++ b/src/WebApps/smalltalk/auth-app/yarn.lock @@ -1001,6 +1001,17 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== +"@microsoft/signalr@^6.0.4": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.4.tgz#ae9fc0b35ae6a125913a056a640589a661900174" + integrity sha512-YeWRh4LxfYnq4I5CKw17/HOq8rY+ouTv6Bq+s55122StE3pK29j8j2OpP+1PA3D1ksHPfy7dFIgC33yr/E+01A== + dependencies: + abort-controller "^3.0.0" + eventsource "^1.0.7" + fetch-cookie "^0.11.0" + node-fetch "^2.6.7" + ws "^7.4.5" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1348,6 +1359,13 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + 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" @@ -2203,6 +2221,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -2213,6 +2236,13 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + dependencies: + original "^1.0.0" + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2305,6 +2335,13 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +fetch-cookie@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407" + integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA== + dependencies: + tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -3118,6 +3155,13 @@ node-emoji@^1.11.0: dependencies: lodash "^4.17.21" +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + 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" @@ -3233,6 +3277,13 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -3485,7 +3536,12 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -punycode@^2.1.0: +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -3507,6 +3563,11 @@ qs@6.10.3: dependencies: side-channel "^1.0.4" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4219,6 +4280,15 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -4226,6 +4296,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + tslib@^2.0.3: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" @@ -4262,6 +4337,11 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -4288,6 +4368,14 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" +url-parse@^1.4.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + use-sync-external-store@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz#3343c3fe7f7e404db70f8c687adf5c1652d34e82" @@ -4338,6 +4426,11 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -4464,6 +4557,14 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -4490,6 +4591,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +ws@^7.4.5: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + ws@^8.4.2: version "8.6.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" diff --git a/src/WebApps/smalltalk/chat/src/App.jsx b/src/WebApps/smalltalk/chat/src/App.jsx index a9545e5b..a72785e0 100644 --- a/src/WebApps/smalltalk/chat/src/App.jsx +++ b/src/WebApps/smalltalk/chat/src/App.jsx @@ -140,25 +140,6 @@ function App() {
{/*
Denis
*/}
- - {/*
- Denis -
Denis
-
- -
- Denis -
Denis
-
- -
- Denis -
Denis
-
-
- Denis -
Denis
-
*/}
Date: Sat, 7 May 2022 17:27:20 +0300 Subject: [PATCH 08/13] feat(issue-351): signalr and auth works for smalltalk reactjs app --- .../Extensions/IdentityExtensions.cs | 2 + .../Extensions/IdentityServerExtensions.cs | 92 +++++++++----- .../Pages/{ => Account}/ConfirmEmail.cshtml | 0 .../{ => Account}/ConfirmEmail.cshtml.cs | 0 .../Services/ProfileService.cs | 117 ++++++++++++++++++ .../auth/O2NextGen.Auth.Web/Startup.cs | 6 +- .../Controllers/ChatController.cs | 5 +- .../Hubs/ChatHub.cs | 20 +++ .../O2NextGen.SmallTalk.SignalrHub/Startup.cs | 44 +++---- .../smalltalk/auth-app/src/pages/home.jsx | 2 +- .../auth-app/src/services/userService.js | 5 +- 11 files changed, 235 insertions(+), 58 deletions(-) rename src/Services/auth/O2NextGen.Auth.Web/Pages/{ => Account}/ConfirmEmail.cshtml (100%) rename src/Services/auth/O2NextGen.Auth.Web/Pages/{ => Account}/ConfirmEmail.cshtml.cs (100%) create mode 100644 src/Services/auth/O2NextGen.Auth.Web/Services/ProfileService.cs diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs index aa86eec5..807edf36 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityExtensions.cs @@ -24,6 +24,8 @@ public static IServiceCollection AddConfiguredIdentity(this IServiceCollection s options.Password.RequireLowercase = false; options.Password.RequireUppercase = false; options.Password.RequireNonAlphanumeric = false; + options.User.RequireUniqueEmail = true; + // options.SignIn.RequireConfirmedEmail = true; }) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs index ee5ad0e4..8ee261bc 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs @@ -2,9 +2,11 @@ using System.Linq; using IdentityServer4; using IdentityServer4.Models; +using IdentityServer4.Services; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using O2NextGen.Auth.Web.Data; +using O2NextGen.Auth.Web.Services; namespace O2NextGen.Auth.Web.Extensions { @@ -31,14 +33,15 @@ public static IServiceCollection AddConfiguredIdentityServer(this IServiceCollec // client applications that may access users data and APIs on the user's behalf .AddInMemoryClients(GetClients()) // configures IdentityServer integration with ASP.NET Core Identity - .AddAspNetIdentity(); + .AddAspNetIdentity() // to avoid bombarding the db with checks, make use of cache //.AddInMemoryCaching(); // more about EF integration: // - http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html // - http://docs.identityserver.io/en/latest/reference/ef.html?highlight=dbcontext - + + .Services.AddTransient(); return services; } @@ -73,43 +76,74 @@ private static IEnumerable GetClients() { return new[] { + // React client new Client { ClientId = "smalltalk_client_reactjs", - AllowedGrantTypes = GrantTypes.Code, - //ClientSecrets = { new Secret("secret".Sha256())}, + ClientName = "SmallTalk React App", + ClientUri = "http://localhost:3003", + + AllowedGrantTypes = GrantTypes.Implicit, + RequireClientSecret = false, - RedirectUris = new[] {"http://localhost:3003/signin-oidc"}, - RefreshTokenUsage = TokenUsage.OneTimeOnly, - AllowedScopes = + + RedirectUris = + { + "http://localhost:3003/signin-oidc", + }, + + PostLogoutRedirectUris = { "http://localhost:3003/signout-oidc" }, + AllowedCorsOrigins = { "http://localhost:3003" }, + + AllowedScopes = new List { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "smalltalkapi", "smalltalkapisignalr", - //IdentityServerConstants.StandardScopes.OfflineAccess }, - //AllowOfflineAccess = true, - // AccessTokenLifetime = 60, - // RefreshTokenExpiration = TokenExpiration.Sliding, - RequireConsent = false, - AllowedCorsOrigins = new []{"http://localhost:3003"}, - // PostLogoutRedirectUris = new []{"http://localhost:3003/signout-oidc"}, - RequirePkce = true, - // RequireClientSecret=false, - - // - - - - //, - - // AllowAccessTokensViaBrowser = true, - //AllowOfflineAccess = true, - //AccessTokenLifetime = 60, - //RefreshTokenExpiration = TokenExpiration.Sliding, - //RequireConsent = false - } + + AllowAccessTokensViaBrowser = true, + AlwaysIncludeUserClaimsInIdToken = true, + RequireConsent = false + }, + // new Client + // { + // ClientId = "smalltalk_client_reactjs", + // AllowedGrantTypes = GrantTypes.Implicit, + // //ClientSecrets = { new Secret("secret".Sha256())}, + // RequireClientSecret = false, + // RedirectUris = new[] {"http://localhost:3003/signin-oidc"}, + // //RefreshTokenUsage = TokenUsage.OneTimeOnly, + // AllowedScopes = + // { + // IdentityServerConstants.StandardScopes.OpenId, + // IdentityServerConstants.StandardScopes.Profile, + // "smalltalkapi", + // "smalltalkapisignalr", + // //IdentityServerConstants.StandardScopes.OfflineAccess + // }, + // //AllowOfflineAccess = true, + // //AccessTokenLifetime = 60, + // //RefreshTokenExpiration = TokenExpiration.Sliding, + // RequireConsent = false, + // AllowedCorsOrigins = new []{"http://localhost:3003"}, + // // PostLogoutRedirectUris = new []{"http://localhost:3003/signout-oidc"}, + // //RequirePkce = true, + // // RequireClientSecret=false, + // + // // + // + // + // + // //, + // + // // AllowAccessTokensViaBrowser = true, + // //AllowOfflineAccess = true, + // //AccessTokenLifetime = 60, + // //RefreshTokenExpiration = TokenExpiration.Sliding, + // //RequireConsent = false + // } }; } } diff --git a/src/Services/auth/O2NextGen.Auth.Web/Pages/ConfirmEmail.cshtml b/src/Services/auth/O2NextGen.Auth.Web/Pages/Account/ConfirmEmail.cshtml similarity index 100% rename from src/Services/auth/O2NextGen.Auth.Web/Pages/ConfirmEmail.cshtml rename to src/Services/auth/O2NextGen.Auth.Web/Pages/Account/ConfirmEmail.cshtml diff --git a/src/Services/auth/O2NextGen.Auth.Web/Pages/ConfirmEmail.cshtml.cs b/src/Services/auth/O2NextGen.Auth.Web/Pages/Account/ConfirmEmail.cshtml.cs similarity index 100% rename from src/Services/auth/O2NextGen.Auth.Web/Pages/ConfirmEmail.cshtml.cs rename to src/Services/auth/O2NextGen.Auth.Web/Pages/Account/ConfirmEmail.cshtml.cs diff --git a/src/Services/auth/O2NextGen.Auth.Web/Services/ProfileService.cs b/src/Services/auth/O2NextGen.Auth.Web/Services/ProfileService.cs new file mode 100644 index 00000000..5796c9ff --- /dev/null +++ b/src/Services/auth/O2NextGen.Auth.Web/Services/ProfileService.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using IdentityModel; +using IdentityServer4.Extensions; +using IdentityServer4.Models; +using IdentityServer4.Services; +using Microsoft.AspNetCore.Identity; +using O2NextGen.Auth.Web.Data; + +namespace O2NextGen.Auth.Web.Services +{ + public class ProfileService : IProfileService + { + private readonly IUserClaimsPrincipalFactory _claimsFactory; + private readonly UserManager _userManager; + + public ProfileService(UserManager userManager, IUserClaimsPrincipalFactory claimsFactory) + { + _userManager = userManager; + _claimsFactory = claimsFactory; + } + + public async Task GetProfileDataAsync(ProfileDataRequestContext context) + { + var subject = context.Subject ?? throw new ArgumentNullException(nameof(context.Subject)); + + var subjectId = subject.Claims.Where(x => x.Type == "sub").FirstOrDefault().Value; + + var user = await _userManager.FindByIdAsync(subjectId); + if (user == null) + throw new ArgumentException("Invalid subject identifier"); + + var claims = GetClaimsFromUser(user); + context.IssuedClaims = claims.ToList(); + } + + private IEnumerable GetClaimsFromUser(O2User user) + { + var claims = new List + { + new Claim(JwtClaimTypes.Subject, user.Id), + new Claim(JwtClaimTypes.PreferredUserName, user.UserName), + new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName) + }; + // if (!string.IsNullOrWhiteSpace(user.Firstname)) + // claims.Add(new Claim(JwtClaimTypes.Name, user.Firstname)); + // + // if (!string.IsNullOrWhiteSpace(user.Lastname)) + // claims.Add(new Claim(JwtClaimTypes.FamilyName, user.Lastname)); + + // if (!string.IsNullOrWhiteSpace(user.Lastname)) + // claims.Add(new Claim(JwtClaimTypes.Picture, user.ProfilePhoto ?? "")); + + + // claims.Add(new Claim("is_specialist", user.IsSpecialist.ToString())); + // var role = user.IsSpecialist ? "Member" : "Client"; + + // claims.Add(new Claim(JwtClaimTypes.Role, role)); + // context.IssuedClaims = claims.ToList(); + // + // claims = claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList(); + // // claims.Remove(claims.Single(x => x.Type == JwtClaimTypes.Name)); + // claims.Add(new Claim(JwtClaimTypes.Name, user.Firstname)); + // claims.Add(new Claim(IdentityServerConstants.StandardScopes.Email, user.Email)); + // // claims.Add(new Claim(IdentityServerConstants.StandardScopes.Phone )); + // claims.Add(new Claim(JwtClaimTypes.FamilyName, user.Lastname)); + // claims.Add(new Claim(JwtClaimTypes.PhoneNumber, user.PhoneNumber)); + // claims.Add(new Claim(JwtClaimTypes.Picture, user.ProfilePhoto ?? "")); + // claims.Add(new Claim("is_specialist", user.IsSpecialist.ToString())); + // + // + // //Get user claims from AspNetUserClaims table + // var userClaims = await _userManager.GetClaimsAsync(user); + // + // // Add custom claims in token here based on user properties or any other source + // claims.AddRange(userClaims); + // + // Console.WriteLine("========= claims =========="); + // foreach (var claim in claims) + // { + // Console.WriteLine(claim.Type,claim.Value); + // } + // Console.WriteLine("======= end claims ========"); + // context.IssuedClaims = claims; + if (_userManager.SupportsUserEmail) + { + claims.AddRange(new[] + { + new Claim(JwtClaimTypes.Email, user.Email), + new Claim(JwtClaimTypes.EmailVerified, user.EmailConfirmed ? "true" : "false", ClaimValueTypes.Boolean) + }); + } + + if (_userManager.SupportsUserPhoneNumber && !string.IsNullOrWhiteSpace(user.PhoneNumber)) + { + claims.AddRange(new[] + { + new Claim(JwtClaimTypes.PhoneNumber, user.PhoneNumber), + new Claim(JwtClaimTypes.PhoneNumberVerified, user.PhoneNumberConfirmed ? "true" : "false", ClaimValueTypes.Boolean) + }); + } + + return claims; + } + + public async Task IsActiveAsync(IsActiveContext context) + { + var sub = context.Subject.GetSubjectId(); + var user = await _userManager.FindByIdAsync(sub); + context.IsActive = user != null; + } + } + } diff --git a/src/Services/auth/O2NextGen.Auth.Web/Startup.cs b/src/Services/auth/O2NextGen.Auth.Web/Startup.cs index 7d0eff51..41562841 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Startup.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Startup.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Builder; +using System.IdentityModel.Tokens.Jwt; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI.Services; @@ -48,7 +49,6 @@ public void ConfigureServices(IServiceCollection services) options.LogoutPath = "/Logout"; options.AccessDeniedPath = "/AccessDenied"; }) - .AddConfiguredIdentity(_configuration); services.AddConfiguredLocalization(); @@ -58,6 +58,8 @@ public void ConfigureServices(IServiceCollection services) public void Configure(IApplicationBuilder app, IHostingEnvironment env) { + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); + if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs index 85975212..d6f19d1e 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs @@ -19,9 +19,10 @@ public ChatController(IHubContext chatHub) public async Task Test() { //await chatHub.UpdateMessages(); + await _hubContext.Clients - .Group("Denis") - .SendAsync("OnUpdateMessage"); + .All + .SendAsync("OnUserUpdateState"); return Ok("Ok"); } } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs index 74b98446..50bdfb88 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Hubs/ChatHub.cs @@ -1,5 +1,7 @@ using Microsoft.AspNetCore.SignalR; using System; +using System.IdentityModel.Tokens.Jwt; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; @@ -15,6 +17,24 @@ public class ChatHub : Hub, IChatHub { public override async Task OnConnectedAsync() { + // var httpContext = Context.GetHttpContext(); + // if (httpContext != null) + // { + // var jwtToken = httpContext.Request.Query["access_token"]; + // var handler = new JwtSecurityTokenHandler(); + // if (!string.IsNullOrEmpty(jwtToken)) + // { + // var token = handler.ReadJwtToken(jwtToken); + // var tokenS = token as JwtSecurityToken; + // + // // replace email with your claim name + // var jti = tokenS.Claims.First(claim => claim.Type == "email").Value; + // if (jti != null && jti != "") + // { + // await Groups.AddToGroupAsync(Context.ConnectionId, jti); + // } + // } + // } await Groups.AddToGroupAsync(Context.ConnectionId, Context.User.Identity.Name); Console.WriteLine($"Connect... session, {Context.User.Identity.Name}"); await base.OnConnectedAsync(); diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs index ab1d4ffe..bbee7601 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs @@ -31,13 +31,27 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddSignalR(); // // adds DI services to DI and configures bearer as the default scheme - // services.AddAuthentication(options => - // { - // options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - // options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - // - // }).AddJwtBearer(options => - // { + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + + }).AddJwtBearer(options => + { + // identity server issuing token + options.Authority = "http://localhost:5001"; + options.RequireHttpsMetadata = false; + + // // allow self-signed SSL certs + // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; + + // the scope id of this api + options.Audience = "smalltalkapisignalr"; + }); + // // adds DI services to DI and configures bearer as the default scheme + // services.AddAuthentication("Bearer") + // .AddJwtBearer("Bearer", options => + // { // // identity server issuing token // options.Authority = "http://localhost:5001"; // options.RequireHttpsMetadata = false; @@ -48,20 +62,6 @@ public void ConfigureServices(IServiceCollection services) // // the scope id of this api // options.Audience = "smalltalkapisignalr"; // }); - // adds DI services to DI and configures bearer as the default scheme - services.AddAuthentication("Bearer") - .AddJwtBearer("Bearer", options => - { - // identity server issuing token - options.Authority = "http://localhost:5001"; - options.RequireHttpsMetadata = false; - - // // allow self-signed SSL certs - // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; - - // the scope id of this api - options.Audience = "smalltalkapisignalr"; - }); services.AddAuthorization(); services.AddAuthorization(); } @@ -89,7 +89,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) { routes.MapHub("/chathub",options => { - //options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransports.All; + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransports.All; }); }); diff --git a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx index b04cbfec..d6edf510 100644 --- a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx +++ b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx @@ -30,7 +30,7 @@ function Home() { .withAutomaticReconnect() .build(); connect.start().then(() => { - connect.invoke("SendStateUser","") + connect.invoke("SendStateUser") console.log('Connection started!') }) .catch(err => { diff --git a/src/WebApps/smalltalk/auth-app/src/services/userService.js b/src/WebApps/smalltalk/auth-app/src/services/userService.js index 641a0e6e..eb6cf902 100644 --- a/src/WebApps/smalltalk/auth-app/src/services/userService.js +++ b/src/WebApps/smalltalk/auth-app/src/services/userService.js @@ -12,10 +12,11 @@ const config = { authority: "http://localhost:5001/", client_id: "smalltalk_client_reactjs", redirect_uri: "http://localhost:3003/signin-oidc", - response_type: "code", + response_type: "id_token token", //client_secret: "secret", scope: "openid profile smalltalkapi smalltalkapisignalr", - loadUserInfo: true, + // monitorSession: false, + // loadUserInfo: true, // post_logout_redirect_uri: "http://localhost:3003/signout-oidc" } From 205029494368577e996fa5b9f2224d046fa808eb Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Sat, 7 May 2022 19:55:53 +0300 Subject: [PATCH 09/13] feat(issue-351): add notification sound for smalltalk reactjs app --- src/WebApps/smalltalk/auth-app/src/App.jsx | 12 ++++++------ .../auth-app/src/assets/sound-notification.wav | Bin 0 -> 268104 bytes .../smalltalk/auth-app/src/pages/home.jsx | 8 ++++++-- .../smalltalk/auth-app/webpack.config.js | 6 +++++- 4 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 src/WebApps/smalltalk/auth-app/src/assets/sound-notification.wav diff --git a/src/WebApps/smalltalk/auth-app/src/App.jsx b/src/WebApps/smalltalk/auth-app/src/App.jsx index 9a150cf4..000b4d2e 100644 --- a/src/WebApps/smalltalk/auth-app/src/App.jsx +++ b/src/WebApps/smalltalk/auth-app/src/App.jsx @@ -16,16 +16,16 @@ import PrivateRoute from './utils/protectedRoute' import test from "./pages/test"; import * as signalR from '@microsoft/signalr'; import {HttpTransportType} from "@microsoft/signalr"; - +import soundNotification from './assets/sound-notification.wav'; function App() { // const user = useSelector(state => state.auth.user) // // const user = useSelector(state => state.auth.user) - // useEffect(() => { - // - // - // - // }, []); + useEffect(() => { + + // new Audio(soundNotification).play(); + + }, []); diff --git a/src/WebApps/smalltalk/auth-app/src/assets/sound-notification.wav b/src/WebApps/smalltalk/auth-app/src/assets/sound-notification.wav new file mode 100644 index 0000000000000000000000000000000000000000..441a04b1e8c3cc6ef021b531d8f664174e99c636 GIT binary patch literal 268104 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%0DVycUOB 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 literal 0 HcmV?d00001 diff --git a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx index d6edf510..74d74313 100644 --- a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx +++ b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx @@ -8,7 +8,7 @@ import MessageItem from "smalltalk/MessageItem"; import CheckApi from "./check-api"; import store from "../store"; import * as signalR from "@microsoft/signalr"; - +import soundNotification from '../assets/sound-notification.wav'; function Home() { const user = useSelector(state => state.auth.user) @@ -38,7 +38,10 @@ function Home() { }); console.log("invoke is called") connect.on("OnUserUpdateState", (userId)=>{ - console.log(userId) + //(new Audio(soundNotification)).play(); + new Audio(soundNotification).play(); + console.log("bell") + console.log(userId) }) setConnection(connect) }) @@ -46,6 +49,7 @@ function Home() { + const [messages, setMessages] = useState([ { id: 1, message: 'it is me', senderId: 1, recipientId: 2, }, { id: 2, message: 'Who?', senderId: 2, recipientId: 1, }, diff --git a/src/WebApps/smalltalk/auth-app/webpack.config.js b/src/WebApps/smalltalk/auth-app/webpack.config.js index 7958f89c..7fca8ba2 100644 --- a/src/WebApps/smalltalk/auth-app/webpack.config.js +++ b/src/WebApps/smalltalk/auth-app/webpack.config.js @@ -37,11 +37,15 @@ module.exports = { }, }, { - test: /\.(jpg|jpeg|png|gif|mp3|svg)$/, + test: /\.(jpg|jpeg|png|gif|svg)$/, use: { loader: "url-loader" }, }, + { + test: /\.(mp3|wav)$/, + loader: "file-loader" + }, ], }, From ddc51bd71b5b4bb2558d95d33a8c4f66d2f9194e Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Sun, 8 May 2022 13:28:11 +0300 Subject: [PATCH 10/13] feat(issue-351) add rabbitmq for services --- src/O2NextGen-Prototypes.sln | 15 ++++ .../Controllers/ChatController.cs | 8 ++- .../Messaging/SendMessageCompletedEvent.cs | 14 ++++ .../O2NextGen.SmallTalk.Api.csproj | 5 ++ .../O2NextGen.SmallTalk.Api/Startup.cs | 39 ++++++++++- .../O2NextGen.SmallTalk.SignalrHub/Dockerfile | 10 +-- .../O2NextGen.SmallTalk.SignalrHub.csproj | 5 ++ .../O2NextGen.SmallTalk.SignalrHub/Startup.cs | 69 ++++++++++--------- src/docker-compose.override.yml | 26 ++++++- src/docker-compose.yml | 5 ++ 10 files changed, 154 insertions(+), 42 deletions(-) create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs diff --git a/src/O2NextGen-Prototypes.sln b/src/O2NextGen-Prototypes.sln index cd5683e0..852d251a 100644 --- a/src/O2NextGen-Prototypes.sln +++ b/src/O2NextGen-Prototypes.sln @@ -99,6 +99,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "teambrain", "teambrain", "{ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "a-discount", "a-discount", "{41ECEE68-B668-45CB-A3F0-DAC0BCF20D89}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "O2NextGen.SmallTalk.SignalrHub", "Services\smalltalk\O2NextGen.SmallTalk.SignalrHub\O2NextGen.SmallTalk.SignalrHub.csproj", "{C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -493,6 +495,18 @@ Global {9D65077A-687A-433A-A280-45A70620ADC0}.Release|x64.Build.0 = Release|Any CPU {9D65077A-687A-433A-A280-45A70620ADC0}.Release|x86.ActiveCfg = Release|Any CPU {9D65077A-687A-433A-A280-45A70620ADC0}.Release|x86.Build.0 = Release|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Debug|x64.ActiveCfg = Debug|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Debug|x64.Build.0 = Debug|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Debug|x86.ActiveCfg = Debug|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Debug|x86.Build.0 = Debug|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Release|Any CPU.Build.0 = Release|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Release|x64.ActiveCfg = Release|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Release|x64.Build.0 = Release|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Release|x86.ActiveCfg = Release|Any CPU + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -543,6 +557,7 @@ Global {A50DA91B-BD5D-4640-80D8-46B1E55E76FD} = {574CE1BF-397E-4262-82AD-94FB1CE98DA2} {4BAA467F-6F58-4C99-ACCF-88F2ADD398B8} = {574CE1BF-397E-4262-82AD-94FB1CE98DA2} {41ECEE68-B668-45CB-A3F0-DAC0BCF20D89} = {574CE1BF-397E-4262-82AD-94FB1CE98DA2} + {C4AE66A7-2DC5-410C-B17C-9A23DBD0A429} = {0DB9F20A-FD40-4110-807E-AAEFEFCCD574} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {5C9AF9F4-BF0A-486D-9F2E-17FE2F53F7E9} diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs index 86981fb6..44b52547 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs @@ -8,7 +8,9 @@ using O2NextGen.SmallTalk.Business.Services; using System.Threading; using System.Threading.Tasks; +using MassTransit; using Microsoft.AspNetCore.Authorization; +using O2NextGen.SmallTalk.Api.Messaging; namespace O2NextGen.SmallTalk.Api.Controllers { @@ -23,6 +25,7 @@ public class ChatController : ControllerBase private readonly ILogger _logger; private readonly ISignalRService _signalRService; private readonly IChatManager _chatManager; + private readonly IBus _bus; #endregion @@ -30,12 +33,13 @@ public class ChatController : ControllerBase #region Ctors public ChatController(IHostingEnvironment environment, ILogger logger, ISignalRService signalRService, - IChatManager chatManager) + IChatManager chatManager, IBus bus) { _environment = environment; _logger = logger; _signalRService = signalRService; _chatManager = chatManager; + _bus = bus; } #endregion @@ -72,11 +76,13 @@ public async Task GetMessagesAsync(long sessionId, CancellationTo [Route("session/{sessionId}/messages")] public async Task AddAsync(long sessionId, ChatMessage chatMessage, CancellationToken ct) { + var userId = HttpContext.User.FindFirst("sub").Value; if (chatMessage == null) throw new System.ArgumentNullException(nameof(chatMessage)); ChatMessageModel resultSession = await _chatManager.AddMessage(sessionId, chatMessage.ToModel(), ct); await _signalRService.GetAsync(ct); + _bus.Publish(new { userId , chatMessage.RecipientId }).Wait(); return Ok(resultSession.ToViewModel()); } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs new file mode 100644 index 00000000..d6f260a5 --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs @@ -0,0 +1,14 @@ +namespace O2NextGen.SmallTalk.Api.Messaging +{ + public class SendMessageCompletedEvent + { + private string SenderId { get; set; } + public string RecipientId { get; set; } + + public SendMessageCompletedEvent(string userId, string recipientId) + { + SenderId = userId; + RecipientId = recipientId; + } + } +} \ No newline at end of file diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj index 7025f70e..d36d3cd8 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj @@ -13,6 +13,11 @@ + + + + + diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs index 7ea2fd64..b6da16ab 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs @@ -8,6 +8,11 @@ using Polly; using System; using System.Threading.Tasks; +using Autofac; +using Autofac.Extensions.DependencyInjection; +using MassTransit; +using MassTransit.Util; +using RabbitMQ.Client; using Swashbuckle.AspNetCore.Swagger; namespace O2NextGen.SmallTalk.Api @@ -20,8 +25,9 @@ public Startup(IConfiguration configuration) } public IConfiguration Configuration { get; } - - public void ConfigureServices(IServiceCollection services) + private IContainer ApplicationContainer { get; set; } + + public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddRequiredMvcComponents(); services.AddBusiness(); @@ -61,9 +67,32 @@ public void ConfigureServices(IServiceCollection services) }); services.AddAuthorization(); services.AddApplicationServices(Configuration); + + var builderAf = new ContainerBuilder(); + builderAf.Register(c => + { + return Bus.Factory.CreateUsingRabbitMq(rmq => + { + rmq.Host(new Uri("rabbitmq://rabbitmq"), "/", h => + { + h.Username("guest"); + h.Password("guest"); + }); + rmq.ExchangeType = ExchangeType.Fanout; + }); + + }). + As() + .As() + .As() + .SingleInstance(); + + builderAf.Populate(services); + ApplicationContainer = builderAf.Build(); + return new AutofacServiceProvider(ApplicationContainer); } - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime) { if (env.IsDevelopment()) { @@ -91,6 +120,10 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) // adds authentication middleware to the pipeline so authentication will be performed on every request app.UseAuthentication(); app.UseMvc(); + + var bus = ApplicationContainer.Resolve(); + var bushandle = TaskUtil.Await(() => bus.StartAsync()); + applicationLifetime.ApplicationStopped.Register(() => bushandle.Stop()); } } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Dockerfile b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Dockerfile index c009a181..631c8d25 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Dockerfile +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Dockerfile @@ -1,16 +1,16 @@ #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:2.1 AS base +FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:2.1 AS build +FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build WORKDIR /src -COPY ["O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj", "O2NextGen.SmallTalk.SignalrHub/"] -RUN dotnet restore "O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj" +COPY ["Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj", "Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/"] +RUN dotnet restore "Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj" COPY . . -WORKDIR "/src/O2NextGen.SmallTalk.SignalrHub" +WORKDIR "/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub" RUN dotnet build "O2NextGen.SmallTalk.SignalrHub.csproj" -c Release -o /app/build FROM build AS publish diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj index 76560417..77b81214 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj @@ -13,6 +13,11 @@ + + + + + diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs index bbee7601..601c399a 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs @@ -1,18 +1,24 @@ -using Microsoft.AspNetCore.Authentication.JwtBearer; +using System; +using Autofac; +using Autofac.Extensions.DependencyInjection; +using MassTransit; +using MassTransit.Util; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; using O2NextGen.SmallTalk.SignalrHub.Hubs; - +using RabbitMQ.Client; namespace O2NextGen.SmallTalk.SignalrHub { public class Startup { + private IContainer ApplicationContainer { get; set; } + // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 - public void ConfigureServices(IServiceCollection services) + public IServiceProvider ConfigureServices(IServiceCollection services) { var mvcBuilder = services.AddMvcCore(options => { //options.Filters.Add(); @@ -48,26 +54,34 @@ public void ConfigureServices(IServiceCollection services) // the scope id of this api options.Audience = "smalltalkapisignalr"; }); - // // adds DI services to DI and configures bearer as the default scheme - // services.AddAuthentication("Bearer") - // .AddJwtBearer("Bearer", options => - // { - // // identity server issuing token - // options.Authority = "http://localhost:5001"; - // options.RequireHttpsMetadata = false; - // - // // // allow self-signed SSL certs - // // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; - // - // // the scope id of this api - // options.Audience = "smalltalkapisignalr"; - // }); - services.AddAuthorization(); services.AddAuthorization(); + + var builderAf = new ContainerBuilder(); + builderAf.Register(c => + { + return Bus.Factory.CreateUsingRabbitMq(rmq => + { + rmq.Host(new Uri("rabbitmq://rabbitmq"), "/", h => + { + h.Username("guest"); + h.Password("guest"); + }); + rmq.ExchangeType = ExchangeType.Fanout; + }); + + }). + As() + .As() + .As() + .SingleInstance(); + + builderAf.Populate(services); + ApplicationContainer = builderAf.Build(); + return new AutofacServiceProvider(ApplicationContainer); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime) { if (env.IsDevelopment()) { @@ -94,17 +108,10 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) }); app.UseMvc(); - //app.UseEndpoints(endpoints => - //{ - // endpoints.MapControllers(); - // endpoints.MapHub("/signalrtc"); - // endpoints.MapHub("/o2hub"); - //}); - //app.UseEndpoints(endpoints => - //{ - // endpoints.MapHub("/hub/chathub", - // options => options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransports.All); - //}; + var bus = ApplicationContainer.Resolve(); + var bushandle = TaskUtil.Await(() => bus.StartAsync()); + applicationLifetime.ApplicationStopped.Register(() => bushandle.Stop()); + // app.Run(async (context) => //{ // await context.Response.WriteAsync("Hello World!"); diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml index 998fa852..d52053d5 100644 --- a/src/docker-compose.override.yml +++ b/src/docker-compose.override.yml @@ -17,10 +17,24 @@ services: networks: - backend + rabbitmq: + image: rabbitmq:3-management + container_name: rabbitmq + hostname: myrabbitmq + ports: + - "15672:15672" + - "5672:5672" + - "5671:5671" + volumes: + - ~/rabbitmq:/var/lib/rabbitmq/mnesia + networks: + - backend + + o2nextgen.auth.web: environment: - ASPNETCORE_ENVIRONMENT=Development - - ConnectionString="Server=sql.data;Initial Catalog=O2NextGen.AuthDb;Persist Security Info=False;User ID=sa;Password=your@Password;Connection Timeout=30;" + - ConnectionString=Server=sql.data;Initial Catalog=O2NextGen.AuthDb;Persist Security Info=False;User ID=sa;Password=your@Password;Connection Timeout=30; #- ASPNETCORE_URLS=https://+:443;http://+:80 ports: - "5001:80" @@ -50,6 +64,7 @@ services: #- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro #- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro + o2nextgen.smalltalk.api: environment: - ASPNETCORE_ENVIRONMENT=Development @@ -60,7 +75,14 @@ services: #volumes: # - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro # - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro - + + o2nextgen.smalltalk.signalr: + environment: + - ASPNETCORE_ENVIRONMENT=Development + #- ASPNETCORE_URLS=https://+:443;http://+:80 + ports: + - "5103:80" + o2nextgen.esender.api: environment: - ASPNETCORE_ENVIRONMENT=Development diff --git a/src/docker-compose.yml b/src/docker-compose.yml index bc124c22..0a8a9f40 100644 --- a/src/docker-compose.yml +++ b/src/docker-compose.yml @@ -21,6 +21,11 @@ services: context: . dockerfile: Services/smalltalk/O2NextGen.SmallTalk.Api/Dockerfile + o2nextgen.smalltalk.signalr: + image: ${DOCKER_REGISTRY-}o2ng-smalltalk-signalr + build: + context: . + dockerfile: Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Dockerfile o2nextgen.esender.api: image: ${DOCKER_REGISTRY-}o2ng-esender-api From 266bcbcaf5ead566e1c6da492466fae2cc49634f Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Sun, 8 May 2022 19:01:44 +0300 Subject: [PATCH 11/13] feat(issue-351): add dockerfile for smalltalk react app --- .../Extensions/IdentityServerExtensions.cs | 16 +++++++ .../Controllers/ChatController.cs | 2 +- .../Messaging/SendMessageCompletedEvent.cs | 2 +- .../O2NextGen.SmallTalk.Api.csproj | 2 +- .../O2NextGen.SmallTalk.Api/Startup.cs | 46 +++++++++++++------ .../Controllers/ChatController.cs | 8 +++- .../OnlineStatusCompletedEventConsumer.cs | 23 ++++++++++ .../SendMessageCompletedEventConsumer.cs | 24 ++++++++++ .../Messaging/OnlineStatusCompletedEvent.cs | 12 +++++ .../Messaging/SendMessageCompletedEvent.cs | 14 ++++++ .../O2NextGen.SmallTalk.SignalrHub.csproj | 2 +- .../O2NextGen.SmallTalk.SignalrHub/Program.cs | 26 +++++++++-- .../O2NextGen.SmallTalk.SignalrHub/Startup.cs | 3 +- src/WebApps/smalltalk/auth-app/Dockerfile | 16 +++++++ .../smalltalk/auth-app/nginx-custom.conf | 21 +++++++++ src/WebApps/smalltalk/chat/Dockerfile | 16 +++++++ src/WebApps/smalltalk/chat/nginx-custom.conf | 21 +++++++++ src/WebApps/smalltalk/yarn.lock | 4 -- src/docker-compose.override.yml | 39 ++++++++++++++-- src/docker-compose.yml | 11 +++++ 20 files changed, 278 insertions(+), 30 deletions(-) create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/OnlineStatusCompletedEventConsumer.cs create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/SendMessageCompletedEventConsumer.cs create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/OnlineStatusCompletedEvent.cs create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/SendMessageCompletedEvent.cs create mode 100644 src/WebApps/smalltalk/auth-app/Dockerfile create mode 100644 src/WebApps/smalltalk/auth-app/nginx-custom.conf create mode 100644 src/WebApps/smalltalk/chat/Dockerfile create mode 100644 src/WebApps/smalltalk/chat/nginx-custom.conf delete mode 100644 src/WebApps/smalltalk/yarn.lock diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs index 8ee261bc..434862a3 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs @@ -107,6 +107,22 @@ private static IEnumerable GetClients() AlwaysIncludeUserClaimsInIdToken = true, RequireConsent = false }, + new Client + { + ClientId = "smalltalkapi", + ClientName = "Smalltalkapi Swagger UI", + AllowedGrantTypes = GrantTypes.Implicit, + AllowAccessTokensViaBrowser = true, + + RedirectUris = { $"http://localhost:5003/swagger/o2c.html" }, + PostLogoutRedirectUris = { $"http://localhost:5003/swagger/" }, + + AllowedScopes = new List + { + + "order" + } + } // new Client // { // ClientId = "smalltalk_client_reactjs", diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs index 44b52547..257ed1ca 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Controllers/ChatController.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using MassTransit; using Microsoft.AspNetCore.Authorization; -using O2NextGen.SmallTalk.Api.Messaging; +using O2NextGen.Common; namespace O2NextGen.SmallTalk.Api.Controllers { diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs index d6f260a5..53ba6a31 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Messaging/SendMessageCompletedEvent.cs @@ -1,4 +1,4 @@ -namespace O2NextGen.SmallTalk.Api.Messaging +namespace O2NextGen.Common { public class SendMessageCompletedEvent { diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj index d36d3cd8..11923b9c 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/O2NextGen.SmallTalk.Api.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs index b6da16ab..4106696a 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs @@ -7,11 +7,13 @@ using O2NextGen.SmallTalk.Api.Services; using Polly; using System; +using System.Collections.Generic; using System.Threading.Tasks; using Autofac; using Autofac.Extensions.DependencyInjection; using MassTransit; using MassTransit.Util; +using Microsoft.AspNetCore.Authentication.JwtBearer; using RabbitMQ.Client; using Swashbuckle.AspNetCore.Swagger; @@ -41,6 +43,18 @@ public IServiceProvider ConfigureServices(IServiceCollection services) Description = "SmallTalk API Service. The service allows you to create chats", TermsOfService = "Terms of Service" }); + options.AddSecurityDefinition("oauth2", new OAuth2Scheme + { + Type = "oauth2", + Flow = "implicit", + AuthorizationUrl = $"{Configuration.GetValue("IdentityUrl")}/connect/authorize", + TokenUrl = $"{Configuration.GetValue("IdentityUrl")}/connect/token", + Scopes = new Dictionary() + { + { "smalltalkapi", "SmallTalk Api" } + } + + }); }); services.AddCors(options => { @@ -52,19 +66,24 @@ public IServiceProvider ConfigureServices(IServiceCollection services) .AllowCredentials()); }); // adds DI services to DI and configures bearer as the default scheme - services.AddAuthentication("Bearer") - .AddJwtBearer("Bearer", options => - { - // identity server issuing token - options.Authority = "http://localhost:5001"; - options.RequireHttpsMetadata = false; - - // // allow self-signed SSL certs - // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; - - // the scope id of this api - options.Audience = "smalltalkapi"; - }); + // // adds DI services to DI and configures bearer as the default scheme + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + + }).AddJwtBearer(options => + { + // identity server issuing token + options.Authority = "http://localhost:5001"; + options.RequireHttpsMetadata = false; + + // // allow self-signed SSL certs + // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; + + // the scope id of this api + options.Audience = "smalltalkapi"; + }); services.AddAuthorization(); services.AddApplicationServices(Configuration); @@ -122,6 +141,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplica app.UseMvc(); var bus = ApplicationContainer.Resolve(); + //bus.Start(); var bushandle = TaskUtil.Await(() => bus.StartAsync()); applicationLifetime.ApplicationStopped.Register(() => bushandle.Stop()); } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs index d6f19d1e..91b20e92 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs @@ -2,6 +2,8 @@ using Microsoft.AspNetCore.SignalR; using O2NextGen.SmallTalk.SignalrHub.Hubs; using System.Threading.Tasks; +using MassTransit; +using O2NextGen.Common; namespace O2NextGen.SmallTalk.SignalrHub.Controllers { @@ -10,16 +12,18 @@ namespace O2NextGen.SmallTalk.SignalrHub.Controllers public class ChatController : ControllerBase { private IHubContext _hubContext; + private readonly IBus _bus; - public ChatController(IHubContext chatHub) + public ChatController(IHubContext chatHub,IBus bus) { this._hubContext = chatHub; + _bus = bus; } [HttpGet] public async Task Test() { //await chatHub.UpdateMessages(); - + _bus.Publish(new { userId = "1" , recipientId="2"}).Wait(); await _hubContext.Clients .All .SendAsync("OnUserUpdateState"); diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/OnlineStatusCompletedEventConsumer.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/OnlineStatusCompletedEventConsumer.cs new file mode 100644 index 00000000..9fb8044b --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/OnlineStatusCompletedEventConsumer.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using MassTransit; +using Microsoft.AspNetCore.SignalR; +using O2NextGen.SmallTalk.SignalrHub.Hubs; + +namespace O2NextGen.Common.Consumers +{ + public class OnlineStatusCompletedEventConsumer:IConsumer + { + private readonly IHubContext _chatHub; + + public OnlineStatusCompletedEventConsumer(IHubContext chatHub) + { + _chatHub = chatHub; + } + public async Task Consume(ConsumeContext context) + { + await _chatHub.Clients + .All + .SendAsync("OnSetOnline"); + } + } +} \ No newline at end of file diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/SendMessageCompletedEventConsumer.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/SendMessageCompletedEventConsumer.cs new file mode 100644 index 00000000..dd6f9bf4 --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/Consumers/SendMessageCompletedEventConsumer.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using MassTransit; +using Microsoft.AspNetCore.SignalR; +using O2NextGen.SmallTalk.SignalrHub.Hubs; + +namespace O2NextGen.Common.Consumers +{ + + public class SendMessageCompletedEventConsumer: IConsumer + { + private readonly IHubContext _chatHub; + + public SendMessageCompletedEventConsumer(IHubContext chatHub) + { + _chatHub = chatHub; + } + public async Task Consume(ConsumeContext context) + { + await _chatHub.Clients + .All + .SendAsync("OnGetNewMessage"); + } + } +} \ No newline at end of file diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/OnlineStatusCompletedEvent.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/OnlineStatusCompletedEvent.cs new file mode 100644 index 00000000..983b899c --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/OnlineStatusCompletedEvent.cs @@ -0,0 +1,12 @@ +namespace O2NextGen.Common +{ + public class OnlineStatusCompletedEvent + { + private string UserId { get; } + + public OnlineStatusCompletedEvent(string userId) + { + UserId = userId; + } + } +} \ No newline at end of file diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/SendMessageCompletedEvent.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/SendMessageCompletedEvent.cs new file mode 100644 index 00000000..53ba6a31 --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Messaging/SendMessageCompletedEvent.cs @@ -0,0 +1,14 @@ +namespace O2NextGen.Common +{ + public class SendMessageCompletedEvent + { + private string SenderId { get; set; } + public string RecipientId { get; set; } + + public SendMessageCompletedEvent(string userId, string recipientId) + { + SenderId = userId; + RecipientId = recipientId; + } + } +} \ No newline at end of file diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj index 77b81214..580c500b 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/O2NextGen.SmallTalk.SignalrHub.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Program.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Program.cs index 93e339b4..99e7007d 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Program.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Program.cs @@ -1,13 +1,33 @@ -using Microsoft.AspNetCore; +using System; +using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; namespace O2NextGen.SmallTalk.SignalrHub { public class Program { - public static void Main(string[] args) + public static readonly string Namespace = typeof(Program).Namespace; + public static readonly string AppName = Namespace.Substring(Namespace.LastIndexOf('.', Namespace.LastIndexOf('.') - 1) + 1); + public static int Main(string[] args) { - CreateWebHostBuilder(args).Build().Run(); + try + { + //Log.Information("Configuring web host ({ApplicationContext})...", AppName); + var host = CreateWebHostBuilder(args).Build(); + //Log.Information("Starting web host ({ApplicationContext})...", AppName); + host.Run(); + + return 0; + } + catch (Exception ex) + { + //Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", AppName); + return 1; + } + finally + { + //Log.CloseAndFlush(); + } } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs index 601c399a..7efb7464 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs @@ -109,9 +109,10 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplica }); app.UseMvc(); var bus = ApplicationContainer.Resolve(); + //bus.Start(); var bushandle = TaskUtil.Await(() => bus.StartAsync()); applicationLifetime.ApplicationStopped.Register(() => bushandle.Stop()); - + // app.Run(async (context) => //{ // await context.Response.WriteAsync("Hello World!"); diff --git a/src/WebApps/smalltalk/auth-app/Dockerfile b/src/WebApps/smalltalk/auth-app/Dockerfile new file mode 100644 index 00000000..9b9112aa --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/Dockerfile @@ -0,0 +1,16 @@ +# Stage 0, "build-stage", based on Node.js, to build and compile the frontend +FROM node:12.16.1 as build-stage +WORKDIR /app +COPY package*.json /app/ +RUN yarn +COPY ./ /app/ + +RUN yarn build +# -- --output-path=./dist/out --configuration $configuration + +# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx +FROM nginx:1.15 +#Copy ci-dashboard-dist +COPY --from=build-stage /app/dist/ /usr/share/nginx/html +#Copy default nginx configuration +COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/nginx-custom.conf b/src/WebApps/smalltalk/auth-app/nginx-custom.conf new file mode 100644 index 00000000..50a8eb53 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/nginx-custom.conf @@ -0,0 +1,21 @@ +# Expires map +map $sent_http_content_type $expires { + default off; + text/html epoch; + text/css max; + application/json max; + application/javascript max; + ~image/ max; +} + +server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri$args $uri$args/ index.html =404; + error_page 404 =200 /index.html; + } + expires $expires; + gzip on; +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/Dockerfile b/src/WebApps/smalltalk/chat/Dockerfile new file mode 100644 index 00000000..9b9112aa --- /dev/null +++ b/src/WebApps/smalltalk/chat/Dockerfile @@ -0,0 +1,16 @@ +# Stage 0, "build-stage", based on Node.js, to build and compile the frontend +FROM node:12.16.1 as build-stage +WORKDIR /app +COPY package*.json /app/ +RUN yarn +COPY ./ /app/ + +RUN yarn build +# -- --output-path=./dist/out --configuration $configuration + +# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx +FROM nginx:1.15 +#Copy ci-dashboard-dist +COPY --from=build-stage /app/dist/ /usr/share/nginx/html +#Copy default nginx configuration +COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/nginx-custom.conf b/src/WebApps/smalltalk/chat/nginx-custom.conf new file mode 100644 index 00000000..50a8eb53 --- /dev/null +++ b/src/WebApps/smalltalk/chat/nginx-custom.conf @@ -0,0 +1,21 @@ +# Expires map +map $sent_http_content_type $expires { + default off; + text/html epoch; + text/css max; + application/json max; + application/javascript max; + ~image/ max; +} + +server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri$args $uri$args/ index.html =404; + error_page 404 =200 /index.html; + } + expires $expires; + gzip on; +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/yarn.lock b/src/WebApps/smalltalk/yarn.lock deleted file mode 100644 index fb57ccd1..00000000 --- a/src/WebApps/smalltalk/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml index d52053d5..38249fb7 100644 --- a/src/docker-compose.override.yml +++ b/src/docker-compose.override.yml @@ -21,14 +21,14 @@ services: image: rabbitmq:3-management container_name: rabbitmq hostname: myrabbitmq - ports: + ports: - "15672:15672" - "5672:5672" - "5671:5671" volumes: - - ~/rabbitmq:/var/lib/rabbitmq/mnesia + - ~/rabbitmq:/var/lib/rabbitmq/mnesia networks: - - backend + - backend o2nextgen.auth.web: @@ -71,6 +71,12 @@ services: #- ASPNETCORE_URLS=https://+:443;http://+:80 ports: - "5003:80" + depends_on: + - rabbitmq + - o2nextgen.smalltalk.signalr + networks: + - backend + - frontend # - "10003:443" #volumes: # - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro @@ -82,6 +88,11 @@ services: #- ASPNETCORE_URLS=https://+:443;http://+:80 ports: - "5103:80" + depends_on: + - rabbitmq + networks: + - backend + - frontend o2nextgen.esender.api: environment: @@ -98,3 +109,25 @@ services: #volumes: # - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro # - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro + + smalltalk.app: + ports: + - "3003:80" + depends_on: + - o2nextgen.auth.web + - o2nextgen.smalltalk.api + - o2nextgen.smalltalk.signalr + networks: + - backend + - frontend + + smalltalk.app.chat: + ports: + - "3002:80" + depends_on: + - o2nextgen.auth.web + - o2nextgen.smalltalk.api + - o2nextgen.smalltalk.signalr + networks: + - backend + - frontend diff --git a/src/docker-compose.yml b/src/docker-compose.yml index 0a8a9f40..99c78ea1 100644 --- a/src/docker-compose.yml +++ b/src/docker-compose.yml @@ -33,3 +33,14 @@ services: context: . dockerfile: Services/e-sender/O2NextGen.ESender.Api/Dockerfile + smalltalk.app: + image: ${DOCKER_REGISTRY-}smalltalk-app + build: + context: ./WebApps/smalltalk/auth-app/ + dockerfile: Dockerfile + + smalltalk.app.chat: + image: ${DOCKER_REGISTRY-}smalltalk-mf-chat + build: + context: ./WebApps/smalltalk/chat/ + dockerfile: Dockerfile From 434afee15671762ef8cad90e2398e8da7aa2cc82 Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Mon, 9 May 2022 13:57:06 +0300 Subject: [PATCH 12/13] feat(issue-351): add exts for code --- .../Extensions/IdentityServerExtensions.cs | 102 +++++++++--------- .../Helpers/ConfigFunctionStateConverter.cs | 20 ++++ .../O2NextGen.SmallTalk.Api/Startup.cs | 40 +++++-- .../O2NextGen.SmallTalk.Api/appsettings.json | 9 +- .../Controllers/ChatController.cs | 2 +- .../Helpers/ConfigFunctionStateConverter.cs | 20 ++++ .../O2NextGen.SmallTalk.SignalrHub/Startup.cs | 52 +++++++-- .../appsettings.Development.json | 10 ++ .../appsettings.json | 17 +++ src/WebApps/smalltalk/auth-app/env-config.js | 5 + .../smalltalk/auth-app/src/configuration.jsx | 7 ++ src/WebApps/smalltalk/auth-app/src/index.html | 1 - .../smalltalk/auth-app/src/pages/home.jsx | 9 +- .../auth-app/src/services/userService.js | 7 +- src/docker-compose.override.yml | 19 +++- src/docker-compose.yml | 10 +- 16 files changed, 240 insertions(+), 90 deletions(-) create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.Api/Helpers/ConfigFunctionStateConverter.cs create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Helpers/ConfigFunctionStateConverter.cs create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.Development.json create mode 100644 src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.json create mode 100644 src/WebApps/smalltalk/auth-app/env-config.js create mode 100644 src/WebApps/smalltalk/auth-app/src/configuration.jsx diff --git a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs index 434862a3..e43692c6 100644 --- a/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs +++ b/src/Services/auth/O2NextGen.Auth.Web/Extensions/IdentityServerExtensions.cs @@ -40,11 +40,11 @@ public static IServiceCollection AddConfiguredIdentityServer(this IServiceCollec // more about EF integration: // - http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html // - http://docs.identityserver.io/en/latest/reference/ef.html?highlight=dbcontext - + .Services.AddTransient(); return services; } - + private static IEnumerable GetIdentityResources() { var profile = new IdentityResources.Profile(); @@ -55,7 +55,7 @@ private static IEnumerable GetIdentityResources() profile }; } - + // private static IEnumerable GetApis() // { // var apiResource = new ApiResource("smalltalkapi", "smalltalkapi"); @@ -68,10 +68,10 @@ private static IEnumerable GetIdentityResources() public static IEnumerable GetApis() => new List { - new ApiResource("smalltalkapi", "smalltalkapi"), - new ApiResource("smalltalkapisignalr","smalltalkapisignalr") + new ApiResource("smalltalkapi", "SmallTalk API"), + new ApiResource("smalltalksignalr","SmallTalk SignalR") }; - + private static IEnumerable GetClients() { return new[] @@ -81,26 +81,22 @@ private static IEnumerable GetClients() { ClientId = "smalltalk_client_reactjs", ClientName = "SmallTalk React App", - ClientUri = "http://localhost:3003", AllowedGrantTypes = GrantTypes.Implicit, - + RequireClientSecret = false, - RedirectUris = - { - "http://localhost:3003/signin-oidc", + RedirectUris = + {"http://localhost:3003/signin-oidc", }, - PostLogoutRedirectUris = { "http://localhost:3003/signout-oidc" }, - AllowedCorsOrigins = { "http://localhost:3003" }, AllowedScopes = new List { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "smalltalkapi", - "smalltalkapisignalr", + "smalltalksignalr", }, AllowAccessTokensViaBrowser = true, @@ -119,47 +115,45 @@ private static IEnumerable GetClients() AllowedScopes = new List { - - "order" + "smalltalkapi" } - } - // new Client - // { - // ClientId = "smalltalk_client_reactjs", - // AllowedGrantTypes = GrantTypes.Implicit, - // //ClientSecrets = { new Secret("secret".Sha256())}, - // RequireClientSecret = false, - // RedirectUris = new[] {"http://localhost:3003/signin-oidc"}, - // //RefreshTokenUsage = TokenUsage.OneTimeOnly, - // AllowedScopes = - // { - // IdentityServerConstants.StandardScopes.OpenId, - // IdentityServerConstants.StandardScopes.Profile, - // "smalltalkapi", - // "smalltalkapisignalr", - // //IdentityServerConstants.StandardScopes.OfflineAccess - // }, - // //AllowOfflineAccess = true, - // //AccessTokenLifetime = 60, - // //RefreshTokenExpiration = TokenExpiration.Sliding, - // RequireConsent = false, - // AllowedCorsOrigins = new []{"http://localhost:3003"}, - // // PostLogoutRedirectUris = new []{"http://localhost:3003/signout-oidc"}, - // //RequirePkce = true, - // // RequireClientSecret=false, - // - // // - // - // - // - // //, - // - // // AllowAccessTokensViaBrowser = true, - // //AllowOfflineAccess = true, - // //AccessTokenLifetime = 60, - // //RefreshTokenExpiration = TokenExpiration.Sliding, - // //RequireConsent = false - // } + }, + new Client { + ClientId = "o2business-wpf", + + AllowedGrantTypes = GrantTypes.Code, + RequirePkce = true, + RequireClientSecret = false, + + RedirectUris = { "http://localhost/sample-wpf-app" }, + AllowedCorsOrigins = { "http://localhost" }, + + AllowedScopes = { + IdentityServerConstants.StandardScopes.OpenId, + IdentityServerConstants.StandardScopes.Profile, + }, + + AllowAccessTokensViaBrowser = true, + RequireConsent = false, + }, + new Client { + ClientId = "xamarin", + + AllowedGrantTypes = GrantTypes.Code, + RequirePkce = true, + RequireClientSecret = false, + + RedirectUris = { "xamarinformsclients://callback" }, + + AllowedScopes = { + IdentityServerConstants.StandardScopes.OpenId, + IdentityServerConstants.StandardScopes.Profile, + }, + + AllowAccessTokensViaBrowser = true, + RequireConsent = false, + }, + }; } } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Helpers/ConfigFunctionStateConverter.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Helpers/ConfigFunctionStateConverter.cs new file mode 100644 index 00000000..b55895d8 --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Helpers/ConfigFunctionStateConverter.cs @@ -0,0 +1,20 @@ +using System; + +namespace O2NextGen.SmallTalk.Api.Helpers +{ + //Converter Off/On + public static class ConfigFunctionStateConverter + { + public static bool GetStateFunction(string value) + { + if (value.ToLower().Contains("on")) + return true; + else + { + if (value.ToLower().Contains("off")) + return false; + throw new ArgumentException(nameof(value)); + } + } + } +} \ No newline at end of file diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs index 4106696a..22e09b7d 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/Startup.cs @@ -8,6 +8,7 @@ using Polly; using System; using System.Collections.Generic; +using System.Net.Http; using System.Threading.Tasks; using Autofac; using Autofac.Extensions.DependencyInjection; @@ -29,8 +30,22 @@ public Startup(IConfiguration configuration) public IConfiguration Configuration { get; } private IContainer ApplicationContainer { get; set; } + private void CheckConfiguration() + { + var urlsRabbitmq = Configuration.GetValue("Urls:Rabbitmq"); + var urlsIdentityUrl = Configuration.GetValue("Urls:IdentityUrl"); + var urlSmallTalkSignalRUrl = Configuration.GetValue("Urls:SmallTalkSignalRUrl"); + var brokerRabbitState = Configuration.GetValue("BrokersMessage:Rabbitmq"); + Console.WriteLine(" ============= Configuration ==============="); + Console.WriteLine($" Urls:IdentityUrl = {urlsIdentityUrl}"); + Console.WriteLine($" Urls:Rabbitmq = {urlsRabbitmq}"); + Console.WriteLine($" Urls:SmallTalkSignalRUrl = {urlSmallTalkSignalRUrl}"); + Console.WriteLine($" BrokersMessage:Rabbitmq = {brokerRabbitState}"); + Console.WriteLine(" =========== End Configuration ============="); + } public IServiceProvider ConfigureServices(IServiceCollection services) { + CheckConfiguration(); services.AddRequiredMvcComponents(); services.AddBusiness(); services.AddSwaggerGen(options => @@ -47,8 +62,8 @@ public IServiceProvider ConfigureServices(IServiceCollection services) { Type = "oauth2", Flow = "implicit", - AuthorizationUrl = $"{Configuration.GetValue("IdentityUrl")}/connect/authorize", - TokenUrl = $"{Configuration.GetValue("IdentityUrl")}/connect/token", + AuthorizationUrl = $"{Configuration.GetValue("Urls:IdentityUrl")}/connect/authorize", + TokenUrl = $"{Configuration.GetValue("Urls:IdentityUrl")}/connect/token", Scopes = new Dictionary() { { "smalltalkapi", "SmallTalk Api" } @@ -75,11 +90,11 @@ public IServiceProvider ConfigureServices(IServiceCollection services) }).AddJwtBearer(options => { // identity server issuing token - options.Authority = "http://localhost:5001"; + options.Authority = Configuration.GetValue("Urls:IdentityUrl"); options.RequireHttpsMetadata = false; - // // allow self-signed SSL certs - // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; + // allow self-signed SSL certs + options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; // the scope id of this api options.Audience = "smalltalkapi"; @@ -88,16 +103,21 @@ public IServiceProvider ConfigureServices(IServiceCollection services) services.AddApplicationServices(Configuration); var builderAf = new ContainerBuilder(); - builderAf.Register(c => + builderAf.Register(context => { return Bus.Factory.CreateUsingRabbitMq(rmq => { - rmq.Host(new Uri("rabbitmq://rabbitmq"), "/", h => + var host = rmq.Host(new Uri(Configuration.GetValue("Urls:RabbitmqUrl")), "/", h => { h.Username("guest"); h.Password("guest"); }); - rmq.ExchangeType = ExchangeType.Fanout; + + //rmq.ExchangeType = ExchangeType.Fanout; + rmq.ReceiveEndpoint(host,"O2NextGen" +Guid.NewGuid().ToString(), e => + { + e.LoadFrom(context); + }); }); }). @@ -140,6 +160,8 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplica app.UseAuthentication(); app.UseMvc(); + if (!ConfigFunctionStateConverter.GetStateFunction(Configuration.GetValue("BrokersMessage:Rabbitmq") + .ToString())) return; var bus = ApplicationContainer.Resolve(); //bus.Start(); var bushandle = TaskUtil.Await(() => bus.StartAsync()); @@ -159,7 +181,7 @@ public static IServiceCollection AddApplicationServices(this IServiceCollection //register http services services .AddHttpClient("Signal-R", - client => { client.BaseAddress = new Uri(configuration.GetValue("urls:SignalRUrl")); }) + client => { client.BaseAddress = new Uri(configuration.GetValue("Urls:SmallTalkSignalRUrl")); }) .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(5, arrempt => TimeSpan.FromSeconds(arrempt * 2) )); diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json index 0e1e4a40..d4e15183 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.Api/appsettings.json @@ -5,8 +5,13 @@ } }, "AllowedHosts": "*", - "urls": { - "SignalRUrl": "http://localhost:5103" + "BrokersMessage": { + "Rabbitmq": "on" + }, + "Urls": { + "IdentityUrl":"http://localhost:5001", + "SmallTalkSignalRUrl": "http://localhost:5103", + "RabbitmqUrl":"rabbitmq://rabbitmq" } } diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs index 91b20e92..65dd604a 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Controllers/ChatController.cs @@ -23,7 +23,7 @@ public ChatController(IHubContext chatHub,IBus bus) public async Task Test() { //await chatHub.UpdateMessages(); - _bus.Publish(new { userId = "1" , recipientId="2"}).Wait(); + // _bus.Publish(new { userId = "1" , recipientId="2"}).Wait(); await _hubContext.Clients .All .SendAsync("OnUserUpdateState"); diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Helpers/ConfigFunctionStateConverter.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Helpers/ConfigFunctionStateConverter.cs new file mode 100644 index 00000000..7bcc279a --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Helpers/ConfigFunctionStateConverter.cs @@ -0,0 +1,20 @@ +using System; + +namespace O2NextGen.SmallTalk.SignalrHub.Helpers +{ + //Converter Off/On + public static class ConfigFunctionStateConverter + { + public static bool GetStateFunction(string value) + { + if (value.ToLower().Contains("on")) + return true; + else + { + if (value.ToLower().Contains("off")) + return false; + throw new ArgumentException(nameof(value)); + } + } + } +} \ No newline at end of file diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs index 7efb7464..e3d18704 100644 --- a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/Startup.cs @@ -1,4 +1,5 @@ using System; +using System.Net.Http; using Autofac; using Autofac.Extensions.DependencyInjection; using MassTransit; @@ -7,19 +8,28 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using O2NextGen.SmallTalk.SignalrHub.Helpers; using O2NextGen.SmallTalk.SignalrHub.Hubs; using RabbitMQ.Client; namespace O2NextGen.SmallTalk.SignalrHub { public class Startup { + private IConfiguration Configuration { get; } + + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } private IContainer ApplicationContainer { get; set; } // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public IServiceProvider ConfigureServices(IServiceCollection services) { + CheckConfiguration(); var mvcBuilder = services.AddMvcCore(options => { //options.Filters.Add(); }); @@ -36,7 +46,7 @@ public IServiceProvider ConfigureServices(IServiceCollection services) }); services.AddSingleton(); services.AddSignalR(); - // // adds DI services to DI and configures bearer as the default scheme + // adds DI services to DI and configures bearer as the default scheme services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; @@ -45,29 +55,34 @@ public IServiceProvider ConfigureServices(IServiceCollection services) }).AddJwtBearer(options => { // identity server issuing token - options.Authority = "http://localhost:5001"; + options.Authority = Configuration.GetValue("Urls:IdentityUrl"); options.RequireHttpsMetadata = false; - // // allow self-signed SSL certs - // options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; + // allow self-signed SSL certs + options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } }; // the scope id of this api - options.Audience = "smalltalkapisignalr"; + options.Audience = "smalltalksignalr"; }); services.AddAuthorization(); - + var builderAf = new ContainerBuilder(); - builderAf.Register(c => + builderAf.Register(context => { return Bus.Factory.CreateUsingRabbitMq(rmq => { - rmq.Host(new Uri("rabbitmq://rabbitmq"), "/", h => + var host = rmq.Host(new Uri(Configuration.GetValue("Urls:Rabbitmq")), "/", h => { h.Username("guest"); h.Password("guest"); }); - rmq.ExchangeType = ExchangeType.Fanout; + //rmq.ExchangeType = ExchangeType.Fanout; + rmq.ReceiveEndpoint(host,"O2NextGen" +Guid.NewGuid().ToString(), e => + { + e.LoadFrom(context); + }); }); + }). As() @@ -80,6 +95,20 @@ public IServiceProvider ConfigureServices(IServiceCollection services) return new AutofacServiceProvider(ApplicationContainer); } + private void CheckConfiguration() + { + var urlsRabbitmq = Configuration.GetValue("Urls:RabbitmqUrl"); + var urlsIdentityUrl = Configuration.GetValue("Urls:IdentityUrl"); + var urlSmallTalkApi = Configuration.GetValue("Urls:SmallTalkApi"); + var brokerRabbitState = Configuration.GetValue("BrokersMessage:Rabbitmq"); + Console.WriteLine(" ============= Configuration ==============="); + Console.WriteLine($" Urls:IdentityUrl = {urlsIdentityUrl}"); + Console.WriteLine($" Urls:Rabbitmq = {urlsRabbitmq}"); + Console.WriteLine($" Urls:SmallTalkApi = {urlSmallTalkApi}"); + Console.WriteLine($" BrokersMessage:Rabbitmq = {brokerRabbitState}"); + Console.WriteLine(" =========== End Configuration ============="); + } + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime) { @@ -108,11 +137,12 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplica }); app.UseMvc(); + + if (!ConfigFunctionStateConverter.GetStateFunction(Configuration.GetValue("BrokersMessage:Rabbitmq"))) return; + var bus = ApplicationContainer.Resolve(); - //bus.Start(); var bushandle = TaskUtil.Await(() => bus.StartAsync()); applicationLifetime.ApplicationStopped.Register(() => bushandle.Stop()); - // app.Run(async (context) => //{ // await context.Response.WriteAsync("Hello World!"); diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.Development.json b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.Development.json new file mode 100644 index 00000000..11a51145 --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} + diff --git a/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.json b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.json new file mode 100644 index 00000000..138e724e --- /dev/null +++ b/src/Services/smalltalk/O2NextGen.SmallTalk.SignalrHub/appsettings.json @@ -0,0 +1,17 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "AllowedHosts": "*", + "BrokersMessage": { + "Rabbitmq": "on" + }, + "Urls": { + "IdentityUrl":"http://localhost:5001", + "SmallTalkApi": "http://localhost:5003", + "RabbitmqUrl":"rabbitmq://rabbitmq" + } +} + diff --git a/src/WebApps/smalltalk/auth-app/env-config.js b/src/WebApps/smalltalk/auth-app/env-config.js new file mode 100644 index 00000000..52bd3483 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/env-config.js @@ -0,0 +1,5 @@ +window._env_ = { + Identity_URL: "http://localhost:5001", + Client_URL: "http://localhost:3003", + SignalRHub_URl: "http://localhost:5103/chathub", +} \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/configuration.jsx b/src/WebApps/smalltalk/auth-app/src/configuration.jsx new file mode 100644 index 00000000..06b5b587 --- /dev/null +++ b/src/WebApps/smalltalk/auth-app/src/configuration.jsx @@ -0,0 +1,7 @@ + +// export const Identity_URL=process.env.Identity_URL ?? 'http://localhost:5001/'; +// export const Client_URL=process.env.Client_URL ?? 'http://localhost:3003'; +// export const SignalRHub_URl=process.env.SignalRHub_URl ?? 'http://localhost:5103/chathub'; +export const Identity_URL='http://localhost:5001/'; +export const Client_URL='http://localhost:3003'; +export const SignalRHub_URl='http://localhost:5103/chathub'; \ No newline at end of file diff --git a/src/WebApps/smalltalk/auth-app/src/index.html b/src/WebApps/smalltalk/auth-app/src/index.html index c5668f42..26f7fd14 100644 --- a/src/WebApps/smalltalk/auth-app/src/index.html +++ b/src/WebApps/smalltalk/auth-app/src/index.html @@ -6,7 +6,6 @@ auth-app -
diff --git a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx index 74d74313..e26c29c2 100644 --- a/src/WebApps/smalltalk/auth-app/src/pages/home.jsx +++ b/src/WebApps/smalltalk/auth-app/src/pages/home.jsx @@ -9,6 +9,7 @@ import CheckApi from "./check-api"; import store from "../store"; import * as signalR from "@microsoft/signalr"; import soundNotification from '../assets/sound-notification.wav'; +import {SignalRHub_URl} from "../configuration"; function Home() { const user = useSelector(state => state.auth.user) @@ -20,7 +21,7 @@ function Home() { // fetch current user from cookies loadUserFromStorage(store).then(()=>{ let connect = new signalR.HubConnectionBuilder() - .withUrl("http://localhost:5103/chathub", + .withUrl(SignalRHub_URl, { // skipNegotiation: true, // transport: signalR.HttpTransportType.LongPolling, @@ -37,7 +38,11 @@ function Home() { console.log(err); }); console.log("invoke is called") - connect.on("OnUserUpdateState", (userId)=>{ + connect.on("OnUserUpdateState",()=>{ + new Audio(soundNotification).play(); + console.log("call >> OnUserUpdateState") + }) + connect.on("OnGetNewMessage", (userId)=>{ //(new Audio(soundNotification)).play(); new Audio(soundNotification).play(); console.log("bell") diff --git a/src/WebApps/smalltalk/auth-app/src/services/userService.js b/src/WebApps/smalltalk/auth-app/src/services/userService.js index eb6cf902..824f6325 100644 --- a/src/WebApps/smalltalk/auth-app/src/services/userService.js +++ b/src/WebApps/smalltalk/auth-app/src/services/userService.js @@ -1,5 +1,6 @@ import { UserManager } from 'oidc-client'; import { storeUserError, storeUser } from '../actions/authActions' +import {Client_URL, Identity_URL} from "../configuration"; // const config = { // authority: "https://localhost:10001", @@ -9,12 +10,12 @@ import { storeUserError, storeUser } from '../actions/authActions' // redirect_uri: "http://localhost:3003/signin-oidc" // }; const config = { - authority: "http://localhost:5001/", + authority: Identity_URL, client_id: "smalltalk_client_reactjs", - redirect_uri: "http://localhost:3003/signin-oidc", + redirect_uri: Client_URL+"/signin-oidc", response_type: "id_token token", //client_secret: "secret", - scope: "openid profile smalltalkapi smalltalkapisignalr", + scope: "openid profile smalltalkapi smalltalksignalr", // monitorSession: false, // loadUserInfo: true, // post_logout_redirect_uri: "http://localhost:3003/signout-oidc" diff --git a/src/docker-compose.override.yml b/src/docker-compose.override.yml index 38249fb7..482f5a7f 100644 --- a/src/docker-compose.override.yml +++ b/src/docker-compose.override.yml @@ -6,8 +6,6 @@ networks: services: sql.data: - image: mcr.microsoft.com/mssql/server:2017-latest - container_name: sqldatacontainer environment: - SA_PASSWORD=your@Password - ACCEPT_EULA=Y @@ -18,8 +16,6 @@ services: - backend rabbitmq: - image: rabbitmq:3-management - container_name: rabbitmq hostname: myrabbitmq ports: - "15672:15672" @@ -68,15 +64,19 @@ services: o2nextgen.smalltalk.api: environment: - ASPNETCORE_ENVIRONMENT=Development + - Urls__IdentityUrl=http://o2nextgen.auth.web + - Urls__SmallTalkSignalRUrl=http://o2nextgen.smalltalk.signalr + - Urls__Rabbitmq=rabbitmq://rabbitmq #- ASPNETCORE_URLS=https://+:443;http://+:80 ports: - "5003:80" depends_on: - rabbitmq - o2nextgen.smalltalk.signalr + - o2nextgen.auth.web networks: - backend - - frontend + - frontend # - "10003:443" #volumes: # - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro @@ -85,11 +85,16 @@ services: o2nextgen.smalltalk.signalr: environment: - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_URLS=http://0.0.0.0:80l + - Urls__IdentityUrl=http://o2nextgen.auth.web + - Urls__Rabbitmq=rabbitmq://rabbitmq + - Urls__SmallTalkUrl=http://o2nextgen.smalltalk.api #- ASPNETCORE_URLS=https://+:443;http://+:80 ports: - "5103:80" depends_on: - rabbitmq + - o2nextgen.auth.web networks: - backend - frontend @@ -111,6 +116,10 @@ services: # - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro smalltalk.app: + environment: + - ASPNETCORE_ENVIRONMENT=Development + # - Urls__IdentityUrl=http://docker.for.mac.localhost:5001 + # - Urls__SignalRUrl=http://docker.for.mac.localhost:5103 ports: - "3003:80" depends_on: diff --git a/src/docker-compose.yml b/src/docker-compose.yml index 99c78ea1..254c6a4f 100644 --- a/src/docker-compose.yml +++ b/src/docker-compose.yml @@ -1,7 +1,14 @@ version: '3.4' services: - + sql.data: + image: mcr.microsoft.com/mssql/server:2017-latest + container_name: sqldatacontainer + + rabbitmq: + image: rabbitmq:3-management + container_name: rabbitmq + o2nextgen.auth.web: image: ${DOCKER_REGISTRY-}o2ng-auth-web build: @@ -14,7 +21,6 @@ services: context: . dockerfile: Services/c-gen/O2NextGen.CertificateManagement.Api/Dockerfile - o2nextgen.smalltalk.api: image: ${DOCKER_REGISTRY-}o2ng-smalltalk-api build: From ee2da8f225f7a209d809d04c36601a02629590a2 Mon Sep 17 00:00:00 2001 From: Denis Prokhorchik Date: Mon, 9 May 2022 19:03:48 +0300 Subject: [PATCH 13/13] feat(issue-351): integrate chat to smalltalk react app --- .../auth-app/src/assets/Denis_prox.jpg | Bin 0 -> 138098 bytes .../smalltalk/auth-app/src/pages/home.jsx | 51 +++-- .../auth-app/src/services/apiService.js | 10 +- src/WebApps/smalltalk/chat/src/App.jsx | 184 +++++++----------- .../components/Avatar/AvatarWithStatus.jsx | 19 ++ .../components/Avatar/AvatarWithUsername.jsx | 14 ++ .../src/components/Menu/MessageBoardMenu.jsx | 56 ++++++ .../components/MessageBoard/MessageBoard.jsx | 37 ++++ .../MessageBoard/Parts/MessageBoardHeader.jsx | 18 ++ .../MessageBoard/Parts/MessageBoardPlace.jsx | 25 +++ .../Parts/MessageBoardToolBar.jsx | 45 +++++ .../smalltalk/chat/src/components/STChat.jsx | 172 ++++++++++++++++ .../chat/src/components/UI/STButton.jsx | 9 + .../smalltalk/chat/src/pages/ControlStyle.jsx | 12 ++ src/WebApps/smalltalk/chat/webpack.config.js | 8 +- 15 files changed, 533 insertions(+), 127 deletions(-) create mode 100644 src/WebApps/smalltalk/auth-app/src/assets/Denis_prox.jpg create mode 100644 src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithStatus.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithUsername.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/Menu/MessageBoardMenu.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/MessageBoard/MessageBoard.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardHeader.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardPlace.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardToolBar.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/STChat.jsx create mode 100644 src/WebApps/smalltalk/chat/src/components/UI/STButton.jsx create mode 100644 src/WebApps/smalltalk/chat/src/pages/ControlStyle.jsx diff --git a/src/WebApps/smalltalk/auth-app/src/assets/Denis_prox.jpg b/src/WebApps/smalltalk/auth-app/src/assets/Denis_prox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06d6eb5ea86736b8bedf61f38c77c83209d584b7 GIT binary patch literal 138098 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%0A6`R`S0#Sw@5#bWPyeV@FQrm`n# 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�V|v|wxslSJlSdii8+*-F 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

0%(uEbXE@yaQ-)eFwVJ8o4g7|r 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�CRAY&Ivy>BX8oWclbRQJb;U>}qSWoAed z|D?7a9qaX;!?DFHNS2ssUFP-2UxT?12rTIhtRiwK|JS<9A1iwWiS=SCy1uHS{4H`GBO0tm3`b^?zqU8h0<%H$M7zM9tMUTUOgSWdMjtx zVITuFM<)13>~cpLDG&~(OxsqY^jB=BJAr)vk=)lgCQY(XX4YMP9;sFQ z_3QdKfwEP)l`GbmqL@F8e4*qY?fbs$qQ{urWQfTw07>Qu?jz#wlwcwz!*Wj1mu{Gz zvO58&x>N7+vTlPf^%1S1PKEV|pa1uQOJm#mg94wqpBvKyXD;o%o_zWdqW_g(MbH@! zi^vj!W>+_cNhM(fnrDoS=*`h`JFPU~9d0?Xh|e-mJ2h>CpK%*kOh!nH`vI$+f2(ZK>B7DIn~ZmlnP}7`+%*{83?shm?PR`AWX&R}B2&rO zxFLq0v#yZy_0wH(Naj}aHQs-llG+`-e3gp`RJv;I8TLgos^dK7%fy+RIQmszMJ zzNjx+Q7KQ+3)n?42`qFi@KH3_aoOVRgKVT*Y8vm!sGqR29|;pCY6soeg* zBreG$?$>$8F1@-eBmSGXH0q}X(@NBvaPj|c;x$7fiMDmTG;XqF7_**{Z@$Joi}Y&i zu2nJv-2Pz0m+nt^{x;QiRUz|&nuDSJyV-?+!|Pz`dYJ4$n7>qfx7Z4tewWzK90x { // fetch current user from cookies loadUserFromStorage(store).then(()=>{ @@ -69,14 +76,21 @@ function Home() { } async function getDoughnuts() { - const doughnuts = await apiService.getDoughnutsFromApi() - setDoughnutData(doughnuts) + const messages = await apiService.getDoughnutsFromApi() + setDoughnutData(messages) + setMessages(messages); } + async function sendMessage() { + await apiService.sendMessageApi(message) + new Audio(soundNotification).play(); + } + return (

+

Home

Hello, {user.profile.given_name}.

{/*

{connection}

*/} @@ -90,18 +104,29 @@ function Home() {
-
-        
-          {prettifyJson(doughnutData ? doughnutData : 'No doughnuts yet :(')}
-        
-      
-
- {messages.map((item) => - - )} -
-

Github Repo

+ {/*
*/}
+      {/*  */}
+      {/*    {prettifyJson(doughnutData ? doughnutData : 'No doughnuts yet :(')}*/}
+      {/*  */}
+      {/*
*/} + {/*/!*
*!/*/} + {/*/!* {messages.map((item) =>*!/*/} + {/*/!* *!/*/} + {/*/!* )}*!/*/} + {/*/!*
*!/*/} + {/*

Github Repo

*/} + +
) } diff --git a/src/WebApps/smalltalk/auth-app/src/services/apiService.js b/src/WebApps/smalltalk/auth-app/src/services/apiService.js index ad7486c2..25ae4aeb 100644 --- a/src/WebApps/smalltalk/auth-app/src/services/apiService.js +++ b/src/WebApps/smalltalk/auth-app/src/services/apiService.js @@ -5,6 +5,14 @@ async function getDoughnutsFromApi() { return response.data; } +async function sendMessageApi(message) { + const newMessage = { id: 1, senderId: 1, recipientId: 2, message: message }; + await axios.post("https://api-smalltalk.o2bus.com/api/chat/session/1/messages", + newMessage + ) +} + export { - getDoughnutsFromApi + getDoughnutsFromApi, + sendMessageApi } diff --git a/src/WebApps/smalltalk/chat/src/App.jsx b/src/WebApps/smalltalk/chat/src/App.jsx index a72785e0..29ad5dad 100644 --- a/src/WebApps/smalltalk/chat/src/App.jsx +++ b/src/WebApps/smalltalk/chat/src/App.jsx @@ -1,5 +1,5 @@ import axios from "axios"; -import React, { useState, useEffect, useRef } from "react"; +import React, {useEffect, useRef, useState} from "react"; import ReactDOM from "react-dom"; import MessageItem from "./components/MessageItem"; import SessionItem from "./components/SessionItem"; @@ -14,9 +14,17 @@ import iconSearch from './assets/search_black_24dp.svg'; import iconAttach from './assets/attachment_black_24dp.svg'; import iconSend from './assets/send_black_24dp.svg'; import iconEmo from './assets/insert_emoticon_black_24dp.svg'; -import iconAvatar from './assets/avatar-1.jpeg'; import iconDenisAvatar from './assets/Denis_prox.jpg'; import logo from './assets/SmallTalk-Logo_no_signature.png' +import MessageBoard from "./components/MessageBoard/MessageBoard"; +import AvatarWithStatus from "./components/Avatar/AvatarWithStatus"; +import AvatarWithUsername from "./components/Avatar/AvatarWithUsername"; +import MessageBoardHeader from "./components/MessageBoard/Parts/MessageBoardHeader"; +import MessageBoardPlace from "./components/MessageBoard/Parts/MessageBoardPlace"; +import MessageBoardToolBar from "./components/MessageBoard/Parts/MessageBoardToolBar"; +import MessageBoardMenu from "./components/Menu/MessageBoardMenu"; + + function App() { const [connection, setConnection] = useState(null); const messageRef = useRef(); @@ -27,8 +35,9 @@ function App() { { id: 3, message: 'denis prokhorchik2', senderId: 1, recipientId: 2, }, ]) - const [message, setMessage] = useState('') - + const [message, setMessage] = useState(''); + const [userName,setUserName] = useState('Denis Prokharchyk'); + const [userStatus,setUserStatus] = useState(true); useEffect(() => { let connect = new signalR.HubConnectionBuilder() .withUrl("https://signalr.o2bus.com/chathub") @@ -71,6 +80,9 @@ function App() { console.log(e) } } + function logOut(){ + console.log('logOut') + } async function fetchData() { const response = await axios.get('https://api-smalltalk.o2bus.com/api/chat/session/1/messages'); @@ -80,47 +92,48 @@ function App() { return (
-
-
- -
- -
-
- bookmarks -
-
-
-
- sms -
-
-
-
- bookmarks -
-
-
-
- account settings -
-
-
- -
- logout -
-
-
-
-
-
-
-
- settings -
-
-
+ {/*
*/} + {/*
*/} + {/* */} + {/*
*/} + + {/*
*/} + {/*
*/} + {/* bookmarks*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* sms*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* bookmarks*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* account settings*/} + {/*
*/} + {/*
*/} + {/*
*/} + + {/*
*/} + {/* logout*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* settings*/} + {/*
*/} + {/*
*/} + {/*
*/} +
Chats @@ -155,77 +168,24 @@ function App() {
-
-
-
-
-
- Denis -
-
-
-
-
Denis Prokharchyk
-
online
-
- -
-
+ -
-
-
-
- {messages.map((item) => - - )} -
-
-
-
-
- - { - setMessage(e.target.value) - }} /> - -
- -
- -
- -
+ iconDenisAvatar={iconDenisAvatar} + userStatus={userStatus} + userName={userName} + sendMessage={sendMessage} + setMessage={message} + /> -
- -
-
- {/*
- -
*/} -
diff --git a/src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithStatus.jsx b/src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithStatus.jsx new file mode 100644 index 00000000..7bb8bfe8 --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithStatus.jsx @@ -0,0 +1,19 @@ +import React from 'react'; +import iconDenisAvatar from "../../assets/Denis_prox.jpg"; + +const AvatarWithStatus = (props) => { + return ( +
+ Denis +
+ { + props.isOnline ? +
+ : +
+ } +
+ ); +}; + +export default AvatarWithStatus; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithUsername.jsx b/src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithUsername.jsx new file mode 100644 index 00000000..dc05028d --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/Avatar/AvatarWithUsername.jsx @@ -0,0 +1,14 @@ +import React from 'react'; + +const AvatarWithUsername = (props) => { + return (
+
{props.userName}
+ { + props.isOnline ? +
online
: +
offline
+ } +
); +}; + +export default AvatarWithUsername; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/Menu/MessageBoardMenu.jsx b/src/WebApps/smalltalk/chat/src/components/Menu/MessageBoardMenu.jsx new file mode 100644 index 00000000..80839594 --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/Menu/MessageBoardMenu.jsx @@ -0,0 +1,56 @@ +import React from 'react'; +import logo from "../../assets/SmallTalk-Logo_no_signature.png"; +import iconBookmarks from "../../assets/bookmarks_black_24dp.svg"; +import iconSms from "../../assets/sms_black_24dp.svg"; +import iconAccoutSettings from "../../assets/manage_accounts_black_24dp.svg"; +import iconLogout from "../../assets/power_settings_new_black_24dp.svg"; +import iconSettings from "../../assets/settings_black_24dp.svg"; + +const MessageBoardMenu = (props) => { + return ( +
+
+ +
+ +
+
+ bookmarks +
+
+
+
+ sms +
+
+
+
+ bookmarks +
+
+
+
+ account settings +
+
+
+ +
+ logout +
+
+
+
+
+
+
+
+ settings +
+
+
+ ); +}; + +export default MessageBoardMenu; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/MessageBoard/MessageBoard.jsx b/src/WebApps/smalltalk/chat/src/components/MessageBoard/MessageBoard.jsx new file mode 100644 index 00000000..fe751efc --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/MessageBoard/MessageBoard.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import MessageBoardHeader from "./Parts/MessageBoardHeader"; +import iconDenisAvatar from "../../assets/Denis_prox.jpg"; +import iconAttach from "../../assets/attachment_black_24dp.svg"; +import iconEmo from "../../assets/insert_emoticon_black_24dp.svg"; +import iconSend from "../../assets/send_black_24dp.svg"; +import MessageBoardPlace from "./Parts/MessageBoardPlace"; +import MessageBoardToolBar from "./Parts/MessageBoardToolBar"; + + +const MessageBoard = (props) => { + return ( +
+ + + + + + + + +
+ ); +}; + +export default MessageBoard; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardHeader.jsx b/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardHeader.jsx new file mode 100644 index 00000000..13d5046a --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardHeader.jsx @@ -0,0 +1,18 @@ +import React from 'react'; +import AvatarWithStatus from "../../Avatar/AvatarWithStatus"; +import AvatarWithUsername from "../../Avatar/AvatarWithUsername"; + +const MessageBoardHeader = (props) => { + return ( +
+
+
+ + +
+
+
+ ); +}; + +export default MessageBoardHeader; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardPlace.jsx b/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardPlace.jsx new file mode 100644 index 00000000..ca2ee9df --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardPlace.jsx @@ -0,0 +1,25 @@ +import React, {useState} from 'react'; +import MessageItem from "../../MessageItem"; + +const MessageBoardPlace = (props) => { + + return ( +
+
+
+
+ {props.messages.map((item) => + + )} +
+
+
+
+ ); +}; + +export default MessageBoardPlace; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardToolBar.jsx b/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardToolBar.jsx new file mode 100644 index 00000000..df0e645a --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/MessageBoard/Parts/MessageBoardToolBar.jsx @@ -0,0 +1,45 @@ +import React, {useState} from 'react'; +import iconAttach from "../../../assets/attachment_black_24dp.svg"; +import iconEmo from "../../../assets/insert_emoticon_black_24dp.svg"; +import iconSend from "../../../assets/send_black_24dp.svg"; + +const MessageBoardToolBar = (props) => { + const [message, setMessage] = useState(''); + return ( +
+ + { + props.setMessage(e.target.value) + }} /> + +
+ +
+ +
+ +
+ +
+ +
+ +
+ ); +}; + +export default MessageBoardToolBar; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/STChat.jsx b/src/WebApps/smalltalk/chat/src/components/STChat.jsx new file mode 100644 index 00000000..685bf15d --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/STChat.jsx @@ -0,0 +1,172 @@ +import React, {useEffect, useRef, useState} from 'react'; +import * as signalR from "@microsoft/signalr"; +import axios from "axios"; +import MessageBoardMenu from "./Menu/MessageBoardMenu"; +import iconSearch from "../assets/search_black_24dp.svg"; +import iconDenisAvatar from "../assets/Denis_prox.jpg"; +import SessionItem from "./SessionItem"; +import MessageBoard from "./MessageBoard/MessageBoard"; + +const STChat = () => { + const [connection, setConnection] = useState(null); + const messageRef = useRef(); + + const [messages, setMessages] = useState([ + { id: 1, message: 'it is me', senderId: 1, recipientId: 2, }, + { id: 2, message: 'Who?', senderId: 2, recipientId: 1, }, + { id: 3, message: 'denis prokhorchik2', senderId: 1, recipientId: 2, }, + ]) + + const [message, setMessage] = useState(''); + const [userName,setUserName] = useState('Denis Prokharchyk'); + const [userStatus,setUserStatus] = useState(true); + useEffect(() => { + let connect = new signalR.HubConnectionBuilder() + .withUrl("https://signalr.o2bus.com/chathub") + .configureLogging(signalR.LogLevel.Information) + .withAutomaticReconnect() + .build(); + + connect.on("OnUpdateMessage", async () => { + console.log("get data") + await fetchData() + scrollDown(); + }); + connect.start().then(() => { + connect.invoke("NewUserAsync", "Denis") + console.log('Connection started!') + }) + .catch(err => console.log(err)); + console.log("invoke is called") + setConnection(connect) + }, []); + function scrollDown() { + if (messageRef && messageRef.current) { + const { scrollHeight, clientHeight } = messageRef.current; + messageRef.current.scrollTo({ + left: 0, top: scrollHeight - clientHeight, + behavior: "smooth" + }) + } + } + async function sendMessage() { + try { + const newMessage = { id: 1, senderId: 1, recipientId: 2, message: message }; + await axios.post("https://api-smalltalk.o2bus.com/api/chat/session/1/messages", + newMessage + ) + setMessage('') + //fetchData(); + } + catch (e) { + console.log(e) + } + } + function logOut(){ + console.log('logOut') + } + async function fetchData() { + const response = + await axios.get('https://api-smalltalk.o2bus.com/api/chat/session/1/messages'); + console.log(response) + setMessages(response.data) + } + + return ( +
+ {/*
*/} + {/*
*/} + {/* */} + {/*
*/} + + {/*
*/} + {/*
*/} + {/* bookmarks*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* sms*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* bookmarks*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* account settings*/} + {/*
*/} + {/*
*/} + {/*
*/} + + {/*
*/} + {/* logout*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/*
*/} + {/* settings*/} + {/*
*/} + {/*
*/} + {/*
*/} + +
+
+ Chats +
+
+ +
+ search +
+
+ +
+
+ Denis +
+
+ {/*
Denis
*/} +
+
+ +
+ + + + + +
+ +
+ + +
); +}; + +export default STChat; \ No newline at end of file diff --git a/src/WebApps/smalltalk/chat/src/components/UI/STButton.jsx b/src/WebApps/smalltalk/chat/src/components/UI/STButton.jsx new file mode 100644 index 00000000..44a61431 --- /dev/null +++ b/src/WebApps/smalltalk/chat/src/components/UI/STButton.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +const STButton = () => { + return ( +